- 本日の作業内容
- 宿題の結果について
今回は採点対象外の提出は2件ありました.今後は注意してください.
解答用紙を使用していない b1401
学生番号と氏名が無い b1333
以下はいつものようにまず処理に問題のある解答の例です.
for(i=1;i<=1000;i++)
if(a%b==0){
a--;
b=2;
}
else
b++;
|
いろいろ考えて工夫したのだと思いますが,汎用性が無いように思えます.1000回限定とかの for 文に違和感があります.
for(i=a-1; i>=l ;i--){
k=0;
l=0;
for(j=1 ;j<=a ;j++){
if(i%j==0)
k++;
}
if(k==2){
printf("%d\n",i);
l++;
}
if(l==1)
l=a;
}
|
これと同じようなものがかなりの数ありました.最大の素数を表示するのは1回だけなので,for 文の中に printf を入れるのは感心しません.
for(i=num;i>=2;i--){
for(j=i-1;j>=2;j--){
if(i % j==0)
j = -1;
}
if(j==1){
printf(" %d.\n\n",i);
i = j;
}
}
|
if 文の中で変数 i の値をいじっているのですが,このような処理はあまり歓迎できません.
int i,num=rand()%9000+1000,num2,count=0;
printf("My student number: s134015\n\n");
for(i=(num/2)-1;i<=2;i--){
if(num%i!=0){
num2+=i;
break;
}
}
|
num2 の値が初期化されていません.オプションで初期化を確認するようにWebテキストで何度も指示していますので,確認する癖をつけてください.
for(i=1; i<=a-1; i++){
count=0;
for(j=2; j<=i-1; j++)
if(i%j==0)
count++;
if(count==0)
if(max<i)
max=i;
}
|
変数 max の値が不定です.
a = rand() % 8999 + 1000;
|
いつまで経っても乱数と剰余のわからない人がいます.
for(i=1; i<=(a-1); i++){
if((a - 1) % i == 0)
b++;
if(b == 2)
c = i;
}
|
何をしているのでしょう?
for(i=1;i<=a;i++){
for(j=2;j<=i;j++){
if(i%j==0)
num=1;
}
if(num==0){
num2=i;
}
printf("%d\n",num2);
}
|
発生した乱数の行数分,1を表示しつづけます.えらい迷惑でした.
以下はインデントの問題です.いくつかについては番号も出しましたので,自分でよく確認してください.
printf(" %d\n\n",max);
printf("----------------------------------------\n");
return(0);
}
|
上のようにどのレベルに合わせるのか,いまだにわからない人が多いようです.制御構造(if 文や for 文)の処理部分が下がるだけです.
for (i=0; i<a ; i++)
{
yakusuu=0;
for (j=2; j<=i-1; j++)
{
if(i%j == 0)
yakusuu++;
}
if(yakusuu == 0)
max = i;
}
|
最後の if 文の構造は全部位置がおかしいですね.
for(i=1; i<=num-1; i++){
k=0;
for(j=1; j<=i; j++){
if(i%j==0)
k++;
}
if(k==2)
l=i;
}
printf("%d.\n\n",l);
printf("----------------------------------------\n");
return(0);
|
上は21番ですが,字下げする幅が4文字分だったり3文字分だったりといい加減です.スペースでは無く,TABで下げればこのようなことにはなりませんが.
for(i=1;i<a;i+=1)
{
for(j=2;j<i;j++)
if(i%j==0)
j=j+i;
if(i==j)
max = i;
}
printf("The greatest prime number under %d is %d.\n\n",a,max);
printf("----------------------------------------\n\n");
|
32番.2つ目のif 文の代入の式の位置がおかしいし,その後の printf もおかしい.
for(i=2; i<num; i++){
count = 0;
for(j=2; j<=i-1; j++)
if(i%j==0)
count++;
if(count==0)
max=i;
}
|
35番.最初のfor 文の処理の位置と if 文の代入の式の位置.
printf("The greatest prime number under %d", a);
for(i=2;i<a;i++){
c=0;
for(j=2;j<=i-1;j++){
if(i%j==0)
c++;
}
if(c==0)
b=i;
}
|
41番.for 文がぐちゃぐちゃ.
printf("The greatest prime number under %d is ", a);
for(i=1; i<a; i++){
count = 0;
for(j=2; j<=i-1; j++)
if(i%j==0)
count++;
if(count==0)
b=i;
}
printf("%d", b);
printf("\n\n----------------------\n\n");
return(0);
}
|
43番.なぜ for 文が下がる?しかも,インデントの幅がまちまち.
for(i=1; i<a; i++){
count = 0;
for(j=2; j<=i-1; j++)
if(i%j==0)
count++;
if(count==0)
b=i;
}
|
46番.インデントの幅がTAB1個分だったり,2個分だったり,3個分だったり...
printf(" %d\n\n",max);
printf("-----------------------------\n");
return(0);
}
|
57番.最初の例といっしょ.
for(i=1; i<n; i++){
y = 0;
for(j=1; j<=i; j++){
if(i%j==0)
y += 1;
}
if(y==2)
s = i;
}
|
63番.if 文の中.
for(i=2; i<num; i++){
count = 0;
for(j=2; j<=i-1; j++)
if(i%j==0)
count++;
if(count==0)
max=i;
}
|
65番.count++ の位置.
for(i=1; i<num; i++){
count = 0;
for(j=2; j<=i-1; j++)
if(i%j==0)
count++;
if(count==0){
max = i;
}
}
|
70番.内側の for 文と,if 文の中の処理.
printf("The greatest prime number under %d is ",num);
for(i=1; i<num; i++){
count = 0;
for(j=2; j<=i-1; j++)
if(i%j==0)
count++;
if(count==0){
max = i;
}
}
printf("%d.\n ",max);
printf("\n----------------------\n\n");
return(0);
|
77番.for 文以降.
printf("The greatest prime number under %d is ",a);
for(i=1;i<a;i++){
count=0;
for(j=1;j<=i;j++){
if(i%j==0){
count+=1;
}
}
if(count==2){
if(i>b)
b=i;
}
}
printf("%d.\n",b);
|
1304番.好き勝手な位置に並んでいる.きちんとTABで下げて.
- 前回の復習
for 文が始まると,変数の値がループが回るたびにどのように変わっていくのか,十分に把握しておく必要があるのですが,そこをフォローするのが難しいのも事実です.そのため,変数の値の遷移をノートなどで確認していくことが重要です.例えば,以下のように考えてみましょう.
#include <stdio.h>
main()
{
int i, j;
for(i=0; i<=5; i++){ // <- loop1
for(j=0; j<i; j++) // <- loop2
printf(" ");
for(j=i; j<=i+5; j++){ // <- loop3
printf("%2d ", j);
}
printf("\n");
}
return(0);
}
|
のようなプログラムで変数 i と j がどのように変わっていくのか見てみましょう.
loop1 | loop2 | loop3 |
i | j | j |
0 | - | 0 |
1 |
2 |
3 |
4 |
5 |
1 | 0 | - |
- | 1 |
2 |
3 |
4 |
5 |
6 |
2 | 0 | - |
1 |
- | 2 |
3 |
4 |
5 |
6 |
7 |
- - - - |
5 | 0 | - |
1 |
2 |
3 |
4 |
- | 5 |
6 |
7 |
8 |
9 |
10 |
この変数の変化と実際の実行結果との対応を考えてみてください.
- 多重の for 文
前回に引き続き多重のループの練習を今日も行いますが,ループの処理の学習の
初期には変数の値がどのように変化しているのか,注意して行くと間違いに気づ
いたり,処理の無駄に気づいたりということが多いので,分からなくなってきた
ら,メモ用紙などに変数の値の遷移を書いて見直してみてください.
- 実習
実習の演習問題は当日ご案内します.
- 次回の予習範囲
教科書のp.42からp.48の while 文を予習してきてください.
- 宿題
授業の終わりに宿題の案内をします.ただし,問題を見ることができるのは9日以降です.
10.184.10.130/report/
にアクセスして問題を見てください.