Imports System
Module Program
Class elem
Private _ope As String
Private _lve As Integer
Public Property Ope() As String
Get
Return _ope
End Get
Set(value As String)
_ope = value
End Set
End Property
Public Property Lve() As Integer
Get
Return _lve
End Get
Set(value As Integer)
_lve = value
End Set
End Property
End Class
Sub Main(args As String())
Dim a As New elem
a.Ope = "100"
a.Lve = 0
Dim b As New elem With {.Ope = "+", .Lve = 1}
Dim c As New elem With {.Ope = "*", .Lve = 2}
Dim elemstack As New Stack
Dim w As elem
elemstack.Push(a)
elemstack.Push(b)
elemstack.Push(c)
Do While elemstack.Count > 0
w = elemstack.Pop
Console.Write(w.Ope + ", ")
Console.WriteLine(w.Lve)
Loop
Console.WriteLine("Hello World!")
End Sub
End Module
Imports System
Module Program
Class elem
Public ope As String
Public lev As Integer
End Class
Sub Main(args As String())
Dim inpstr As String = "6.1 + 5.2 * 4.3 - 3.4 / 2.5 * 1.6 "
Dim rpnstr As String = ""
Dim opeStack As New Stack
Dim aelem As New elem
While True
If inpstr.Length = 0 Then
GoTo owari
End If
Dim fSpacePosition As Integer = inpstr.IndexOf(" ")
Dim fstr As String = inpstr.Substring(0, fSpacePosition)
Dim nstr As String = Strings.Right(inpstr, inpstr.Length - fSpacePosition - 1)
If Not (fstr = "+" Or fstr = "-" Or fstr = "*" Or fstr = "/") Then
'演算子以外の数値は出力する
rpnstr += fstr + " "
Else
If opeStack.Count >= 1 Then
Dim wope As elem = opeStack.Peek
Dim currentlev As Integer
Select Case fstr
Case "*" : currentlev = 2
Case "/" : currentlev = 2
Case "+" : currentlev = 1
Case "-" : currentlev = 1
Case Else : currentlev = 0
End Select
Do While wope.lev >= currentlev And opeStack.Count >= 1
rpnstr += wope.ope + " "
opeStack.Pop()
If opeStack.Count > 0 Then
wope = opeStack.Peek
End If
Loop
Dim belem As New elem
belem.ope = fstr
belem.lev = currentlev
opeStack.Push(belem)
Else
'最初のスタックへの積上げ
If fstr = "+" Or fstr = "-" Then
aelem.lev = 1
Else
aelem.lev = 2
End If
aelem.ope = fstr
opeStack.Push(aelem)
End If
End If
inpstr = nstr
End While
owari:
Dim welem As elem
Do While opeStack.Count > 0
welem = opeStack.Pop
rpnstr += welem.ope + " "
Loop
Console.WriteLine(rpnstr)
Console.WriteLine("Hello World!")
End Sub
End Module
Imports System
Module Program
Class elem
Public ope As String
Public lev As Integer
End Class
Sub Main(args As String())
Dim a As New elem With {.ope = "100", .lev = 0}
Dim b As New elem With {.ope = "+", .lev = 1}
Dim elemstack As New Stack
Dim w As elem
elemstack.Push(a)
elemstack.Push(b)
Do While elemstack.Count > 0
w = elemstack.Pop
Console.Write(w.ope + ", ")
Console.WriteLine(w.lev)
Loop
Console.WriteLine("Hello World!")
End Sub
End Module
Imports System
Module Program
Sub Main(args As String())
Dim rpnstr As String = "6.1 5.2 4.3 * + 3.4 2.5 / 1.6 * - "
Dim opeStack As New Stack
While True
If rpnstr.Length = 0 Then
GoTo owari
End If
Dim fSpacePosition As Integer = rpnstr.IndexOf(" ")
Dim fstr As String = rpnstr.Substring(0, fSpacePosition)
Dim nstr As String = Strings.Right(rpnstr, rpnstr.Length - fSpacePosition - 1)
If fstr = "+" Or fstr = "-" Or fstr = "*" Or fstr = "/" Then
Dim y As Double = CDbl(opeStack.Pop)
Dim x As Double = CDbl(opeStack.Pop)
Select Case fstr
Case "+" : opeStack.Push(CStr(x + y))
Case "-" : opeStack.Push(CStr(x - y))
Case "*" : opeStack.Push(CStr(x * y))
Case "/" : opeStack.Push(CStr(x / y))
End Select
Else
opeStack.Push(fstr)
End If
rpnstr = nstr
End While
owari:
Console.WriteLine(opeStack.Pop)
Console.WriteLine("Hello World!")
End Sub
End Module
カテゴリー
逆ポーランド記法の計算式
Imports System
Module Program
Sub Main(args As String())
Dim rpnstr As String
Dim rpnary() As String
Dim ans As Double
rpnstr = "6.1 5.2 4.3 * + 3.4 2.5 / 1.6 * - "
While True
rpnstr = RTrim(rpnstr)
rpnary = rpnstr.Split(" ")
If rpnary.Length = 1 Then
ans = rpnary(0)
GoTo owari
End If
Dim i As Integer = 0
While True
If rpnary(i) = "+" Or rpnary(i) = "-" Or rpnary(i) = "*" Or rpnary(i) = "/" Then
GoTo mikke
End If
i += 1
End While
mikke:
Dim a As Double
Dim b As Double
a = CDbl(rpnary(i - 2))
b = CDbl(rpnary(i - 1))
If rpnary(i) = "+" Then
rpnary(i - 2) = a + b
ElseIf rpnary(i) = "-" Then
rpnary(i - 2) = a - b
ElseIf rpnary(i) = "*" Then
rpnary(i - 2) = a * b
Else
rpnary(i - 2) = a / b
End If
rpnary(i - 1) = ""
rpnary(i) = ""
rpnstr = ""
Dim j As Integer = 0
For j = 0 To i - 2 - 1
rpnstr += rpnary(j) + " "
Next
rpnstr += CStr(rpnary(i - 2)) + rpnary(i - 1) + rpnary(i) + " "
For j = i + 1 To rpnary.Length - 1
rpnstr += rpnary(j) + " "
Next
End While
owari:
Console.WriteLine(ans)
Console.WriteLine("Hello World!")
End Sub
#include <stdio.h>
int main(){
puts("Hello");
return 0;
}
dim a as integer
a = 100
print a
dim a as integer
a = 100
print a
highlighting code blockを使ってますが、デフォルトでの設定以外では、free契約のWordPressでは出来ないようです。何故かというと、サーバーにアクセスできないようですので。その結果、Visual Basicでは使えないということです。別に試したところでは、VS2022以上の使用感は実現されていないようです。上に載せているように、コードだけであれば問題ないように思います。
カテゴリー
Pythonのソースをアップしてみる
import tkinter
# 解読関数
def decode_line(event):
global current_line, bgimg, lcharimg, ccharimg, rcharimg
if current_line >= len(scenario):
return;
# 1行読み込み
line = scenario[current_line]
current_line = current_line + 1
line = line.replace("\\n", "\n").strip()
params = line.split(" ")
# 分岐
if line[0] != "#":
message["text"] = line
return
elif params[0] == "#back":
canvas.delete("all")
bgimg = tkinter.PhotoImage(file=params[1])
canvas.create_image(450, 230, image=bgimg)
elif params[0] == "#putChar":
if params[2] == "L":
canvas.delete("left")
lcharimg = tkinter.PhotoImage(file=params[1])
canvas.create_image(200, 160, image=lcharimg, tag="left")
elif params[2] == "R":
canvas.delete("right")
rcharimg = tkinter.PhotoImage(file=params[1])
canvas.create_image(700, 160, image=rcharimg, tag="right")
else:
canvas.delete("center")
ccharimg = tkinter.PhotoImage(file=params[1])
canvas.create_image(450, 160, image=ccharimg, tag="center")
elif params[0] == "#branch":
message.unbind("<Button-1>")
btn = tkinter.Button(text=params[2], width=20)
branch.append(btn)
btn["command"] = lambda : jump_to_line(int(params[1])-1)
btn.place(x=300, y=60+int(params[1])*60)
jumplabel.append(params[3])
if params[4] == "n":
return
elif params[0] == "#jump":
label = params[1].strip()
# ジャンプ先を探す
for l in range(len(scenario)):
if scenario[l].strip() == "## " + label:
current_line = l
decode_line(None)
return
elif params[0].strip() == "#end":
message["text"] = "終わり"
message.unbind("<Button-1>")
current_line = 999999999
# 再帰呼び出し
decode_line(None)
# ジャンプ関数
def jump_to_line(branchID):
global current_line
# ボタンを消す
for btn in branch:
btn.place_forget()
btn.destroy()
branch.clear()
label = jumplabel[branchID]
jumplabel.clear()
message.bind("<Button-1>", decode_line)
# ジャンプ先を探す
for l in range(len(scenario)):
if scenario[l].strip() == "## " + label:
current_line = l
decode_line(None)
return
# ウィンドウ作成
root = tkinter.Tk()
root.title("よろしくアドベンチャー")
root.minsize(900, 460)
root.option_add("*font", ["メイリオ", 14])
# キャンバス作成
canvas = tkinter.Canvas(width=900, height=460)
canvas.place(x=0, y=0)
# メッセージエリア
message = tkinter.Label(width=70, height=5, wraplength=840,
bg="white", justify="left", anchor="nw")
message.place(x=28, y=284)
message["text"] = "クリックしてスタート"
# ファイル読み込み
scenario = []
file = open("img8/scenario.txt", "r", encoding="utf-8")
while True:
line = file.readline()
scenario.append(line)
if not line:
file.close()
break
# 現在の行数
current_line = 0
# イベント設定
message.bind("<Button-1>", decode_line)
# 画像
bgimg = None
lcharimg = None
ccharimg = None
rcharimg = None
# 選択肢
branch = []
jumplabel = []
root.mainloop()
カテゴリー
gooブログバックアップデータの活用
Sub BlogBKDateToExcel()
Dim work As String, work2 As String
Dim inWord(10) As String
Dim i As Integer, j As Integer, k As Integer
Dim w1 As Integer, w2 As Integer
Dim ans As String
Dim ws0 As String
Dim pattern(10) As String
pattern(1) = "AUTHOR:"
pattern(2) = "TITLE:"
pattern(3) = "DATE:"
pattern(4) = "PRIMARY CATEGORY:"
pattern(5) = "STATUS:"
pattern(6) = "ALLOW COMMENTS:"
pattern(7) = "CONVERT BREAKS:"
pattern(8) = "-----"
pattern(9) = "BODY:"
pattern(10) = "--------"
Call HeaderPrint(pattern)
i = 1
Worksheets("sheet1").Activate 'ワークシートは1とします
Open "d:\blog\blogbk15-21.txt" For Input As #1 'バックアップファイルを展開してもの
Do Until EOF(1)
For k = 1 To 9
ans = ""
Input #1, work
NyuryokuPass:
If StrComp(work, pattern(9)) = 0 Then 'BODYの場合
Do
Input #1, work2
ans = ans + work2 '終了でない時は、読み込んだデーに加える
Loop While StrComp(work2, pattern(10)) <> 0 '終了でないうちは続けるpattern(10)はブログの区切り
inWord(k) = ans
Else 'BODY以外の処理
If StrComp(work, pattern(8)) <> 0 Then '-----は無視する。前回データを格納に行きます
w1 = InStr(work, ":")
ws0 = Mid(work, 1, w1)
ans = Right(work, Len(work) - Len(pattern(k)) - 1) 'TITLEの一番最初に読み込んだ処理
Do 'TITLEの読込が最後まで行くの行かないのか?
Input #1, work2
If StrComp(work2, pattern(8)) = 0 Then
inWord(k) = ans
k = k + 1
work = work2
GoTo NyuryokuPass
Else
w2 = InStr(work2, ":") '入力が途中で終わっているか?
If w2 = 0 Then '入力が途中、TITLEに半角","が入っている時
ans = ans + work2 + "、" '半角,を全角、で置換え
Else
inWord(k) = ans
k = k + 1
work = work2
GoTo NyuryokuPass
End If
End If
Loop While w2 = 0 '"DATE:"が出てくるまで、続ける
inWord(k) = ans '読み込んだデータがpattern(8)の時、前回データを格納します
End If
End If
Next k
i = i + 1
w0 = 0
For j = 1 To 9
If j = 9 Then
w0 = -1
End If
If j >= 4 Then
Cells(i, j + 2 + w0).Value = inWord(j)
Else
Cells(i, j).Value = inWord(j)
End If
Next j
Input #1, work
Loop
Close #1
Call ハイパーリンク作成
Call 表全体を検索
MsgBox "処理を終わります"
End Sub
Sub HeaderPrint(patterns() As String)
Cells(1, 1) = patterns(1)
Cells(1, 2) = patterns(2)
Cells(1, 3) = patterns(3)
Cells(1, 4) = "WorkDate"
Cells(1, 5) = "HyperLink"
Cells(1, 6) = patterns(4)
Cells(1, 7) = patterns(5)
Cells(1, 8) = "Comments"
Cells(1, 9) = "Breaks"
Cells(1, 10) = patterns(9)
End Sub
Sub ハイパーリンク作成()
Dim i As Integer
Dim last As Integer
last = Cells(2, 1).End(xlDown).Row
For i = 2 To last
Range("d" & i).FormulaR1C1 = "=TEXT(RC[-1], ""yyyymmdd"")"
ActiveSheet.Hyperlinks.Add Anchor:=Cells(i, 5), _
Address:="https://blog.goo.ne.jp/" + Cells(i, 1) + "/d/" + Cells(i, 4), _
TextToDisplay:="https://blog.goo.ne.jp/isamrx72/d/" + Cells(i, 4)
Next
'MsgBox "ハイパーリンクの作成終了"
End Sub
Sub テキストボックスを作る()
'
' テキストボックスを作る Macro
'
' Keyboard Shortcut: Ctrl+t
'
Worksheets("sheet1").Activate
Dim i As Long
Dim j As Long
Dim 範囲 As Range
Dim ws As Worksheet
Set ws = ActiveSheet
i = ActiveCell.Row
j = ActiveCell.Column
Set 範囲 = Range(Cells(i + 1, j), Cells(i + 6, j + 5))
Dim shp As Shape
Set shp = ws.Shapes.AddTextbox _
(Orientation:=msoTextOrientationHorizontal, _
Left:=範囲.Left, Top:=範囲.Top, _
Width:=範囲.Width, Height:=範囲.Height)
shp.TextFrame.Characters.Font.Size = 10
Dim chars As Characters
Set chars = shp.TextFrame.Characters
chars.Text = Cells(i, j).Value
chars.Font.Color = RGB(255, 0, 0)
End Sub
Sub テキストボックスの全削除()
'
' テキストボックスの全削除 Macro
'
' Keyboard Shortcut: Ctrl+k
'
Worksheets("sheet1").Activate
Dim sp As Shape
For Each sp In ActiveSheet.Shapes
sp.Delete
Next
End Sub
Sub 表全体を検索()
'
' 表全体を検索 Macro
'
' Keyboard Shortcut: Ctrl+z
'
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.AutoFilter
Range("A1").Select
End Sub
多分、コード自体は良いと思いますが、テキストの色付けがおかしいようです。VBAには対応してないのかも?
//#include <condefs>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
#pragma hdrstop
int main(int argc, char** argv)
{
char buff[81]; //漢字大丈夫?
ifstream infile;
infile.open("readfile.cpp");
if (!infile) return 0;
while (!infile.eof()) {
infile.getline(buff, sizeof(buff));
cout << buff << endl;
}
infile.close();
cout << endl << "Press any key to continue...";
//getch();
return 0;
}
上はC++Builder入門のサンプルコード。自分自身を表示します。
/*
Chotto.c multifile cat. procedures
Designed & created by N.Mita 1986/05/28 Copyright Core Dump Co,.Ltd.
*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define CLS cls()
//画面を消去する関数を呼ぶマクロ
#define MAXFILES 128 //このプログラムで扱えるファイル数の最大値256
#define MAXLINES 256 //このプログラムで扱える1行の文字数の最大値
static char file_name[MAXFILES][40]; //ファイル名を入れておくバッファ
FILE* fp; //ファイル構造体へのポインタ
void cls()
{ //・・画面を消去する関数(どの処理系でも対応できるように、 25 行空行を送るだけにしてある)
int i;
for (i = 0; i < 25; ++i) printf("\n");
}
int open_file(fname) //ファイルをオープンする関数
char fname[];
{
if (NULL == (fp = fopen(fname, "r")))
return(0);
else
return(1);
}
void close_file() //ファイルをクローズする関数
{
fclose(fp);
}
void cat_file(line) // ......... ファイルの内容を指定行数だけ表示する関数
int line; /* number of display lines*/
{
int i, j;
char line_buff[MAXLINES]; /* display line-buffer */
for (i = 0; i < line; ++i) //....... 1行を処理するループ
{
if (NULL == fgets(line_buff, MAXLINES, fp)) // 1行を読み込み、エラーが起きた
{ //かどうか判断する
if (feof(fp)) break; //ファイルの終わりならば for ループを抜ける
if (ferror(fp))
{
printf(">>>>>>> Read-ERROR on FILE <<<<<<<\n");
break;
}
} //エラーであれば 処理を中断して終了
for (j = 0; j < MAXLINES; ++j) //......... ファイルから読み込んだ行を表示する
{
if ((int)NULL == line_buff[j]) break; //読めない文字があった場合は、 .ピリオド
if ((isspace(line_buff[j])) || (' ' <= line_buff[j]))
putchar(line_buff[j]);
else
putchar('.');
}
}
}
int disp_1file(fname, n) //指定されたファイルを表示する関数
char fname[]; /* file-names for display */
int n; /* number of display-lines */
{
if (!open_file(fname))
{
printf("******* Cannot open file: %20s ******\n", fname);
return(0);
}
else
{
printf("-------- FILE : %20s --------\n", fname);
cat_file(n);
printf("\n\n");
}
close_file();
return (1);
}
void disp_file(m, n) //・指定された複数ファイルを表示する関数
int m; /* Number of files */
int n; /* Number of lines */
{
int i; char dummy[40];
for (i = 0; i < m; ++i)
{
disp_1file(&file_name[i][0], n);
puts("Press return...........");
gets(dummy);
}
}
int input_file() //ファイル名の入力関数
{
int i;
CLS;
for (i = 0; i < MAXFILES; ++i)
{
printf("%5d: FILE-NAME=", i + 1);
gets(&file_name[i][0]);
if (0 >= strlen(&file_name[i][0])) break;
}
return(i);
}
int input_line() //表示行数の入力関数
{
char i_str[40];
printf(" : LINES ? = ");
gets(i_str);
return(atoi(i_str));
}
int main() //・・・・・・メインの関数. できるだけシンプルになっていることが望ましい
{
int i, j;
if (0 >= (i = input_file())) //.....・ファイル名の入力
{
printf("******* No files *******\n");
exit(0);
}
else
{
if (0 >= (j = input_line())) // 表示行数の入力
{
printf("******* No lines *******¥n");
exit(0);
}
disp_file(i, j); //......... 実際の処理
}
printf("------- Complete. -------\n"); //作業終了の表示
return 0;
}
上は三田典玄さんのサンプルコード。表示するファイル名をstaticで確保してます。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string.h>
using namespace std;
#pragma hdrstop
#define MAXFILES 5
#define MAXLINES 10
class FileNameArray
{
public:
FileNameArray();
~FileNameArray();
char* getFname() { return fname; }
void setFname(char* fn) { strcpy(fname, fn); }
private:
char fname[40];
};
FileNameArray::FileNameArray()
{
strcpy(fname, "end");
}
FileNameArray::~FileNameArray()
{
}
int InputFileName(FileNameArray* fnm[]) {
for (int i = 0; i < (MAXFILES - 1); i++) {
char w[40];
cout << i + 1 << " FileName: ";
cin >> w;
fnm[i]->setFname(w);
if (strcmp(w, "end") == 0) {
return -1;
}
}
return 0;
}
void PrintFileName(FileNameArray* fnm[]) {
for (int i = 0; i < MAXFILES - 1; i++) {
cout << i + 1 << " :FileName: ";
cout << fnm[i]->getFname() << endl;
if (strcmp(fnm[i]->getFname(), "end") == 0)
break;
}
}
int PrintFileStop(FileNameArray* ptr[]) {
char buff[81];
for (int i = 0; i < MAXFILES - 1; i++) {
ifstream infile;
char w[40];
int lcnt = 0;
strcpy(w, ptr[i]->getFname());
if (strcmp(w, "end") != 0) {
infile.open(w);
if (!infile) return -1;
while (!infile.eof()) {
infile.getline(buff, sizeof(buff));
cout << buff << endl;
lcnt++;
if (lcnt > MAXLINES)
break;
}
}
else {
infile.close();
break;
}
infile.close();
}
return 0;
}
int main(int argc, char** argv)
{
FileNameArray* fnab[MAXFILES];
for (int i = 0; i < (MAXFILES - 1); i++)
fnab[i] = new FileNameArray();
InputFileName(fnab);
char msg[40];
(PrintFileStop(fnab) != 0) ? (strcpy(msg, "異常")) : (strcpy(msg, "正常"));
cout << msg << "終了しました。";
cout << endl << "Press any key to continue...";
return 0;
}
上は見様見真似で弄り回した自分で書いたもの。ファイル名を入れておくところをclassで作って、mainに置いてます。それらはポインタの配列で、必要なルーティンへ渡します。PrintFileStopはほぼ、C++Builder入門のコードと同じです。
//-------------------------------
#pragma once
//-------------------------------
#define AIRLINER 0
#define COMMUTER 1
#define PRIVATE 2
#define TAKINGOFF 0
#define CRUISING 1
#define LANDING 2
#define ONRAMP 3
#define MSG_CHANGE 0
#define MSG_TAKEOFF 1
#define MSG_LAND 2
#define MSG_REPORT 3
#include <stdio.h>
class Airplane {
public:
Airplane(const char* _name, int _type = AIRLINER);
~Airplane();
virtual int GetStatus(char* statusString);
int GetStatus() { return status; }
int Speed() { return speed; }
int Heading() { return heading; }
int Altitude() { return altitude; }
void ReportStatus();
bool SendMessage(int msg, char* response, int spd = -1, int dir = -1, int alt = -1);
char* name;
protected:
virtual void TakeOff(int dir);
virtual void Land();
private:
int speed;
int altitude;
int heading;
int status;
int type;
int ceiling;
};
#include <iostream>
#include <stdio.h>
#include <cstring>
#pragma hdrstop
#include "airplane.h"
using namespace std;
//
// 初期化処理を行うコンストラクタ
//
Airplane::Airplane(const char* _name, int _type) :
type(_type),
status(ONRAMP),
speed(0),
altitude(0),
heading(0)
{
switch (type) {
case AIRLINER: ceiling = 35000; break;
case COMMUTER: ceiling = 20000; break;
case PRIVATE: ceiling = 8000; break;
//default: ceiling = 0;
}
name = new char[50];
strcpy(name, _name);
}
//
// 終了処理を行うデストラクタ
//
Airplane::~Airplane()
{
delete[] name;
}
//
// ユーザからメッセージを取得する
//
bool
Airplane::SendMessage(int msg, char* rtnMsg, int spd, int dir, int alt)
{
// 不正なコマンドを検査する
//
strcpy(rtnMsg, " ");
if (spd > 500) {
char w[] = "Speed cannot be more than 500.";
strcpy(rtnMsg, w);
return false;
}
if (dir > 360) {
char w[] = "Heading cannot be over 360 degrees.";
strcpy(rtnMsg, w);
return false;
}
if (alt < 100 && alt != -1) {
char w[] = "I'd crash, bonehead!";
strcpy(rtnMsg, w);
return false;
}
if (alt > ceiling) {
char w[] = "I can't go that high.";
strcpy(rtnMsg, w);
return false;
}
//
// 送られたコマンドに基づいて各処理を実行する
//
switch (msg) {
case MSG_TAKEOFF: {
// すでに上空にいる場合は離陸できない
if (status != ONRAMP) {
char w[] = "I'm already in the air!";
strcpy(rtnMsg, w);
return false;
}
TakeOff(dir);
break;
}
case MSG_CHANGE: {
// 地上にいる場合は何も変更できない
if (status == ONRAMP) {
char w[] = "I'm on the ground";
strcpy(rtnMsg, w);
return false;
}
// 正の値が渡された場合のみ変更する
if (spd != -1) speed = spd;
if (dir != -1) heading = dir;
if (alt != -1) altitude = alt;
status = CRUISING;
break;
}
case MSG_LAND: {
if (status == ONRAMP) {
char w[] = "I'm already on the ground.";
strcpy(rtnMsg, w);
return false;
}
Land();
break;
}
case MSG_REPORT: ReportStatus();
}
//
// すべてうまくいっている場合の標準的な応答
//
char w[] = "Roger.";
strcpy(rtnMsg, w);
return true;
}
//
// 離陸处理
//
void
Airplane::TakeOff(int dir)
{
heading = dir;
status = TAKINGOFF;
}
//
//着陸処理
//
void
Airplane::Land()
{
speed = heading = altitude = 0;
status = ONRAMP;
}
//
// 飛行機のステータスを報告する文字列を作成する
//
int
Airplane::GetStatus(char* statusString)
{
sprintf(statusString, "%s, Altitude: %d, Heading: %d, "
"Speed: %d\n", name, altitude, heading, speed);
return status;
}
//
// ステータス文字列を取得して、それを画面に表示する
//
void
Airplane::ReportStatus()
{
char buffer[100];
strcpy(buffer, " ");
GetStatus(buffer);
cout << endl <<buffer << endl;
}
//追加
//
// メッセージをセット
//
/*
void
Airplane::SetMessage(char* msg) {
strcpy_s(msg, strlen(msg), msg);
}
*/
#include <iostream>
#include <conio.h>
#pragma hdrstop
#include "airplane.h"
using namespace std;
int getInput(int max);
void getItems(int& speed, int& dir, int& alt);
int main(int argc, char** argv)
{
char returnMsg[100];
// Airpleのポインタ配列を用意し、
// 3つのAirplaneオブジェクトを作成する
//
Airplane* planes[3];
planes[0] = new Airplane("TWA 1040");
planes[1] = new Airplane("United Express 749", COMMUTER);
planes[2] = new Airplane("Cessna 3238T", PRIVATE);
//
//ループ開始
//
do {
int plane, message, speed, altitude, direction;
speed = altitude = direction = -1;
// メッセージを送るべき飛行機を取得する
// 飛行機の一覧を表示し、 ユーザに1つ選択してもらう
//
cout << "Who do you want to send a message to?" << endl;
cout << "0. Quit" << endl;
for (int i = 0; i < 3; i++)
cout << i + 1 << ". " << planes[i] -> name << endl;
//
// getInput ( ) 関数を呼び出して、 機体番号を取得する
//
plane = getInput(4);
//
// ユーザが項目を選択した場合はループを終了する
//
if (plane == -1) break;
//
// 飛行機の確認 47:
//
cout << endl << planes[plane]-> name << ", roger.";
cout << endl << endl;
//
// 送信したいメッセージをユーザに選択してもらう
//
cout << "What message do you want to send?" << endl;
cout << endl << "0. Quit" << endl;;
cout << "1. State Change" << endl;
cout << "2. Take Off" << endl;
cout << "3. Land" << endl;
cout << "4. Report Status" << endl;
message = getInput(5);
//
// ユーザが0を選択した場合はループを終了する
//
if (message == -1) break;
//
// ユーザが項目1を選択した場合は、
// getItems ( ) 関数を呼び出して、
// 新しい速度、機首角度、 高度を入力してもらう
if (message == 0)
getItems(speed, direction, altitude);
//
// 飛行機にメッセージを送信
//
bool goodMsg = planes[plane]->SendMessage(message, returnMsg, speed, direction, altitude);
//
//メッセージが不適切な場合
//
if (!goodMsg) cout << endl << "Unable to comply.";
//
// 飛行機の応答を表示
//
cout << endl << returnMsg << endl;
} while (1);
//
// Airplainオブジェクトを削除する
//
for (int i = 0; i < 3; i++) delete planes[i];
}
int getInput(int max)
{
int choice;
do {
choice = _getch();
choice -= 49;
} while (choice < -1 || choice > max);
return choice;
}
void getItems(int& speed, int& dir, int& alt)
{
cout << endl << "Enter new speed: ";
//_getch();
cin >> speed;
cout << "Enter new heading: ";
cin >> dir;
cout << "Enter new altitude: ";
cin >> alt;
cout << endl;
}