プログラミング入門2004

第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;
提出用紙に授業への意見・感想・提案も書いて下さい