第9回[平成16年6月15日(火)]:PN04-09.ppt 配列(1) 今日の内容 1 2 3 4 5 6 構造化プログラミングの復習 配列の必要性 配列とは 配列の演習 素数を求める(教科書の例) 課題 皆さんのミニレポートから • • • • • • • • • • • • • • 今日多重ループを習ったので、しっかり覚えておきたい。 今日は早く終わったし、考える時間もあって良かったで for文あたりから分からなくなってきました。復習します。 す。多重ループだけではないけど、プログラムの全体を トレースしながら、手書きで実行すると、驚くほど理解で 途中で5分ほど休憩してほしいです。頭が疲れてややこ 把握するのが難しくなってきたので、人が作ったプログラ きるようになった。 トレースはプログラミングでは大変 しいです。 いいですね。試してみましょう。 ムでも理解できるようにしたい。 基本情報試験の午後 有効な勉強法です。プログラムを読む力もつきます。 識別子がブロック内だけで利用できるときは、ブロック内 のC言語の問題は基本的にプログラムが読めないと問 今回、インデンテーションを習って、今度からは見やすい の先頭に記述しても良いことを知ったので、識別子が多 題が解けませんので、良いプログラムをいっぱい読んで プログラムを作って提出したいと思います。 下さい。 くて分かりにくくなったときに利用したい。 有効に活用し リストを見やすくするのは大切だと思った。 プログラム て下さい。変数の有効範囲(スコープ)という考え方です。 講義でわざわざ復習の時間を設けなくても良いので、先 を見やすく書くと、間違いを発見しやすくし、良いプログ 生のPCのフォルダーに復習問題を提示してほしい。準 教科書の125頁、140頁~を見てみて下さい。 ラムが書けるようになります。 備の時間が必要ですので、ちょっと考えさせて下さい。 今日は多重ループと今までの復習をやった。今日まで 全然分からないところがいくつかあった。でも、分かるよ 分からないので復習をしっかりした。 の授業でかなり多くのことを学んだので、頭の中でしっ うに勉強したいです。 今回のは結構分かりました。 かりと整理しておきたいと思う。今日は多重ループが少 覚える事がかなり多いので、だんだんつらくなってきた 今回は大体理解できて良かった。復習をしておきたい。 し難しかったけど80%ぐらいは理解できた。 が、頑張ろうと思う。 今日は早く終わった。 全く分かりません。 復習 構造化プログラミング • 順次構造 A B • 選択構造 true 判断 ・二者択一、 複数場合分け A ・if文、switch文 false B • 繰り返し(反復)構造 ・定数回繰り返し、前判断、後判断 ・for文、while文、do-while文 どの構造も入口と出口 が一つだけ false 判断 true A 配列の必要性 • 学生10000人分の成績データを取得し、 平均点等を計算する (1)全部のデータを入力し、変数に代入する (2)そのための変数を宣言する int d1, d2, d3,..., d10000; 10000個の変数を書くのか!? ◎解決策:配列を使おう int d[10000]; と書くだけで、 d[0]~d[9999]まで、 10000個の変数を扱うことができる!!! 配列とは • 同じデータ型をたくさん集めたもの • 統一的に同じ名前で扱える変数の集まり 普通の変数 配列 int d[10000]; int a; double b; char c; a b c d[0] d[1] integer double char d[2] : : d[9999] integer 配列の宣言 要素型名 配列名[要素数]; 配列名 配列の名前(変数名) 要素数 有効添え字:0 ~ 要素数-1 例 int a[100]; a[0]~a[99] の100個の要素 要素型名 int,double,char等 配列への値の代入・参照 配列名[添字式]で配列要素(成分)を指定 各要素(成分)は、元のデータ型に従う 例:整数型配列 → 要素が整数型の配列 添字式 添字型の範囲に入った値を持つ式 例 d[51] = 21; d[n] = 100; d[k % j] = -99; d[m-1] = d[m]/d[m+1]; n, k % j, m-1, m+1の 値はすべて範 囲内でなけれ ばならない 演習 (1)要素数10個の整数型の配列dat、要素 数20個の浮動小数点型配列xを宣言せよ。 (2)for文を使って、上記の配列datに入っ ている値の合計をsumに求めよ。 変数・配列の初期化(p.92) 変数 int MaxN=100; double x=3.5; 配列の初期化(配列宣言の時に与える) int int int int int int a[6]={ b[ ]={ c[5]={ d[5]={ e[5]={ f[3]={ 2, 4, 6, 8, 10, 9} ; 0, 1, 2} ; 1, 2 } ; 0 } ; 3 } ; 0, 1, 2, 3} ; 初期化はプログラム実行時、最初の1回だけ実行 配列への入力(p.94) &配列名[添字式]で 配列要素(成分)のアドレスを指定 int a[10],i; scanf("%d",&a[6]); for (i=0;i<=9;i++) scanf("%d",&a[i]); 要素はa[0]~a[9]となる a[10]は存在しない 演習 (1)100個の整数を配列Aに入力する (2)配列Aのデータを、 偶数はそのまま、奇数は2倍して、 配列Bに移す (3)配列Bのデータの平均値(整数)を求める (4)配列Aのデータと配列Bの平均値との 差で配列Aを書き換える (5)配列Aと配列Bのデータの和で配列B を書き換える int main(void) { int n,sum,ave; /* 1:配列Aに入力 */ for (n=0; n<100; n++) ; /* 2:配列Aの値をBに代入する */ for (n=0; n<100; n++) { if ( == 0) B[n] = ; else B[n] = 2* ; } /* つづく */ 演習 (1)100個のデータを配列Aに入力する (2)配列Aのデータを、 偶数はそのまま、奇数は2倍して、 配列Bに移す (3)配列Bのデータの平均値(整数)を求める (4)配列Aのデータと配列Bの平均値との 差で配列Aを書き換える (5)配列Aと配列Bのデータの和で配列B を書き換える /* 3:配列Bの平均値を求める */ ; for (n=0; n<NUM; n++) sum = ; ave = sum/NUM; /* 4:配列Aと平均aveとの差 */ for (n=0; n<NUM; n++) A[n] = ; /* 5:配列Aと配列Bとの和を配列Bに */ for (n=0; n<NUM; n++) B[n] = ; } 値の交換(p.94-95) • 二つの変数x,y、あるいは、配列に入って いる二つの値を交換する。 x=3; y=7; x 3 y 7 x y 3 7 x=y; y=x; y=x; x=y; 素数(その1:p.104-111) List 5-15 int i, no; unsigned long cnt=0; for ( no=2; no<=1000; no++) { for ( i=2; i<no; i++) { cnt++; if ( no % i == 0 ) break; } if (no==i) printf("%d\n",no); } printf("乗除回数: %d\n",cnt); ・・・・ /* 偶数をはじめから除く */ /* 奇数のみを調べる */ for ( no=2; no<=1000; no++ ) { for ( i=2; i<no; i++ ) { cnt++; if ( no % i == 0 ) break; } if (no==i) printf("%d\n",no); } printf("乗除回数: %d\n",cnt); List 5-16,-17 int prime[500]; int ptr=0; ・・・・ /* 既得素数を配列に保存 */ prime[ptr++] = 2; prime[ptr++] = 3; for ( no=5; no<=1000; no+=2) { for ( i=1; i<ptr; i++) { cnt++; if(no % prime[i] == 0) break; } if (ptr==i) prime[ptr++]=no; } List 5-18 prime[ptr++]=2; prime[ptr++]=3; for ( no=5; no<=1000; no+=2) { int flag = 0; for ( i=1; cnt++,prime[i]*prime[i]<=no; i++) { cnt++; if(no % prime[i] == 0) { flag = 1; break; } } if ( !flag ) prime[ptr++]=no; } List 5-19 コンマ演算子(p.110) op1,op2,・・,opn →左から順に評価 (op1、op2、..、opnの順に評価する) → 式全体としてはopnの評価値となる b = 5; a a = ( a=3, b+=a, c=b*5); b 5 c for ( i=10, j=0; i>j; i--, j++) 代入式(p.98) • 代入式→変数へ値を代入する式(p.23) int k; double a=1.1, b=2.2; k = a + b; k = a + b a=k=b=3.14 代入式; → 式文 k a b 今日の課題 • 次の式の値、各変数の値を求めよ。ただ し、変数は全て整数型とする。 a=5; a+2; a=b=a+1; a=5; a=b=a+1.5; a=b=5; a=(a+2,b+3); a=2; if(a=1) b=a; else b=a; a=1; if( a==1, a==2) b=1; else b=0; a=2; if( a==1, a==2) b=1; else b=0; a=1; if( a++, (a==2)-(a=1) ) b=1; else b=0; 提出用紙に授業への意見・感想・提案も書いて下さい
© Copyright 2024 ExpyDoc