• ベストアンサー

c言語で分からないところがあるので教えてください。

http://www9.plala.or.jp/sgwr-t/c/Q/ens06-61.html の問題がわかりません。 回答の #include <stdio.h> int main( void ) { int kekka[51]; int a, b, i; int amari; printf( "整数値を2つ入力してください " ); scanf( "%d%d", &a, &b ); if( b == 0 ){ printf( "処理終了\n" ); return 0; } printf( "%d / %d = ", a, b ); kekka[0] = a/b; for ( i = 1; i < 51;i++ ) { amari = a%b; if ( amari == 0 ) break; a = amari * 10; kekka[i] = a/b; } printf( "%d.", kekka[0] ); ここまでの部分はわかったのですが、 下の for ( a = 1; a < i; a++ ) { printf( "%d", kekka[a] ); } の部分がわかりません。 この部分は何を表わしているのか 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • ttschool
  • ベストアンサー率28% (18/64)
回答No.4

for(i=1;i<51;i++)は、配列変数kekkaに値を"格納"しています。 そして、for(a=1;a<i;a++)は、配列変数kekkaに格納した値を"表示"しているだけです。 条件式の i<51とa<iの違いは、わかっているでしょうか? a<iをa<51に変更することは、正しくないとわかるでしょうか? たぶん、わかっていると思いますが。 できる限り詳しい回答をもらわず、自身の頭を使って答えを導いてほしいです。

black3241
質問者

お礼

ありがとうございます。 無事わかりました。 a < i にするのは、iは51まで求められる前に、breakでforを抜けるので、iは31とか、1とかで終わる場合があるので、a < iでするんですよね。 for文で、あまりを一個づつ出していくということがうまく頭で認識できなかったせいでこのような問題がわからなかったのかもしれません。 紙に筆算を解いてみたら、理解できるようになりました。 本当にありがとうございました。

その他の回答 (3)

回答No.3

>for ( i = 1; i < 51;i++ )と >for ( a = 1; a < i; a++ ) >の違いがわかりません。 違い?構文的には別に違いなんてないでしょう。 多分混乱の原因は「aを使いまわしている」からでしょうね。 今、(amariである)a%b==0が得られた時点iで配列kekkaの要素数がいくつになるか確定しています。従ってiは1≦i<51のうちの「どれか」です。 for ( i = 1; i < 51;i++ )の処理が終わった時点でiはその「どれか」になるわけですね。そしてこの時点でもはやaは計算(a/bを求めるかa%bを求めるか)に使われるのが終わっているので「a自体には意味が無い」状態になっています。 そして、 for ( a = 1; a < i; a++ ) となっていますが、上限は先ほど保持した「i」です。 また、ここでaがまた使われているんで混乱してるんじゃないかな、と思うんですが、ここのaは「単なる使いまわし」です。もはや最初の設計で「a / b」とか「a % b」を求める必然性が終わってるんで、変数aを「再利用」しているだけ、です。 何ならこの部分以降のaを全てbにしてもいいですし、紛らわしいのなら、最初の変数宣言で int a, b, i, j; とでもやって for ( j = 1; j < i; j++ ) { printf( "%d", kekka[j] ); } としても良いですよ。 いずれにせよ、ここで使われているaは最初に出てきたaとは性質が別で、単に「配列要素を指し示す」インデックスとして使われているだけ、です。字面的に見て混同しないようにして下さい。

black3241
質問者

お礼

ありがとうございます。 無事にわかりました。 aが、前の部分で使われてたのに、 なぜ、ここで、もう一度使っているのだろうかと ずっと疑問に残っておりました。 forは初期化をまずはじめにする文なので、 当り前のことでした。 本当にありがとうございました。

  • ttschool
  • ベストアンサー率28% (18/64)
回答No.2

> ここまでの部分はわかったのですが、 おそらく、はっきりとは分かっていないのでしょう。 命令が「ここまでの部分」まで実行された場合の話しです。 kekka[0]には、必ず(100%)なんらかの値が入っているというのは分かりますよね? しかし、kekka[4]やkekka[10]に必ず値が入っているということを保障することはできません。 なぜだか、分かるでしょうか?

black3241
質問者

お礼

回答ありがとうございます。 if ( amari == 0 ) break; でfor文を抜けたときに、 値が入らないということではないでしょうか?

回答No.1

単に、配列a[i]の中身を順次表示していってるだけ、なのではないでしょうか。

black3241
質問者

お礼

回答ありがとうございます。 printfで表示しているのはわかるのですが、 for ( i = 1; i < 51;i++ )と for ( a = 1; a < i; a++ ) の違いがわかりません。 この文章は、 前者のだけで 表現できるのではないでしょうか? 教えてください。

関連するQ&A

  • C言語

    次のプログラムは、自然数を入力して,その約数を表示するものである。ブログラム中の0 ~に適するものを答えなさい。ただし,a%bはaをbで割ったときの会りを求める演算 である。 参考 約数とは、入カした自然数に対して,その数を割り切ることのできる整数である。 例えば、6の約数は、1, 2, 3,6となる。 #include <stdio.h> int main (void) int i, num; printf("自然数を入カしてください。"): scanf ("%d", &num); printf("%dの約数は", num) ; for (i =@;i <= num; i++) ( if (num % i @ 0) { printf ("%d,i@1): printf("です。 ¥n"): return 0; 9 この問題の@の部分に入る数字、記号を教えて欲しいのとなぜそうなるのかも教えていただきたいです(-。-;

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • C言語の、階乗を使うプログラムの問題を教えて下さい

    C言語の、このプログラムを作るのが分かる方、教えて下さい。階乗を使う問題です。 「キーボードで整数aを入力するとn!>aとなるときの最小のnを出力するプログラムを作りなさい」という問題です。 分からず苦戦しています。 nをキーボードで入力してn!を求めるには #include<stdio.h> int main(void) { int kekka,n,i; printf("n=? \n"); scanf("%d",&n); kekka=1; for(i=1;i<=n;i++) { kekka=kekka*i; } printf("%d!は%dです。\n",n,kekka); return 0; } とすればいいのは自分で作れたのですが、問題にあるn!>aのプログラムが分からず困っています。 分かる方、お願いいたします

  • C言語

    このプログラムを作りたいのですが… ??????????? 物の総数を入れてください:12 取り出す物の数を入れてください:2 12個の異なる物から2個をを取り出す組み合わせの数は66です ?????????????? ここに出てくる数字は scanfで入れます。 だいたい こんな感じだと思うのですが… ***********の部分が わかりません。 ??????????????? #include<stdio.h> int factorial(int m,int r) { ************** } int main(void) {int a,b; printf("物の総数を入れてください:") scanf("%d",&a); printf("取り出す物の数を入れてください:") scanf("%d",&b); printf("12個の異なる物から2個を取り出す組み合わせの数は%dです。\n",a,b,factorial(a,b));) ?????????????? お願いします(>_<)

  • C言語のソートの問題なんですが

    値を入力する→値を入力する度に昇順に表示する これを不の値を入力するまで続けるという プログラムを作ろうと思っているのですが #include<stdio.h> swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } main() { int i,j,k,a[100]; for(i=0;;++i)  {   scanf("%d",&a[i]);   if(a[i] < 0)    break;   for(j=i+1;;++j)    if(a[i] > a[j])     swap(&a[i],&a[j]);   for(k=0;k <= i;++k)    printf("%d ",a[k]);  }  return 0; } のように書いたのですがjを使った繰り返しの部分でa[j]に 値が無いから動かないと思うのですが どのように直せばいいか分かりません どなたか分かる方御教授お願いします

  • C言語について プログラムが動きません

    ゲームのプログラムを作りたいものです。 今、試作の途中の段階で以下のようなプログラムを作ってみたのですが、 コアダンプが表示されてうまく起動しません。 どの点を変更すればいいのか、教えてください。 使っている言語はC言語です。 よろしくお願いいたします。 #include <stdio.h> #include <string.h> struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int attack; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; char names[5][10] = {"v", "w", "x", "y", "z"}; main(){ int s = 0; int a[3]; int i; int m; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60}, }; printf("好きなモンスターを3つ選んでください\n\n"); while (s < 1){ for (i = 0; i++; i<3){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m++; m < 4) printf("%d, %s\n", m+1, monster[m].name); printf("5, %s\n\n", monster[4].name); scanf("%d", a[i]); printf("%d体目 : %s\n\n", i+1, monster[a[i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i++; i<2) printf("%d体目 : %s ", i+1, monster[a[i]-1].name); printf("3体目 : %s\n\n", monster[a[2]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &i); if(i=1) return s = 1; else return s = 0; } }

  • 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言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

  • C言語でまったくわからないところがあります。

    C言語でまったくわからないところがあります。 配列を格納して、その中の最小値をA[9]と入れ替える動作がしたいのですが、 #include<stdio.h> int main(void) { double A[10],min,tmp; int i; for(i=0;i<=9;i++) { printf("A[%d]=",i); scanf("%lf",&A[i]); } printf("\n"); min=A[0]; for(i=0;i<=9;i++) { if(A[i]<min) { min=A[i]; } } tmp=A[i]; A[i]=A[9]; A[9]=tmp; for(i=0;i<=9;i++) { printf("A[%d]=%.0lf\n",i,A[i]); } return 0; } これを実行すると、A[9]=最小値にはなるのですが、A[i]はそのまま入れ替わらないのです。 誰か、どのように直せばよいか、教えていただけないでしょうか。よろしくお願いします。

  • C言語の質問です

    以下のコードは100個までの数値を受け取り、ソートするプログラムです。 #include <stdio.h> int main(void) { int item[100]; int a, b, t; int count; /* 数値を読み込む */ printf("数をいくつ入力しますか? "); scanf("%d", &count); for(a=0; a<count; a++) scanf("%d", &item[a]); /* ここでバブルソートを使用して数値を整列させる */ for(a=1; a<count; ++a) for(b=count-1; b>=a; --b) { /* 隣接する要素を比較する */ if(item[b-1] > item[b]) { /* 要素を交換する */ t = item[b-1]; item[b-1] = item[b]; item[b] = t; } } /* 整列後のリストを表示する */ for(t=0; t<count; t++) printf("%d ", item[t]); return 0; } バブルソートする部分が分かりません。 比較、交換するコードは分かるのですが… どなたか詳しく教えていただけないでしょうか?

専門家に質問してみよう