• 締切済み

教えてください

読み込んだ整数を例えば、3322だとしたら、0は0個、1は0個、2は2個、3は2個、4は0個、5は0個、6は0個、7は0個、8は0個、9は0個。のようにするプログラムを配列を用いて表示するのですが、下のプラグラムではできません。教えてください。宜しくお願いします。これは途中からです。 printf("整数を入力してください。"); scanf("%d", &num); do{ num=num / 10; kansu[i]=num % 10; }while (num > 0); for(j=0; j<10; j++) printf("%d個は%dです。\n",j, kansu[i]); return (0); }

みんなの回答

  • seiuchi4
  • ベストアンサー率37% (71/189)
回答No.2

#1です。補足します。 for(i=0; i<10; i++) kansu[i]=0; これは、kansu[0]からkansu[9]までの10個の配列に0を入れています。 do{ }while(num>0); は、jjjj27さんと同じですのでいいですよね? kansu[num % 10]++; num%10で、最下位桁の0から9の数値を求めます。 最下位桁が 2 だった場合、変数kansu[2]を+1します。 要は、最下位桁が2だった場合、kansu[]の[2]を+1することになります。 kansu[num%10]=kansu[num%10]+1と同じです。 num /= 10; は、 num = num / 10; と同じで、1桁小さい整数を求めています。 例えば numが123だったら、12になる。 現在の2桁目を次のループで1桁目にする処理です。 10個の箱があって、それぞれの箱に0から9の番号が振ってあって、 最下位から順に数値を検査して、対象の箱にボールを1つづつ入れていく。 数値の検査が終わったら、0から順にボールの数を表示していく。 そんなイメージでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • seiuchi4
  • ベストアンサー率37% (71/189)
回答No.1

LightCにて確認しました。 jjjj27さんのソースでは do{ num=num / 10; kansu[i]=num % 10; }while (num > 0); で結果を入れる場所が不定ですね。 なお、下記ソースでは最大32767までの入力となります (intが16bitの場合) int i; int num,kansu[10]; printf("整数を入力してください。"); scanf("%d", &num); for(i=0; i<10; i++) kansu[i]=0; do{ kansu[num % 10]++; num /= 10; }while(num>0); for(i=0; i<10; i++) printf("%dは%d個です。\n",i, kansu[i]);

jjjj27
質問者

補足

for(i=0; i<10; i++) kansu[i]=0; do{ kansu[num % 10]++; num /= 10; }while(num>0); このソースがいまいち分かりません。詳しく説明してください。お願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 教えてください!!

    例えば、3455という整数をscanfを使って入力されました。それを、配列を使って0は0個、1は0個、 2は0個、3は1個、4は1個、5は2個、6は0個、7は0個、8は0個、9は0個のようにしたいのですが分かりません。自分で考えたソースです。 printf("非負の整数を入力してください :"); scanf("%d", &num);                 do{ i=num % 10; num=num / 10; kansu[i]=i; }while (num>0); for(i=0; i<10; i++) printf("%d個は%dです。\n",i, kansu[i]); return (0); } 詳しくどこが駄目でどうすればできるか教えてください。宜しくお願いします。

  • 困っています

    このプログラムを以下に示す所を関数化し、該当する部分を関数呼び出すようにします。  1 非負の整数が入力されたかチェックする関数(非負は0、負は1を返す) 2非負の整数を読み込む関数 3渡された整数の1の位を返す関数 4アスタリスクを表示する関数 です。 全然分からないので詳しく教えてください。 お願いします。 int main(void) { int i; int num,kansu[10]; printf("整数を入力してください。"); scanf("%d", &num); for(i=0; i<10; i++) kansu[i]=0; do{ kansu[num % 10]++; num /= 10; }while(num>0); for (i=0; i <10; i++) { printf("%d",i); for (j =0; j < kazu[i]; j++) putchar('*'); putchar('\n'); } return(0); }

  • 困っています

    このプログラムを以下に示す所を関数化し、該当する部分を関数呼び出すようにします。  1 非負の整数が入力されたかチェックする関数(非負は0、負は1を返す) 2非負の整数を読み込む関数 3渡された整数の1の位を返す関数 4アスタリスクを表示する関数 です。 自分では、1は、 int isNotMinus(int n){ return (n < 0) ? 1 : 0 ; } だと思うのですが、2,3,4が分かりません。この 作った関数をmain関数で呼ぶときどうやるかも教えてください。宜しくお願いします。 int main(void) { int i; int num,kansu[10]; printf("整数を入力してください。"); scanf("%d", &num); for(i=0; i<10; i++) kansu[i]=0; do{ kansu[num % 10]++; num /= 10; }while(num>0); for (i=0; i <10; i++) { printf("%d",i); for (j =0; j < kazu[i]; j++) putchar('*'); putchar('\n'); } return(0); }

  • 最大値を求める

    3つの整数を入力して、最大値を求めるプログラムを作りたいのですが、整数を入力するところまでは うまくいくのですが、結果が、255、と出てしまいます。どこがおかしいのかが解かりません。 どなたか教えていただけませんか? 宜しくお願いします。 #include <stdio.h> int main(void) { int num[3]; int max, i, j; puts("三つの整数を入力してください"); for(i = 0; i < 3; ++i) { printf("整数%d:", (i + 1)); scanf("%d", &num[i]); } max = num[0]; for(j = 0; j < 3; ++j) { if(max < num[j]) { max = num[j]; } } printf("最大値は%dです。\n", max); return 0; }

  • C言語初心者です。次の問題で質問です。

    (問題) 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値表示するプログラムを作成せよ。 (自分の解答) #include <stdio.h> int main(void) { int num1,num2; int sum=0; do { printf("整数1>整数2となる整数をそれぞれ入力してください\n"); printf("整数1:"); scanf("%d",&num1); printf("整数2:"); scanf("%d",&num2); if (num1 < num2) printf("整数1>整数2としてください\n"); } while (num1 < num2); printf("%d以上%d以下の全整数の和は",num2,num1); for (num2;num2 <= num1;num2++) { sum=sum+num2; } printf("%dです。",sum); return 0; } これでも一応正しく実行されるのですが、ごちゃごちゃしてるので簡潔に書けないでしょうか? 回答お願いします。

  • 教えてください

    このソースの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); }

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • C言語をお願いします

    何が違うのか教えてください。 segmentation faultになります。 よく分からないので、プログラムを作っていただければ、助かります。 問 整数を入力し、降順並び変えてに表示。 ・入力した整数は配列に入れ、その配列を使って並び変える(入力終りの印は 1000 とする)。 ・入力する整数の個数は #define NUM 100 を使いなさい。 ・使うデータは、下記の例のように、キーボードから入力すること。 #include<stdio.h> #define NUM 100 int main(void){ int d[NUM]; int temp; int i,j,n; printf("Input scores.\n"); for(i=0; i<NUM && d[i]!=1000; i++){ scanf("%d",&d[i]); } n = i; for(i = 0; i < n; i++){ for(j = i + 1; j < n;j++){ if(d[j] > d[i]){ temp = d[i]; d[j] = d[i]; d[i] = temp; } } } printf("After sort."); for(i=0; i < n; i++){ printf("%d\n",d[i]); } return 0; } 実行例 Input scores. 60 30 45 90 100 0 1000 After sort. 100 90 60 45 30 0 よろしければ 問2 並び変えをする部分を mysort 関数にしたプログラムを作ってください。 main 関数から mysort 関数には点数の個数と sort 前の配列を渡し、並び変え結果の表示はmain 関数でお願いします。 (問題の意味が分かりません) 関数はさっぱり分かりません。 では、お願い致します。

  • ループ

    #include<stdio.h> int main(void) { int i=1,sum=0; int num=1; while(num>0) { printf("整数を入力してください。(マイナスの値で終了)\n"); scanf("%d",&num); printf("%dが入力されました。(%d番目の繰り返しです)\n",num,i); sum+=i; printf("1から%dまでをたすと%dです。\n",i,sum); i++; } printf("繰り返しが終わりました。\n"); printf("加算値は%dです。\n",sum); printf("%d回繰り返しました。\n",i); return 0; } このプログラムで101以上の数値は加算しないようにするにはどうすればいいですか。

  • C言語初心者です。次のプログラムを簡潔にしたいです

    二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成せよ。 自分のプログラムは以下の通りです。 #include <stdio.h> int main(void) { int num1,num2,small,big,sum=0; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d",&num1); printf("整数B:"); scanf("%d",&num2); small=(num1 > num2) ? num2 : num1; big=(num1 > num2) ? num1 : num2; printf("%d以上%d以下の全整数の和は",small,big); if (num1 < num2) { do { sum+=num1; num1++; }while (num1 <= num2); } else { do { sum+=num2; num2++; }while (num2 <= num1); } printf("%dです。",sum); return 0; } 結果は正しく表示されるはずです。 しかし多変数かつループ文を組み合わせているため、長ったらしくなっています。 どのようなプログラミングならば、簡潔にかけますか? 解答がないので困っています。

専門家に質問してみよう