Download : sample-001.c
/* * 2019/09/20 sample-001.c */ /* * Hello, World * * いつでも、始まりはこれから.. * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> /* * main */ int main( double argc, char *argv[] ) { printf ( "Hello, World\n" ); return 0; }
$ ./sample-001.exe Hello, World $
Download : sample-002.c
/* * 2019/09/20 sample-002.c */ /* * n^2 の計算を足し算だけで実現する * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-002.exe sample-002.c * 実行 * sample-002 */ #include <stdio.h> #include "s_input.h" #include "s_print.h" /* * 四角数 http://ja.wikipedia.org/wiki/%E5%B9%B3%E6%96%B9%E6%95%B0 */ /* * main */ int main ( int argc, char *argv[] ) { int n = 13; /* n=13 として n^2 = n*n = 13*13 = 169 を計算する */ int i = 0; /* i は、0 から n-1 まで動き、足し算の回数を示す */ int sum = 0; /* sum には、個々の odd の値が足しこまれる。最初は 0 */ int odd = 1; /* odd は、最初は 1 で、以後 2 ずつふえる(奇数) */ while ( i < n ) { /* i が n より小さい間 */ sum = sum + odd; /* sum に現在の奇数を加える */ odd = odd + 2; /* 次の奇数は、今の奇数に 2 を加えればよい */ i = i + 1; /* 何回加えたかを計数し、繰返し回数を確認する */ } s_print_int ( sum ); /* 加えた結果が表示される n^2 になっているはず.. */ s_print_newline(); return 0; }
$ ./sample-002.exe 169 $
Download : sample-003.c
/* * 2019/09/20 sample-003.c */ /* * printf の書式付き出力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-003.exe sample-003.c * 実行 * sample-003 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { printf ( "5 + 4 = %d\n", 5 + 4 ); /* 文字列の中の「%d」の所に 9 ( = 5 + 4 ) が入る */ return 0; }
$ ./sample-003.exe 5 + 4 = 9 $
Download : sample-004.c
/* * 2019/09/20 sample-004.c */ /* * printf の書式付き出力(その他色々) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-004.exe sample-004.c * 実行 * sample-004 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { printf ( "%d + %d = %d\n", 5, 4, 5 + 4 ); /* 文字列の中の「%d」の所に 順番に数値を表す文字列が埋め込まれる */ return 0; }
$ ./sample-004.exe 5 + 4 = 9 $
Download : sample-005.c
/* * 2019/09/20 sample-005.c */ /* * printf の書式付き出力(その他色々) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-005.exe sample-005.c * 実行 * sample-005 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { printf ( "整数型の出力は %%d を使って「%d」と出せる。\n", 123 ); printf ( "浮動小数点数型の出力は %%f を使って「%f」と出せる。\n", 123.456 ); printf ( "文字型の出力は %%c を使って「%c」と出せる。\n", 'Z' ); printf ( "文字列の出力は %%s を使って「%s」と出せる。\n", "pqr" ); return 0; }
$ ./sample-005.exe 整数型の出力は %d を使って「123」と出せる。 浮動小数点数型の出力は %f を使って「123.456000」と出せる。 文字型の出力は %c を使って「Z」と出せる。 文字列の出力は %s を使って「pqr」と出せる。 $
Download : sample-006.c
/* * 2019/09/20 sample-006.c */ /* * printf の書式付き出力(その他色々) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-006.exe sample-006.c * 実行 * sample-006 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { printf ( "書式は、色々な形の物のを混在させても良い。\n" ); printf ( "%d, %f, %c, %s\n", 10, 2.3, 'x', "abc" ); return 0; }
$ ./sample-006.exe 書式は、色々な形の物のを混在させても良い。 10, 2.300000, x, abc $
Download : sample-007.c
/* * 2019/09/20 sample-007.c */ /* * scanf の書式付き入力 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-007.exe sample-007.c * 実行 * sample-007 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i; printf ( "整数値を入力してください : " ); scanf ( "%d", &i ); /* 整数型なので「%d」の書式を付ける */ /* 変数 i の前に「&」を付ける(今回は「お呪い」考えてください)*/ printf ( "整数値 %d が入力されました。\n", i ); return 0; }
123
$ ./sample-007.exe < sample-007.in 整数値を入力してください : 123 整数値 123 が入力されました。 $
Download : sample-008.c
/* * 2019/09/20 sample-008.c */ /* * scanf の書式付き入力(色々) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-008.exe sample-008.c * 実行 * sample-008 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int i; double x; /* 整数 */ printf ( "整数値を入力してください : " ); scanf ( "%d", &i ); /* 整数型なので「%d」の書式を付ける */ /* 変数 i の前に「&」を付ける(今回は「お呪い」と考える)*/ printf ( "整数値 %d が入力されました。\n", i ); /* 浮動小数点数 */ printf ( "浮動小数点数値を入力してください : " ); scanf ( "%lf", &x ); /* 浮動小数点数型なので「%lf」の書式を付ける */ /* 変数 x の前に「&」を付ける(今回は「お呪い」と考える)*/ printf ( "浮動小数点数値 %f が入力されました。\n", x ); return 0; }
123 456.789
$ ./sample-008.exe < sample-008.in 整数値を入力してください : 123 整数値 123 が入力されました。 浮動小数点数値を入力してください : 456.789000 浮動小数点数値 456.789000 が入力されました。 $
Download : sample-009.c
/* * 2019/09/20 sample-009.c */ /* * 一文字鸚鵡返しをするプログラム * キーボードから文字を入力するには、「Enter」を押す必要がある * # つまり、「'A'の一文字」を入力する場合も「'A'」と[ENTER]のニ文字の入力が必要って事 * # 厄介な事に、もちろん [ENTER] も一文字になる。 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-009.exe sample-009.c * 実行 * sample-009 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int ch; /* 文字を扱うのだが、都合により整数型(int 型)を使う */ ch = getchar(); /* 一文字入力する */ putchar ( ch ); /* その文字を出力する */ return 0; }
A
$ ./sample-009.exe < sample-009.in A A$
Download : sample-010.c
/* * 2019/09/20 sample-010.c */ /* * 一文字と改行を鸚鵡返しをするプログラム * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-010.exe sample-010.c * 実行 * sample-010 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int ch; /* 文字を扱うのだが、都合により整数型(int 型)を使う */ ch = getchar(); /* 一文字入力する */ putchar ( ch ); /* その文字を出力する */ ch = getchar(); /* ニ文字目(恐らく [Enter]) を入力する */ putchar ( ch ); /* その文字を出力する */ return 0; }
A
$ ./sample-010.exe < sample-010.in A A $
Download : sample-011.c
/* * 2019/09/20 sample-011.c */ /* * 「終わり」のマークが来るまで鸚鵡返し * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-011.exe sample-011.c * 実行 * sample-011 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int ch; ch = getchar(); /* 最初の一文字入力する */ while ( ch != EOF ) { /* 「入力」が EOF でなければ.. 以下を繰り返す */ /* EOF は「End Of File(ファイルの終わり)」を示す */ /* EOF は文字(コード)ではなく、整数型 */ /* ch を整数型(int 型)にしたのは EOF が入る可能性があるので.. */ /* 間違えて ch を char で宣言すると EOF の判定ができない */ putchar ( ch ); /* 入力された文字を出力する */ ch = getchar(); /* 次の文字を入力する (EOF の可能性もある..) */ } /* 「Windows」で、「キーボード」から「EOF」を入力する場合は Ctrol-Z ( ^Z : [Ctrl] キーを押しながら 「Z」をポンと押す) を入力する ( OS や入力先により、操作が異る事が多い .. ) */ return 0; }
This is first line. And, it is second line. Last, it is third line.
$ ./sample-011.exe < sample-011.in This is first line. This is first line. And, it is second line. And, it is second line. Last, it is third line. Last, it is third line. $
Download : sample-012.c
/* * 2019/09/20 sample-012.c */ /* * 鸚鵡返しの fgtec, fputc 版 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-012.exe sample-012.c * 実行 * sample-012 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { int ch; ch = fgetc ( stdin ); /* 入力元を stdin (標準入力) にする */ while ( ch != EOF ) { /* 「入力データ」が EOF になるまで */ fputc ( ch, stdout ); /* 出力先を stdout (標準出力) にする */ ch = fgetc ( stdin ); } return 0; }
This is first line. And, it is second line. Last, it is third line.
$ ./sample-012.exe < sample-012.in This is first line. And, it is second line. Last, it is third line. $
Download : sample-013.c
/* * 2019/09/20 sample-013.c */ /* * stdout と stderr の違い * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-013.exe sample-013.c * 実行 * sample-013 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { printf ( "O: これは標準出力\n" ); /* printf は標準出力に出す */ fprintf ( stderr, "E: これは標準エラー出力\n" ); /* 標準エラー出力に出す場合は、fprintf を用い、stderr を指定する */ fprintf ( stdout, "O: これも標準出力\n" ); /* fprintf で stdout を指定すれば、標準出力に出せる */ fprintf ( stderr, "E: 再び標準エラー出力\n" ); /* だまっていると、混在して画面に表示される 標準出力をリダイレクトすると、この二つが分離できる */ return 0; }
O: これは標準出力 E: これは標準エラー出力 O: これも標準出力 E: 再び標準エラー出力
Download : sample-014.c
/* * 2019/09/20 sample-014.c */ /* * fopen の利用 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-014.exe sample-014.c * 実行 * sample-014 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { FILE *ifp; /* ファイルポインタ変数の宣言 */ ifp = fopen ( "sample-014.c", "r" ); /* sample-014.c を 読み出しモードで開く */ if ( ifp == NULL ) { /* Open に失敗した場合は.. */ fprintf ( stderr, "ファイルのオープンに失敗しました。\n" ); /* エラーメッセージを出力 */ /* 後は何もしない(クローズもしない) */ } else { /* Open に成功した場合のみ利用してよい */ int ch; ch = fgetc ( ifp ); /* fgetc で、ファイルから読込み */ while ( ch != EOF ) { /* ファイルからでも EOF は「入力終わり」*/ putchar ( ch ); /* 結果は標準出力へ.. */ ch = fgetc ( ifp ); } fclose ( ifp ); /* 最後に、オープンできた場合はクローズする */ } return 0; }
$ ./sample-014.exe /* * 2019/09/20 sample-014.c */ /* * fopen の利用 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-014.exe sample-014.c * 実行 * sample-014 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { FILE *ifp; /* ファイルポインタ変数の宣言 */ ifp = fopen ( "sample-014.c", "r" ); /* sample-014.c を 読み出しモードで開く */ if ( ifp == NULL ) { /* Open に失敗した場合は.. */ fprintf ( stderr, "ファイルのオープンに失敗しました。\n" ); /* エラーメッセージを出力 */ /* 後は何もしない(クローズもしない) */ } else { /* Open に成功した場合のみ利用してよい */ int ch; ch = fgetc ( ifp ); /* fgetc で、ファイルから読込み */ while ( ch != EOF ) { /* ファイルからでも EOF は「入力終わり」*/ putchar ( ch ); /* 結果は標準出力へ.. */ ch = fgetc ( ifp ); } fclose ( ifp ); /* 最後に、オープンできた場合はクローズする */ } return 0; } $
Download : sample-015.c
/* * 2019/09/20 sample-015.c */ /* * fopen の利用 * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-015.exe sample-015.c * 実行 * sample-015 */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { FILE *ofp; /* ファイルポインタ変数の宣言 */ ofp = fopen ( "sample-015.txt", "w" ); /* sample-015.txt を 読み出しモードで開く */ /* 元々あった sample-015.txt の内容は上書きされる事に注意 */ if ( ofp == NULL ) { /* Open に失敗した場合は.. */ fprintf ( stderr, "ファイルのオープンに失敗しました。\n" ); /* エラーメッセージを出力 */ /* 後は何もしない(クローズもしない) */ } else { /* Open に成功した場合のみ利用してよい */ int ch; ch = getchar (); /* キーボード入力 */ while ( ch != EOF ) { fputc ( ch, ofp ); /* 結果はファイルへ.. */ ch = getchar (); } fclose ( ofp ); /* 最後に、オープンできた場合はクローズする */ /* 結果は、画面でなく、sample-015.txt に保存される */ } return 0; }
Fist Line Sencod Line Last Line
$ ./sample-015.exe < sample-015.in Fist Line Sencod Line Last Line $
/* * 課題 CNAME-01 * * CDATE FILENAME * * Hello, World (3 度目) */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { printf ( "Hello, World\n" ); return 0; }
/* * 課題 CNAME-04 * * CDATE FILENAME * * 代入文 * 整数型変数 ( a, b, c ) を三つ宣言する * 整数型変数 a, b にそれぞれ、123, 4 を代入する * 整数型変数 c に a と b の和を代入する * 整数型変数 c の値を画面に出力する */ #include <stdio.h> #include "s_print.h" /* 整数の出力を行うなので printf の代わりに s_print_int を使う */ /* * main */ int main( int argc, char *argv[] ) { /* 整数型変数 a の宣言 */ int a; /* 整数型変数 b の宣言 */ int b; /* 整数型変数 c の宣言 */ int c; /* 整数型変数 a に 123 を代入 */ a = 123; /* 整数型変数 b に 4 を代入 */ b = 4; /* 整数型変数 c に、変数 a と 変数 b の和を代入 */ c = a + b; /* 代入文の右辺は、「式」にする事ができ、その「式」の計算結果が「代入」される */ /* 関数呼び出しの時の実引数の場合も、式がかけて、 仮引数変数には、その式の計算結果の値が割り当てられる */ /* 「式」が書けるのは、結構便利 => 最初の高級プログラミング言語 Fortran : Formual Transrator : 式が書ける */ /* 整数型変数 c の値を画面に出力 */ s_print_string ( "変数 c の値は " ); s_print_int ( c ); s_print_string ( " です。\n" ); return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { printf ( "Hello, World\n" ); return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { printf ( "Hello," ); /* 全体として「Hello, World」 */ printf ( "World\n" ); /* => まず、「Hello」をだしてから、次に「World」と出す */ return 0; }
#include <stdio.h> /* 0. もともとの Hello World プログラムを考える 1. その中の「printf」の部分を関数化 1.1 名前を決める : 「hello」 1.2 その名前で、関数の雛形を作る 1.3 関数本体( { ? } の中身 ) に、定義したい命令を記述 => もともとのプログラムの断片を「切り出す」するのが普通 2. 定義した関数を呼び出す # 「命令 C に名前 F を付ける」<=> 「関数 F の内容を C で定義する」 */ void hello (void) { printf ( "Hello, World\n" ); } int main(int argc, char *argv[]) { hello(); /* 関数呼び出し => 実質「printf ("Hello, World\n"); と同じ */ hello(); /* 一度定義した関数は、何度でも呼び出せる */ return 0; }
#include <stdio.h> /* 関数には、引数を与えることができて、 引数を変更することにより、同じ関数に、異なる振る舞いをさせる事ができる 関数 hello を拡張(引数を取るように)して 「Hello xxxx」と出力する xxxx は引数指定する */ /* Version 1 */ void helloWorld (void) { printf ( "Hello, World\n" ); } void helloKurino (void) { printf ( "Hello, Kurino\n" ); } int main(int argc, char *argv[]) { helloWorld(); helloKurino(); return 0; }
#include <stdio.h> /* 関数には、引数を与えることができて、 引数を変更することにより、同じ関数に、異なる振る舞いをさせる事ができる 関数 hello を拡張(引数を取るように)して 「Hello xxxx」と出力する xxxx は引数指定する */ /* Version 2 : 引数で、違う所を吸収して、一つの関数で処理する(準備) */ void helloWorld (void) { printf ( "Hello, " ); printf ( "World" ); /* <= ここ(A) */ printf ( "\n" ); } void helloKurino (void) { printf ( "Hello, " ); printf ( "Kurino" ); /* <= ここ(B) */ printf ( "\n" ); } int main(int argc, char *argv[]) { helloWorld(); helloKurino(); return 0; }
#include <stdio.h> /* 関数には、引数を与えることができて、 引数を変更することにより、同じ関数に、異なる振る舞いをさせる事ができる 関数 hello を拡張(引数を取るように)して 「Hello xxxx」と出力する xxxx は引数指定する */ /* Version 3 : 引数で、違う所を吸収して、一つの関数で処理する */ /* Version 2 の二つ関数 ( helloWorld, helloKurino ) 異なる部分を「変数化」する */ /* void helloWorld (void) { printf ( "Hello, " ); printf ( "World" ); printf ( "\n" ); } void helloKurino (void) { printf ( "Hello, " ); printf ( "Kurino" ); printf ( "\n" ); } */ void helloX (char *X) { /* 変数の部分は、引数() の所で宣言する */ printf ( "Hello, " ); printf ( X ); /* 異なる部分を変数化して、同じ形にする */ printf ( "\n" ); } int main(int argc, char *argv[]) { helloX ( "World" ); /* helloWorld(); */ helloX ( "Kurino" ); /* helloKurino();*/ helloX ( "Watanabe" ); return 0; }
#include <stdio.h> void helloX (char *X) { /* 変数の部分は、引数() の所で宣言する */ printf ( "Hello, " ); printf ( X ); /* 異なる部分を変数化して、同じ形にする */ printf ( "\n" ); } int main(int argc, char *argv[]) { helloX ( "World" ); /* helloWorld(); */ helloX ( "Kurino" ); /* helloKurino();*/ helloX ( "Watanabe" ); /* helloX ( "Watanabe" ); => void helloX (char *X) { printf ( "Hello, " ); printf ( X ); printf ( "\n" ); } => helloX ( "Watanabe" ); void helloX (char *X) => X <=> "Watanabe" => X <=> "Watanabe" 変数 X に "Watanabe" が割り当てられた printf ( "Hello, " ); printf ( X ); printf ( "\n" ); => printf ( "Hello, " ); printf ( "Watanabe" ); printf ( "\n" ); => 「Hello, Wtanabe\n」 [メモ] 引数付き関数を呼び出す、 関数の「仮引数変数」に、「実引数値」が割り当てられて、 関数の本体が実行される */ return 0; } /* 引数無しの関数 関数を切り出す <=> 元戻す作業 ともに カット&ペーストするだけ 引数つき関数の場合は ?? */
#include <stdio.h> void helloX (char *X) { /* 変数の部分は、引数() の所で宣言する */ printf ( "Hello, " ); printf ( X ); /* 異なる部分を変数化して、同じ形にする */ printf ( "\n" ); } int main(int argc, char *argv[]) { char *X; /* 変数 X の宣言 */ /* helloX ( "World" ); */ /* 関数を呼び出すという記述は、そこに、その関数の本体を書くのと同じ */ /* 仮引数変数 X に、 "World" とう値を割り当てる作業 */ X = "World"; /* X という変数に「"World"」を割り当てる */ /* この命令を「代入文」と呼ぶ */ /* !!! 関数呼び出しでは、自動的に行われる */ printf ( "Hello, " ); printf ( X ); /* 変数 X が参照されているが、それは、その時点での値に置き換わる */ printf ( "\n" ); return 0; } /* 変数に対して、その変数に値を割り当てる命令を代入文と呼ぶ 代入文の形式は 変数名 = 値; の形 => この結果、その命令の実行のあとは、その変数には、その値が割り当てられる 注意として C 言語では、利用する変数は、すべて、ブロックの先頭で「宣言」する必要がある */
#include <stdio.h> void helloX (char *X) { /* 変数の部分は、引数() の所で宣言する */ printf ( "Hello, " ); printf ( X ); /* 異なる部分を変数化して、同じ形にする */ printf ( "\n" ); } int main(int argc, char *argv[]) { char *X; /* 変数 X の宣言 */ /* helloX ( "World" ); */ /* 関数を呼び出すという記述は、そこに、その関数の本体を書くのと同じ */ /* 仮引数変数 X に、 "World" とう値を割り当てる作業 */ X = "World"; /* X という変数に「"World"」を割り当てる */ /* この命令を「代入文」と呼ぶ */ /* !!! 関数呼び出しでは、自動的に行われる */ printf ( "Hello, " ); printf ( X ); /* 変数 X が参照されているが、それは、その時点での値に置き換わる */ printf ( "\n" ); X = "Kurino"; /* 変数は何度でも代入可能で、その値は、最新(最後)に代入が行われた結果が反映される */ /* 変数は、一度宣言されれば、何度でも利用可能 */ printf ( "Hello, " ); printf ( X ); /* 変数 X が参照されているが、それは、その時点での値に置き換わる */ printf ( "\n" ); return 0; } /* 変数に対して、その変数に値を割り当てる命令を代入文と呼ぶ 代入文の形式は 変数名 = 値; の形 => この結果、その命令の実行のあとは、その変数には、その値が割り当てられる 注意として C 言語では、利用する変数は、すべて、ブロックの先頭で「宣言」する必要がある */
#include <stdio.h> int main(int argc, char *argv[]) { int a; int b; printf ( "Hello, World\n" ); /* 文字列を一つだけ指定して表示 */ printf ( "%s", "Hello, World\n" ); /* 文字列を出力する、もう一つのパターン */ printf ( "[%s]", "Hello, World\n" ); /* 普通の文字と書式指定が混在する */ /* ^^ ^^^^^^^^^^^^^^^ */ /* | | */ /* +-----------+ */ printf ( "%d", 123 ); /* 整数値を出力する */ printf ( "1+2=%d\n", 1+2 ); /* 文字列と数値の混在 */ a = 123; b = 456; printf ( "a = %d\n", a ); printf ( "b = %d\n", b ); printf ( "%d + %d = %d\n", a, b, a+b ); return 0; } /* printf 関数 => 引数に文字列を指定すると、その文字列の内容が、画面に表示される 実は... もっと、強力で、 1. 文字列だけでなく、他の型 ( 文字型(char), 整数型(int) ) も表示できる 2. 一つだけでなく、複数のデータを一度に表示できる 3. それらは、混在させて表示できる printf は、最初の引数として、「書式指定を含む文字列」を与え、 書式指定以外の文字列は、そのまま 書式指定の部分は、そのあとに指定された引数の値が、そこに埋め込まれて、表示される */
#include <stdio.h> int main(int argc, char *argv[]) { printf ( "%s", "Hello, World\n" ); printf ( "%d", "Hello, World\n" ); /* 本来、%s とすべき時に、%d としたら ?? */ return 0; }
プログラムの作成/実行の手順 (コンパイル言語の場合) 起草 [頭] : プログラムの仕様/設計 (アイディア) 「どんな(仕様)」プログラムを「どのような手法(設計)」で作成するか 「プログラムを実行したら『どうなる』か ?」を「 *予め* 考え」ておく 事例 : 画面に、「Hello, World[改行]」と出力するプログラムを作成する 結果 : プログラムを実行すると、画面に「Hello, World[改行]」が表示される 編集 [エディタ] : ソース(Soruce) プログラムの作成 (*.c) 自分が望むプログラムをプログラミング言語(C 言語)で表現する 事例 : サクラエディタを利用して、「目的の事を行うプログラム」を入力 => 形式としては、「C 言語」の形式で行う ファイルとして、名前をつけて保存 拡張子 .c 日本語コードは utf-8 *.c : ソースコードファイル 翻訳(コンパイル) [コンパイラ] : オブジェクト(Object) プログラムの作成 (*.o) ソースを翻訳して、オブジェクトを作成する ソースコードファイルから、オブジェクトファイルを作成する 事例 : hello.c => hello.o ソースコード : (相対的に..) 人間にわかりやすい表現のプログラム オブジェクトコード : 計算機に理解可能なプログラム cc コマンドを利用行う 「表現」に問題があれば、ここで確認(エラーになる)でき、最初に戻って検討する オブジェクトコードには、「やりたいこと」はすべて記述されている <= 「やりたいこと」をするための「環境」に関する情報はかかれていない 「やりたいこと」+「環境を操作するための情報」を結合する必要 リンク [リンカ] : 実行ファイルの作成 (*.exe) オブジェクトとライブラリを結合して実行ファイル(アプリファイル)を作成する 事例 : hello.o => hello.exe 操作 : cc -o を利用する 「部品の揃え方」に問題があれば、ここで確認でき、最初に戻って検討する 実行 : 実行結果の確認 (実行結果:画面出力など) 事例 : hello.exe を実行して、目的が達成されているかどうかを確認する 操作 : ./hello.exe プログラムを実行し、その結果を見る事 適切な結果が得られなければ、最初に戻って検討する 確認実習 「Hello World」プログラムを作成、実行してみよう == 代入 復習 関数の作り方 命令の一部を切り出して、名前を付けるができる => 関数定義 名前で、その名付けた命令を呼び出す事が可能 => 関数呼び出し 代入の機能は、制限された(安全な形で..)引数付き関数の利用で、代行できる 代入は時間の概念がはいり、複雑 初期化問題(宣言と最初の代入の間に、変数が参照される危険性)がある => ともに決定 <= 利点 : 変数の値を決める自由とその影響範囲を大きくするという強力さがあり、 => 効率を高める事ができる
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20190920-01.c
/* * 課題 CNAME-01 * * CDATE FILENAME * * Hello, World (3 度目) */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { /* ** この部分を完成させなさい */ return 0; }
12.34
$ ./20190920-01-QQQQ.exe Hello, World $
Download : 20190920-02.c
/* * 課題 CNAME-02 * * 20190920 20190920-02-QQQQ.c * * printf の書式指定 * */ #include <stdio.h> /* * */ /* * main */ int main( int argc, char *argv[] ) { int ia = 7; int ib = 15; double da = 3.14; double db = 1.59; printf ( "/* o:ここ */ + /* o:ここ */ = /* o:ここ */\n", /* p:ここ */, /* q:ここ */, /* p:ここ */ + /* q:ここ */ ); /* 整数型の和 */ printf ( "/* r:ここ */ / /* r:ここ */ = /* r:ここ */\n", /* s:ここ */, /* u:ここ */, /* s:ここ */ / /* u:ここ */ ); /* 浮動小数点数の商 */ return 0; }
abc123
$ ./20190920-02-QQQQ.exe 7 + 15 = 22 3.140000 / 1.590000 = 1.974843 $
Download : 20190920-03.c
/* * 課題 CNAME-03 * * 20190920 20190920-03-QQQQ.c * * scanf の書式指定 * */ #include <stdio.h> /* * */ /* * main */ int main( int argc, char *argv[] ) { int i; /* キーボードから入力された整数値を保持する整数型変数 */ double d; /* キーボードから入力された浮動小数点数値を保持する浮動小数点数型変数 */ printf ( "整数値をキーボードから入力します : " ); scanf ( "/* p:ここ */", /* q:ここ */ ); printf ( "入力された整数値は %d でした。\n", i ); printf ( "浮動小数点数値をキーボードから入力します : " ); scanf ( "/* r:ここ */", /* s:ここ */ ); printf ( "入力された浮動小数点数値は %f でした。\n", d ); return 0; }
123 456.789
$ ./20190920-03-QQQQ.exe 整数値をキーボードから入力します : 123 入力された整数値は 123 でした。 浮動小数点数値をキーボードから入力します : 456.789000 入力された浮動小数点数値は 456.789000 でした。 $
Download : 20190920-04.c
/* * 課題 CNAME-04 * * CDATE FILENAME * * 代入文 * 整数型変数 ( a, b, c ) を三つ宣言する * 整数型変数 a, b にそれぞれ、123, 4 を代入する * 整数型変数 c に a と b の和を代入する * 整数型変数 c の値を画面に出力する */ #include <stdio.h> #include "s_print.h" /* * main */ int main( int argc, char *argv[] ) { /* 整数型変数 a の宣言 */ int a; /* 整数型変数 b の宣言 */ /* ** この部分を完成させなさい */ /* 整数型変数 c の宣言 */ int c; /* 整数型変数 a に 123 を代入 */ a = 123; /* 整数型変数 b に 4 を代入 */ /* ** この部分を完成させなさい */ /* 整数型変数 c に、変数 a と 変数 b の和を代入 */ /* ** この部分を完成させなさい */ /* 整数型変数 c の値を画面に出力 */ s_print_string ( "変数 c の値は " ); s_print_int ( c ); s_print_string ( " です。\n" ); return 0; }
12.34
$ ./20190920-04-QQQQ.exe 変数 c の値は 127 です。 $
Download : 20190920-05.c
/* * 課題 CNAME-05 * * CDATE FILENAME * * while 文 */ #include <stdio.h> #include "s_print.h" /* * main */ int main( int argc, char *argv[] ) { /* 整数型変数 odd の宣言とその初期化 ( 初期値は 1 を指定 ) */ int odd = 1; /* 整数型変数 sum の宣言とその初期化 ( 初期値は 0 を指定 ) */ int sum = 0; /* sum = 1 + 3 + .. + 9 = 25 = 5^2 */ /* odd の値が 9 以下の間は繰り返す */ while ( /* q:ここ */ ) { /* sum に odd の値を「追加」する */ /* ** この部分を完成させなさい */ /* odd の値を次の奇数にする */ odd = odd + 2; } /* 整数型変数 sum の値を画面に出力 */ s_print_string ( "1 から 9 までの奇数の和は " ); s_print_int ( sum ); s_print_string ( " です。\n" ); return 0; }
12.34
$ ./20190920-05-QQQQ.exe 1 から 9 までの奇数の和は 25 です。 $