• ベストアンサー

プログラミングの間違いを…

度々の似たような発言、大変申し訳ありません。お許し下さい。 もう1つ実行が上手く出来ないプログラムがある事を忘れていました。以下のプログラムについても、まだまだ未熟な私には間違っている箇所が全く分からないので、C言語プログラミング熟練者の方々、どうか指摘して下さると有り難いです。宜しくお願い致します。 ●for文の2重ループを使い、入力された星の行数に対して、下図のような表示になるようなプログラム。なお、このプログラムでは、中のループで表示するスペースの数を変え、その後にアスタリスクを表示している。 星の行数を入力してください。 6 *  *   *    *     *      * (1)整数型変数のi,j,noを宣言する (2)“星の行数を入力して下さい。”と表示し、入力された値をnoに読み込む (3)for文により、カウンターiが1からnoまで、(4)、(6)の処理を繰り返す (4)for文により、カウンターjが1からi未満まで、(5)の処理を繰り返す (5)半角スペース1つ(“ ”)を表示する (6)半角のアスタリスクを表示し、改行する #include <stdio.h> main(void) {   int i,j,no;   printf("星の行数を入力して下さい。\n");   scanf("%d",&no);   for(i=1;i<=no;i++){     for(j=1;j<i;i++){       printf(" \n");     }     printf("*");     printf("\n");   } }

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

  • ベストアンサー
回答No.4

for(初期設定式,条件式,再設定式){文} の動作は理解していますか? (1)初期設定式を最初の1回だけ行う (2)条件式を評価して真なら(3)へ、偽なら終わり (3)forの{文}を実行する (4)再設定式を実行して(2)へ forがネストしている(forの中にforがある)場合でも、変数iとjは同じものなので、中のforでiを変更すると外のforに影響が出ます。 printfで"\n"は改行になります。ループの中でスペースを連続して表示させたいのであれば改行してはいけません。

その他の回答 (3)

回答No.3

> (5)半角スペース1つ(“ ”)を表示する >      printf(" \n"); ここがマチガイ。これでは空白と改行を出力します。

  • alphion
  • ベストアンサー率19% (27/136)
回答No.2

printf(" \n"); <==== \nは改行してしまいます。 for(j=1;j<i;i++){ <==== i++ではなくj++ 試していませんが、そんなところかと…

  • kyrsche
  • ベストアンサー率41% (7/17)
回答No.1

実行してみたところ、無限ループを起こしているようです。 ループの終了条件を確認してみてください。 期待通りの動作になるためには、上の条件の見直しを 含めて、全体で二箇所修正しました。 ループが解決したら、あとはすぐだと思います。 #なんとなく学校の課題っぽいので適当にはぐらかしてみました(^_^;;

関連するQ&A

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

  • プログラミング for文

    プログラミング for文 プログラミングの問題です。 「自然数nを入力し、以下のようなパターンが出力されるようなプログラムをfor文を使って作成せよ。」 (例:n=3のとき) % ./a.out n: 3 * ** *** *__* **_** ****** *__*__* **_**_** ********* (例:n=4のとき) % ./a.out n: 4 * ** *** **** *___* **__** ***_*** ******** *___*___* **__**__** ***_***_*** ************ *___*___*___* **__**__**__** ***_***_***_*** **************** (_で空白を表しましたが、上手く見られないかもしれません…。小さい直角三角形が下に行くにつれ1個ずつ増え、全体的にみると大きい直角三角形が見えるイメージです。) つまり、n=3なら、 * ** *** を単位として、1~3行目にはこれが1つ、4~6行目にはこれが2つ、7~9行目にはこれが3つあります。 一般に、 * ** *** … ********(←n個) を単位とし、n^2-2~n^2行目にこれがn個あるようなパターンです。 私はまず、単位パターンをプログラムしました。 #include <stdio.h> main() { ___int n, i, j; ___printf("n: "); ___scanf("%d", &n); ___for (i=1; i<=n; i++) { ______for (j=1; j<=i; j++) { _________printf("*"); ______} ______printf("\n"); ___} } (_は空白です) しかし、単位パターンを横に2個、3個と並べるプログラムが分かりません。 さらにfor文を使い、3重、4重にするのですか?どなたか教えてください。

  • プログラミングの配列で

    3*3の魔法陣を #include<stdio.h> int main(void) { int mg[3][3],i=1,j,no=3,k; j=(no+1)/2; mg[1][j]=1; for(k=2;k<=no*no;k++){ if(k%no==1) i++; else if(i==1){ i=no; j++; } else if(j==no){ i--; j=1; } else { i--; j++; } mg[i][j]=k; } for(i=1;i<=no;i++){ for(j=1;j<=no;j++) printf("%3d",mg[i][j]); printf("\n"); } return(0); } と作ってみたのですが、 if文やelse文内のi++やi=などを、 すべてfor文を使って表したい場合、 どのように変更したらいいですか? 他の部分(if文やelse文以外)をいじってもいいので、 教えてください。

  • C++ プログラミング

    連立方程式の逆行列と解を出そうとしたのですが /*n=4と定義nは元の数*/ #define n 4 int main() { /*係数マトリクスAと単位マトリクスと右辺ベクトルの定義*/ double a[n][n+5]={{4,1,3,2,1,0,0,0,23}, {1,4,3,3,0,1,0,0,30}, {5,5,10,5,0,0,1,0,65}, {4,4,2,6,0,0,0,1,42}}; double x,y; int i,j,k; /*#1ピボットの演算を行うためのループ*/ for(k=0;k<n;k++) { /*ピボット係数*/ x=a[k][k]; /*#2ピボットをにするための演算を行うためのループ*/ for(j=k;j<n+5;j++) /*ピボット行をxで割る*/ a[k][j]=a[k][j]/x; /*#3ピボット列の掃き出しを行うためのループ*/ for(i=0;i<n;i++) { /*#4iがkではないとき*/ if(i!=k) { y=a[i][k]; /*#5ピボット以外をにする演算を行うためのループ*/ for(j=k;j<n+5;j++) a[i][j]=a[i][j]-y*a[k][j]; } } } /*結果を表示*/ printf("係数マトリクスAの逆行列を表示\n"); for(i=0;i<n;i++){ for(j=4;j<n+4;j++){ printf("a[%d][%d]=%f",i+1,j-3,a[i][j]); } printf("\n"); } printf("連立方程式の解を表示\n"); for(i=0;i<n;i++) printf("x%d=%f\n",i+1,a[i][n+4]); return 0; このプログラムを打って 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(35) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(38) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(40) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(42) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(44) : error C3861: 'printf': 識別子が見つかりませんでした 1>z:\win\personal\visual studio 2008\projects\課題2.cpp(46) : fatal error C1075: 左側 中かっこ '{' に対応するものが 'z:\win\personal\visual studio 2008\projects\課題2.cpp(4)' で見つかる前に EOF が検出されました。 とエラーがでました.printfはちゃんと定義されてると思うんですが何がおかしいのでしょうか・・・?

  • このプログラムの間違いがわかりません

    独学でプログラムを勉強し始めましたのですが、どうもうまくいきません。自分ではうまく作れたと思ったのですが。。。プログラムの目的は、お互いに数値を入力していって、15を越えたら、越えた方の負けというプログラムを作ったつもりですが、どこかに間違いがあるようなので、よろしければ、皆様、どこが間違いか教えて頂けないでしょうか?(自分が始めて作ったプログラムなので、真に申し訳ないのですがループ文や自作関数を使ったプログラムであれば嬉しいです。) #include<stdio.h> int main() { int i[8],j[7],sum,a,b ; printf("1、2、3のどれかを入力しなさい。15を超えた人が負けになります。\n"); while(sum<15){ /*ループ*/ ///////////////////player Aの範囲////////////////////// printf("player A入力しなさい"); scanf("%d",&i[a]); /*数値入力*/ sum= sum+i[a]; /*現在の合計*/ printf("現在%dです。",sum); /*結果表示*/ if(sum>=15){ /*判定1*/ printf("player Aの負け!!!"); } else{ ///////////////////player Bの範囲//////////////////////// printf("player B入力しなさい。"); scanf("%d",&j[b]); /*数値入力*/ sum=sum+j[b]; /*現在の合計*/ printf("現在%dです。",sum); /*結果表示*/ if(sum>=15){ /*判定2*/ printf("player Bの負け!!!"); }else{ } } return 0; } }

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • 大学のプログラミングの課題

    大学のプログラミングの課題で、また分からないことがあるので 質問させていただきます。 3行3列の正の実数データを入力して、行列の様に出力して、 縦の合計と横の合計を求めるものなんですが、 実行例はこんな感じです 999.99以下の3行3列の正の実数データを入力してください data[0][0]の値? 350.23 data[0][1]の値? 1.0 data[0][2]の値? 503.25 ・・・ 集計の結果は次のとおりである. 350.23 1.00 503.25 : 854.48 625.00 3.14 50.27 : 678.41 999.00 750.75 0.00 : 1749.75 ================================= 1974.23 754.89 553.52 : 3282.64 私の作ったプログラムは以下の通りです。 #include <stdio.h> int main (void) { int i,j; float data[3][3]; float suma,sumb,sumsum=0; printf(" 999.99 以下の3行3列の正の実数データを入力してください\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("date[%d][%d]の値?",i,j); scanf("%f",&data[i][j]); } } printf("集計の結果は次のとおりである。\n"); for(i=0;i<3;i++) { suma=0; for(j=0;j<3;j++) { suma=suma+data[i][j]; printf("%7.2f ",data[i][j]); } printf(":"); printf("%7.2f ",suma); printf("\n"); sumsum=sumsum+suma; } printf("======================================\n"); for(j=0;j<3;j++); { sumb=0; for(i=0;i<3;i++) { sumb=sumb+data[i][j]; } printf("%7.2f ",sumb); } printf(":"); printf("%7.2f ",sumsum); printf("\n"); } 実行すると、横の合計はうまくいくのですが、 縦の合計(1974.23 754.89 553.52 と出力したいところ)が -107374・・・ と表示されてうまく行きません・・・ どこが間違っているのか分からないので 詳しく教えていただけると嬉しいです。 分かりにくくてすみません・・・(・・;)

  • C言語 for文を使った一例について

    #include<stdio.h> main () { int i ; int j ; for(i = 0 ; i<5 ; i++){ /*行数の制御部*/ for(j = 0; j<(i+1) ; j++){ /* *の制御部*/ printf("*"); } printf("\n"); } return; } このプログラムを実行すると * ** *** **** ***** が表示されます。 for(j = 0; j<(i+1) ; j++){ ↑    printf("*");} ↑ 「*」の制御部となりますが、 何故「*」が1行目で1個表示されているのに 2行目では2個表示されているのですか? 行数と「*」は同じになると思われますが。 上記の質問の回答の程宜しくお願いします。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。 一つだけでも構いません!よろしくお願いします。

  • お願いします!!!プログラミングについて。

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) printf("i=%d j=%lf\n", 1/2,1/3); (2) x = 0.5; y= 1e0/3e0; printf("x = %7.3f, y = %12.5e\n", x, y); */ (3) i = 2; j = 3; printf("%d", i==2); (4) int sum1(i){ int s = 0; return s += i; } int sum2(i){ static int s = 0; return s += i; } main(){ int s1, s2, i; for(i=1;i<=10;i++){ s1 =sum1(i); s2 = sum2(i);} printf("%d %d\n",s1,s2); } (5) int mtx[4][3] = {{1,2,3},{4,5,6},{7,8,9},{-1,-2,-3}}; int i,j,rtot,ctot[3]={0,0,0},stot=0; for(i=0,i<4,i++){ rtot = 0; for(j=0;j<3;j++){ rtot += mtx[i][j] ctot[j] += mtx[i][j]; stot += mtx[i][j]; printf("%3d ",mtx[i][j]); } printf(" %3d\n",rtot); } printf("\n"); for(j=0;j<3;j++) printf("%3d ",ctot[j]); printf(" %3d\n",rtot); この5問をプログラミングに詳しい方教えてください!切実です。。1問だけでも構いませんのでよろしくお願いします。