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

Similar documents
PowerPoint Presentation

PowerPoint Presentation

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

Microsoft PowerPoint - prog04.ppt

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

gengo1-2

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

プログラミング実習I

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

Microsoft PowerPoint - lec10.ppt

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

Microsoft Word - 3new.doc

数値計算

プログラミング基礎

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

演算増幅器

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

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

CONTENTS

gengo1-11

演習課題No12

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

Microsoft PowerPoint - 11.pptx

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

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

PowerPoint プレゼンテーション

情報処理Ⅰ演習

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

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

memo

memo

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

CプログラミングI

スライド 1

Microsoft Word - no02.doc

02: 変数と標準入出力

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

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

< F2D837C E95CF CF68A4A94C5816A2E6A>

PowerPoint プレゼンテーション

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

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

物質工学科 田中晋

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

Microsoft PowerPoint - kougi7.ppt

cp-7. 配列

講習No.12

Prog1_10th

講習No.12

PowerPoint プレゼンテーション

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

memo

02: 変数と標準入出力

Microsoft PowerPoint - prog06.ppt

Microsoft PowerPoint - kougi8.ppt

gengo1-10

‚æ4›ñ

講習No.10

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

Microsoft Word - no12.doc

02: 変数と標準入出力

kiso2-09.key

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint ppt

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

PowerPoint プレゼンテーション

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

第3回 配列とリスト

プログラミング及び演習 第1回 講義概容・実行制御

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

Microsoft PowerPoint - prog03.ppt

02: 変数と標準入出力

数値計算

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

Microsoft PowerPoint pptx

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

プログラミング実習I

第1回 プログラミング演習3 センサーアプリケーション

プログラミング基礎

プログラミング基礎

第2回講義:まとめ

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

DVIOUT

基礎プログラミング2015

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

Microsoft PowerPoint - kougi6.ppt

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

Microsoft PowerPoint - 第1回目復習_pdf用.ppt [互換モード]

Microsoft PowerPoint - kougi2.ppt

gengo1-8

C言語講座 後半

memo

C 言語講座 Vol 年 5 月 29 日 CISC

講習No.1

02: 変数と標準入出力

Microsoft PowerPoint - 09.pptx

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft Word - no103.docx

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

Transcription:

工学部 6 7 8 9 10 組 ( 奇数学籍番号 ) 担当 : 長谷川英之 情報処理演習 第 13 回 2011 年 1 月 13 日 1

本日の講義の内容 1. 配列データを main 以外の関数とやりとりする方法 2. データの型構造体, 共用体という新しいデータ型を学習します. 2

2 次元ベクトルのノルム ( 長さ ) を計算するプログラム 2 次元ベクトル a(x, y) のノルム ( 長さ )d : プログラムh13.c #include <math.h> 2 d = x + y 2 double dot(double x,double y) return(sqrt(x*x+y*y)); double x0,y0; scanf( %lf %lf,&x0,&y0); printf( vector norm=%lf n,dot(x0,y0)); 2 次元ベクトルのノルムくらいなら変数を渡しても何とかなる 3

N 次元ベクトル (N >2) のノルムを計算するプログラム N 次元ベクトル a(x 0, x 1,..., x N-1 ) のノルムd : プログラムh13-1.c #include <math.h> #define N 5 double dot(double vec[]) int i; double d=0.0; for(i=0;i<n;++i) d=d+vec[i]*vec[i]; return(sqrt(d)); int i; double vec0[n]; for(i=0;i<n;++i) scanf( %lf,&vec0[i]); d 2 2 2 = x + x1 + + xn 0... 配列を渡したいときはこのように [] を付けて定義 ( アドレス渡し, ということになる ) d 2 2 2 2 = x0 + x1 +... + xn 1 を計算 2 d = d として値を返す. i=0 から N-1 までの 5 個の値を読み込んで対応する配列要素 vec0[i] に格納. 1 printf( vector norm=%lf n,dot(vec0)); 配列を渡すときは, 配列の先頭のアドレ (&vec0[0]=vec0) を渡せば良い. 4

#define N 3 void multar(float vec[], float a) int i; for(i=0;i<n;++i) vec[i]=a*vec[i]; a=0.5; int i; float a=2.5,vec0[n]; 関数内で配列の内容を変えると main でも変更される プログラム h13-2.c for(i=0;i<n;++i) scanf( %f,&vec0[i]); printf( *** input data *** n ); printf( a=%f n,a); for(i=0;i<n;++i) printf( vec0[%d]: %f n,i,vec0[i]); multar(vec0,a); printf( *** processed data *** n ); printf( a=%f n,a); for(i=0;i<n;++i) printf( vec0[%d]: %f n,i,vec0[i]); 1 配列 vec0の各要素の値をキーボード入力 vec0=&vec0[0] = アドレス 0 1 2 3 4 5 6 7 8 メモリ内容 2. 1. 3. 2 関数 multarをmainで呼び出しvec0のアドレスを渡す. vec0=&vec0[0]=&vec[0] = アドレス 0 1 2 3 4 5 6 7 8 メモリ内容 2. 1. 3. 3 配列 vec (=vec0) の各要素をa (=2.5) 倍する. vec0=&vec0[0]=&vec[0] = アドレス 0 1 2 3 4 5 6 7 8 メモリ内容 5. 2.5 7.5 5

関数定義時 関数定義と呼び出し方のまとめ double func(int a, float *pr, double x[]) 関数の型 : 値を return で返すときは int, float, double など. 返さないきは void ( 第 9~12 回資料参照 ) 関数中で書き換えた内容を main 中でも有効にさせたいときは * を付けポインタ変数にする ( 第 12 回資料参照 ) int a0; float r; double x0[10]; 変数の内容を渡すときは * も [] も不要. 渡された変数の内容は, 関数中で変更されない ( 第 9 回資料参照 ) main 関数中での呼び出し ( コール ) 時 配列を渡したいときは,[] を付ける. アドレス渡しになる ( 第 13 回資料参照 ) それぞれの変数 配列の main 中での定義 func(a0,&r,x0) 変数 配列のアドレスを渡して, 渡した変数 配列が使用しているアドレスに関数 func 中でデータを書き込ませる main 中でも同じ場所を参照するのでrとx0[i] は書き換えられた値となる 6

データの型 ( 教科書第 9 章 ) 算術型 浮動小数点型, 整数型, 文字型 スカラ型 列挙型 ポインタ 配列 データ型 集合型 構造体型 共用体型 void型 7

文字型 char ( メモリ上のサイズ : 1 バイト ) 算術型 整数型 ( 符号つき (signed( 省略可 )), 符号なし (unsigned) がある ) short (2 バイト ) -32767~32767 (unsigned の場合 : 0~65535) int, long (4 バイト ) -21474836477~21474836477 (unsigned の場合 : 0~42949672955) 浮動小数点数型 float ( 単精度,4バイト) ±3.4 10-38 ~±3.4 10 38 double ( 倍精度,8バイト) ±1.7 10-308 ~±1.7 10 308 使い方 int unsigned long float など 8

列挙型を利用したプログラム例 enum.c 0 1 2 3 4 5 6 enum week Sun,Mon,Tue,Wed,Thu,Fri,Sat; enum week day; int i; day=sun; for(i=day;i<day+7;++i) switch(i) case 0: 値を明示しない場合は, 列挙型変数 day に Sun(= 0 を代入 ) i の値が零のときの処理 printf("sunday n"); break; case 1: printf("monday n"); break; case 2: printf("tuesday n"); break; case 3: printf("wednesday n"); break; case 4: printf("thursday n"); break; case 5: printf("friday n"); break; case 6: printf("saturday n"); break; default: break; 列挙名が week である列挙定数を定義 列挙型変数 day を定義 i を day(= 0) から day+6(= 6) まで繰り返し 実行結果 [xxx]% a.out Sunday Monday Tuesday Wednesday Thursday Friday Saturday i が 0 から 6 まで繰り返すので, 全てのケースに該当 9

列挙型を利用したプログラム例 enum.c を変更 値を指定した場合は ( 指定以降は順番に割当 ), 1 2 3 4 5 6 7 enum week Sun=1,Mon,Tue,Wed,Thu,Fri,Sat; enum week day; int i; day=sun; for(i=day;i<day+7;++i) switch(i) case 0: printf("sunday n"); break; case 1: printf("monday n"); break; case 2: printf("tuesday n"); break; case 3: printf("wednesday n"); break; case 4: printf("thursday n"); break; case 5: printf("friday n"); break; case 6: printf("saturday n"); break; default: break; Sun が 1 なので, i を day(=1) から day+6(=7) まで繰り返し 実行結果 [xxx]% a.out Monday Tuesday Wednesday Thursday Friday Saturday i は 1 から 7 まで繰り返すので, i=0 のケース ( つまり Sunday) が表示されない 10

構造体型を利用したプログラム例 struct.c struct person int id; char name[40]; long phone; ; struct person student; 構造体名 person を定義 3 つの要素を持つ ( 任意の型を要素とできる ) 構造体変数 student を定義変数 student は 3 つの要素 id, name, phone を持つ scanf( %d %s %ld,&student.id,student.name,&student.phone); int 型なので & 要 char 型配列なので long 型なので & 要 & 不要 ピリオドをつけて変数の要素を表す printf( %d %s %ld n,student.id,student.name,student.phone); 11

構造体型を利用した複素数演算 cmpstr.c struct complex double x; double y; ; struct complex conjg(struct complex z) struct complex zz; zz.x=z.x; zz.y=-z.y; 関数の型 ( 処理後に返す変数の型 ) や引数の型を, 定義した構造体の型とすることもできる. return(zz); struct complex z0,z1; z0.x=1.; z0.y=1.; z1=conjg(z0); printf( complex conjugate of z0 = %lf %lf n, z1.x,z1.y); 12

共用体型を利用したプログラム例 union.c union ic unsigned int a; unsigned short b[2]; ; union ic x; 共用体変数 x を定義 共用体名 ic を定義.2 つの要素を持つ. x.a=65535; printf( %d %d n,x.b[0],x.b[1]); 実行結果 [xxx]% a.out 65535 0 共用体の要素は, 同じメモリの場所を使用するこの例の場合, 1バイト: 2 進数 8 桁 変数 a (int: 4 バイト ) x.a=65535 の 2 進数表示 : 11111111 11111111 00000000 00000000 配列要素 b[0] (short: 2 バイト ) 配列要素 b[1] (short: 2 バイト ) 13

共用体型を利用したプログラム例 union.c union ic unsigned int a; unsigned short b[2]; ; union ic x; 共用体変数 x を定義 共用体名 ic を定義.2 つの要素を持つ. x.a=65536; printf( %d %d n,x.b[0],x.b[1]); 実行結果 [xxx]% a.out 0 1 共用体の要素は, 同じメモリの場所を使用するこの例の場合, 1バイト: 2 進数 8 桁 変数 a (int: 4 バイト ) x.a=65536 の 2 進数表示 : 00000000 00000000 10000000 00000000 配列要素 b[0] (short: 2 バイト ) 配列要素 b[1] (short: 2 バイト ) 14

課題 Q13-20110113a 以下の処理を実現するプログラムを作成して下さい. 1. 三角関数 sin(x) を 0 から 6.28 まで 0.314 刻みで計算してその結果を配列 s[i] に格納して下さい (i=0 のとき x = 0,i=1 のとき x = 0.314,i=2 のとき x = 0.628,, に対応. つまり x =0.314 i). ( 第 3 回資料 10 ページが参考になると思います ) 2. 配列 s[i], 配列 s[i] の要素数 N, 係数 a を受け取り, 配列 s[i] の要素全てを a 倍する関数 mar を作成して下さい. 係数 a の値は適当に設定して下さい. ( 本資料 5 ページが参考になると思います ) 3. a 倍する前と後の配列 s[i] を gnuplot で見られるようファイルに保存し, 確かに a 倍されていることを確認して下さい. 15

課題 Q13-20110113b 複素数 x+iy を受け取りその逆数 ( 有理化も行って下さい ) を計算して返す関数 cminv を作成して下さい. 複素数の扱いを, 本資料 12 ページのように構造体を用いて実現して下さい. また, 関数 ( サブルーチン ) のファイルと,main 関数のファイルは別にして下さい. ( プログラムのファイル名は何でも良い ) 複素数 x+iy の逆数 : 逆数を有理化したもの : 本資料 12 ページのサブルーチン内の処理を変更すれば OK です. 16