前回引き続き、今回はメニュー画面を作っています。
最近、色作りに専念しちゃっててやっと本題ですか?って感じですよね。
まぁ、超初心者のページなんて誰もみない!!と勝手に仮定させてもらって、
超メモ書きになっているのですが・・
こんなふうにしたらいいよ!!なんてアドバイスいただけるとものすごーく嬉しいので(#^.^#)念のため・・・
私が作りたいのはこんなの↓↓
なんですけど・・・
以前作ってたのはここまでで・・
でも、今回は少しだけ進みました。
マイツールの記述方法とは違いがあり、まず画面表示に座標が指定ができそうになかったことです。
以下のソースはマイツールで記述したものなんですが、
使えたのは、今のところCLS とIFくらいです。(記述方法は違いますが・・・)
RUNという命令は、次のプログラムを実行する命令なんですが、C言語ではまだ見つけていません。
[メニュ-] 18.04.30 混 L=0123 C=0074 *メインメニュ-1 DPOFF:CLS:COLOR:7:0:2://画面表示を停止し、画面を消去 LINE:40:20:40:970:3: //始点縦位置:始点横位置:終点縦位置:終点横位置:線の種類: LINE:120:20:120:970:3: COLOR:3:0:2://黒‥0、青‥1、緑‥2、水色‥3、赤‥4、紫‥5、貴‥6、白‥7 LOC:4:30:PRINT:"***** メ イ ン メ ニ ユ ― *****": COLOR:7:0:2: LOC:10:42:PRINT:1.販 売 管 理 メ ニ ュ ―: LOC:13:42:PRINT:2.顧 客 管 理 メ ニ ュ ―: LOC:16:42:PRINT:3.財 務 管 理 メ ニ ュ ―: COLOR:4:0:2: LOC:19:42:PRINT:4. 終 了://LOCで表示位置を指定 PRINTで文字を表示 ACCP:処理番号を(1~4)で入力してエンタ―を押してください:?: ON Z0 GOSUB *1,*2,*3,*4: IF Z0>=5 THEN:GOTO *メインメニュ-1: ELSE: IF Z0=0 THEN:GOTO *メインメニュ-1: ENDIF:ENDIF: *1 RUN:ハンバイカンリメニュ-: RETURN: *2 RUN:得意先マスタ―: RETURN: *3 RUN:ザイムカンリメニュ-: RETURN: *4 DPON: STOP:
C言語ではgoto関数は使わない方がいい?
マイツールでよく使っていた飛び先を指定する方法「GOTO」なんですが、まず、下のように記述してみました。
#include <stdio.h> #include <windows.h> #include "color16.h" int main() { printf("==========================================================================\n\n"); SET(COLOR, CYAN);//文字色をシアン printf("\t\t\t メインメニュー\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("==========================================================================\n\n\n"); printf("\t\t\t1.販売管理メニュー\n\n"); printf("\t\t\t2.顧客管理メニュー\n\n"); printf("\t\t\t3.財務管理メニュー\n\n"); SET(COLOR, RED);//文字色を強調の赤に変更 printf("\t\t\t4.終 了\n\n\n\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("\t 処理番号を数字(1~4)で入力してエンターを押してください"); int c; /* キーボードから受け取った文字を入れておく変数 */ c = getchar(); /* キーボードから1文字だけ受け取る */ putchar(c); if (c == 1) { goto hanbai; }else if (c == 2) { goto kokyaku; }else if (c== 3) { goto zaimu; }else if (c == 4) { goto owari; } system("stty echo -icanon min 1 time 0"); c = 0; hanbai: system("cls"); int hanbai(void); { printf("hanbaiです\n"); return 0; } system("pause"); // 出力表示のための一時停止 kokyaku: system("cls"); int kokyaku(void); { printf("kokyakuです\n"); return 0; } zaimu: { printf("zaiomuです\n"); } owari: { printf("owariです\n"); } return 0; }
すると1C言語では、「goto」を指定すると思うように飛先に行ってくれず・・
困ったあげくに検索すると、やはりgoto関数は戻ってこれないとか色々なことが書かれていて素人は使わない方がいいようなことが沢山書かれていました。
そこで、気を取り直し、
goto関数を使うのはやめて、以下のように入力変更・・・
#include <stdio.h> #include "color16.h" int main(void) { printf("==========================================================================\n\n"); SET(COLOR, CYAN);//文字色をシアン printf("\t\t\t メインメニュー\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("==========================================================================\n\n\n"); printf("\t\t\t1.販売管理メニュー\n\n"); printf("\t\t\t2.顧客管理メニュー\n\n"); printf("\t\t\t3.財務管理メニュー\n\n"); SET(COLOR, RED);//文字色を強調の赤に変更 printf("\t\t\t4.終 了\n\n\n\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("\t 処理番号を数字(1~4)で入力してエンターを押してください"); int c; /* キーボードから受け取った文字を入れておく変数 */ c = getchar(); /* キーボードから1文字だけ受け取る */ if ( c == '1' ) { //キーボードから入力された値が1の時の処理 int hanbai(void); { printf("==========================================================================\n\n"); SET(COLOR, CYAN);//文字色をシアン printf("\t\t\t 販売管理メニュー\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("==========================================================================\n\n\n"); printf("\t\t\t1.レンタル 納品伝票\n\n"); printf("\t\t\t2.レンタル 返却伝票\n\n"); printf("\t\t\t3.販 売 伝 票\n\n"); SET(COLOR, RED);//文字色を強調の赤に変更 printf("\t\t\t4.終 了\n\n\n\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("\t 処理番号を数字(1~4)で入力してエンターを押してください\n\n\n"); int b; /* キーボードから受け取った文字を入れておく変数 */ b = getchar(); /* キーボードから1文字だけ受け取る */ system("pause"); // 出力表示のための一時停止 return 0; } } else if (c == '2') { //キーボードから入力された値が2の時の処理 int kokyaku(void); { printf("==========================================================================\n\n"); SET(COLOR, CYAN);//文字色をシアン printf("\t\t\t 顧客管理メニュー\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("==========================================================================\n\n\n"); printf("\t\t\t1.顧客登録\n\n"); printf("\t\t\t2.顧客修正\n\n"); SET(COLOR, RED);//文字色を強調の赤に変更 printf("\t\t\t3.終 了\n\n\n\n\n"); SET(COLOR, WHITE);//文字色を白に変更 printf("\t 処理番号を数字(1~3)で入力してエンターを押してください\n\n\n"); int d; /* キーボードから受け取った文字を入れておく変数 */ d = getchar(); /* キーボードから1文字だけ受け取る */ return 0; } } else if (c == '3') { int zaimu(void); printf("財務が表示されました"); } else return 0; }
すると・・始めの画面表示はよかったのですが
メインメニュー表示中に 1⏎ すると・・・
上の画像のように画面表示されました。
解決方法としては、マイツールの時に使っていたCLS命令
それに匹敵するのが【system(cls)】でした。
system(cls)で現在の画面をクリアにする
system() 関数はシステムにコマンド実行を要求する関数で
cls=画面クリアコマンド
system("cls"); //現在の画面を非表示にする
でも、次の画面を表示したいので、
system("pause"); // 出力表示のための一時停止
を使って表示しました。
やっとコマンドプロント画面から 1⏎ で次のメニュー画面が表示されるようになりました。
今回少し手こずったのは、数字を入力しても指定の場所にいってくれなかったところでした。
解決方法としては変数キーボードから入力した値を格納する時に以下のように
if ( c == '1' )
文字として認識してもらえるようにシングルコーテーションを付加した結果素直に動いてもらえました。
get char関数を使う時の注意点!
get char関数は、コマンドプロンプト画面から入力された半角英数字を自動的に文字として変数の型charに格納する関数。
少しだけ進んだかな?
コメント