• 締切済み

変数に入る値

以下の1部のコードがあるとします。 #include<stdio.h> #define N 3 #define M 3 int main(){ float i,j,k;    ・    ・ここのプログラムは省略します。    ・ for(i=0; i<N; i++){ for(j=0; j<N; j++){ for(k=0; k<M; k++){ c[i][j] += a[i][k] * b[k][j]; }}} このようなコードがあった場合、c[i][j] += a[i][k] * b[k][j];のところで 3個目のfor文の1回目のループの時、 c[i][j] += a[i][k] * b[k][j];の[i][j]や[i][k]、[k][j]にはいる値は c[0.000000][0.000000]+=a[0.000000][0.000000]~~~~~~~~ とかんがえられるでしょうか? i,j,kはint型のほうがよいですが、確認のためfloatにしました。 意味不明な質問ですみません。 よろしくお願いします。

みんなの回答

回答No.3

>floatでプログラムをコンパイルしても正常に結果がでるのですが コンパイラが int 型に勝手に変換してるのでは? (環境がわからないので勘ですが・・・)

serumnuit
質問者

お礼

返信ありがとうございます。 環境はBorland C++ Compiler です。

noname#208124
noname#208124
回答No.2

c[(int)i][(int)j] のようにしないとVC++でもgccでもコンパイル通りませんけど それより狭いスコープでi,j,k再定義してたりしませんか

serumnuit
質問者

お礼

すみません、スコープというのはよくわかりませんが、 i,j,kを定義する場所ではすべてfloatにしても、コンパイルできました・・

回答No.1

   floatは配列の添え字に使えない。  

serumnuit
質問者

お礼

返信ありがとうございます。 調べたら、使えないとのことでした。 floatでプログラムをコンパイルしても正常に結果がでるのですが なぜでしょうか??

関連するQ&A

  • 行列の計算

    #include<stdio.h> #define N 2 #define M 3 void hyoji(float[][M]); int main(){ int i,j,k; float a[N][M] = {{2.0,2.0,2.0},{2.0,2.0,2.0}}; float b[M][M] = {{1.0,1.0,1.0},{2.0,2.0,2.0},{1.0,1.0,1.0}}; float c[N][N]; for(i=0; i<N; i++){ for(j=0; j<M; j++){ c[i][j] = 0; for(k=0; k<M; k++){ c[i][j] += a[i][k] * b[k][j]; } } } hyoji(c); return(0); } void hyoji(float x[][M]){ int i,j; for(i=0; i<N; i++){ for(j=0; j<M; j++){ printf("%4.1f ",x[i][j]); } printf("\n"); } } 以上のプログラムで 行列aと行列bをかけ合せた行列cを求めるのですが コンパイルすると 8 8 8 8 8 1 となり、正しい結果がでません。 なにが間違っているのでしょうか?? よろしくお願いします。

  • 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; }

  • 行列の積を計算するプログラムがうまくいきません

    どこが間違っているのかわかる方お願いします ・行列A,Bはファイルから読み込む ・行列A,Bの積Cの計算には関数を用いる #include<stdio.h> #define ROW 10 #define COL 10 void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m ) { int i,j,k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i][j]=0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } int main(void) { FILE *fp1,*fp2; char fname1[64],fname2[64]; int a[ROW][COL],b[ROW][COL],c[ROW][COL],n,m; int i,j,k; printf("Input file name ?"); scanf("%s",fname1); printf("Output file name ?"); scanf("%s",fname2); fp1=fopen(fname1,"r"); fp2=fopen(fname2,"w"); fscanf(fp1,"%d %d",&n,&m); MatrixProduct(a,b,c,n,m); for(i=0;i<n;i++){ for(j=0;j<n;j++){ fprintf(fp2,"%3d",c[i][j]); } fprintf(fp2,"\n"); } fclose(fp1); fclose(fp2); return(0); } fp1 3 4 1 2 3 4 2 3 4 5 3 4 5 6 1 2 3 2 3 4 3 4 5 4 5 6

  • 掃出法で連立一次方程式の解を求める

    掃出法で連立一次方程式の解を求めるプログラムを作ってみたのですが、ポインタと浮動小数点のエラーが出てしまい、実行できません。どこが間違っているのかさえ分からず困っています。訂正箇所を教えてください。宜しくお願い致します。 #include<stdio.h> #include<math.h> #include <float.h> #define N 3 #define EPSILON 1.0E-5 #define TRUE 1 #define FALSE 0 void sweep(int *flag); void swap(float *wk1,float *wk2); float a[N][N]={{ 2, 6, 3}, {-1, 5,-2}, {-2,-1, 6}}; float x[N],b[N]={6,3,14}; int flag; void main() { int i,j; for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%10.4f",a[i][j]); printf("%10.4f\n",b[i]); } flag=TRUE; sweep(&flag); if(flag==TRUE) { printf("連立方程式の解\n"); for(i=0;i=N;i++) printf("x[%d]=%10.4f\n",i+1,x[i]); } else printf("解なし\n"); } void swap(float *wk1,float *wk2) { float w; w=*wk1; *wk1=*wk2; *wk2=w; } void sweep(int *flag) { int i,j,k,ik; float ak,aik; for(k=0;k<N;k++) { ak=a[k][k]; if(fabs(ak)<=EPSILON) { ik=k+1; while((ik<N)&&(fabs(a[ik][k])<EPSILON)) ik++; if(ik<N) { for(j=k;j<N;j++) swap(&a[k][j],&a[ik][j]); swap(b[k],b[ik]); ak=a[k][k]; } else { printf("ピボットが零です\n"); *flag=FALSE; goto end; } } for(j=k;j<N;j++) a[k][j]=a[k][j]/ak; b[k]=b[k]/ak; for(i=0;i<N;i++) { if(i!=k) { aik=a[i][k]; for(j=k;j<N;j++) a[k][j]=a[i][j]-aik*a[k][j]; b[i]=b[i]-aik*b[k]; } } for(k=0;k<N;k++) x[k]=b[k]; end:; } }

  • c言語 行列のn階乗のプログラム

      1 2 -1 D= 3 0 -2   -1 1 2 の3次正方行列のn乗を計算するプログラムを作成しています。 いろいろと試してみましたがうまくいきません。 どなたか教えていただけるとうれしいです。 よろしくおねがいします。 #include <stdio.h> int main(void) { int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int s[3][3]; int m,n; int i,j,k; printf("[A]^n;n = ");scanf("%d",&n); for (m=2;m <= n;m++){ for (i=0;i<3;i++){ for (j=0;j<3;j++){ s[i][j] = 0; for(k=0;k<3;k++){ s[i][j] =s[i][j] + a[i][k] * b[k][j]; } } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ b[i][j]=s[i][j]; } } printf("%3d",s[i][j]); putchar('\n'); } return (0); }

  • サブルーチン、グローバル変数がわかりません。

    2つの行列の計算をサブルーチン関数とグローバル変数を使って行いたいのですが、サブルーチン関数を宣言する為の、プロトタイプ宣言やプロトタイプ定義や、グローバル変数など、 調べてもよく理解できません。 とりあえず、二次元配列を用いたソースコードを書いてみました。 (1)14行目と23行目からのfor文、(2)40行目と51行目と62行目からのfor文を1つにまとめて、最初のプロトタイプ宣言は void 関数(double a[LINE][COLUMN] , double b{LINE][COLUMN] , double c[LINE][COLUMN]) ; にすればいいと思うのですが、 その後は、どのようにすればいいのでしょうか? あと、scanfも使って、aとbも入力できるようにしたいです。 1 #include <stdio.h> 2 3 #define LINE 3 4 #define COLUMN 3 5 6 int main(int argc, char *argv[]) 7 { 8 double a[LINE][COLUMN] ; 9 double b[LINE][COLUMN] ; 10 double c[LINE][COLUMN] ; 11 int i ; 12 int j ; 13 14 for(i= 0;i < LINE ; i++) 15 { 16 for(j = 0 ; j<COLUMN ; j++) 17 { 18 printf("A[%d][%d]=", i+1 , j+1 ); 19 scanf("%f", &a[i][j]); 20 } 21 } 22 23 for(i =0;i < LINE ; i++) 24 { 25 for(j = 0 ; j<COLUMN ; j++) 26 { 27 printf("B[%d][%d]=", i+1 , j+1 ); 28 scanf(" %f", &b[i][j]); 29 } 30 } 31 32 for(i =0;i < LINE ; i++) 33 { 34 for(j = 0 ; j<COLUMN ; j++) 35 { 36 c[i][j] = a[i][j] + b[i][j] ; 37 } 38 } 39 40 printf("\n行列A:\n"); 41 for(i =0;i < LINE ; i++) 42 { 43 for(j = 0 ; j<COLUMN ; j++) 44 { 45 printf("%10.5f" , a[i][j]) ; 46 } 47 48 printf("\n"); 49 } 50 51 printf("\n行列B:\n"); 52 for(i= 0;i < LINE ; i++) 53 { 54 for(j = 0 ; j<COLUMN ; j++) 55 { 56 printf("%10.5f" , b[i][j]) ; 57 } 58 59 printf("\n"); 60 } 61 62 printf("\nC(和):\n"); 63 for(i= 0;i < LINE ; i++) 64 { 65 for(j = 0 ; j<COLUMN ; j++) 66 { 67 printf("%10.5f" , c[i][j]) ; 68 } 69 70 printf("\n"); 71 } 72 return 0 ; 73 }

  • 行列の行の入換え

    | -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行目しかいれかわりません。 なぜでしょうか??

  • 設定した値が意図せぬ値に

    POJ 3176の問題です。 http://poj.org/problem?id=3176 #include <iostream> #include <algorithm> #define MAX 100 using namespace std; int main() { int n; cin >> n; int line[n-1][MAX]; int num[n-1][MAX]; cin >> line[0][0]; if(n==0) { cout << 0 <<endl; return 0; } else if(n==1) { cout << line[0][0] << endl; return 0; } for (int i =1;i < n;i++) { for (int j=0;j < i+1;j++) { int x; cin >> x; line[i][j]= x; } } for (int k= 0 ; k<n;k++) { num[n-1][k]= line [n-1][k]; } for (int k= n-2; k > 0 ; k--) { for (int l=0 ; l<k+1; l++) { num[k][l] = max (num[k+1][l],num[k+1][l+1]) + line[k][l]; } } num[0][0] = max(num[1][0],num[1][1]) + line[0][0]; cout << line[0][0] <<" "<<num[0][0]<<endl; return 0; } 入力 4 3 1 3 1 2 3 1 3 4 5 出力 1 12 最後に出力でline[0][0]をするようにしているのはバグチェックのためです。 ここで僕がわからないのはどうしてline[0][0]が3で宣言し、ほかでいじっていないにも関わらず、最後に1になっているのかということです。 どなたかわかる方がいらっしゃったらよろしくお願いします。

  • doubleからfloatにすると表示が変になる

    しょうもない質問ですいません。 下記のC言語の行列積のコードでは行列の変数をdoubleとしていますが、これをfloatに全て置き換えると、printfで表示させる結果がバグってしまいます。 原因は何でしょうか? 最近ひさしぶりにC言語を触ったので、しょうもないところでつまずきました。 お願いします。 ----------------------------------------- #include <stdio.h> #include <stdlib.h> #define N 10 //N次の正方行列まで扱えるようにする void matrixmultiply(int n,double a[N][N],double b[N][N],double c[N][N]); int main(int argc, char** argv) { int i,j,n; double A[N][N],B[N][N],C[N][N]; FILE *readin1,*readin2; /*行列の値が書き込まれたファイルを開く*/ if((readin1=fopen("a.dat","r"))==NULL) { printf("a.datを開けません\n"); exit(1); } if((readin2=fopen("b.dat","r"))==NULL) { printf("b.datを開けません\n"); exit(1); } printf("行列の次数を入力してください\n"); scanf("%d",&n); printf("%d次の正方行列の掛け算を行います\n\n",n); /*ファイルから数値を読み込み、配列に代入する*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { fscanf(readin1,"%lf",&A[i][j]); fscanf(readin2,"%lf",&B[i][j]); } } matrixmultiply(n,A,B,C); //関数を呼び出し行列の掛け算を行う。 /*結果を表示する*/ printf("計算結果\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%lf ",C[i][j]); } printf("\n"); } fclose(readin1); fclose(readin2); return 0; } /*掛け算を行う行列2つと、結果を入れる行列を引数として受け取る。*/ void matrixmultiply(int n,double a[N][N],double b[N][N],double c[N][N]) { int i,j,k; /*受け取った2つの行列の掛け算を行う。*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { c[i][j]+=a[i][k]*b[k][j]; } } } }

  • 行列の和、積、乗算について(C言語)

    まだC言語の勉強を始めて1か月の初心者なのですが、みなさんにお聞きしたいことがあります。 任意の行列に対して和、積、乗算の関数を作り出力するプログラムを 作りたいのですが、試しに和の関数を作ってビルトしてみたら、 31個もエラーが出て、困っています。 ↓参考書を見ながら、自分なりに考えたプログラムです。 #include <stdio.h> typedef struct matrix{ int m; int n; double data[100][100]; } MATRIX; int main(void) { MATRIX a; MATRIX b; a.m=2; a.n=3; a.data[100][100]={{1,2,1},{2,3,3}}; b.m=2; b.n=3; b.data[100][100]={{2,3,1},{1,2,1}}; kekka=add_mat(MATRIX a,MATRIX b); printf("和:%f,kekka.data); //行列和関数 MATRIX add_mat(MATRIX a,MATRIX b){ MATRIX sum; int i,j; sum.m=a.m; sum.n=a.n; sum.data[100][100]={{0,0,0}{0,0,0}}; for(i=0;i<sum.m;i++){ for(j=0;j<sum.n;j++){ sum.data=(a.data)+(b.data); return sum; } } } return 0; } おそらく相当ダメな感じなのでしょうが、エラー文を読んでも なかなか解決できません。 ちなみに、積の関数は mul_mat(MATRIX c,MATRIX a,MATRIX b){ int i,j,k; for(i = 0; i < a.m; i++){ for(j = 0; j < b.n; j++){ for(k = 0; k < a.n; k++){ C[i][j] = C[i][j] + A[i][k] * B[k][j]; } } } という風に考えました。みなさまのお力を借りたいです。 よろしくお願いします

専門家に質問してみよう