講習No.12

Similar documents
プログラミング実習I

講習No.10

講習No.9

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft Word - Training10_プリプロセッサ.docx

Microsoft Word - no11.docx

ゲームエンジンの構成要素

Microsoft PowerPoint - 3.ppt [互換モード]

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

Microsoft Word - Cプログラミング演習(3)

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

講習No.12

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - prog05.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - 4.ppt [互換モード]

gengo1-12

gengo1-10

C 言語固有の命令で全部で32 個 の関数C 言語第 1 回 C 言語って?( シラバス 1 2 回目 ) 関数型言語 コンピュータに実行してもらう命令はすべて関数の中に記述されている 関数がプロ グラム

Prog1_6th

Microsoft Word - no15.docx

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft PowerPoint - kougi7.ppt

gengo1-12

Prog1_10th

1 return main() { main main C 1 戻り値の型 関数名 引数 関数ブロックをあらわす中括弧 main() 関数の定義 int main(void){ printf("hello World!!\n"); return 0; 戻り値 1: main() 2.2 C main

memo

6 関数 6-1 関数とは少し長いプログラムを作るようになると 同じ処理を何度も行う場面が出てくる そのたびに処 理を書いていたのでは明らかに無駄であるし プログラム全体の見通しも悪くなる そこで登場す るのが 関数 である 関数を使うことを 関数を呼び出す ともいう どのように使うのか 実際に見て

Prog1_15th

Microsoft PowerPoint - program.ppt [互換モード]

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

講習No.1

ポインタ変数

Microsoft PowerPoint ppt

gengo1-12

Cプログラミング1(再) 第2回

Microsoft Word - Cプログラミング演習(12)

02: 変数と標準入出力

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

PowerPoint プレゼンテーション - 物理学情報処理演習

のプログラムはそのままでは 人間は理解できても コンピュータは理解できません 皆さんが作るプログラムはソースプログラム ( ソースファイル ) と呼ばれます C 言語では *.c という形式にファイルで作成します そのソースプログラムをコンピュータが理解できるようなデータ形式に変換することをコンパイ

02: 変数と標準入出力

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - kougi4.ppt

Microsoft Word - no202.docx

Microsoft PowerPoint - prog06.ppt

gengo1-2

Microsoft PowerPoint - 11.pptx

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

Microsoft PowerPoint - kougi2.ppt

演習課題No12

PowerPoint Presentation

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

第2回講義:まとめ

8 / 0 1 i++ i 1 i-- i C !!! C 2

プログラミング実習I

02: 変数と標準入出力

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - 13.ppt [互換モード]

Microsoft PowerPoint - 5Chap15.ppt

kiso2-06.key

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

02: 変数と標準入出力

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード]

kiso2-09.key

Microsoft PowerPoint - prog04.ppt

PowerPoint Presentation

プログラミング基礎

Microsoft PowerPoint - 12.ppt [互換モード]

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

gengo1-11

Javaプログラムの実行手順

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

PowerPoint Presentation

PowerPoint プレゼンテーション

Microsoft Word - 3new.doc

数値計算

PowerPoint プレゼンテーション

プログラミング基礎

Microsoft PowerPoint - 11th.ppt [互換モード]

2006年10月5日(木)実施

初歩のC言語ターミナル_2014_May.pages

Microsoft PowerPoint - prog07.ppt

配列, 関数, 構造体

#include<math.h> 数学関係の関数群で sin() cos() tan() などの三角関数や累乗の pow() 平方根を求める sqrt() 対数 log() などがあります #include<string.h> 文字列を扱う関数群 コイツもまた後日に 4. 自作関数 実は 関数は自分

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Microsoft Word - Cプログラミング演習(8)

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

Taro-ポインタ変数Ⅰ(公開版).j

PowerPoint Presentation

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

ポインタ変数

kiso2-03.key

Microsoft PowerPoint - 14Chap17.ppt

Microsoft PowerPoint - 09.pptx

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft Word - no103.docx

Transcription:

前回までの関数のまとめ 関数は main() 関数または他の関数から呼び出されて実行される. 関数を呼び出す側の実引数の値が関数内の仮引数 ( 変数 ) にコピーされる. 関数内で定義した変数は, 関数の外からは用いることができない ( ローカル変数 ). 一般に関数内で仮引数を変化しても, 呼び出し側の変数は変化しない ( 値渡し ). 関数内で求めた値は return 文によって関数値として呼び出し側に戻される. 呼び出し側では, 必要なければ戻り値を利用しなくてもかまわない. 戻り値が無い関数を定義する場合は void キーワードを用いる. #include <stdio.h> a,b 仮引数 float menseki(float a, float b) return (a b / 2); float x, y, kekka; printf(" 底辺は?"); scanf(" %f ", &x); printf(" 高さは?"); scanf(" %f ", &y); kekka = menseki(x, y); printf(" 面積は %fです. n", kekka); x,y 実引数 仮引数もローカル変数だ! 例外として参照渡しである配列引数, ポインタ引数を用いた場合は, 呼び出し側の変数を変化できる!

関数のプロトタイプ宣言 (1) #include <stdio.h> #include <stdio.h> float menseki(float a, float b) float s; s = a b / 2; return s; float kekka; kekka = menseki(3, 4); printf("s=%f n", kekka); float kekka; kekka = menseki(3, 4); printf("s=%f n", kekka); float menseki(float a, float b) float s; s = a b / 2; return s; ソースプログラム上で, 関数の定義は関数の呼び出しより先に書かれていなければならない 理由 : コンパイラはソースプログラムの先頭から順にソースプログラムを機械語に変換するため, 関数の定義より先に関数の呼び出しがあると機械語に変換できない.

関数のプロトタイプ宣言 (2) #include <stdio.h> #include <stdio.h> float func1(...) // 何かの関数 1... b = func2(...); return s; void func2(...) // 何かの関数 2... c = func1(...); return; void func2(...) // 何かの関数 2... c = func1(...); return; float func1(...) // 何かの関数 1... b = func2(...); return s;... x = func1(...); y = func2(...);... x = func1(...); y = func2(...); 関数がお互いに呼び出しあうソースプログラムは記述不可能??

関数のプロトタイプ宣言 (3) #include <stdio.h> float menseki(float a, float b); float kekka; kekka = menseki(3, 4); printf("s=%f n", kekka); 関数のプロトタイプ宣言 ソースプログラム上で, 関数の呼び出し前に, 関数の定義か, プロトタイプ宣言のどちらかが絶対必要 printf() 関数や scanf() 関数では不要? float menseki(float a, float b) float s; s = a b / 2; return s; No! 絶対必要 printf() や scanf() のプロトタイプ宣言は stdio.h ファイルに定義されている. プロトタイプ宣言 = 関数定義の 1 行目プロトタイプ宣言は関数の使用方法 ( 引数の数と型, 戻り値の型 ) を示している

ヘッダファイル 関数のプロトタイプ宣言を集めてあるファイル ヘッダファイル (xxxxx.h) ヘッダファイルをソースプログラム内に読み込む命令 #include #include <stdio.h> stdio.h という名前のヘッダファイルを読み込む これをライブラリ関数と呼ぶ stdio.h あらかじめ用意されている標準入出力関数であるprintf() やscanf() などのプロトタイプ宣言が書かれているヘッダファイル (standard input output) math.h sqrt() などの数値計算関数のヘッダファイル (mathematics)

実行プログラム ( 機械語プログラム ) ができるまで ヘッダファイル ( ライブラリ関数の使用法 ) の読み込みソースプログラム1 ソースライブラリプログラム2 ソース関数 1 プログラム3 ライブラリ関数 2 コンパイルライブラリ関数 3 リンク ライブラリ関数本体の結合 実行プログラム

実行プログラムができるまで ( もっと詳しく!) プロジェクト名 kadai12-1 ソースファイル名 source12-1.cpp ソースプログラム source12-1.cpp テキストファイル プリプロセッサ ヘッダファイルの読み込み等の処理 コンパイル プリプロセス ( 事前処理 ) されたソースプログラム (source12-1.i) テキストファイル コンパイラ 機械語への変換 注 : プリプロセスされたソースプログラムは一般にはファイルとして作成されない オブジェクトファイル source12-1.obj バイナリファイル リンク リンカ ライブラリとオブジェクトファイルの結合 実行プログラム kadai12-1.exe バイナリファイル コンパイル + リンク = ビルドと呼ぶことがある テキストファイル文書として読めるファイルバイナリファイル文書として読めないファイル ( 機械語 )

プリプロセッサ命令は # で始まる プリプロセッサ命令 #include < 標準ヘッダファイル名 > #include " 自作ヘッダファイル名 " #define マクロ名マクロ文字列 スペース ( 空白 ) またはタブ ヘッダファイルを読み込むマクロ名をマクロ文字列で置き換える ソースファイル :kadai12.cpp #include "rei12.h" #define teisu 35 #define moji 'B'+15 int x,y; x = teisu + 22 + moji; func1(x); y = func2(teisu, moji); 自作ヘッダファイル :rei12.h void func1(int a); float func2(int a, char b); プリプロセス プリプロセッサの処理後 void func1(int a); float func2(int a, float b); int x,y; x = 35 + 22 + 'B'+15; func1(x); y = func2(35, 'B'+15); コンパイル

標準ライブラリ関数の例 プロトタイプヘッダファイル説明 double sqrt(double x) math.h x の平方根を返す double pow(double x, double y) math.h x の y 乗を返す double cos(double x) math.h cos x を返す.x の単位はラジアン double sin(double x) math.h sin x を返す.x の単位はラジアン double tan(double x) math.h tan x を返す.x の単位はラジアン double atan(double x) math.h tan 1 x を返す. 返り値の単位はラジアン double log10(double x) math.h 常用対数 log 10 x を返す int rand(void) stdlib.h 0~RAND_MAX の間の疑似乱数を返す void srand(unsigned seed) stdlib.h 擬似乱数の発生系列を seed に変更する int strlen(char s[]) string.h 文字列 s の文字数を返す char _strset(char s[], int c) string.h 文字列 s をアスキーコード c の文字で埋める char strcpy(char s1[], char s2[]) string.h 文字列 s1 を文字列 s2 にコピーする char はポインタ.2 年生で学習 int strcmp(char s1[], char s2[]) string.h 文字列 s1 と文字列 s2 を比較する. 同じ文字列なら 0 を返す. 辞書の順序で s1 が s2 より前なら, 正の値を返す. s1 が s2 より後なら, 負の値を返す. RAND_MAXはマクロ名.stdlib.hで定義されている 注 ) プロトタイプの表記は, 現在の学習レベルに合わせて変更してある. これらの関数の本来のプロトタイプはこの表とは異なる場合がある.

標準ライブラリ関数を用いたプログラムの例 (1) #include <stdio.h> #include <math.h> #define PI 3.1415 double x; x=0 から 2 まで /10 毎に sin x を計算する for (x = 0; x <= 2PI; x = x + PI/10) printf("x = %5.3f, sin x = %6.3f n", x, sin(x)); x = 0.000, sin x = 0.000 x = 0.314, sin x = 0.309 x = 0.628, sin x = 0.588 x = 0.942, sin x = 0.809 x = 1.257, sin x = 0.951 x = 1.571, sin x = 1.000 x = 1.885, sin x = 0.951 x = 2.199, sin x = 0.809 x = 2.513, sin x = 0.588 x = 2.827, sin x = 0.309 x = 3.142, sin x = 0.000 x = 3.456, sin x = -0.309 x = 3.770, sin x = -0.588 x = 4.084, sin x = -0.809 x = 4.398, sin x = -0.951 x = 4.712, sin x = -1.000 x = 5.026, sin x = -0.951 x = 5.341, sin x = -0.809 x = 5.655, sin x = -0.588 x = 5.969, sin x = -0.309 x = 6.283, sin x = -0.000 続行するには何かキー...

標準ライブラリ関数を用いたプログラムの例 (2) 21 文字の文字列 s[] で #include <stdio.h> 1 文字だけを '' にして, #include <math.h> グラフとして表現する #include <string.h> #define PI 3.1415 #define amp 10 要素数 22の配列 double x, y; 文字列なので最後 int p; は0にしておく char s[2amp + 2]; s[2amp + 1] = 0; for (x = 0; x <= 2PI; x = x + PI/10) 全て空白文字で埋めておく _strset(s, ' '); y = sin(x); p = (int)(amp y + 0.5) + amp; s[p] = ''; printf("%s n", s); y=-1.0 s[0] 10 文字 (= amp) y = sin x のyに対応するインデックスを求める y=0 s[10] 10 文字 (= amp) s[20] y=1.0 y x 続行するには何かキー...

キャストによる変数型の変換 #include <stdio.h> int a = 2, b = 3; double x1, x2, y1, y2; x1 = 1 / 3; x2 = a / b; printf("x1 =%5.2f, x2 =%5.2f n", x1, x2); y1 = 1.0 / 3; y2 = (double) a / b; printf("y1 =%5.2f, y3 =%5.2f n", y1, y2); x1 x1 = 0.00, 0.00, x2 x2 = 0.00 0.00 y1 y1 = 0.33, 0.33, y3 y3 = 0.67 0.67 続行するには何かキー... 整数同士の演算では少数以下は切り捨て 1/3 = 0.333 0 浮動小数点と整数の演算では全て浮動小数点として計算 1.0/3 = 1.0/3.0 0.333 キャストの書き方 ( 変数型 ) 変数変数を変数型に変換する キャストによる型の変換

キャストを用いた四捨五入 #include <stdio.h> int c0, c1, c2, c3, c4; double x1, x2; x1 = 3.4999; c0 = x1; c1 = (int) x1; x2 = 3.5000; c2 = (int) x2; printf("c1 = %d, c2 = %d n", c1, c2); c3 = (int) (x1 + 0.5); c4 = (int) (x2 + 0.5); printf("c3 = %d, c4 = %d n", c3, c4); c1 c1 = 3, 3, c2 c2 = 3 c1 c1 = 3, 3, c2 c2 = 4 続行するには何かキー... warning C4244: '=' : 'double' から 'int' への変換です データが失われる可能性があります キャストを用いているので警告が出ない! キャストを用いた四捨五入 0.5 を足して整数型に変換すると小数以下の四捨五入になる 3.4999 + 0.5 = 3.9999 3 3.5000 + 0.5 = 4.0000 4

標準ライブラリ関数を用いたプログラムの例 (3) #include <stdio.h> RAND_MAXは #include <stdlib.h> stdlib.h 内でマクロ として定義されている int i; printf("0から %dの乱数 n", RAND_MAX); for (i = 0; i < 20; i++) printf("%d, ", rand()); printf(" n0から9の乱数 n"); for (i = 0; i < 20; i++) printf("%d, ", (int)((double)rand()/(rand_max+1)10); printf(" n0から9の乱数 ( 簡易的な方法 ) n"); for (i = 0; i < 20; i++) printf("%d, ", rand()%10); printf(" n"); 0 から 32767 の乱数 41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464, 5705, 28145, 2 3281, 16827, 9961, 491, 2995, 11942, 4827, 5436, 0 から 9 の乱数 9, 4, 1, 0, 0, 3, 5, 5, 5, 5, 1, 6, 4, 3, 1, 5, 7, 7, 5, 3, 0 から 9 の乱数 ( 簡易的な方法 ) 3, 1, 2, 3, 3, 4, 1, 1, 3, 8, 7, 4, 2, 7, 7, 9, 3, 1, 9, 8, 続行するには何かキー... rand() RAND_MAX+1 10 を計算する 0, 1,... 9 が同じ確率で現れる 0, 1,... 9 が同じ確率で現れない

標準ライブラリ関数を用いたプログラムの例 (4) #include <stdio.h> #include <string.h> #define mojisu 20 char s1[mojisu] = "abcdef"; char s2[mojisu]; int n; while(1) printf("%d 文字の文字列を当てよう!:", strlen(s1)); scanf("%s", s2); n = strcmp(s1, s2); if (n == 0) printf(" 正解です! n"); break; 66 文字の文字列を当てよう!:abcdee!:abcdee else if (n > 0) 辞書順でもっと後だよ!! printf(" 辞書順でもっと後だよ! n"); 6 else 6 文字の文字列を当てよう!:abcdeg!:abcdeg 辞書順でもっと前だよ printf(" 辞書順でもっと前だよ! n");!! 6 6 文字の文字列を当てよう!:abcdef!:abcdef 正解です正解です!! 続行するには何かキー......