プログラミング論 I 講義,テスト C言語復習 http://www.ns.kogakuin.ac.jp/~ct13140/Prog.

Slides:



Advertisements
Similar presentations
C言語によるプログラミングスタイル 制御システム工学科 山北 昌毅.
Advertisements

応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング論 I 行列の演算
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
第2回ネットワークプログラミング 中村 修.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
第6章 2重ループ&配列 2重ループと配列をやります.
プログラミング論 II 電卓,逆ポーランド記法電卓
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング論 I 2008年5月22日 講義概要 C言語復習
繰り返し計算 while文, for文.
Cプログラミング演習.
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング論 II 2008年10月30日 文字列
Cプログラミング演習 第7回 メモリ内でのデータの配置.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング序論 2. n人のインディアン.
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
indentについて forやifの「中身」を右に寄せる. forやifの「外枠」は右に寄せない. int x; x = 3;
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
高度プログラミング演習 (05).
PHP 概要 担当 岡村耕二 月曜日 2限 平成22年度 情報科学III (理系コア科目・2年生)
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
C言語 はじめに 2016年 吉田研究室.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
プログラミング演習I 2003年4月30日(第3回) 木村巌.
C言語,ソースファイルの作成,コンパイル,実行
C言語復習 来週もこの資料を持参してください.
第5回 プログラミングⅡ 第5回
高度プログラミング演習 (11).
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
情報処理Ⅱ 2005年10月28日(金).
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
プログラミング論 文字列
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
モバイルプログラミング第2回 C言語の基礎 (1).
情報処理Ⅱ 2005年11月25日(金).
プログラミング1 プログラミング演習I 第2回.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
printf・scanf・変数・四則演算
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
第1章 文字の表示と計算 printfと演算子をやります.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

プログラミング論 I 講義,テスト C言語復習 http://www.ns.kogakuin.ac.jp/~ct13140/Prog

概要 講義,テスト C言語復習

講義について

プログラミング論I 概要 諸問題を数学とコンピュータを用いて解くためのアルゴリズムを学ぶ. プログラミング力を付ける アルゴリズムについて学ぶ 主に数学的問題を解く 使用する言語は C言語

プログラミング論Iと演習I 論Iで理論を学び,演習Iでそれを実践してみる. 両科目を併せて取ることをお勧めします.

教科書 必ず教科書を購入すること! 教科書なしでの学習は不可能. テストは許可書等持ち見込み可 新C言語入門 ビギナー編 林 晴比古 (著) 出版社: ソフトバンククリエイティブ

テスト プログラミング論I,II,プログラミング演習I,IIの試験は「紙媒体のものは全て持ち込み可」とします. C言語の教科書の購入を強く推奨します. 当然,授業,演習も教科書を持参し参照することを強く推奨します. 試験は筆記試験のみです. 詳細は,Webページ参照

C言語復習 来週もこの資料を持参してください

C言語,ソースファイルの作成,コンパイル,実行

C言語 プログラムとは,“計算機を動かす手順を記述したもの”. C言語はプログラミング言語の1個 計算機に命令を与えて動かすには“プログラムを作成する”ことになる. C言語はプログラミング言語の1個 手続き型言語に分類される. C/C++ は非常に多くの場面で使われる言語 C++はC言語をオブジェクト指向に拡張したもの

C言語プログラミングの手順 ソースファイルを作成し,コンパイルし,実行. “hello.c” “hello.exe” ソースファイル source file C言語 人間が記述する. コンパイルする compile 実行ファイル executable exe マシン語 通常人間に読めない コンパイラ compiler (Visual C++, gcc, bcc など) ・C言語では,ソースファイルを直接実行することができない.  ソースファイルをコンパイルして実行ファイルを作成し,実行ファイルを実行する. ・“ソースファイル” を “原始ファイル” と呼ぶこともある(ごくまれ). ・実行ファイルの拡張子はOSに依存する.Windows では “.exe” となる. ・厳密には,コンパイルとリンク(link)を行い実行ファイルを作る.

コンパイルとリンク エディタ コンパイラ ソースファイル “abc.c” コンパイル オブジェクト ファイル “abc.o” エディタ リンカ 実行ファイル “xyz.exe” ソースファイル “def.c” コンパイル オブジェクト ファイル “def.o” リンク 標準ライブラリ

C言語のソースファイルの骨格 #include <stdio.h> void main(){ } ヘッダ(header)ファイルの読み込み. 先頭に必ず書く. void main(){ と } でプログラム本体を 挟む ここにプログラムの本体を記述する. void main(){ と } でプログラム本体を 挟む

何も起きないプログラム 1 #include <stdio.h> 2 3 void main(){ 4 } 4 } 半角で記述する.大文字と小文字は明確に区別される. 上記を入力し,実行する. Error メッセージ,Warning(警告)メッセージ を確認する. Errorは明確な誤りへのメッセージ Warningは誤りではないが好ましくないことへのメッセージ

文字列を表示するプログラム 1 #include <stdio.h> 2 3 void main(){ 4 printf("Hello, World!\n"); 5 } “Hello world!” と 表示するプログラム. printf を 使えば,” ” で囲った文字列を表示できる. “\n”は,改行を意味する. printf(“Hello\nWorld!\n”); として実行.動作を確認.

C言語の式と文 式 文 (式文) は 式; a 10 3+4 a+4 a++ a = 7 3 < a ”hello” printf(”hello”) 文 (式文) は 式; printf(”hello”); a=3; a++; a; 正しいが, 通常あり得ない

C言語の文 (関数の呼び出し) printf("Hello, World!\n"); 関数の引数は()で囲み,中に式を書く. 関数名 セミコロン

文字列を表示するプログラム 1 #include <stdio.h> 2 3 void main(){ 4 printf("Hello,\n"); 5 printf(“C lang.\n"); 6 printf("World!\n"); 7 } 上から下に進む hello01.c

インデントとフリーフォーマット プログラム内の 空白,TAB文字,改行は 無視される. よって,どのように 書いても問題ない. #include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); } プログラム内の 空白,TAB文字,改行は 無視される. よって,どのように 書いても問題ない. 当然,見やすく書くことが 好ましい. #include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); } #include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); } ↑対応関係がわかりづらい. ↑対応関係が誤り. #include <stdio.h> void main(){ int i; for(i=0; i<5; i++){ printf(”i=%d\n”, i); }} ↑理解が困難.対応関係が分かりづらい.

コメント /* と */ で挟まれた領域は, コメントとして 無視される. 1 #include <stdio.h> 実行されない. // から行末までの領域も, コメントとして無視される. ただし,これはC++の機能であり C言語の機能ではない. (実際はほとんどのC言語のコンパイラにこの機能が付いている) コメント部にはデタラメに書いても問題ない. 正しいC言語の文も無視される. 1 #include <stdio.h> 2 3 void main(){ 4 /* print hello */ 5 // print hello 6 printf("Hello,\n"); 7 8 /* 9 printf("World!\n"); 10 */ 11 } hello02.c

数値計算を行う 変数,演算

演算結果の型 X型とX型の演算結果はX型. int a=7, b=2; double d; d = a + b; d = a / b; a + b は int型とint型の演算. 演算結果も int 型. a+b は 9 (int型). dには9.0 (double型)が入る. a / b は int型とint型の演算. 演算結果も int 型. a / b は 3 (int型). dには 3.0 (double型)が格納される. 3.5 は格納されない.

a / b は int型とdouble型の演算. 演算結果の型 X型とY型の演算結果はXorY型. 優先度の高い型が勝つ. double > float > long > int > char の優先順 int a=7; double d=2.0, e; e = a / d; a / b は int型とdouble型の演算. double型が勝つので, 演算結果はdouble型. 7.0 / 2.0 と解釈され, 演算結果は 3.5 (double型).

演算結果の型 double d; d = 7 / 2; /* intとintの演算.結果はintの 3 */ d = 7 / 2.0; /* intとdoubleの演算. 結果はdoubleの3.5 */ d = 7.0 / 2; /* doubleとintの演算. d = 7.0 / 2.0; /* doubleとdoubleの演算.

制御文

真偽 条件が成り立つ場合,その条件式は真である. 例えば, (3 < 4) は真 true (3 == 4) は偽 false

比較演算子 a==b : aとbが等しい a!=b : aとbが等しくない a<b : bはaより大きい 注意! OK NG 比較 代入 != <= >= =! =< => a==b a=b

論理演算子 条件 && 条件 条件 || 条件 !条件 論理積(and):両方成り立つ場合に真 論理和(or):少なくとも片方が成り立つ場合に真 !条件 否定(not):条件が成り立たないときに真. 真偽が逆転される

条件分岐 if 文 if( 条件式X ){ プログラムA } if( 条件式X ){ プログラムA } else { プログラムB } 実行される. 偽の場合(成り立たない場合)は 何も実行されない. if( 条件式X ){ プログラムA } else { プログラムB } 条件Xが真の場合 前半のプログラムAが 実行され, 偽の場合(成り立たない場合) 後半(else部)の プログラムBが実行される

条件分岐 if 文 if( 条件式X ){ プログラムA } else if( 条件式Y ){ プログラムB } else if( 条件式Z ){ プログラムC } else { プログラムD } プログラムE 条件式Xが成り立つ場合, プログラムAが実行され, その後プログラムEに移る. プログラムB,C,Dは全て“条件式Xのelse”の 中にあるため,たとえ条件式Yや条件式Zが成り立っても実行されない. 条件式Xが偽の場合に限り,条件式Yが検証される. 条件式Xが偽で かつ 条件式Yが真 の場合,プログラムBが実行され,プログラムEに移る. プログラムC,Dは実行されない. 条件式Xが偽,条件式Yが偽,条件式Zが真の場合,プログラムC,Eが実行される. 全てが偽の場合,プログラムD, Eが実行される.

条件分岐 if 文 1 #include <stdio.h> 2 void main(){ 3 int a=12; 4 if( a < 10 ){ 5 printf("a < 10 (a = %d)\n", a); 6 } else { 7 printf("10 <= a (a = %d)\n", a); 8 } 9 }

条件分岐 if 文 1 #include <stdio.h> 2 void main(){ 3 int a=8; 4 if( a < 10 ){ 5 printf("a < 10 (a = %d)\n", a); 6 } else { 7 printf("10 <= a (a = %d)\n", a); 8 } 9 }

条件分岐 if 文 #include <stdio.h> void main(){ int a=8; if( a < 10 ){ printf("A\n"); } printf("B\n"); 実行結果 A B

条件分岐 if 文 実行結果 A B #include <stdio.h> void main(){ int a=23; printf("A\n"); } if( 20 <= a ){ printf("B\n"); if( 30 <= a ){ printf("C\n"); 実行結果 A B

条件分岐 if 文 実行結果 A #include <stdio.h> void main(){ int a=8, b=8; if( b < 10 ){ printf("A\n"); } else { printf("B\n"); } if( b < 7 ){ printf("C\n"); printf("D\n"); 実行結果 A

条件分岐 if 文 実行結果 D #include <stdio.h> void main(){ int a=12, b=8; if( a < 10 ){ if( b < 10 ){ printf("A\n"); } else { printf("B\n"); } if( b < 7 ){ printf("C\n"); printf("D\n"); 実行結果 D

おまけ 著しく読みづらいソースコード #include <stdio.h> void main(){ int a=12, b=8; if( a < 10 ){ if( b < 10 ){ printf("A\n"); } else { printf("B\n"); } if( b < 7 ){ printf("C\n"); printf("D\n");

条件分岐 if 文 #include <stdio.h> void main(){ int a=12, b=8; if( a < 10 && b < 10 ){ printf("A\n"); } else { printf("B\n"); } 実行結果 B

条件分岐 if 文 #include <stdio.h> void main(){ int a=12, b=8; if( a < 10 || b < 10 ){ printf("A\n"); } else { printf("B\n"); } 実行結果 A

条件分岐 if 文 #include <stdio.h> void main(){ int a=12, b=8; if( ! (a<10||b<10) ){ printf("A\n"); } else { printf("B\n"); } 実行結果 B

真偽 厳密には,C言語には条件や真や偽はない. 値(式分)が「0以外」なら真,「0」なら偽とみなす. 注意:NULL は「0」なので 偽 である. if( 1+2 ){ プログラムA } else { プログラムB } 「3」は真を意味する. 結果,プログラムAに入る if( 4-4 ){ プログラムA } else { プログラムB } 「0」は偽を意味する. 結果,プログラムBに入る C言語になれるまでは,このような変な(?)表現は使わなくて良い.

繰り返し for 文 同じ処理を何度も繰り返すには for 文を使う. int i; for( i=0; i<5; i++){ 処理A; } 処理Aを 5 回繰り返す. Hello! 結果 int i; for(i=0; i<3; i++){ printf("Hello!\n"); } World! 例 結果 int i; for(i=0; i<7; i++){ printf("World!\n"); }

繰り返し for 文 (i=0; i<3; i++) int i; for(i=0; i<3; i++){ printf("Hello,\n");  printf("World!\n"); } (i=0; i<3; i++) 「i が 0 から 3未満の範囲で(2まで), 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. i=0 → iが0から始まる. i<3 → iが3未満である限り続ける i++ → i は1ずつ増える i が“0から3未満(2まで)”なので, i =0, i =1, i=2 の3回繰り返す. i=0 として printf("Hello,\n"); printf("World!\n"); i=1 として printf("Hello,\n"); printf("World!\n"); printf("Hello,\n"); printf("World!\n"); i=2 として printf("Hello,\n"); printf("World!\n");

繰り返し for 文 int i; 「i が 10 から始まり 13未満の範囲で for(i=10; i<13; i++){ printf(“i=%d\n“,i); } 「i が 10 から始まり 13未満の範囲で (12まで),繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,i=10, i=11, i=12 の3回繰り返す. int i; for(i=0; i<6; i+=2){ printf(“i=%d\n“,i); } 「i が 0 から始まり 6未満の範囲で, 繰り返す.i は2ずつ増える.」 という意味の 繰り返し. 結局,i=0, i=2, i=4 の3回繰り返す. int i; for(i=2; 0<=i; i--){ printf(“i=%d\n“,i); } 「i が 2 から始まり 0 以上の範囲で, 繰り返す.i は1ずつ減る.」 という意味の 繰り返し. 結局,i=2, i=1, i=0 の3回繰り返す.

結局,(10<3が偽なので)1回も実行しない. 繰り返し for 文 int i; for(i=10; i<3; i++){ printf(“i=%d\n“,i); } 「i が 10 から始まり,3未満の範囲で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,(10<3が偽なので)1回も実行しない. int i; for(i=3; 0<=i; i++){ printf(“i=%d\n“,i); } 「i が 10 から始まり,0以上の範囲で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,無限に繰り返す. int i; for(i=0; ; i++){ printf(“i=%d\n“,i); } 「i が 0 から始まり,無条件で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,無限に繰り返す.

繰り返し for 文 for( 式1; 式2; 式3 ){ プログラム } int i; for (i=0; i<2; i++){ printf()を実行. ブロックが終わり,i++を行い,ブロックの最初に戻る. i<2 の真偽を調べる.真である(i=1). i<2 の真偽を調べる.偽である(i=2). よって,forを終了する. 最初に式1を行う 式2が真である限り, ブロックの中身を繰り返す. 1回繰り返すたびに式3を行う. int i; for (i=0; i<2; i++){ printf("i=%d\n"); }

繰り返し for 文 動作原理 N Y int i; for(i=0; i<3; i++){ printf("Hello,\n");  printf("World!\n"); } printf("End\n"); N i<3? Y printf("Hello,\n"); printf("World!\n"); i++; printf("End\n");

繰り返し for 文 動作原理 終了 int i; for(i=0; i<3; i++){ printf("Hello,\n"); printf("World!\n"); int i; for(i=0; i<3; i++){ printf("Hello,\n");  printf("World!\n"); } i++; /*i=1となる*/ i<3? printf("Hello,\n"); printf("World!\n"); i++; /*i=2となる*/ i<3? printf("Hello,\n"); printf("World!\n"); i++; /*i=3となる*/ i<3? 終了

繰り返し for 文 for文の中にfor文 同義 黄:Helloと1回表示. 青:Helloと4回表示.黄色を4回繰り返す. int i, j; for(i=0; i<3; i++){ printf("Hello\n"); } int i, j; for(i=0; i<3; i++){ for(j=0; j<4; j++){ printf("Hello\n"); } 同義 黄:Helloと1回表示. 青:Helloと4回表示.黄色を4回繰り返す. 結果,4回×3回=12回繰り返す.

繰り返し for 文 for文の中にfor文 『printf() をj=0~3の4回繰り返す』をi=0~2の3回繰り返す. int i, j; for(i=0; i<3; i++){ for(j=0; j<4; j++){ printf("i=%d,j=%d\n",i,j); } 『printf() をj=0~3の4回繰り返す』をi=0~2の3回繰り返す. 結果,4回×3回=12回繰り返す.

繰り返し while 文 while( 条件式X ){ プログラムA } int i=0; while( i<2 ){ i<2 の真偽を調べる.真である(i=0). よって,whileの中のブロックに入る. printf()を実行. i++ により i が1になる. ブロックが終わり,ブロックの最初に戻る. i<2 の真偽を調べる.真である(i=1). i++ により i が2になる. i<2 の真偽を調べる.偽である(i=2). よって,whileを終了する. 条件Xが真である限り, 中身(プログラムA)を 繰り返し実行する. 毎回,条件式を評価してから, プログラムを実行する. int i=0; while( i<2 ){ printf("i=%d\n"); i++; }

中身(プログラムA)を繰り返し実行する. 繰り返し do-while 文 do{ プログラムA }while(条件式X ); iが0になる. printf()を実行. i++ により i が1になる. ブロックが終わり,i<2 の真偽を調べる.真である(i=1). よって,再度,whileブロックの中を実行. i++ により i が2になる. ブロックが終わり,i<2 の真偽を調べる.偽である(i=2). 条件Xが真である限り, 中身(プログラムA)を繰り返し実行する. 毎回,プログラムを実行してから, 条件式を評価する. よって,最低でも1回は実行される. int i=0; do{ printf("i=%d\n"); i++; } while( i<2 );

break による 繰り返しの中断 break; を実行すると, 繰り返しが中断される. 実行結果 int i; for(i=0; i<10; i++){ printf(“i=%d\n“,i); if( i==3 ){ break; } printf(“Fin!\n“,i); 実行結果 i=0 i=1 i=2 i=3 Fin! 繰り返し中断 break; を実行すると, 繰り返しが中断される.

無限ループ for(;;){ printf("Hello, World!\n"); } while(1){ 無条件で繰り返し. 無限ループとなる. for(;;){ printf("Hello, World!\n"); } while(1){ printf("Hello, World!\n"); } while文で条件部に1と書くと, 条件が必ず成立するので 無限ループとなる. (1は真偽における“真”であるため.)

例 1, 4, 9, 16, 25, 36,…,100と出力 int i, x; for(i=1; i<=10; i++){ x = i*i; printf("%d\n", x); }

配列

C言語:変数の宣言と利用 変数の宣言 int i; double d; i = 3; d = 5.7; printf("i=%d, d=%lf\n", i, d); “ d ”という名前の 浮動小数点型変数を宣言. 変数 i に整数 3 を代入. 以後, i には 3 が入っている. プログラム 実行結果 i=3, d=5.700000

C言語:配列の宣言と使用 配列 int型が3個の配列. data[0]~data[2] が使用可能. int data[3]; int i; for(i=0; i<3; i++){ printf("data[%d]", i); printf("=%d\n", data[i]); } "0から始めて,3未満" でfor文を使うと やりやすい. data[0]=3 data[1]=4 data[2]=5 実行結果 プログラム

C言語:2次元配列 int型が2×3=6個の配列. data[0][0]~data[2][1] が使用可能. 「長さ2個の配列」が3個. (長さ3の配列が2個でない) int data[3][2]; int i, j; data[0][0] = 3; data[0][1] = 4; data[1][0] = 5; data[1][1] = 6; data[2][0] = 7; data[2][1] = 8; for(i=0; i<3; i++){ for(j=0; j<2; j++){ printf("data[%d][%d]", i, j); printf("=%d\n", data[i][j]); } data[0][0]=3 data[0][1]=4 data[1][0]=5 data[1][1]=6 data[2][0]=7 data[2][1]=8 プログラム 実行結果