C言語で行列を用いた場合分けの方法

このQ&Aのポイント
  • C言語で行列を用いて場合分けをする方法について困っています。
  • 具体的には、if文を使用して場合分けしたいのですがうまくいきません。
  • どなたかアドバイスをいただけないでしょうか?
回答を見る
  • ベストアンサー

C言語 行列を用いて場合分け

if分の場合分けをしたいのですが、どうもやりたいように場合分けが出来ずに困っております。アドバイスをよろしくお願いします。 int main(void){ char A[] = "A.dat"; aaa = fopen(A,"r"); for (i = 0; i < iMESH ; i++) { for (j = 0; j < jMESH ; j++) { fscanf(aaa, "%d", &AAA[i][j]); } } fclose(aaa); for( n = 0 ; n < nMESH ; n++){ for( i = 0 ; i < iMESH ; i++){ for( j = 0 ; j < jMESH ; j++){ /*ここでfprintfなどしてみるとAAA[i][j]が読み込めているのは確かめられています。*/ if(AAA[i][j]==1){ /* 読み込んだAAA[i][j]の中に1はあるのに処理を行いません。なぜでしょうか */ } } } } }

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

  • ベストアンサー
  • tsunji
  • ベストアンサー率20% (196/958)
回答No.4

配列AAAがint(short)型しか扱わないのであれば、配列の宣言をdouble型からint(short)型に変更するとかした方がいいかも。

akasatana005
質問者

お礼

ありがとうございます! 無事に読み込んでもらえました!! ウェブで調べながらとりあえず回れば次へ、、、という進め方をしてきたので基本が疎かなんですね。 非常に助かりました。 ありがとうございます。

その他の回答 (6)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.7

既にツッコミ入っていますが……。 >char s[5]; >の様に直接添え字の数(5)を書いた場合、この場合は安全に使える添え字は0~4の5つになりますが >char s[] = "TEST"; >の様に直接添え字の数を書かなかった場合、安全に使える添え字いくつからいくつまでかわかりますか。 >って事だと思いますが。 って事です。 その辺りのメモリ管理についてはプログラマの責任。って言語ですので注意を払った方がいいでしょう。 メモリ管理を失敗しても、書かれた通りに愚直に実行しますよ。 少佐「この容器(10リットルガソリン携行缶・空)にこっちの容器(20リットルガソリン携行缶・満タン)から中身を移して、向こうの部隊へ持って行ってくれ。」 軍曹「(10リットルの容器に20リットル注いだらこぼれるけど…)イエッサー!上官の命令は絶対でアリマス!」     ………あふれてガソリンまみれ。(バッファオーバーランで破壊) 軍曹「完了したであります!!」 少佐「うむ。ご苦労。 次の作業まで一服したまえ。」 軍曹「ありがとうございます!!」     …引火して火傷で重症。(破壊の結果が表面化) 少佐「さて、次の作業だが… ん?どうした?しっかり動かんか!」 みたいな。 貴方が用意した char outputfilename[]= "input.dat"; は、 sprintf(outputfilename,"out-land%03d.dat",n); で納められる容量がありますか? で……ソースは削除されたようなので、今この質問(と回答)見ている人には意味不明ですねぇ。 # 後から見た時にナレッジデータベースの役割果たせないから外部に置くのはちょっと……。

akasatana005
質問者

お礼

ご指摘ありがとうございました。 今後その辺りにも配慮しながら書いていこうと思います。 データベースとして貢献しきれないのは申し訳ないと思いつつもアップロードしっぱなしという訳にも行かなかったのでやむを得ずこういう形を取らせて頂きました。 一応型が間違っているとifが上手くいかないってことだけは後から見た人にも伝わるかと思うのでご容赦下さい・・・ 繰り返しの質問に対しても親切にありがとうございました。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.6

>添字の数ですか・・・ >全く考えておりませんでした。小規模で回せたらどんどん大きくしていこうとしか考えておりませんでしたので #5でたずねられている >char s[]="TEST"; >とした時、s[]の添字はいくつまで安全に使えると思いますか? のは、 char s[5]; の様に直接添え字の数(5)を書いた場合、この場合は安全に使える添え字は0~4の5つになりますが char s[] = "TEST"; の様に直接添え字の数を書かなかった場合、安全に使える添え字いくつからいくつまでかわかりますか。 って事だと思いますが。

akasatana005
質問者

お礼

そうだったようですね。 親切にありがとうございます。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.5

> fprintf,scanfは自分で調べて使っていたので誤った解釈をしていたかもしれません 書式で指定している形式と変数の型を確認して下さい。 %dで浮動小数点の実数が表示(数字化)出来ますか? > snprintfを代わりに使いました > 他になにかおかしなところはあるでしょうか char s[]="TEST"; とした時、s[]の添字はいくつまで安全に使えると思いますか?

akasatana005
質問者

お礼

回答有り難うございます。 変数の型ですね。確かに最初に設定したきり余りきにしておりませんでした。 以後気をつけますね。 型が違うとこんなふうにコンパイルはできるけど期待通り動いてくれないということがあるのですね。 人間とは数字の認識の仕方が違うことを改めて感じました。 添字の数ですか・・・ 全く考えておりませんでした。小規模で回せたらどんどん大きくしていこうとしか考えておりませんでしたので 64bit 実メモリ4GB のPCでやっているのでhttp://okwave.jp/qa/q4670548.htmlを見る限りだと100億ぐらいに成るのですかね

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

指摘されているscanf()の書式がおかしいのと同じ理由でfprintf()の書式がおかしいところが多数。 まぁ、吹っ飛びはしないです。 期待した動作はしませんが。

akasatana005
質問者

補足

回答ありがとうございます。 fprintf,scanfは自分で調べて使っていたので誤った解釈をしていたかもしれません。 調べなおしても今ひとつ何がおかしいのかわからないのでこちらも具体的に指摘して頂けると幸いです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

とりあえず, scanf が 1か所おかしい. あと, sprintf でオーバーランしてる.

akasatana005
質問者

補足

見て頂きありがとうございます。 今までバッファオーバーフローというものを考えたことがなかったのですが snprintfを代わりに使いました 他になにかおかしなところはあるでしょうか

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

とりあえず ・コンパイルできて同じ問題が発生するプログラム ・そのプログラムで問題が発生するデータ は出せませんか?

akasatana005
質問者

補足

お手数おかけします。 後々削除できるようにアップロード形式にはなりますがこちらです https://docs.google.com/file/d/0B7R997Q5M1dHTXhkY09vQ0gzLW8/edit?usp=sharing よろしくお願い致します

関連するQ&A

  • C言語 テキストの場合分け

    C言語プログラミングの質問です。 x1, y1, r1, distance1 x2, y2, r2, distance2 ・・・ と続くテキストを読み込み、distanceを10刻みで場合分けをするプログラムを作成しています。初心者で苦戦しているところですが、以下のサンプルの間違いをご指摘いただけませんでしょうか。 よろしくお願いいたします。 テキストの行数とdistanceの最大値は不明です。 ーーーーーーーー #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <locale.h> int main(int argc, char *argv[]) { int a,b,c,distance; int i=0; int num[200]; FILE* inifile = fopen("file.txt", "r"); if(inifile==NULL) { printf("err__file.txt is nothing!!"); return 0; } FILE* outfile = fopen("outfile.txt", "w"); if(outfile==NULL) { printf("err__outfile.txt is nothing!!"); return 0; } while (fscanf(inifile,"%d\t %d\t %d\t %d\n", &a, &b, &c, &distance) != EOF) fclose(inifile); for(int i =1; i<101; i++) { if((i-1)*10 <= distance && distance < i*10) { num[i]+=1; } } for(int i =1; i<101; i++) { fprintf(outfile, "%d\t", num[i]); } fclose(inifile); fclose(outfile); printf("Normal END\n"); return 0; }

  • c言語についての質問です

    #include<stdio.h> #define N 3 void inputAns(int *row,int *col,int data[][N]); void printAns(int ID,int data[][N]); int main(){ int row[N]={2,3,6},col[N]={8,5,3},answer[N][N]; int i,ID; printf("Input your ID number :\n"); scanf("%d",&ID);inputAns(row,col,answer); printAns(ID,answer); return(1); } void inputAns(int *row,int *col,int data[][N]){ int i,j; printf(" Input Answers of matrxi Q :\n"); for(i=0;i<N;i++){ for(j=0; j<N; j++){ printf("%2d+%2d=",row[i],col[j]); scanf("%d",&data[i][j]); } } } void printAns(int ID, int data[][N]){ FILE *fp; int i,j; fp=fopen("ans.dat","a+t"); fprintf(fp,"%d\n",ID); for(i=0; i<N; i++){ for(j=0; j<N; j++) fprintf(fp," %3d",data[i][j]); fprintf(fp,"\n"); } fclose(fp); } この百マス計算のプログラムの28行目からを書き換えて以下のような画面出力を求めたいです。 >./a.exe ID=50413001 [ 9/9 ] ID=50413002 [ 5/9 ] ID=50413003 [ 7/9 ] ID=50413004 [ 6/9 ] ID=50413005 [ 5/9 ] == correct rate === 4/5 3/5 5/5 5/5 1/5 4/5 4/5 1/5 5/5 =================== > 読み込むファイル(ans.dat)は以下のものです。 50413001 10 7 5 11 8 6 14 11 9 50413002 10 7 5 11 9 5 13 10 9 50413003 10 7 5 11 5 6 14 10 9 50413004 10 11 5 11 5 6 14 10 9 50413005 9 11 5 11 5 6 14 10 9 読み込みから集計がうまくいかず困っています。 どなたか教えてくれませんか?

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。

  • C言語でファイルを出力

    ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、 できたファイルの後に?マークがついてきます。 file = fopen("filename.txt", "w"); for(j=0; j<30; j++){ fprintf(file ,"%d.dat\n",j ); } fclose(file); file2 = fopen("filename.txt", "r"); として、ファイル名を書いたファイルをつくってから、 for(k=0; k<30; k++){ fgets(fp,sizeof(fp),file2); file_out = fopen(fp,"w"); 省略 fprintf(file_out, %e %e \n",a ,b); fclose(file_out); } fclose(file2); をして、30個のファイルを出力すると、 0.dat? 1.dat? 2.dat? . . . 29.dat? というファイルができてしまいます。 ファイルの中はしっかりできています。 なにか解決法を知っている方がおりましたら、どうか教えて下さい。

  • C言語 ファイルポインタ

    度々同じプログラムで質問させてもらっています。 #include <stdio.h> #include <time.h> #include <math.h> #define N 10 void filewrite(int i,int a[]); void main(void){ int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%10+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; filewrite(i,a); } } void filewrite(int i,int a[]){ int s; FILE *fp; fp = fopen("selection.txt","w"); if(fp == NULL)return; for(s=0;s<i;s++){ fprintf(fp,"%d,",a[s]); } fprintf(fp,"\n"); fclose(fp); } 途中経過もテキストファイルで出力したいのですが、このプログラムを実行すると最後の結果しか出力されません。 アドバイスをよろしくお願いします。

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

    どこが間違っているのかわかる方お願いします ・行列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

  • C言語のプログラムをエクセルに書き込む方法

    C言語のプログラムをエクセルに書き込みたいのですが、自分が理解していないのか、上手にできません。 前、質問(No.421727)して、教えてもらったのですがソートプログラムの実行結果もおかしい感じです。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 void filewrite(int j,int i,int a[]); void main(void){ int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%1000+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; if(j%100 == 99){ for(s=0;s<i;s++) printf("%d\t",a[s]); } filewrite(j,i,a); } } void filewrite(int j,int i,int a[]) { int s; FILE *fp; char name[15]; printf("\nfilename="); scanf("%s",name); if((fp=fopen(name,"w"))==NULL){ printf("\nCan't open the sourse file\n"); exit(1); } if(j%100 == 99){ for(s=0;s<i;s++) fprintf(fp,"%d\n",a[s]); fclose(fp); } } よろしくお願いします。

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力するのはどうやってやるのですか?教えてください。以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。これに処理時間を出力するようにしてもらいたいのですが、どうしたらいいですか?解説とソースファイルをよろしくお願いします。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; }

  • このプログラムの内容を知りたいのですが…

    /*ファイルの書き込み*/ void kyoku_write(char *file_name){ int i=0, j; FILE *write; FILE *point; write = fopen(file_name, "w"); for(j = 1; j < ONPU; j++) { fprintf(write, "%d,",kyoku[i][j]); } point = fopen("メロディ点数.txt","a"); switch(m_key){ case 1: fprintf(point,"【%d】C ***%d\n",scale,kyoku[i][0]);break; case 2: fprintf(point,"【%d】CM7 ***%d\n",scale,kyoku[i][0]);break; } for(j = 2; j < ONPU; j++) { if(kyoku[i][j] == 14 || kyoku[i][j] == 15 || kyoku[i][j] == 16) fprintf(point,"◆"); else if(kyoku[i][j] == 0) fprintf(point,"○"); else fprintf(point, "%d,",kyoku[i][j]); } fprintf(point,"\n///////////////////////////////////////////////////////////////////////////////\n"); fputs("\n", write); fclose(write); fclose(point); } このプログラムが理解できません。わかる方がいたら教えてください。お願いします。

  • C言語 セグメンテーション違反

    最大値検索法のプログラムソースを書きましたが、 実行すると、セグメンテーション違反となってしまいます。 どこがおかしいのでしょうか? 分かる方、教えてください。 宜しくお願いします。 swapのソース #include <stdio.h> void swap(int *px,int *py); int main (void) { FILE *fp; if ((fp=fopen("file.txt","rt"))==NULL){ printf("File open error.\n"); //ファイルが無い場合のエラー処理// return 0; } int i,a[10]; for(i=0;i<100;i++){ fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。// } fclose(fp); //初期データの並びの表示// for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]); /*1.ソートすべきデータの中で最大のデータを見つけ、 2.そのデータを最後のデータと入れ替える。 最大データは配列のどこにあるのか⇒maxi              その値⇒max とする。*/ //データが10個の場合 int max,maxi,j; max=a[0],maxi=0; for(i = 0;i < 9; i++){ if(a[i + 1] > max){ max = a[i + 1]; maxi = i + 1; } swap(&a[maxi],&a[9-j]); for(j=0;j<9;j++){ printf("%d \n",j); printf("i=%d\n ",i); max=a[0], maxi=0; for(i=0;i<9-j;i++){ //最大値をもつデータ探索;(カウンタ変数) max++; //最大データと探索範囲最後のデータとの入れ替え: int n; n=maxi; maxi=max; max=n; printf("maxi=%d \n ",maxi); printf("i=%d\n ",i); printf("j=%d \n",j); } } if((fp=fopen("file.txt","wt"))==NULL){ printf("File open error.\n"); return 0; } for(i=0;i<100;i++){ fprintf(fp,"%d,",a[i]); } fclose(fp); } sortのソース #include<stdio.h> void swap (int *px,int *py); void swap (int *px,int *py) { int n; n =*px; *px = *py; *py = n; }

専門家に質問してみよう