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

Slides:



Advertisements
Similar presentations
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
Advertisements

プログラミング論 I 行列の演算
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング論 I 講義,テスト C言語復習
第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回 メモリ内でのデータの配置.
基本骨格 #include #include : int main(void) { 変数の宣言 実行すること return 0; } #include int main(void) { int i; printf(”Hello world!\n”);
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング序論 2. n人のインディアン.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
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言語プログラミング 第1回 導入、標準出力、変数 2017年10月13日
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
情報処理Ⅱ 第3回 2007年10月22日(月).
C言語復習 来週もこの資料を持参してください.
情報処理Ⅱ 第2回 2006年10月13日(金).
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
情報処理Ⅱ 2005年10月28日(金).
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
情報処理Ⅱ 第2回 2004年10月12日(火).
モバイルプログラミング第2回 C言語の基礎 (1).
プログラミング1 プログラミング演習I 第2回.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
printf・scanf・変数・四則演算
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
情報処理Ⅱ 第3回 2004年10月19日(火).
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:

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

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

型 整数型(符号付き,符号とは+か-) char型,short int型,int型,long int型,long long int型 整数を格納.格納できる値の範囲(最大値,最小値)と,消費メモリが異なる サイズは処理系依存.charは必ず1バイト.intは最近は4バイトであることがほとんど. charは-128以上127以下の値を格納可能 整数型(符号無し) unsigned char型,unsigned short int型,unsigned int型,… unsigned charは0以上255の値を格納可能

型 浮動小数点型 float型,double型 消費メモリサイズと精度が異なる 計算処理速度が異なる. 実はdoubleの方が速いことも…

演算子 x+=2 xが2増える x-=2 xが2減る x*=2 xが2倍になる x/=2 xが半分になる + 加算 - 減算 + 加算 - 減算 * 乗算 / 除算 % 剰余

演算結果の型 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

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

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

条件分岐 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 が 3 から始まり,0以上の範囲で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,無限に繰り返す. int i; for(i=0; ; i++){ printf("i=%d\n",i); } 「i が 0 から始まり,無条件で, 繰り返す.i は1ずつ増える.」 という意味の 繰り返し. 結局,無限に繰り返す.

繰り返し 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( 式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",i); }

繰り返し 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); 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); 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); }

switch文 switch( 値X ){ case 値A: プログラムA break; もし,値x が 値A と等しければ, case 値B: プログラムB default: プログラムC } もし,値x が 値A と等しければ, “case 値A:”までジャンプして, そこから“break”まで実行. もし 値B と等しければ, “case 値B:”までジャンプして, “break”まで実行. もしどれとも等しくなければ, “default:”までジャンプして, もしどれとも等しくなく,“default:” がなければ,何も実行しない.

switch文 実行結果 i=1 なら one i=2 なら two three i=3 なら i=4 なら four or five int i; i= ?; switch( i ){ case 1: printf("one\n"); break; case 2: printf("two\n"); case 3: printf("three\n"); case 4: case 5: printf("four or five\n"); default: printf(“another"); } 実行結果 i=1 なら one i=2 なら two three i=3 なら i=4 なら four or five i=5 なら i=6 なら another

配列

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 i; data[0] = 3; data[1] = 4; data[2] = 5; 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 実行結果 プログラム