大学のプログラミングの課題で縦の合計が正常に出力されない理由とは?

このQ&Aのポイント
  • 大学のプログラミングの課題で、3行3列の正の実数データを入力して行列のように出力し、縦の合計と横の合計を求めるプログラムを作成しました。
  • 横の合計は正常に出力されるのですが、縦の合計が-107374...と表示されてしまいます。
  • どこが間違っているのか分からず困っています。詳しい解説を教えていただけると助かります。
回答を見る
  • ベストアンサー

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

大学のプログラミングの課題で、また分からないことがあるので 質問させていただきます。 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・・・ と表示されてうまく行きません・・・ どこが間違っているのか分からないので 詳しく教えていただけると嬉しいです。 分かりにくくてすみません・・・(・・;)

noname#140177
noname#140177

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> for(j=0;j<3;j++); また、前と同じことやってますよ http://okwave.jp/qa/q6356162.html 悪癖が着く前に治しましょう。

その他の回答 (2)

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.3

#1さん、すごいですね。 蛇足: for文は、 for (j=0; j<3; j++ ) { ”ここに繰り返す命令を書く” } のですが、 for (j=0; j<3; j++ ) ; と、セミコロンを書いてしまうと、セミコロンまでの命令文を繰り返すとなってしまいます。 この例ですと、何も書かれていないので、単に j がインクリメントされ、最後には j には3が代入されるだけでループが終了します。 次の {  から、 } までは一つの命令郡になりますので、一度だけ実行されます。 今回の例では、sumb に0を代入した後、 data[0][3]、data[1][3], data[2][3]が次々に加算されます。(j=3のままなので) dataは、float data[3][3] で定義されていますので、data[?][3] は定義されていない領域(通常は不定値)になりますので、異常な値が加算されていたことになります。 なので、最初の誤記 ”;” を取れば、確実に動くでしょう。 蛇足の蛇足: cで記述する場合、インデントをちゃんと入れると見易くなります。 例: 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++); { ご参考に。

noname#140177
質問者

お礼

ありがとうございます 単純なケアレスミスですね もっと気をつけます(^^;)

回答No.1

printf("======================================\n"); のすぐ下にある, for(j=0;j<3;j++); の行末にある";"を削除

noname#140177
質問者

お礼

ありがとうございます しょうもないミスでした(^^;) 無事に解決しました!!

関連するQ&A

  • 大学のプログラミング課題について

    大学でプログラミングの課題が出たのですが、よくわからないので 詳しく教えてほしいです。 問題 99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に,またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ 実行結果は 99文字以下の文字列を入力してください.abcABC123sDFgh#"x32YY= 変換された文字列はABCabc***SdfGH**X**yy*です. というようになるはずなのですが、うまくいきません。 私が考えたのは #include <stdio.h> int main(void) { int i,j; char t[100],u; printf("99文字以下の文字列を入力してください"); scanf("%s",t); printf("変換された文字列は"); for(i=0;t[i]>0;i++); { } for(j=0;j<=i;j++); { if(t[j]>=65 && t[j]<=90) { u=t[j]+32; printf("%c",u); } else if(t[j]>=97 && t[j]<=122) { u=t[j]-32; printf("%c",u); } else { u='*'; printf("%c",u); } } printf("です\n"); } というものです。 ちなみに、他のライブラリ関数は使わないで作らないといけません。 どこが間違っているのかも含めて 教えていただけると嬉しいです。

  • プログラミングの課題で困ってます。

    正弦関数x=sintのグラフを■で描きなさい(31行程度で)。数値xに対する■の数はウインド各行に表示される しきれる範囲内で任意に定めてよい。 という課題が出ました。よくわからなくて困っています。 下記に書いてるプログラミングを参考に答えを教えていただきたいと思い、質問させていただきました。よろしくお願いします。 また、下記を参考にしなくてもよいです。 プログラミングはvisual C++ 2008を使ってます。 #include "stdafx.h" #include<stdio.h> #include<math.h> int _tmain(int argc, _TCHAR* argv[]) { double x[100]; int i , j; for(i=0; i<31; i++){ x[i]=sin(0.1*i); } // for(j=0; j<31; j++){ // printf("%lf\n",y[j]); // } for(i=0; i<31; i++){ for(j=0; j<x[i]*20; j++){ printf("■"); } printf("\n"); } return 0; }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • Linuxプログラミングについて

     今回初めてLinuxでプログラム作成をしているのですが、どうもわからない 現象がでてしまい困っています。なにが悪いのかわかりません。  めちゃ困っています。助けて下さい。宜しくお願い致します。 (サンプルプログラム) #include <stdio.h> main(){ float float_data ; float float_data1 ; float float_data2 ; float RuisekiSum ; printf("\n") ; float_data = 0.1 ; float_data1 = 1.1 ; float_data2 = 0.01 ; RuisekiSum = float_data1 * float_data2 ; printf(" data → float1( %f. %e )\n" , float_data1,float_data1 ) ; printf(" float2( %f, %e )\n" , float_data2,float_data2 ) ; printf(" RuisekiSum = float_data1 * float_data2\n" ) ; printf(" = 0x%x( %f , %e )\n" , RuisekiSum, RuisekiSum, RuisekiSum ) ; printf("\n") ; exit(0) ; } (実行結果) data → float1( 1.100000. 1.100000e+00 ) float2( 0.010000, 1.000000e-02 ) RuisekiSum = float_data1 * float_data2 = 0x0( 0.000000 , 5.265658e-315 ) 何が悪いのでしょうか? 恥ずかしいながら宜しくお願い致します。

  • C言語プログラミングの問題がわかりません・・・。

    ただいまC言語を勉強している者です。 【入力するデータ数と各データ(整数)を入力していき,0 以下の整数の数,正の整数の数,0 以下の整数の合計,正の整数の合計を求めるプログラムを作成せよ。】 という問題があり、とりあえず #include "stdio.h" void main() { int i,j,k,l=0,m=0,goukeisei=0,goukeifu=0; printf("入力するデータ数:"); scanf("%d",&i); for(j=1;j<=i;j++); { printf("データを入力してください(整数):"); scanf("%d",&k); if(k>0){ l++; goukeisei+=k; }else{ m++; goukeifu+=k; } } printf("正の整数の数%d\n",l); printf("0以下の整数の数%d\n",m); printf("正の整数の合計%d\n",goukeisei); printf("0以下の整数の合計%d\n",goukeifu); } と作ってみたのですが、入力するデータ数の繰り返しがされません(1回入力して終わりになってしまいます);; for文の使い方が間違っているのでしょうか・・・ 詳しい方教えてくださいm( _ _ )m 尚環境はXPでVC++2008を使っています。よろしくお願いします。

  • C言語、putcharについて

    C言語で、 int i,j; for (i=1;i<=9;i++) { for (j=1;j<=9;j++) printf("%d",i*j); putchar('¥n'); を実行すると   1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 となります。 しかし、4行目をprintf("%d",i*j); にかえてputchar('¥n')をなくすと、すべての値が同じ列になってしまいます これはどういうことでしょうか??

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

    C言語のプログラミングで質問です. 時間を測ろうと下記のようなプログラムをしてみましたが計測時間がoTime, nTime共に0.000になってしまいます.(winmm.libはリンクさせてます) おかしいところはどこでしょうか? #include<stdio.h> #include<time.h> #include<windows.h> #include<mmsystem.h> #include<stdlib.h> #define N 2048 #define M 32 int main(int argc, char* argv[]) {   int i, j, k, l;   float target = 0;   float* a;   float* b;   float c;   DWORD nTime, oTime;     a = (float*)malloc(sizeof(float)*N);   b = (float*)malloc(sizeof(float)*N);   c = 0;   for(i = 0; i < N; i++)   {     a[i] = 1000;     b[i] = 0;   }  oTime = timeGetTime();   for(i = 0; i < M; i++)   {    for(j = 1; j < N/M; j += j)    {      for(k = 0; k < N/M; k++)      {        if(k % 2 == 0)        {          a[k+i*N/M] += a[k+j+i*N/M];        }      }    }    b[i] = a[i*N/M];    printf("%f\n", a[i*N/M]);   }   for(i = 0; i < M; i++)   {     target += b[i];   }   c = target;   nTime = timeGetTime();   printf("%f\n%f\n%f", c, oTime, nTime);   getch();   return 0; }

  • 行列の行の入換え

    | -1 -1 -2 -1 10 | | -1 -2 -1 10 -1 | | -2 -1 10 -1 -1 | | -1 10 -1 -1 -2 | | 10 -1 -1 -2 -1 | この行列を次の順序で並び替えたいのですが 1.第1列にある要素の中で絶対値の最大値がある行を探し,その行と第1行を入れ換える. 2.第2列にある要素の中で絶対値の最大値がある行を第2行以下から探し,その行と第2行を入れ換える. 3.これを左上から右下へ順次移動して,行の入れ換えを行う. #include<stdio.h> #include<math.h> #define N 5 #define M 5 int main(){ float a[N][M]={{-1.0,-1.0,-2.0,-1.0,10.0},{-1.0,-2.0,-1.0,10.0,-1.0},{-2.0,-1.0,10.0,-1.0,-1.0}, {-1.0,10.0,-1.0,-1.0,-2.0},{10.0,-1.0,-1.0,-2.0,-1.0}}; float nmax; int i,j,k=0,s,imax; for(j=0; j<M; j++){ nmax = a[0][j]; imax = 0; for(i=1; i<N; i++){ if(fabs(nmax) < fabs(a[i][j])){ nmax = a[i][j]; imax = i; } } for(j=0; j<M; j++){ s=a[k][j]; a[k][j]=a[imax][j]; a[imax][j]=s; } k++; } for(i=0; i<N; i++){ for(j=0; j<M; j++){ printf("%5.1f ",a[i][j]); } printf("\n"); } return(0); } このように作成したのですが、1行目と5行目しかいれかわりません。 なぜでしょうか??

  • 二次配列

    3×2 行列の要素(float)をキーボードから入力し,画面表示するプログラムを作成したいのですが 配列名をmatrixとして #include <stdio.h> int main(void){ int i, j; float matrix[3][2]; for ( i = 0; i < 3; i++ ){ printf("列入力:"); scanf("%f",matrix[i]); } for ( j = 0; j < 2; j++ ){ printf("行入力:"); scanf("%f",matrix[i]); }   for( i = 0; i < 3; i++ ){ for(j = 0; j < 2; j++ ){ printf("matrix[%d][%d] = %f\n",i+1,j+1,matrix[j][i]); } } getchar(); getchar(); return(0); } としたのですが・・・・・・一部が正しく表示されません。 さらにビジュアルスタジオ.net2003でコンパイルすると。実行結果の最後にエンターキーを押すとエラーが発生してしまうのですが・・・・。 どのようにすればいいのでしょうか?

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

    お願いします!!!プログラミングについて。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”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問をプログラミングに詳しい方教えてください!切実です。。 一つだけでも構いません!よろしくお願いします。

専門家に質問してみよう