• 締切済み

卒論

下記のプログラムなのですが、入力ファイルがテキストだと上手くいくのですが csvだとうまくいきません。 ちなみに、入力ファイル内容は          13.csv tenb 42885415 123 255 236 tenb 42885415 252 498 452 といった内容が1500行程あります。 本当に困っていますどうか助けてください。 カンマも入ってるんです。  プログラム内容(本来はファイルを3つ入力しますが文字数の関係で1つにしています) #include<stdio.h> #include<stdlib.h> #include<math.h> main() { FILE *fin,*fin2,*fin3; char n[2000][1]; double g=0,z=0,p=0,p2=0,s[2000][10],,g2=0,z2=0,r,r1,r2,r3,r4,r5,r6; int w2=0,w1=0,w=0,a=0,b=0,i=0,j=0,k=0,m=0,u=0,y=0,a2=0,b2=0,i2=0,j2=0,k2=0,m2=0,u2=0,y2=0,i3=0,j3=0,a3=0,u3=0,y3=0,flag=0; if((fin=fopen("13.csv","r"))==NULL){ printf("入力ファイルがオープンできません.\n"); exit(1); } while( flag!=1 ){ if(j2==0) { fscanf(fin,"%s,",&n[i2][j2]); if(n[i2][j2] == EOF) { flag = 1; } } else { fscanf(fin,"%lf,",&s[i2][j2]); } j2++; if(j2>=5) { j2=0; i2++; } } for(i2=0;i2<=2000;i2++){ g2=sqrt((s[i2][2]*s[i2][2])+((s[i2][3])*(s[i2][3]))+(s[i2][4]*s[i2][4])); if(g2>max2 && g2<5000) { max2=g2; a2=i2; } } //printf("%5lf",sqrt((c[a][0]*c[a][0])+(c[a][1]*c[a][1])+(c[a][2]*c[a][2]))); //printf("%d",a+1); for(k2=a2-140;k2<=a2-40;k2++) { if(sqrt((s[k2][2]*s[k2][2])+((s[k2][3])*(s[k2][3]))+(s[k2][4]*s[k2][4]))>z2) { z2=sqrt((s[k2][2]-s[0][2])*(s[k2][2]-s[0][2])+((s[k2][3]-s[0][3])*(s[k2][3]-s[0][3]))+(s[k2][4]-s[0][4])*(s[k2][4]-s[0][4])); u2=k2; } } //printf("%5lf",z); //printf("%d",k+1); for(m2=a2+7;m2<=a2+50;m2++) { if(sqrt((s[m2][2]*s[m2][2])+((s[m2][3])*(s[m2][3]))+(s[m2][4]*s[m2][4]))>p2) { p2=sqrt((s[m2][2]-s[0][2])*(s[m2][2]-s[0][2])+(s[m2][3]-s[0][3])*(s[m2][3]-s[0][3])+(s[m2][4]-s[0][4])*(s[m2][4]-s[0][4])); y2=m2; } } printf("%5lf%5lf%5lf%5d%\n",sqrt((s[a2-1][2]*s[a2-1][2])+((s[a2-1][3])*(s[a2-1][3]))+(s[a2-1][4]*s[a2-1][4])),z2,p2,m2); r=sqrt((s[a2-1][2]-s[0][2])*(s[a2-1][2]-s[0][2])+(s[a2-1][3]-s[0][3])*(s[a2-1][3]-s[0][3])+(s[a2-1][4]-s[0][4])*(s[a2-1][4]-s[0][4])); fclose(fin);

みんなの回答

回答No.3

 カンマ(,)で区切られたcsvファイルですよね? 読み込み段階でのエラーじゃないですかね。  csvはカンマで区切られているので、その内容の展開にあわせて fscanf() を書いてみてください。↓にファイル読み込みの定番プログラム例を上げておきます。なお、実際に正しく読み込まれているか面倒でも printf()で確認してから、次の for()計算に移るとより確実ですよ。 // ---- プログラム省略 ---- if((fin=fopen("13.csv","r"))==NULL) { printf("入力ファイルがオープンできません.\n"); exit(1); } i2 = 0; /* (tenb, 42885415, 123, 255, 236) 等の1行につき fscanf() を展開すること */ fscanf(fin, "%s, %lf, %lf, %lf, %lf", &n[i2][0], &s[i2][0], &s[i2][1], &s[i2][2], &s[i2][3]); //printf("%d: %s %lf %lf %lf %lf\n", i2, n[i2][0], s[i2][0], ....); while(!feof(fin)) { i2++; //if (i2 > 5) break; //←チェック用ですから確認後削除のこと fscanf(fin, "%s, %lf, %lf, %lf, %lf", &n[i2][0], &s[i2][0], &s[i2][1], &s[i2][2], &s[i2][3]); //printf("%d: %s %lf %lf %lf %lf\n", i2, n[i2][0], s[i2][0], ....); } //exit(0); for(i2=0;i2<=2000;i2++) { g2=sqrt((s[i2][2]*s[i2][2])+((s[i2][3])*(s[i2][3]))+(s[i2][4]*s[i2][4])); if(g2>max2 && g2<5000) { max2=g2; a2=i2; } } // ---- プログラム省略 ----

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

タイトルはC/C++に関係していないので、 タイトルの内容、「卒論」について回答させていただくと、 「卒論は、自らもしくは共著者とともに」作成するのが普通です。 ここで回答してくれる人を全員共著者にされるおつもりなんでしょうか? もしくは謝辞に入れるとか。 >本当に困っていますどうか助けてください。 こういった質問は、本当に困ってしまいます。 何に困っているかさっぱりわかりません。助けて下さい。 参考URL:卒業論文 http://ja.wikipedia.org/wiki/%E5%8D%92%E6%A5%AD%E8%AB%96%E6%96%87

回答No.1

何がどのようにうまくいかないのでしょうか?

関連するQ&A

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • テキストの読み込みとmalloc()についてです

    こんにちは。 二つのベクトルの次元と要素をテキストファイルから読み取ってそのベクトルの和を出したいのですがうまくいきません。 #include <stdio.h> #include <stdlib.h> double vector_sum(double *x, double *y, int n){ int i; double z[256]={0}; for(i=0;i<n;i++){ z[i] = x[i] + y[i] ; } return *z; } //ベクトル和を出す関数(のつもり)// int main(void){ int i,j,e; double *a,*b,c[256][256]; //a,bはベクトル// FILE *fp; char fname[64]; char str[256]; double z[256]; printf("二つのベクトルが書き込まれているファイル名を入力してください."); scanf("%s",fname); fp = fopen(fname,"r"); if(fp==NULL){ printf("そのようなファイルを見つけることができません。"); } while (fgets(str, 256, fp) >= 0) { i++; fgets(str, 256, fp); printf("%s",str); //テキストの読み取り// if(fgets(str,256,fp)==NULL) break; //読み取り終了時の動作// sscanf(str,"%lf", &c[i]);//c[i][0]は要素数、c[i][1以上]はベクトルの中身を指すことにする。// printf("%lf%lf%lf%lf%lf%lf%lf%lf\n",c[0][0],c[0][1],c[1][2]); if(sscanf(str,"%lf", &c[i])<1){ printf("Format error"); } } if(c[0][0]!=c[1][0]){ printf("要素数が違います。"); } a = malloc(sizeof(double) * c[0][0]); b = malloc(sizeof(double) * c[1][0]); if(a==NULL||b==NULL){ printf("記憶領域の確保に失敗しました。"); } e = c[0][0]; //要素数// for(i=0;i<=e-1;i++){ a[i]=c[0][i+1]; //ベクトルの中身のみをa,bに代入する。// b[i]=c[1][i+i]; } *z= vector_sum(a,b,e); printf("ベクトル和は{"); for(i=0;i<=e-1;i++){ printf("%lf,",z[i]); } printf("}です。"); return 0; } テキストファイルは下のものを使いました。(ファイル名はvector.txt) element: 7 { 4, 4 ,4 ,4 ,4 ,4 ,4 } element: 7 { 8, 8, 8, 8, 8, 8, 8 } 結果は 「二つのベクトル名が書き込まれているファイルを入力してください。(vector.txtを入力) element: 7 { 8, 8, 8, 8, 8, 8, 8 } 要素数が違います。記憶領域の確保に失敗しました。ベクトル和は{}です。」 と表示されてしまい、困っています。 初歩的なミスかもしれず恐縮ですがよろしければ回答お願いします。

  • 書いたプログラムの間違いを教えてください

    こんにちは。 C言語を学習し始めた者です。 「三角形の3辺を入力し、その面積を出す」という課題で、下のように書き、実行しました。 しかし、面積がいつも-0.00になってしまいます。 どの部分が間違っているか教えてください。 #include <stdio.h> #include <math.h> main() { double a,b,c,s,S; s=(a+b+c)/2; S=sqrt(s*(s-a)*(s-b)*(s-c)); printf("三角形の長さを入力:"); scanf("%lf %lf %lf",&a,&b,&c); if(s>0){ printf("面積は%.2lfです。\n",S); } else{ printf("これは三角形ではありません。\n"); } }

  • 虚数解の表示

    Ax^2+Bx+Cの形の二次関数の解を計算するプログラムです #include <stdio.h> #include <math.h> int main(void) { double a,b,c,d,x1,x2,real,image; printf("A="); scanf("%lf",&a); printf("B="); scanf("%lf",&b); printf("C="); scanf("%lf",&c); if(a==0){x1=-c/b; printf("X=%5.2lf\n",x1); } if(a!=0.0){d=sqrt(pow(b,2.0)-4*a*c); if(d<0.0){ real=(-b)/(2*a); image=sqrt(-d)/(2*a); printf("実数=%5.2lf\n",real); printf("虚数=±%lfi\n",image);} else if(fabs(d)<0.0){ x1=(-b)/(2*a); printf("X=%5.2lf\n",x1);} else if(d>0.0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("X1=%5.2lf\n",x1); printf("X2=%5.2lf\n",x2);} } return 0;} 判別式d<0、d>0、d=0で分けています 判別式dが負になるとき(虚数解の部分)はそのままではsqrtが使えないので、-dを入れてみたのですがうまくいきません どのように修正すればよいのかご教示願います よろしくお願いします

  • C++でのプログラムについての質問です

    このような二次関数の解を求めるプログラムを作成したのですが、自作関数solveをvoid solve(double, double, double)のように変更し同じ動作をするように変更したいです どのようにへんこうすればよいでしょうか #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; }

  • 空間上の四面体の体積

    C言語で空間上の四面体の体積を求めるプログラムを作りたいんですが、どうすればいいのかわかりません。 構造体を使って空間上(三次元)の4点A,B,C,Dの座標を定義するのですが。 四面体の求め方もわかりません。ヘロンの公式じゃ求められませんよね(^^; 空間上の三角形の面積を求めるプログラムを作ってみました。 少しでも参考になれば幸いです。 よろしくお願いします。 #include <stdio.h> #include <math.h> int main(void) { double AB, BC, CA, s, m; struct zahyo { double x; double y; double z; }A, B, C; scanf("%lf %lf %lf",&A.x,&A.y,&A.z); scanf("%lf %lf %lf",&B.x,&B.y,&B.z); scanf("%lf %lf %lf",&C.x,&C.y,&C.z); AB=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)+(A.z-B.z)*(A.z-B.z)); BC=sqrt((B.x-C.x)*(B.x-C.x)+(B.y-C.y)*(B.y-C.y)+(B.z-C.z)*(B.z-C.z)); CA=sqrt((C.x-A.x)*(C.x-A.x)+(C.y-A.y)*(C.y-A.y)+(C.z-A.z)*(C.z-A.z)); printf("AB=%lf\nBC=%lf\nCA=%lf\n",AB,BC,CA); s=(AB+BC+CA)/2; m=sqrt(s*(s-AB)*(s-BC)*(s-CA)); printf("m=%lf\n",m); return 0; }

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

    プログラミング初心者です if関数を使用して二次方程式の解を解くプログムを作成したのですが、この作成した関数をユーザー定義関数を使用しmain 関数の中でユーザー定義関数を呼び出すことにより、 2次方程式の解を求めるプログラムへ変更したいのですが、どのように行えばいいのか分かりません… 私が作成したプログラムはこのようなものになっています #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; } よろしくお願いいたします

  • 平均、分散を求めたときの入力エラー

    入力された10個の数字について平均、分散を求めるため素朴に書いてみました。 #include<stdio.h> int main(){ char buf[256]; double a,b,c,d,e,f,g,h,i,j,mean,variance; fgets(buf,256,stdin); sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j); if(!sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j)){ printf("数字を入力してください。\n"); }else{ mean=(a+b+c+d+e+f+g+h+i+j)/10; variance=((a-mean)*(a-mean)+(b-mean)*(b-mean)+(c-mean)*(c-mean)+(d-mean)*(d-mean)+(e-mean)*(e-mean)+(f-mean)*(f-mean)+(g-mean)*(g-mean)+(h-mean)*(h-mean)+(i-mean)*(i-mean)+(j-mean)*(j-mean))/10; printf("平均=%lf\n",mean); printf("分散=%lf\n",variance); return 0; } } 途中、数字が入力されなかったときに”数字を入力してください。” と書きたかったのですがうまくいきません。あと、10個より少なく入力したときのエラー表示もしたいのですが… 教えてください。よろしくお願いします。

  • どうしてもできない!!

    このC言語でのプログラミングがsqrtのところで常にエラーしてしまいます。どこがおかしいのか、おしえてください。 問・三角形の三辺の長さを入力し、ヘロンの公式を利用して面積を求めなさい。 #include <stdio.h> main() { double a,b,c,s,S; printf("Enter 3 numbers"); scanf("%lf %lf %lf",&a,&b,&c); s=(a+b+c)/2; S=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area = %f\n",S); } [EOF] 常に表示されるエラー (1)In fuction `main': (2)type mismatch in implicit declaration for built-in function `sqrt' (3)undefined reference to `sqrt' お願いします。

  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

専門家に質問してみよう