/* * CDATE FILENAME * * キーボードから一文字入力し、その文字によって異る国の挨拶をする */ #include <stdio.h> /* * hello ( char contry ) * char contry : 国を表す一文字 * j : 日本 * e : 英語 * c : 中国 * f : フランス語 * g : ドイツ語 */ void hello ( char cmd ) { /* 引数に「文字(ASCII 表に基づく、その文字に対応する ASCII Code[小さな整数])」*/ switch ( cmd ) { case 'j': /* 'j' の時は、日本語にする */ printf ( "こんにちは\n" ); break; case 'e': /* 'e' の時は、英語にする */ printf ( "Hello\n" ); break; case 'c': /* 'c' の時は、中国語にする */ printf ( "ニイハオ\n" ); /* ** この部分を完成させなさい */ case 'f': /* 'f' の時は、フランス語にする */ printf ( "Bonjour\n" ); break; /* ** この部分を完成させなさい */ printf ( "Guten tag\n" ); break; default: /* どれでもなければ.. */ printf ( "???\n" ); break; } } /* * main */ int main( void ) { printf ( "国を表す文字を入力してください\n" ); printf ( "\tj\t日本\n" ); printf ( "\te\t英語\n" ); printf ( "\tc\t中国\n" ); printf ( "\tf\tフランス\n" ); printf ( "\tg\tドイツ\n" ); hello ( getchar() ); /* getchar() で文字を入力し、それに対応する結果を出す */ return 0; }
/* * 課題 CNAME-02 * * 20170929 20170929-02-QQQQ.c * * 0 〜 99 の偶数を出力する * */ #include <stdio.h> /* * for 構文を利用して、0 から 99 の偶数の数値 (そのニ) i が 0 〜 99 の間の偶数だけを動くようにし、毎回 i を出す i = 0, 2, 4, 6, , 98, 100 2 = 0 + 2 4 = 2 + 2 .. 100 = 98 + 2 => i = i + 2 */ int main(int ac, char *av[] ) { int i; /* for 文の制御変数 */ for ( i = 0; i < 100; i = i + 2 ) { /* i++ だと i = 0, 1, 2, .. */ /* 「i = i + 2」とすれば i = 0, 2, 4, .. */ printf ( "%d\n", i ); /* i を出力 */ } /* もし、for 構文の代わりに、while 構文を利用するであれば、 i = 0; while ( i < 100 ) { printf ( "%d\n", i ); i = i + 2; } */ return 0; }
/* * 課題 20171006-01 * * 20171006 20171006-01-QQQQ.c * * curses を利用して画面に、「回」の文字を書く */ #include <stdio.h> #include <ncursesw/ncurses.h> /* ncurses の利用 */ #include <unistd.h> /* * */ #define OUT_X_POS 20 /* 「回」の外側の左上の x 座標 ( 1 〜 80 ) */ #define OUT_Y_POS 5 /* 「回」の外側の左上の y 座標 ( 1 〜 25 ) */ #define OUT_Y_SIZE 10 /* 「回」の外側の縦の長さ */ #define OUT_X_SIZE (OUT_Y_SIZE*2) /* 「回」の外側の横の長さ */ #define IN_Y_SIZE 6 /* 「回」の内側の縦の長さ */ #define IN_X_SIZE (IN_Y_SIZE*2) /* 「回」の内側の横の長さ */ #define IN_X_POS (OUT_X_POS+(OUT_X_SIZE-IN_X_SIZE)/2) /* 「回」の内側の左上の x 座標 */ #define IN_Y_POS (OUT_Y_POS+(OUT_Y_SIZE-IN_Y_SIZE)/2) /* 「回」の内側の左上の y 座標 */ /* * draw_rect ( int px, int py, int xs, int ys ) * (px, py) の位置 に xs * ys の矩形を書く */ void draw_rect ( int px, int py, int xs, int ys ) { int x; /* カーソルの x 座標を表す変数 */ int y; /* カーソルの y 座標を表す変数 */ for ( x = px; x < px + xs; x++ ) { move ( py + 0 , x ); addch ( '*' ); move ( py + ys - 1, x ); addch ( '*' ); } for ( y = py; y < py + ys; y++ ) { move ( y, px + 0 ); addch ( '*' ); move ( y, px + xs - 1 ); addch ( '*' ); /* ** この部分を完成させなさい */ } } /* * main */ int main( void ) { /* ncurses の初期化 */ initscr(); /* 画面を初期化 (クリアされる) */ cbreak(); /* 文字の入力をリアルタイムにする */ noecho(); /* 文字の入力をエコーバックしない */ /* 画面に「回」を書く */ /* 外の四角 */ draw_rect ( OUT_X_POS, OUT_Y_POS, OUT_X_SIZE, OUT_Y_SIZE ); /* 内の四角 */ draw_rect ( IN_X_POS, IN_Y_POS, IN_X_SIZE, IN_Y_SIZE ); /* 描画結果の反映 */ refresh(); /* 書き換えた内容を画面に描画 */ /* 何かキーが押されるまで末 */ getch(); /* 文字の入力待ち */ /* 後始末 */ endwin(); /* curses の後始末 */ return 0; }
#include <stdio.h> /* 1 から 10 までの和を計算する s1 = 1 s2 = 1 + 2 ... s10 = 1 + 2 + 3 + .. + 10 = 0 + 1 + 2 + 3 + .. + 10 ... = (..((0 + 1) + 2) + 3) + .. + 10) s0 = 0 s = 0 s1 = s0 + 1 s = s + 1 s2 = s1 + 2 .. s10 = s9 + 10 s = s + 10 s = 0 i = 0 s = s + i + 1 i = i + 1 ... s = s + i + 1 i = i + 1 */ int main(int argc, char *argv[] ) { int i; /* 変数:繰り返しをするときに、参照される変数 */ /* (loop) 制御変数 */ int s; /* s は、計算の途中までの中間の値を保持.. */ /* i = k の時、s は 1 から k までの和になる */ /* while 構文が終了したとき、i = 10 なので、 s には、 1 から 10 までの和が入る */ s = 0; i = 0; /* i を 0 に初期化する */ while ( i < 10 ) { /* i が上限を超えていないかチェック */ /* while 構文 ::= while ( 繰り返す条件 ) { 繰り返し命令 } -> 「繰り返し条件」が成立する限り、 「繰り返し命令」を繰りし返す 1. 「繰り返し条件」は、必ず最初に一度チェックされる 2. 「繰り返し命令」の実行の後に、再び、「繰り返し条件」がチェックされる 「繰り返し条件」のチェック回数は、常に「繰り返し命令」実行回数 + 1 3. 「繰り返し条件」は少なくても一度はチェックされるが、「繰り返し命令」は一度も実行されない可能性がある !! 「繰り返し命令」を実行する時は、「繰り返し条件」が成立 4. 「繰り返し命令」の中で、「繰り返し条件」に含まれる変数を変更しないといけない !! そうしないと、無限ループになる */ /* 繰り返したい命令を記述 i = 0, 1, 2, .., 9 ( 10 回繰り返される ) */ s = s + i + 1; /* i=k の時、s は 1 ? k の和 */ i = i + 1; /* i を 1 ずつ増やす */ printf ( "(中) i = %d, s = %d\n", i, s ); } /* i には 10 が入っている... */ printf ( "(外) i = %d, s = %d\n", i, s ); return 0; }
#include <stdio.h> /* 1 から 10 までの和を計算する */ int main(int argc, char *argv[] ) { int i; /* 変数:繰り返しをするときに、参照される変数 */ /* (loop) 制御変数 */ i = 1; /* i を 1 に初期化する */ while ( i <= 10 ) { /* i が上限に達していないかチェック */ /* 繰り返したい命令を記述 i = 1, 2, .., 10 ( 10 回繰り返される ) */ printf ( "(中) i = %d\n", i ); i = i + 1; /* i を 1 ずつ増やす */ } /* i には 11 が入っている... */ printf ( "(外) i = %d\n", i ); return 0; }
#include <stdio.h> int main(int argc, char *argv[] ) { int v; /* 入力した、値を保持する変数 */ printf ( "整数値を一つ入力してください : " ); scanf ( "%d", &v ); /* 整数型の変数 v に、キーボードから 入力された整数値を「代入」している */ /* キーボードから入力されるのは、 整数を表す文字列 scanf は、整数の値を表現する文字列を整数の値に変換して、 その変換した整数値を v に代入している */ /* 変数前についている「&」は 「おまじない」として今は、説明しない */ printf ( "入力された整数値は %d です\n", v ); printf ( "入力された整数値に 1 を加えると %d です\n", v + 1 ); return 0; }
#include <stdio.h> /* キーボードから、整数値 ( 1 から 13 ) を入力したときに、 その数値に対応した、トランプのマーク出す 1 -> A 2 -> 2 .. 10 -> 10 11 -> J 12 -> Q 13 -> K そのほかは、エラー */ int main(int argc, char *argv[] ) { int n; /* 入力した整数値を保持する変数 */ printf ( " 1 から 13 までの整数値を入力してください : " ); /* 入力を要求する場合は、プロンプトを出す */ scanf ( "%d", &n ); /* 従来は、条件分岐は、if で行う */ /* 特に、 if は、基本 2 分岐しかできないので、 多分岐したい場合は、 if .. else if を利用する */ if ( n == 1 ) { printf ( "A\n" ); } else if ( n == 2 ) { printf ( "2\n" ); /* ... */ } else if ( n == 11 ) { printf ( "J\n" ); /* ... */ } else if ( n == 13 ) { printf ( "K\n" ); } else { printf ( "誤り(1 から 13 の数をいれてください)\n" ); } return 0; }
#include <stdio.h> /* キーボードから、整数値 ( 1 から 13 ) を入力したときに、 その数値に対応した、トランプのマーク出す 1 -> A 2 -> 2 .. 10 -> 10 11 -> J 12 -> Q 13 -> K そのほかは、エラー Version 2 : switch 構文を利用する */ int main(int argc, char *argv[] ) { int n; /* 入力した整数値を保持する変数 */ printf ( " 1 から 13 までの整数値を入力してください : " ); /* 入力を要求する場合は、プロンプトを出す */ scanf ( "%d", &n ); /* switch 構文 : 一つの式に対する多分岐の構文 */ switch ( n ) { /* switch の後ろのカッコの式の値で分岐 */ case 1: /* switch の式の値が 1 の時 */ printf ( "A\n" ); break; /* case 1 場合の処理の終わり */ /* <比較> if ( n == 1 ) { printf ( "A\n" ); } else if .. */ case 2: printf ( "2\n" ); break; case 3: printf ( "3\n" ); break; case 4: printf ( "4\n" ); break; case 5: printf ( "5\n" ); break; case 6: printf ( "6\n" ); break; case 7: printf ( "7\n" ); break; case 8: printf ( "8\n" ); break; case 9: printf ( "9\n" ); break; case 10: printf ( "10\n" ); break; case 11: printf ( "J\n" ); break; case 12: printf ( "Q\n" ); break; case 13: printf ( "K\n" ); break; default: printf ( "誤り(1 から 13 の数をいれてください)\n" ); break; } return 0; }
#include <stdio.h> /* キーボードから、整数値 ( 1 から 13 ) を入力したときに、 その数値に対応した、トランプのマーク出す 1 -> A 2 -> 2 .. 10 -> 10 11 -> J 12 -> Q 13 -> K そのほかは、エラー Version 2 : switch 構文を利用する */ int main(int argc, char *argv[] ) { int n; /* 入力した整数値を保持する変数 */ printf ( " 1 から 13 までの整数値を入力してください : " ); /* 入力を要求する場合は、プロンプトを出す */ scanf ( "%d", &n ); /* switch 構文 : 一つの式に対する多分岐の構文 */ /* switch 構文では、「整数式」のみと考える !! 文字は、「小さな値の整数値」なので OK !! 文字列や、浮動小数点数はダメ */ switch ( n ) { /* switch の後ろのカッコの式の値で分岐 */ case 1: /* switch の式の値が 1 の時 */ printf ( "A\n" ); break; /* case 1 場合の処理の終わり */ /* <比較> if ( n == 1 ) { printf ( "A\n" ); } else if .. */ case 2: printf ( "2\n" ); break; case 3: printf ( "3\n" ); break; case 4: printf ( "4\n" ); break; case 5: printf ( "5\n" ); break; case 6: printf ( "6\n" ); break; case 7: printf ( "7\n" ); break; case 8: printf ( "8\n" ); break; case 9: printf ( "9\n" ); break; case 10: printf ( "10\n" ); break; case 11: printf ( "J\n" ); break; case 12: printf ( "Q\n" ); break; case 13: printf ( "K\n" ); break; default: printf ( "誤り(1 から 13 の数をいれてください)\n" ); break; } return 0; }
#include <stdio.h> /* キーボードから、整数値 ( 1 から 13 ) を入力したときに、 その数値に対応した、トランプのマーク出す 1 -> A 2 -> 2 .. 10 -> 10 11 -> J 12 -> Q 13 -> K そのほかは、エラー Version 2 : switch 構文を利用する */ int main(int argc, char *argv[] ) { int n; /* 入力した整数値を保持する変数 */ printf ( " 1 から 13 までの整数値を入力してください : " ); /* 入力を要求する場合は、プロンプトを出す */ scanf ( "%d", &n ); /* switch 構文 : 一つの式に対する多分岐の構文 */ /* switch 構文では、「整数式」のみと考える !! 文字は、「小さな値の整数値」なので OK !! 文字列や、浮動小数点数はダメ */ switch ( n ) { /* switch の後ろのカッコの式の値で分岐 */ case 1: /* switch の式の値が 1 の時 */ printf ( "A\n" ); break; /* case 1 場合の処理の終わり */ /* <比較> if ( n == 1 ) { printf ( "A\n" ); } else if .. */ case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: printf ( "%d\n", n ); /* break がないと、次の行の命令も実行してしまう */ /* 異なる命令を実行したい場合は、break は欠かせない */ /* しかし、逆に同じ命令を実行したい場合は, break を 省略する事で、命令の記述をさぼる事ができる */ break; case 11: printf ( "J\n" ); break; case 12: printf ( "Q\n" ); break; case 13: printf ( "K\n" ); break; default: printf ( "誤り(1 から 13 の数をいれてください)\n" ); break; } return 0; }
#include <stdio.h> /* 1 から 10 までの和を計算する p-001.c では、while 構文を使った p-008.c では、for 構文を使う [while 構文を for 構文に変更する手順] 1. while -> for 2. 条件式の前後に「 ; 」を入れる 3. 一つ目の「;」の前に初期変化の命令を移動する 4. 二つ目の「;」後に、変数更新命令移動する */ int main(int argc, char *argv[] ) { int i; /* 変数:繰り返しをするときに、参照される変数 */ /* (loop) 制御変数 */ for ( i = 0; i < 10; i = i + 1 ) { /* 「while(i<10)」を「for(;i<10;)」に変更 */ /* さらに「for(i=0;i<10;i=i+1)」に変更 */ /* 繰り返したい命令を記述 i = 0, 1, 2, .., 9 ( 10 回繰り返される ) */ printf ( "(中) i = %d\n", i ); } /* i には 10 が入っている... */ printf ( "(外) i = %d\n", i ); return 0; } /* while 構文と for 構文の関係 for ( <初期化式>; <継続条件式>; <再初期化式> ) { <繰返し文> } || <初期化式>; while ( <継続条件式> ) { <繰返し文> <再初期化式> } つまり、 for 構文で書いたプログラムは、while 構文で書く事ができる 一方、 「while ( <継続条件式> )」は、「for ( ;<継続条件式>; )」と同じ while 構文で書いたプログラムは for 構文で書く事ができる したがって、 while 構文と for 構文は(同じプログラムが表現できるという いう意味で..) 同値 for 構文の良いところ 制御変数の操作関する記述が一か所にまとまるでやすい 制御変数を利用する場合は、 for 構文の方が解りやすい 一方、制御変数がない場合は、while の方が簡潔に表現できる */ /* i = i + 1 <=> i++ ( ++i ) for ( i = 0; i < 10; i++ ) { なにか } => 「なにか」を 10 回繰り返す */
/* curses -- カーソルコントロールをして、 画面の任意の場所に文字を書くためのライブラリ cf. printf (を含む一般の出力関数)は、 文字を今のカーソルのある位置 から開始し、左から右、上から下の順にしか 出力できない curses を使えば、画面上の好きな位置に文字がかける 描画の基本 move ( y, x ); y 行の x 桁にカーソルを移動 addch ( c ); 現在のカーソル位置に c を描画 重要な性質 1. curses を利用開始するまえに初期設定が必要 2. curses を利用終えたら、後始末が必要 3. addch の結果は、refresh()するまで反映されない リンクする時に -lncursesw が必要 */ #include <stdio.h> #include <ncursesw/ncurses.h> /* ncurses の利用 */ int main(int argc, char *argv[] ) { /* (5,5) から斜め下にむかって、'*' を 5 つ並べる * * * * * */ /* ncurses の初期化 (コピペする) */ initscr(); /* 画面を初期化 (クリアされる) */ cbreak(); /* 文字の入力をリアルタイムにする */ /* 普通は、[Enter] を押すまで、入力は、 プログラムに渡されない */ noecho(); /* 文字の入力をエコーバックしない */ /* ここから... */ move(5,5); /* カーソルが (5,5) */ addch ( '*' ); /* (5,5) に '*' が表示される */ move(6,6); /* カーソルが (6,6) : 左上が (1,1) */ addch ( '*' ); /* (6,6) に '*' が表示される */ refresh(); /* このままだと、表示後に、プログラムが終了してしまう.. */ /* ここまで.. */ getch(); /* 文字の入力待ち(し、その入力した文字を返す) */ /* 後始末 (コピペする) */ endwin(); /* curses の後始末 */ return 0; }
/* curses -- カーソルコントロールをして、 画面の任意の場所に文字を書くためのライブラリ cf. printf (を含む一般の出力関数)は、 文字を今のカーソルのある位置 から開始し、左から右、上から下の順にしか 出力できない curses を使えば、画面上の好きな位置に文字がかける 描画の基本 move ( y, x ); y 行の x 桁にカーソルを移動 addch ( c ); 現在のカーソル位置に c を描画 重要な性質 1. curses を利用開始するまえに初期設定が必要 2. curses を利用終えたら、後始末が必要 3. addch の結果は、refresh()するまで反映されない リンクする時に -lncursesw が必要 */ #include <stdio.h> #include <ncursesw/ncurses.h> /* ncurses の利用 */ int main(int argc, char *argv[] ) { int i; int j; /* (5,5) から斜め下にむかって、'*' を 5 つ並べる * * * * * */ /* ncurses の初期化 (コピペする) */ initscr(); /* 画面を初期化 (クリアされる) */ cbreak(); /* 文字の入力をリアルタイムにする */ /* 普通は、[Enter] を押すまで、入力は、 プログラムに渡されない */ noecho(); /* 文字の入力をエコーバックしない */ /* ここから... */ for ( j = 0; j < 10; j++ ) { for ( i = 5; i < 10; i++ ) { move(i,i+j*2); /* カーソルが (i,i) */ addch ( '*' ); /* (i,i) に '*' が表示される */ } refresh(); /* addch の内容が反映される */ usleep ( 1000000 ); /* 引数の時間 milli sec 待つ */ } /* このままだと、表示後に、プログラムが終了してしまう.. */ /* ここまで.. */ getch(); /* 文字の入力待ち(し、その入力した文字を返す) */ /* 後始末 (コピペする) */ endwin(); /* curses の後始末 */ return 0; }
Download : 20171006-01.c
/* * 課題 20171006-01 * * 20171006 20171006-01-QQQQ.c * * curses を利用して画面に、「回」の文字を書く */ #include <stdio.h> #include <ncursesw/ncurses.h> /* ncurses の利用 */ #include <unistd.h> /* * */ #define OUT_X_POS 20 /* 「回」の外側の左上の x 座標 ( 1 〜 80 ) */ #define OUT_Y_POS 5 /* 「回」の外側の左上の y 座標 ( 1 〜 25 ) */ #define OUT_Y_SIZE 10 /* 「回」の外側の縦の長さ */ #define OUT_X_SIZE (OUT_Y_SIZE*2) /* 「回」の外側の横の長さ */ #define IN_Y_SIZE 6 /* 「回」の内側の縦の長さ */ #define IN_X_SIZE (IN_Y_SIZE*2) /* 「回」の内側の横の長さ */ #define IN_X_POS (OUT_X_POS+(OUT_X_SIZE-IN_X_SIZE)/2) /* 「回」の内側の左上の x 座標 */ #define IN_Y_POS (OUT_Y_POS+(OUT_Y_SIZE-IN_Y_SIZE)/2) /* 「回」の内側の左上の y 座標 */ /* * draw_rect ( int px, int py, int xs, int ys ) * (px, py) の位置 に xs * ys の矩形を書く */ void draw_rect ( int px, int py, int xs, int ys ) { int x; /* カーソルの x 座標を表す変数 */ int y; /* カーソルの y 座標を表す変数 */ for ( x = px; x < px + xs; x++ ) { move ( py, x ); addch ( '*' ); move ( py + ys - 1, x ); addch ( '*' ); } for ( y = py; y < py + ys; y++ ) { move ( y, px ); addch ( '*' ); /* ** この部分を完成させなさい */ } } /* * main */ int main( void ) { /* ncurses の初期化 */ initscr(); /* 画面を初期化 (クリアされる) */ cbreak(); /* 文字の入力をリアルタイムにする */ noecho(); /* 文字の入力をエコーバックしない */ /* 画面に「回」を書く */ /* 外の四角 */ draw_rect ( OUT_X_POS, OUT_Y_POS, OUT_X_SIZE, OUT_Y_SIZE ); /* 内の四角 */ /* ** この部分を完成させなさい */ /* 描画結果の反映 */ refresh(); /* 書き換えた内容を画面に描画 */ /* 何かキーが押されるまで末 */ getch(); /* 文字の入力待ち */ /* 後始末 */ endwin(); /* curses の後始末 */ return 0; }
123 987 456
******************** * * * ************ * * * * * * * * * * * * * * * * * * ************ * * * ********************