ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:初心者向け配列の処理、本に載っているコードの意味が少しわかりません。) 初心者向け配列の処理、本に載っているコードの意味が少しわかりません。 2007/08/05 19:42 このQ&Aのポイント 初心者向け配列の処理の本に載っているコードの意味がわかりません。学生の点数を読み込んで60点以上の学生の一覧を表示する処理を行っています。合格者の人数と合格者リストを格納し、合格者一覧を表示しています。 初心者向け配列の処理、本に載っているコードの意味が少しわかりません。 入門者向けの本に載っていたコードなんですが、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); } 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー theisman ベストアンサー率47% (56/119) 2007/08/05 20:06 回答No.1 succs[snum++] = i ; を、2行に分けて書くと、 succs[snum] = i ; snum++ ; になります。これでわかるかな? 質問者 お礼 2007/08/05 21:04 勉強させて頂きました。 ありがとうございます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A 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 は どれに代入するのですか?? 全くわかりません。 どうか、回答よろしくお願いします。 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言語をやっているんですが本にのっている問題に解答がなくわかりません。 問題は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); } ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 教えてください このソースの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); } わかりません!! 関数についての質問です。 以下で大文字なのはオブジェクト形式のマクロで宣言してあります。 void goukaku( int a) { int succs[NUMBER] = {0}; int snum = 0; for ( i = 0 ; i < num ; i ++ ) if ( tensu{a][i] >= GOUKAKU) succs[snum++] = i; for ( i = 0 ; i < snum ; i ++ ); printf("%2d番 (%3d点)¥n” , succs[i] + i , tensu[a][succs[i]]); } 中略 for ( i = 0 ; i < sub ; i ++ ) goukaku(i); subは教科数、numは人数、配列 tensu[SUB][NUMBER] sub , numにそれぞれ1を入れると無限ループになるのですが、どうしたらよいでしょうか?? 教えてください!! このソースの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言語が分からないので分かる方説明お願いします #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 できるだけ詳しく教えてください 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; } それとポインタ?みたいなのもよく理解できず、点数で降順にしたあとに点数を使って名前を並び替えるのかなと思うのですがそれもよくわかりません。 どなたか教えてください わかりません・・・。 100個以下の整数を読み込んで、読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムをつくりたいのですが、わかりません。 教えてください!! 実行例 整数は何個ですか:5 1 個目:65 2 個目:30 3 個目:98 4 個目:10 5 個目:54 入力された整数は 5 個で, 65 30 98 10 54 です. 最大値は 98 です. 二番目に大きい値は 65 です. ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #include<stdio.h> #define number 100 int main (void) { int i; int seisu[number]; int max; puts("整数を入力してください。"); for(i=0, i<number, i++){ printf("%2d番",i+1); scanf("%d",&seisu[i]); } max=seisu[0] for(i=1, i<number, i++){ if (seisu[i]>max) max=seisu[i]; } printf("最高点:%d\n",max); return(0); } までしかわかりません。 2番目に大きい値と‘整数は何個ですか: ‘と‘入力された整数は 個で です。‘の部分はどうすればいいのでしょうか?? 以下のプログラムについて教えてください #include<iostream.h> int main() { int i; int ninzu=0; int tensu[6]; int rakudai[6]; cout<<"6人の点数を入力!\n"; for(i=0; i<6;i++) { cout<<i+1<<"番:"; cin>>tensu[i]; if(tensu[i]<60) { rakudai[ninzu]=i; ninzu++;} } cout<<"60点未満は"<<ninzu<<"人です。\n"; for(i=0; i<ninzu; i++) cout<<rakudai[i]+1<<"番:"<<tensu[rakudai[i]]<<"点\n"; return(0); } というテストの点数が60点未満の学生の一覧表を出力するというプログラムなんですが、12行目からの rakudai[ninzu]...以降が よくわかりません。配列の数を指定するところに数字以外のものが来るというのはいったいどういうことなのでしょう?どなたか教えてください。 整数型配列と2次元文字型配列の入れ替え方 以下のプログラムを実行結果のように作りたいのですがexchange_numberの中身の書き方(配列の入れ替え方)が分らないので教えて下さい。 #include<stdio.h> #define M 10 #define N 5 void sort_score(int score_cpy[M]); int linear_search(int score_cpy[M],int key); void exchange_number(int order[M],char number[M][N]); int no; int main(void) { int i,number[M][N],score[M],score_cpy[M],order[M]; printf("人数を入力して下さい:"); scanf("%d",no); ("学生番号と平均点を入力して下さい。"); for(i=0;i<M;i++){ printf("学生番号:"); scanf("%s",&number[i][N]); printf("得点:"); scanf("%d",&score[i]); } for(i=0;i<=M;i++) score_cpy[i]=score[i]; sort_score(score_cpy); for(i=0;i<M;i++){ order[i]=linear_search(score_cpy,score[i]); } exchange_number(order,number); printf("\n\n得点の高い順に並び替えて表示します\n\n"); for(i=0;i<no;i++) printf("学生番号 :%s %d点\n",number[i],score_cpy[i]); return 0; } void sort_score(int score_cpy[M]) { int i,j,score; for(j=0;j<no-1;j++){ for(i=no-1;i>0;i--){ if(score_cpy[i-1]<score_cpy[i]){ score=score_cpy[i-1]; score_cpy[i-1]=score_cpy[i]; score_cpy[i]=score; } } } } int linear_search(int score_cpy[M],int key) { int i; for(i=0;i<no;i++){ if(score_cpy[i]==key){ return i; } } return -1; } void exchange_number(int order[M],char number[M][N]) {?} ちなみに実行結果は以下の通りです。 人数を入力して下さい:10 学生番号と平均点を入力して下さい。 学生番号:y3051 得点:85 学生番号:y3052 得点:65 学生番号:y3053 得点:75 学生番号:y3054 得点:63 学生番号:y3055 得点:95 学生番号:y3056 得点:68 学生番号:y3057 得点:80 学生番号:y3058 得点:90 学生番号:y3059 得点:83 学生番号:y3060 得点:70 得点の高い順に並び替えて表示します 学生番号:y3055 95 点 学生番号:y3058 90 点 学生番号:y3051 85 点 学生番号:y3059 83 点 学生番号:y3057 80 点 学生番号:y3053 75 点 学生番号:y3060 70 点 学生番号:y3056 68 点 学生番号:y3052 65 点 学生番号:y3054 63 点 プログラム中で間違えがありましたら指摘して頂けると幸いです。それで良いお待ちしております。 配列の使い方 今C言語入門という本で勉強中です。 配列の基本という初歩の部分ですが、教科書通り以下のように記述しているのに、うまく動きません。 環境はMacのXcode ver5で、新しいプロジェクトにてOSXのApplicationのComand Line ToolにてC言語を選択しています。 #include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... int array[5]; int i; int ans; for ( i = 0 ; i <5 ; i++){ printf("number : "); scanf(" %d\n" , &array[i]); } ans = 0; for( i=0; i<4; i++){ printf("%d + " , array[i]); ans += array[i]; } ans += array[4]; printf("%d = %d\n" , array[4] , ans); return 0; } コンソール結果 number : 1 2 number : 3 number : 4 number : 5 number : 6 1 + 2 + 3 + 4 + 5 = 15 Program ended with exit code: 0 数字を1,2,3,4,5,6の順番で入力しました。 おかしな点一つ目:2の入力の際「number:」が出力されない。 おかしな点二つ目:入力項目が一つ多い(array[4]まで、5までの入力のつもりだった) AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム for文内でscanf関数により配列に数値を格納することについて プログラミング初心者です。 よろしくお願いします。 ◎1------------------------------------ #include<stdio.h> int main(void) { int i,dt[3]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[3]=%d\n",dt[3]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("dt[3]=%d\n",dt[3]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- ◎2------------------------------------ #include<stdio.h> int main(void) { int i,dt[2]; for(i=0;i<3;++i){ printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); scanf("%d",&dt[i]); printf("i=%d\n",i); puts(""); if(dt[i]==0){ break; } } printf("dt[0]=%d\n",dt[0]); printf("dt[1]=%d\n",dt[1]); printf("dt[2]=%d\n",dt[2]); printf("i=%d\n",i); puts(""); i=1; while(1){ printf("%d ",i); if(1000<i){ break; } i*=2; } puts(""); return 0; } ---------------------------------------- 以上2つのプログラムについて疑問があります。 まず◎1については、あえて添え字のdt[3]の値を見てみようと思ったら、iの値が入っているとわかりました。 しかし、何故添え字の番号の配列にiの値が入っているのかがわかりません。 次に◎2ですが、3回目のループで、添え字の番号の配列自身に入力した数値を格納すると、iと添え字番号配列に入力した数値が入っていました。 何故このようになっているのか疑問です。 以上のような疑問があります。 添え字の番号の配列とiが何か関連があるようですがいまいちわかりません。 教えていただけると嬉しいです。 配列 配列を使って合計を計算したいんですが total[0]+=tensu[0]; total[1]+=tensu[1]; 上のように延々と一つずつ書いていくんではなく for(int i=0;i<2;i++); total[i]+=tensu[i]; 上のように一文で計算式を書いてしまいたいんですが 実行しても上手くいきません この式やっぱりおかしいんでしょうか? C++ の多次元配列なんですが int i,j; int (*p)[2][3]; int *x; int a[2][3] = {{1,2,3},{4,5,6}}; p = &a; x = &a[0][0]; for ( i = 0; i < 2; i++ ) { for ( j = 0; j < 3; j++) { printf (" %d", (*p)[i][j]); } } printf (" | "); for ( i = 0; i < 2; i++ ) { for ( j = 0; j < 3; j++) { printf (" %d", *(x + ( i * 3 + j )) ); } } printf (" | "); for ( i = 0; i < 6; i++ ) { printf (" %d", *(x + i) ); } これで大丈夫でしょか? ポインタと配列 助けてください #include <stdio.h> int main(void) { int a[5] = {1, 2, 3, 4, 0}; int i, *ptr; ptr = ######; while (*ptr != 0){ ######; ######; } for (i = 0; i < 5; i++) printf("a[%d]=%2d &a[%d]=%p\n", i, #####,i, #####); putchar('\n'); ptr = ######; for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", ####, ####); ####; } printf("\n"); return (0); } 一次元配列a[]の一番目の要素以外を0にするプログラム(ただし、最後の要素は0)を作成したいのですが、#の部分に何をあてはめたらいいかわかりません。 助けてください。 プログラミングで二番目に大きい数を表示する 指定された個数(100個以下)だけ整数を読み込んで,読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムを作成。最大となる値が複数入力された場合も正しく処理する。 このプログラムで入力した数字が全部同じ時、二番目に大きい値はありません。と表示したいのですが、どのようにしたらいいのかわかりません。教えてください。あとこのプログラムで最大値と二番目に大きい値出せたのですが、念のため問題ないか確認お願いします。 #include <stdio.h> #define NUMBER 100 /*整数の個数の上限*/ int main(void) { int i; int num; int kazu[NUMBER]; int max; int sec; printf("整数は何個ですか:"); scanf("%d", &num); puts("整数を入力してください。"); for(i = 0; i<num; i++){ printf("%3d個目:",i+1); scanf("%d", &kazu[i]); } printf("入力された整数は%d個で、\n",num); for(i=0;i<num;i++) printf("%d ",kazu[i]); printf("です。\n"); sec = max = kazu[0]; for(i=1; i<num; i++){ if(kazu[i]>max) max=kazu[i]; } for(i=0;i<num;i++){ if(kazu[i]>max){ sec=max; max=kazu[i]; }else if((max>kazu[i]) && (kazu[i]>sec)) sec=kazu[i]; } printf("最大値は%dです。 \n",max); printf("二番目に大きい値は%dです。\n", sec); return(0); } 2次元配列のポインタ 整数型行2列2の2次元配列の[1][0]は、ポインタでは3になるとおもっているのですが、ちがったでしょうか? 下記のソースでエラーが出ていて困っています。 void main() { int array[2][2] = { { 9, 9 }, { 9, 9 } }; int num=2, j,i; *(array + 3) = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { printf("%d", array[i][j]); } puts(""); } } 99 09 と表示させたいのですが、どこに間違いがあるのでしょうか? C言語課題!C言語初心者です。お願いします。 課題内容 要素数10の(0~9の順)配列Aの値を2倍して配列Bに格納して その後配列Aの値を配列Bに、配列Bの逆順を配列Aに格納し 入れ替える前と入れ替えた後の配列A,Bの値を表示するプログラム 書いてみたプログラム #include <stdio.h> int main(void) { int i; int va[10] = {0,1,2,3,4,5,6,7,8,9}; /* 初期化 */ int vb[10]; puts("入れ替え前"); puts("-----------"); for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i , va[i]); /* 入れ替え前の配列A */ } for(i=0 , i<10 , i++){ vb[10] = 2*va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え前の配列B */ } puts("入れ替え後"); puts("-----------"); for(i=0 , i<10 , i++){ vb[10] = va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え後の配列B */ } for(i = 0 , i < 5 , i++){ /* 配列Bの逆順を配列Aに格納 */ int temp = va[i]; va[i] = vb[4-i]; vb[4-i] = temp; } for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i ,va[i]); /* 入れ替え後の配列A */ } return(0); } コンパイルできません。 教えてください。お願いします。 配列にしたいのですが int i,j=0,work=0; int D[]={376,251,240,115}; int A[]={1,2,4,7,13,24,44,81,149,274}; do{ for(i=9;i>=0;i--){ work=D[j]-A[i]; if(work>=0){ D[j]=work; printf("%2d",i); } } printf("\n"); j++; }while(j<=3); これにより、出力 9 7 4 3 0 8 7 4 3 0 8 7 3 1 0 7 5 3 1 0 を得たのですが、これを int e[4][5]={{9,7,4,3,0},{8,7,4,3,0},{8,7,3,1,0},{7,5,3,1,0}}; となるように配列したいのですが、上記のプログラムをどのようにすればいいのでしょうか。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
勉強させて頂きました。 ありがとうございます。