/*
* 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
********************
* *
* ************ *
* * * *
* * * *
* * * *
* * * *
* ************ *
* *
********************