Download : sample-001.c
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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
/* * 2021/09/17 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 /* * 2021/09/17 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
/* * 2021/09/17 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 $
#include <stdio.h> int main(void) { printf ( "Hello, World\n" ); return 0; }
#include <stdio.h> #include <string.h> void triangle ( char *string ) { if ( !strcmp ( string, "" ) ) { /* やることはない */ } else { printf ( string ); /* 文字列を出力する */ triangle ( string + 1 ); /* 文字列の長さを短くする */ } } int main(void) { triangle ( "abcdefg\n" ); triangle ( "123456\n" ); return 0; }
2021/09/17 09:00- @zoom ソフトウェア概論 ソフトウェア概論 A/B -- ガイダンス / 前期の復習 / 代入 / 標準 I/O ライブラリ -- 数学科 栗野 俊一 / 渡辺 俊一 09:00 より開始します。もうしばらく、お待ちください。 講義内容は、毎回録画し、後日、公開予定です。 ガイダンス ガイダンス ( 5 分で終了予定 ) 講義形態は、前期同様、「ハイブリッド授業」です 対面講義と zoom 配信を同時に行う 教室の講義 => zoom 配信 通学できるのは、半分の人が交互に登校可能 登校「可能」: 登校は権利(行使するかどうかは本人の自由) 登校してもよい ( オンラインで zoom で受けてもよい ) !! 「登校可能でない人」は、「校内に入れない」(禁止) !! => 理由があれば、登校可能 (<= 教員に問い合わせる) 課題を CST Portal II に提出する (講義内容は録画の上、後で公開) 課題重視 => 基本、全部出すように頑張る 課題の締め切りは、翌週の講義の日まで => 締め切りをすぎても、受付はする(試験の日まで..) 貯めない 基本 : 講義中に課題を解く時間を設ける => 講義中に課題を済ませてしまう 講義終了のち、すぐに提出(吉) 前期(ソフトウェア概論 A)を受けて居た方へ 成績結果に不明な点があれば、講義終了時に申し出る メールで、すぐに、連絡 後期(ソフトウェア概論 B)も、 方針は前期と同じです(以上 !!) 以前に、 栗野の講議(コンピュータ概論 A/B, ソフトウェア A/B) を受けた事がある方へ 方針は似た様なものです(人間は一緒なので..) 前期を取っていないのなら、 ubuntu 上の C 言語の環境を作りましょう (前期の動画が役立つでしょう..) 公開予定 ( 録画したもの全部.. ) 今、公開されているのは、「去年(2020)度」の設定動画 初めて栗野の講議を受ける人へ 詳しくは Web にある以前の資料を参照してください 前期の動画ファイルも順次公開の予定です 今、公開されているのは、「去年(2020)度」の設定動画 ガイダンスのまとめ 講義形態は、前期同様、「ハイブリッド授業」 動画は後程公開 課題重視 => 基本、全部出すように頑張る CST Portal II 概論 A を受けていない人 過去の動画を公開予定 今公開されている、設定動画をみて、環境を整える 質問等、わからない場合は、連絡ください 個別に対応する 講義中の質問 チャットであれば、随時 状況確認 状況確認 : 何かに手を付ける時に最初にやる事 過去(実績)、現在(仕事)、未来(目標)を考える できている事(過去)、 したい事(未来) が解れば、 すべき事(現在)が解る 「我々はどこから来たのか ? 我々は何者か ? 我々はどこへ行くのか ?」 フランスの画家ポール・ゴーギャンの有名な作品の名前 過去 : 我々はどこから来たのか ? ソフトウェア概論 A を学んできた (笑) # 受講していない方は、動画に目を通す 環境 ubuntu で、C のプログラム作成し、実行する 経験/知識 ソフトウェア概論 A を学んだ事 詳細は次の講義資料から..(復習/概要) 未来 : 我々はどこへ行くのか ? ソフトウェア概論の目標: 自分の望む事を行うプログラムを C 言語で記述できるようになる そのプログラムを実行する事で望みを叶える事ができるようになる 例: 要望: 歌詞を画面に出力したい できる事: 歌詞を画面に出力するプログラムを C 言語で記述できる 結果: (作成したプログラムを)実行する事により、画面に歌詞が表示される => 要望が、実現できる プログラムが書けるようになる 自分のやりたい事 ( 普通、自分でするのだが.. ) を コンピュータにやらせる事ができる 例: 講義資料 ( <= 内容、栗野が.. ) これを Web に配置するという作業 => プログラムがやってくれる !! プログラムは買ってくる(インターネット経由で無料で入手) !! <= 自分の好みのカスタマイズが可能かどう 現在 : 我々は何者か ? 何ができるようになってるのか ? ソフトウェア概論 A の単位は取れたよね.. 課題の内容はできる 資料を見ながら、既存の問題に対し答えを作る事ができる 試験もそこそこ、点がとれた 見たことがない問題でも、解答を作る事ができる => 「C のプログラムが書けるか」 できる => ソフトウェア概論 A <= 内容がかなり偏っている # C 言語の内容のうち、 # よく利用され、目的を実現するための、最低限の内容しかやっていない # => 最低限であっても、「万能」なので、 # (やりかたは、つたなくなるかもしれないが..) # 「C 言語でできる事」と「同等な事」は全てできる 過去を振り返って、 現状を確認し、 未来(ソフトウェア概論 B)に向って出発しよう.. 前期の復習 1 : 学習目標の確認 目標の確認 一言で言うと.. プログラムが書けるようになりたい !! では、「プログラムが書ける」とは、どう言う事か ? 「プログラムが書ける」ために学ばなければならない三つの要素 [プログラム理解] プログラムとは『何か(what)』 ? 「書く」対象(目標)が解らなければならないので、 それ自身を学ぶ必要がある [C 言語] プログラムは『どう「表現」すれば(how)』良いか ? 「書く」という行為は「表現」行為なので、 「表現手段(how)」としての「C 言語」を学ぶ必要がある !! C 言語 (プログラミング言語)の学習 !! => 言語理解 ( 「C 言語」という「言語」の理解 ) !! => 英語(自然言語)の勉強とよく似ている !! プログラミング言語 => 人工言語 !! 論理的 ( <= 規則正しく、例外が少ない ) !! => 知らなくても、「予測」できる !! コンピュータが、受け取る !! => 人間相手だと、まちがえると恥ずかしい !! <= 何度でも間違えられる(やり直しが可能) !! 規則が少ない ( 学習しやすい.. ) !! 実行できた時のうれしさ(よい報酬:達成感/役立つものができる) 概論 A では、最低限(万能にするために..)の事をやった 概論 B では、C 言語の内容を一通り、全部やりたい [操作手順] プログラムはどう作り、どう利用すれば良いか ? 座学だけでなく、 実際に実習を通じ、経験を積む 「書く」だけでは意味がない、 !!! 栗野が初めて受けたプログラミング言語講義 !!! => 教室で、紙(コーディングシート)に鉛筆で書く それを「動かす」方法を学ぶ必要がある 自分が「書いた」プログラムが実際に「動く」ところが面白い 前期の復習 2 : 操作手順 プログラムの作成/実行の手順 (コンパイル言語の場合) 起草 [頭] : プログラムの仕様/設計 (アイディア) 例: What「画面に「Hello, World」と表示する」という目的を実現するプログラム 「どんな(仕様)」プログラムを「どのような手法(設計)」で作成するか(How) What(目的) -> How (実現手段) : 設計 例: C のプログラムで、画面への出力なので、printf でできる 「プログラムを実行したら『どうなる』か ?」を「 *予め* 考え」ておく 例: 「Hello,World」改行 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- $ ./p-001.exe[Enter] Hello, World $ -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- [プログラムを実行した時の表示のイメージ] # 実際にプログラムを実行して、「できたか」を判断する材料 # <= この「判断基準」を「後」でやると「ごまかし」がおきる # 自分のプログラムの時は OK だが、他人のためにプログラムを作る時は NG => 「目的に即している」事を確認する 編集 [エディタ] : ソース(Source) プログラムの作成 (*.c) Windows 上で、「サクラエディタ」でやる サクラエディタの「新規作成」で、開く 内容を入力 名前を付けて保存 保存先 : c:\usr\c\日付\名前.c 保存形式 : 文字コード =>「utf-8」 / 改行 => 「unix(LF)」 自分が望むプログラムをプログラミング言語(C 言語)で表現する 翻訳(コンパイル) [コンパイラ] : オブジェクト(Object) プログラムの作成 (*.o) ソース(*.c)を翻訳して、オブジェクト(*.o)を作成する C 言語のプログラム => (比較的..) 人間にわかりやすい (メリット) コンピュータにとっては、効率的でない ( デメリット ) => コンピュータにとって都合がよいのは、 機械語形式のプログラム => コンピュータにはよいが、人間には難しい Cのプログラムを機械語に変換する 「表現」に問題があれば、 ここで確認(エラーになる)でき、最初に戻って検討する ubuntu でのコンパイルの方法 ubuntu を起動 ソースファイルのある場所に移動 cd コマンドで、日付のフォルダ(ディレクトリ)に移動 コンパイルする cc -c ソースファイル名 (*.c) # C 言語プログラムのソースコードファイルの拡張子は「c」 => オブジェクトファイル (*.o) # (ubuntu での..) オブジェクトファイルの拡張子は「o」 リンク [リンカ] : 実行ファイルの作成 (*.exe) オブジェクトとライブラリを結合して実行ファイル(アプリファイル)を作成する cc -o 実行ファイル名 オブジェクトファイル名 「部品の揃え方」に問題があれば、ここで確認でき、最初に戻って検討する 実行 : 実行結果の確認 (実行結果:画面出力など) プログラムを実行し、その結果を見る事 実行ファイルをコマンドとして、指定 ./実行ファイル名 適切な結果が得られなければ、最初に戻って検討する 確認実習 「Hello World」プログラムを作成、実行してみよう 10:20 ? 10:40 課題 1 の時間 録画を終了 ( 質問などがあれば、うけつけ ) 休憩もいれて、課題作成 10:40 再開 == 2021/09/17 ソフトウェア概論 B 前期の復習 操作方法 前期の復習 3 : プログラム理解 プログラムとは何か ? (what) コンピュータへの(複数の)指示をまとめたもの (狭義) 指示(コマンド/命令/etc..)与える => コンピュータは、その命令の列をよんで、 逐次実行をする !! 「コンピュータの操作」 !! 命令を「逐一」与えている !! 命令を与えた後に、その命令が終了するのを待っている !! 前に与えた命令の実行が終了するまで、次の命令が与えられない !! 分かりやすい !! 命令の実行結果を確認しながら、次の事ができる !! <= コンピュータに(命令の実行を)待たされる !! 「プログラムの実行」 !! => 命令をまとめて与えることができる !! => 効率がよい(プログラムの作成:困難) 複数の(単純な)指示を適切に組合せる事により、 意味のある(複雑な)結果が得られる 命令の組み合わせ: 文字列を 1 文字ずつ短かくしながら表示する 意味のある結果 : 文字による三角形が表示される プログラムを作成するためにどう考えるか ? 基本は「分割統治法」を利用 (Top-Down 設計) 全体の問題を複数の小さい問題に分割 (個々の問題の解決) 個別撃破 (Bottom-Up 実装) 解決案を組合せて全体を作る [目的] tr("1234\n") => 1234 234 34 4 (具体的な例で分割) tr("1234\n") => 1234 => printf ( "1234\n" ) 234 => tr("234\n") 34 4 (一般論) tr(string) => 1234 => printf ( string ) 234 => tr( string + 1 ) 34 4 (特殊:空文字列) tr("") => なにもしない 目的 +---+--- 空文字列 ("") => なにもしないので終わり | +--- そうでない場合 +---+--- 先頭一行 => printf | +--- 残りの部分 => 再帰呼び出し top donw 分析 この結果を逆方向に、botom up にかいていゆく void tr(char *string) { if ( !strcmp ( string, "" ) ) { /* 何もしない */ } else { printf ( string ); tr ( string + 1 ); } } 例 全体の問題(部屋の片漬け/手がつかない) 分割 ( 取り敢えず机の上から, 次にベット上, 床は最後に ... ) 分割は「再帰的に」行い、「直にできる事」まで「分解」する 例 : ベッドは、まず上に乗っている物をどかし、シーツをかえ、下に隠してあるごにょごにょを... 分解が済んだら、個々に解決し、それを組上げる事により、問題全体を解決 例 : 色々な所から出たゴミは、袋にまとめて、明日の朝出しておく.. 問題解決の考え方 ( top-down => bottom-up ) プログラミングの考え方 => いっぱんの問題解決にも利用できる # 逆も真 : 一般の問題を解く手段は、プログラミングでも利用 # 数学の考え方は、そのままプログラミングで使える # 数学的帰納法 => 再帰呼び出し # 場合分け => 条件分岐 前期の復習 3 : プログラム設計 プログラムの作成法 問題を分割すれば良い .. だとしても ??? 「何(what)」を「どのよう(how)」に、「どこ(where)」で分割すべきか ? 物を分割する(良し悪しは別として..) => 分割パターンに当てはめる プログラミングにおけるパターン 時間の前後関係 ( X は A をやってから B をする) で分ける 状況 : ベットを片漬けるとゴミが出るが、ゴミ箱が一杯で捨てられない 時間分割 : まず、ゴミ箱内のゴミを捨てて、次に、ベッドから出たゴミを入れる ベットのゴミを捨てる ゴミ箱を空にする ゴミをゴミ箱に入れる 条件に応じて対応 ( P の時は A をやって、そうでなければ B をする ) を分ける 状況 : 色々な種類のゴミが出て来た 条件分割 : 紙屑は燃えるゴミの袋に、 アルミ缶やペットボトルは資源ゴミの袋に.. 色々なゴミを捨てる if ( ゴミが紙屑 ) { ゴミの袋にすてる } else if ( ゴミが、アルミ缶 ) { 資源ゴミの袋に捨ている } else { 不燃ごみ } 同じ事を繰り返す事 ( A を繰り返せば済む ) で分ける 状況 : 大量のゴミが出て来きた 繰返し分割 : 取り敢えず一つの袋に入るだけゴミを袋詰めして外に出す、ゴミがなくなるまで、これを繰り返す 大量のゴミ a) 少量(一つのゴミ袋に入る量)を捨てる b) すべてのゴミがなくなるまで a) を繰り返す ゴミを捨てる(ゴミ) { if ( ゴミがなくなった ) { なにもしない } else { 一袋分のゴミをすてる ゴミを捨てる(残りゴミ) /* 再帰呼び出し */ /* => 同じ事「一袋分のゴミをすてる」を繰り返し */ } } 問題解決のパターンが知られている ( cf. アルゴリズム論 ) 状況 : 本が本棚に雑多に押し込まれていて、どこに何があるかが解らない ソーティング : 書名順になるように並べ替えれば、簡単に探せるようになる C 言語 : 「A Programming Lanugage C」 「C 言語」は「プログラミング言語」 プログラムを記述するための言語 「C 言語」で、プログラムを「記述(表現)」できる 「言語」なので、「単語」と「構文規則(文法)」がある => 「構文規則」があり、それに従って、記述(表現)すると、 (その表現の)「意味」が決まる !! 構文規則をまもらないと「意味がない」 !! 目的の意味を表現すには、適切な構文(や単語)を選択する必要が 利用可能な「単語」と適切な「構文」を使わないと正しい「プログラム」にならない (所謂)「コンパイルエラー」は、「『文法的に正しい文』でない」と言う表示 !!! 「文法的に正しい文」が「意味のある文」とは限らない 例 : 日本語における「文法的に正しい」が「意味のない」文: 「机がガソリンを食べた」(童話や詩なら...) 「猫が魚を食べた」 文法の正しさは機械的に判断できる => C Compiler は、文法のチェックをやってくれる いみの適切さは、人間(プログラマ)が考える必要がある C 言語の理解 利用可能な「単語(基本命令)」と「構文(文法)」を憶えて、 「形式」が整られる(文法的に正しい/意味が適切)ようにする 単語と構文の意味(機能)を理解し、 それから得られる内容(意味)の「筋」が通るようにする 前期の復習 5 : C 言語学習 (2) プログラムの最小構成を身に付ける 最小構成 : main 関数の作成 例 : Hello, World さっきやった課題 ( 今日の課題は、これだけ ) => プログラムを書き始める、ひな形になる 動く事が解っているプログラムを変更しながら、 目的のプログラムを作成 プログラムを変更したら、 途中であっても、その変更したプログラムを実行して、 自分の目的が、どの程度進んでいるか確認する => 動くプログラムを変更して、動くプログラムを作る事を繰り返す C 言語の基本命令と構文を身に付ける 定義文 ( 単語に意味や情報を与える記述 [単語定義] ) 関数定義 : 関数の引数と値の型情報をつけ、 その関数を呼出した時に実行される命令を定義し、 その関数の呼出しができるようにする 基本命令 (単独で文になるもの) 関数呼出し (printf, s_print_int, .. 様々な基本命令 / ライブラリ理解) ライブラリの利用 => ボキャブラリーの増加 (半完成品の利用) 構文規則 ( 文から新しい文を作る仕組 ) ブロック構造 ( 「{」?「}」: 複数の文を一つの文にまとめる仕組 ) 制御構造(三つ) => 万能性がある 順接 : 複数(二つ)の命令を、並べて、順次実行する 条件分岐 : 条件によって、二つ命令一方だけを実行する if 構文 繰り返し : 同じ命令を条件を満たすまで繰り返す 再帰 前期の復習 5 : C 言語学習 (3) C 言語の学習 ( 現状確認と今後の話 ) 概論 A では、必要最小限 狭く、深く 概論 B では、(A の内容含めて) 一通り全部 広く、浅く => 応用の話 3 周する予定 必要最小限 : 一周目 一通り全部 : 二周目 ( 概論 A で途中まで ) 現状は(切りが悪いが..) 2 目周の途中 これからの予定 取り敢えず 2 周目を終らす 代入 / データ構造の話をしたい 3 周目はアプリ開発をメインに進めたい
課題プログラム内の「/*名前:ここ*/」の部分を書き換え「/*この部分を完成させなさい*/」の部分にプログラムを追加して、プログラムを完成させます。
Download : 20210917-01.c
/* * TITLE * * 20210917-01-QQQQ.c * * コンパイル : * cc -c 20210917-01-QQQQ.c * cc -o 20210917-01-QQQQ.exe 20210917-01-QQQQ.o * 実行 : * ./20210917-01-QQQQ.exe * * Hello, World (3 度目) */ #include <stdio.h> /* * main */ int main( int argc, char *argv[] ) { /* ** この部分を完成させなさい */ return 0; }
12.34
$ ./20210917-01-QQQQ.exe Hello, World $
Download : 20210917-02.c
/* * TITLE * * 20210917-02-QQQQ.c * * コンパイル : * cc -c 20210917-02-QQQQ.c * cc -o 20210917-02-QQQQ.exe 20210917-02-QQQQ.o * 実行 : * ./20210917-02-QQQQ.exe * * 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
$ ./20210917-02-QQQQ.exe 7 + 15 = 22 3.140000 / 1.590000 = 1.974843 $
Download : 20210917-03.c
/* * TITLE * * 2021/09/17 20210917-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
$ ./20210917-03-QQQQ.exe 整数値をキーボードから入力します : 123 入力された整数値は 123 でした。 浮動小数点数値をキーボードから入力します : 456.789000 入力された浮動小数点数値は 456.789000 でした。 $
Download : 20210917-04.c
/* * TITLE * * 2021/09/17 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
$ ./20210917-04-QQQQ.exe 変数 c の値は 127 です。 $