C言語初心者の合格者一覧ソースコードのわからない部分について
- C言語の初心者が合格者一覧のソースコードについて不明な点があります。
- 特に、if (tensu[i] >= 60)の部分で、succs[snum++] = i;の意味が理解できません。
- 具体的には、iにどの値が代入されるのか、理解できません。回答をお願いします。
- ベストアンサー
C言語 初心者です。
この合格者一覧のソースについてわからない所があります。 詳しく教えてもらえないでしょうか? #include <stdio.h> #define NUMBER 5 /* 人数 */ int main(void) { int i; int snum = 0; int tensu[NUMBER]; int succs[NUMBER]; puts("点数を入力してください。"); for (i = 0; i <NUMBER ; i++){ printf("%2d番:", i + 1); scanf("%d",&tensu[i]); if (tensu[i] >= 60){ succs[snum++] = i; } } puts("合格者一覧"); puts("-----------"); for (i = 0; i < snum; i++) printf("%2d (%3d点)\n",succs[i] + 1, tensu[succs[i]]); return (0); } そのわからないところとは、 if (tensu[i] >= 60){ succs[snum++] = i; で、特に、succs[snum++] = i について教えてください。 私の考えでは、一回目は、 succs[1] = 0 になるのですが・・・?? それでは、おかしい気がするのです。 この i は どれに代入するのですか?? 全くわかりません。 どうか、回答よろしくお願いします。
- hatenan114
- お礼率56% (59/105)
- C・C++・C#
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1の者です。 具体的な例を使って説明してみます。 5人の点数が、順に73, 58, 60, 41, 84だとします。 くだんのif文で、合格圏かどうか(60以上かどうか)を判定します。 0人目:60以上なので、合格 succs[snum]、つまりsuccs[0]に0を代入し、snumを1増やす(1になる) 1人目:60以上でないので、不合格 2人目:60以上なので、合格 succs[snum]、つまりsuccs[1]に2を代入し、snumを1増やす(2になる) 3人目:60以上でないので、不合格 4人目:60以上なので、合格 succs[snum]、つまりsuccs[2]に4を代入し、snumを1増やす(3になる) これで、全員の合否を判定しました。 このときのsnum(つまり3)が、合格者の人数です。 また、合格者の番号はsuccs[0]~succs[2]の値、 つまり0番、2番、4番です。
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2126/6286)
> if (tensu[i] >= 60){ > succs[snum++] = i; > } i番目の人の点数が60点以上ならば その人は合格なので、 合格者のsnum番目にiを代入し、 その後、snumをインクリメントしています。
お礼
丁寧な回答有難うございます。 またよろしくお願いします。 できれば補足についてコメントしていただけたら幸いです。
補足
丁寧に解説していただき、ありがとうございます。 ということは、処理の流れなのですが、 succs[snum] = i → succs[0] snum = snum + 1 → succs[1] と理解していいのでしょうか!? もう一度、回答お願いします。
関連するQ&A
- 初心者向け配列の処理、本に載っているコードの意味が少しわかりません。
入門者向けの本に載っていたコードなんですが、1行だけ どういった処理を行っているのか理解できないところがありました。 よろしくお願いします。 /* 5人の学生の点数を読み込んで60点以上の学生の一覧を表示 */ #include <stdio.h> #define NUMBER 5 /* 人数 */ int main(void) { int i; int snum = 0; /* 合格者の人数 */ int tensu[NUMBER]; /* NUMBER人の学生の点数 */ int succs[NUMBER]; /* 合格者リスト(合格者の添字を格納) */ puts("点数を入力してください。"); for (i = 0; i < NUMBER; i++) { printf("%2d番:", i + 1); scanf("%d", &tensu[i]); if (tensu[i] >= 60) succs[snum++] = i; /*ここがどういった処理になっているのかわからないです。 */ } puts(" 合格者一覧 "); puts("------------"); for (i = 0; i < snum; i++) printf("%2d番(%3d点)\n", succs[i] + 1, tensu[succs[i]]); return (0); }
- ベストアンサー
- C・C++・C#
- C言語 初心者です。
以下のソースの中でわからないことがあります。 詳しく説明してもらえないでしょうか? よろしくお願いします。 #include <stdio.h> #define NUMBER 80 /* 人数の上限 */ int main(void) { int i,j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください。:"); do{ scanf("%d",&num); if (num < 0 || num > NUMBER) printf("\a要【1以上%d以下】:", NUMBER); }while (num > 0 || num < NUMBER); puts("点数を入力してください。"); for (i = 0; i < num; i++){ printf("%2d番:", i + 1); do { scanf("%d",&tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 【0以上100以下】:"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } 上記のソースの中の bunpu[tensu[i] / 10]++; の部分がどうなっているのかわかりません。 教えてください。
- ベストアンサー
- C・C++・C#
- C言語の問題-配列について
今、独学でC言語をやっているんですが本にのっている問題に解答がなくわかりません。 問題はbunpu[tensu[i] / 10]++;はどういう意味を表すかです。 do-while分の繰り返しがおわった後にbumpuに++があるので+1をすればいいのでしょうか?よくわかりません・・・ 学生10人の点数の分布を10点ごとに分布グラフとして表示します。 #include <stdio.h> #define NUMBER 80 int main (void) { int i,j,num; int tensu[NUMBER]; int bunpu[11] = {0}; puts("点数を入力してください"); for("i =0; i < num; i++"){ printf("%2d番",i + 1); do{ scanf("%d",&tensu[i]); if(tensu[i] < 0 || tensu[i] > 100) printf("0以上100以下"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } puts("\n 分布ぐらふ "); printf(" 100:"); for (j = 0;j < bumpu[10];j++) putchar('*') putchar('\n') for(i = 9; i>=0; i--) { printf("%3d - %3d:",i*10,i*10+9); for (j=0; j< bunpu[i];j++) putchar('*'); putchar('\n'); } return(o); }
- ベストアンサー
- C・C++・C#
- 教えてください
このソースのbunpu[tensu[i] / 10]++;がよく分からないので詳しく教えてください。 あと、 printf(" 100:"); for(j=0; j < bunpu[10]; j++) putchar('*'); putchar('\n');についても何を示しているのかわかりません。そこも詳しく教えてください。宜しくお願いします。 #include <stdio.h> #define NUMBER 80 int main(void) { int i, j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください:"); do{ scanf("%d", &num); if(num < 1 || num > NUMBER) printf("\a要 [1以上%d以下] :", NUMBER); }while (num < 1 || num > NUMBER); puts("点数を入力してください。"); for(i=0; i < num; i++) { printf("%2d番:", i+1); do{ scanf("%d", &tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 [0以上100以下] :"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } puts("\n 分布グラフ "); printf(" 100:"); for(j=0; j < bunpu[10]; j++) putchar('*'); putchar('\n'); for (i=9; i >=0; i--) { printf("%3d-%3d:", i*10, i*10+9); for (j =0; j < bunpu[i]; j++) putchar('*'); putchar('\n'); } return(0); }
- ベストアンサー
- C・C++・C#
- c言語のプログラミングについて聞きたいのですが
自分は課題で「10人分の名前と点数を入力して降順に並び替える」というプログラムを作ろうとしているのですが、なかなかうまくいきません。一応↓の形までできたのですがなぜか数字が変になります。 どうしてか教えていただけないでしょうか。 #include<stdio.h> int main(void) { int i,j; int tensu[10][3]; char namae[10][6]; for(i=0;i<10;i++){ printf("名前の入力>>"); scanf("%s",&namae[i]); printf("点数の入力>>"); scanf("%d",tensu[i]); } printf("名前 点数\n"); for(j=0;j<10;j++) { printf("%s ",&namae[j]); printf("%10d\n",tensu[j]); } return 0; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください
- 締切済み
- C・C++・C#
- C言語 最も小さい数
#include <stdio.h> #define NUMBER 5 int min_of(const int vc[ ], int no){ int i; int min=vc[0]; for(i=1;i<no;i++) if(vc[i]<min){ min=vc[i]; return(min); } } int main(void) {int a[NUMBER],i=0; for(;i<NUMBER;i++){ scanf("%d",&a[i]); } printf("%d",min_of(a,NUMBER)); return(0); } 最も小さい数を出すようにしたいのですがうまくいきません。 どこがおかしいのでしょうか? 教えてくださいm(_ _ )m
- ベストアンサー
- C・C++・C#
- C言語が分からないので分かる方説明お願いします
C言語が分からないので分かる方説明お願いします #include<stdio.h> int main(void) { int i; int tensu[5]; int sum=0; printf(”点数を入力してください。”); for(i=0;i<5;i++){ printf(”%2d番:”,i+1); scanf(”%d”,&tensu[i]); sum+=tensu[i]; } printf(”合計点:%5d¥n”,sum); printf(”平均点:%5.1f¥n”,(double)sum/5); return(0); } 実行すると 点数を入力してください。 1番:95 2番:83 3番:85 4番:63 5番:89 合計点:415 平均点:83.0 できるだけ詳しく教えてください
- 締切済み
- 情報工学
- 教えてください!!
このソースのtensu[5]={0};の意味を詳しくお願いします。宜しくお願いします。tensu[5]では、1~100の範囲で入力してください。が実行したら出てきてしまいますが、tensu[5]={0};とやるとうまくできます。そのことを知りたいです。 宜しくお願いします。 #include <stdio.h> int main(void) { int i; int tensu[5]= {0}; int sum=0; puts("点数を入力してください"); for(i=0; i<5; i++){ printf("%2d番:", i+1); do{ if(tensu[i]<0 || tensu[i]>100){ printf("0~100の範囲で入力してください。\n"); printf("%2d番:", i+1); } scanf("%d", &tensu[i]); }while(tensu[i]<0 || tensu[i]>100); sum+=tensu[i]; } putchar('\n'); for(i=0; i<5; i++) printf("%2d番: %d\n", i+1, tensu[i]); printf("合計点: %d\n", sum); printf("平均点: %f\n", (double)sum/5); return (0); }
- ベストアンサー
- C・C++・C#
- C言語の初心者です。教えてください
#include<stdio.h> #define NAME 4 void main() { char str[NAME]; int i; for (i = 0;i < NAME;i++){ scanf("%s", &str[i]); } for(i = 0; i < NAME;i++){ printf("%s\n", str[i]); } } どこか間違っているのですか?それとも何か足りないのでしょうか? お願いします。
- 締切済み
- C・C++・C#
- c言語超初心者です。教えてください
基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。(嬉) 凄くわかりやすいです。 ありがとうございます。(嬉) もう少し、教えてもらいたいのですがよろしいでしょうか? よければ、回答おねがいします。 この問題の最後の方に、 for (i = 0; i < snum; i++) printf("%2d (%3d点)\n",succs[i] + 1, tensu[succs[i]]); と、あるのですが、同じようにsuccs[i] + i と tensu[succs[i]] についても説明していただけないでしょうか? どうかよろしくお願いします。