C言語でキーボードから整数と実数を入力し、Sの値を求めるプログラムを作成

このQ&Aのポイント
  • C言語で、キーボードから整数と実数を入力し、S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1の値を求めるプログラムを作成した。
  • プログラムは正常に動作し、入力した整数と実数を使用してSの値を計算することができる。
  • 作成したプログラムは正確な結果を返すため、正しい処理が行われていると言える。
回答を見る
  • ベストアンサー

プログラムの作成

Cで、キ-ボ-ドから整数を1個(mとする)、実数を1個(xとする)それぞれ入力し、 S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1 の値を求めるプログラムを作ってみたのですが、あってるかどうかわかりますか? #include<stdio.h> #include<math.h> main() { double y=0; int i,m,x; printf(\" Input m: \") scanf(\"%lf\", &m); printf(\" Input x: \") scanf(\"%lf\", &x); for(i=0; i <= m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1) } printf(\" S = %d\n\", y) }

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

  • ベストアンサー
noname#119918
noname#119918
回答No.5

>論理的なエラーについては修正をしていません。悪しからず。 記述が悪かったようですが、私の気づいた範囲では、 これ以上、間違いは無いように思います。 不安でしたら、幾つか例を試してみれば良いかと。

その他の回答 (4)

noname#119918
noname#119918
回答No.4

提示のソースコードをfoo.cとし、 gcc -Wall -o foo foo.c -lm としてコンパイルした結果です。 foo.c:5: 警告: return type defaults to ‘int’ foo.c: In function ‘main’: foo.c:6: error: stray ‘\357’ in program foo.c:6: error: stray ‘\274’ in program foo.c:6: error: stray ‘\235’ in program foo.c:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before numeric constant foo.c:6: 警告: statement with no effect foo.c:9: error: stray ‘\’ in program foo.c:9: error: " 文字での終端を欠いています foo.c:10: error: stray ‘\’ in program foo.c:10: error: " 文字での終端を欠いています foo.c:11: error: stray ‘\’ in program foo.c:11: error: " 文字での終端を欠いています foo.c:12: error: stray ‘\’ in program foo.c:12: error: " 文字での終端を欠いています foo.c:14: error: expected expression before ‘for’ foo.c:14: error: stray ‘\357’ in program foo.c:14: error: stray ‘\274’ in program foo.c:14: error: stray ‘\235’ in program foo.c:14: error: stray ‘\357’ in program foo.c:14: error: stray ‘\274’ in program foo.c:14: error: stray ‘\235’ in program foo.c:16: error: stray ‘\357’ in program foo.c:16: error: stray ‘\274’ in program foo.c:16: error: stray ‘\235’ in program foo.c:16: error: stray ‘\342’ in program foo.c:16: error: stray ‘\210’ in program foo.c:16: error: stray ‘\222’ in program foo.c:18: error: stray ‘\’ in program foo.c:18: error: " 文字での終端を欠いています foo.c:19: 警告: passing argument 1 of ‘printf’ makes pointer from integer without a cast foo.c:19: 警告: passing argument 1 of ‘scanf’ makes pointer from integer without a cast foo.c:19: 警告: passing argument 1 of ‘printf’ makes pointer from integer without a cast foo.c:19: error: expected declaration or statement at end of input foo.c:7: 警告: unused variable ‘x’ foo.c:7: 警告: unused variable ‘m’ foo.c:7: 警告: unused variable ‘i’ foo.c:19: 警告: control reaches end of non-void function 所々に全角文字(イコール,バックスラッシュなど)が含まれているのと、 行末のセミコロンが抜けているためのエラーが多数報告されます。 また、文字列を囲むダブルクォートは、バックスラッシュによるエスケープは不要です。 それらの書き方のミスを修正して再びコンパイルします。 foo.c:5: 警告: return type defaults to ‘int’ foo.c: In function ‘main’: foo.c:10: 警告: format ‘%lf’ expects type ‘double *’, but argument 2 has type ‘int *’ foo.c:12: 警告: format ‘%lf’ expects type ‘double *’, but argument 2 has type ‘int *’ foo.c:18: 警告: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’ foo.c:19: 警告: control reaches end of non-void function main関数の戻り値、変数xの型、 及び、scanf,printfのフォーマットを修正します。 以上の修正を施したものが、次のソースコードです。 論理的なエラーについては修正をしていません。悪しからず。 #include<stdio.h> #include<math.h> int main() { double y=0; int i,m; double x; printf(" Input m: "); scanf("%d", &m); printf(" Input x: "); scanf("%lf", &x); for(i=0; i<=m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1); } printf(" S = %f\n", y); return 0; }

higashino3
質問者

補足

ありがとうございました。でもこのままだと問題の解答としてはあっていないということですよね?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

>都合上整えれません。 無料で使えるコンパイラも導入できないということでしょうか? それだと、こちら側からの手助けは難しいですね。 なお、C/C++に関しては別のカテゴリがありますので、ここは締め切ってそちらで質問されることをお勧めします。

  • asuncion
  • ベストアンサー率33% (2126/6287)
回答No.2

> 整っていないです。 では、まずコンパイルできる環境を整えてください。 ソースコードを書いただけでコンパイルできない状態では、 そのソースコードが正しいかどうかご自分のところでわからないため、 学習する上で効率がよくないです。

higashino3
質問者

補足

都合上整えれません。

  • asuncion
  • ベストアンサー率33% (2126/6287)
回答No.1

> あってるかどうかわかりますか? 合っていないです。 コンパイルするための環境は整っていないですか?

higashino3
質問者

補足

整っていないです。 ¥はいらないです。

関連するQ&A

  • γ関数のプログラム(初心者です)

    以下のようにγ関数のプログラムを組みました。 とりあえず整数値を入力すれば、正しい値は返しているということがprintfの4で確認できました。 もとはfortranで組んだプログラムをCに置き換えました。 ですが、実際走らせてみると、4で値は確認できますがsegmentation faultが出てしまいます。 ですからサブルーチンファイル(ユーザー関数?)として利用できません。 何がいけないのでしょうか? 正しくyが帰ってくるようにどうなおしたらよいのか教えてください。 #include <stdio.h> #include <math.h> double gamma(double x) { double c[8],y,a,r,b,s; 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<8;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+(0.03586834*((double)(pow(-1,8)))*((double)(pow(x,8))))); printf("4 %f\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム %lf\n",x); y=gamma(x); printf("%f\n",y); }

  • 漸化式のプログラム

    n=100としてn+1個の点(Xj,Yj) (j=1,2,3・・n)はどのようなグラフになるか?ただし、h=1/n, Xj=jh, Y(j+1)=Yj+hYj, Y(0)=1である。 このプログラムを教えてください。 #include <stdio.h> #include <math.h> main() { double pi, x, y; int i; pi=4*atan(1); x=1/100; y=1; for(i = 1; i<=100; ++i){ x=i*1/100; y[n+1]=y[n]+1/100*y[n]; printf("%lf %lf\n", i, x, y,); } } ではだめなんでしょうか?

  • c プログラム 

    以下のプログラムは,第n項までのe^xのマクローリン展開をさせるものです. これを修正して,理論値と近似値の誤差がある値(自分で入力)になったときに,計算を終了させるにはどうしたらよいでしょうか.御教授いただければ幸甚 です. ---------------------------------------- #include <stdio.h> #include <math.h> int main(void) { int n; double x=1.0,y=1.0,e=1.0,err; int i; double f=1.0,p=1.0; printf("x="); scanf("%lf",&x); printf("n="); scanf("%d",&n); printf("Mclaurin展開によるn項までのexp(x)の\n n 理論値 近似値 誤差\n"); for(i=1;i<=n;i++){ f*=(double)i; p*=x; y+=p/f;近似値 e=exp(x);理論値 err=e-y;誤差 printf("%2d %12.8e %12.8e %12.8e\n",i,e,y,err); } return 0; }

  • これで良いか教えてください

     学校で、c言語でのプログラミングの宿題を出されたんですけど、家にはプログラミングのソフトがなくて、作ったのが合っているかどうかわかりません。それで、どなたか合っているか教えて下さい。  問題は、   二個の整数で指定される平面上の点が、次の領域  D={(x,y)|(x-3)^2+y^2<=25 または        (x+3)^2+y^2<=25} に含まれているかどうか判定するプログラムを作成したい。  二個の整数をキーボードから入力し(m,nとする)  ・点(m,n)が上の領域Dに含まれている場合には「Yes」と表示する   .そうでない場合には「No」と表示する プログラムを作成せよ。  作ったのは下記のものです。 #include <stdio.h> #include <math.h> main() { int m,n; printf(" Input point(m,n): "); scanf("%d %d", &m, &n); if(pow(m-3,2)+n*n<=25 | | pow(m+3,2)+n*n<=25) printf(" Yes\n"); else printf(" No\n"); }

  • プログラムの練習問題をやっていたのですが、練習問題の答えのような実行結

    プログラムの練習問題をやっていたのですが、練習問題の答えのような実行結果にならないので教えていただけませんか? 下記に記したプログラムを実行すると x=9 y=-9 [ 9]*[-9]=[ -81],[ 9]*[-8]=[ -72],[ 9]*[-7]=[ -63],・・・・ ・・・・ [10]*[-9]=[ -90],[10]*[-8]=[-80],・・・・ ・・・・ のようになるのですが、 x=9 y=-9 [ 9]*[-9]=[ -81],[10]*[-9]=[-90],・・・ [ 9]*[-8]=[ -72],[10]*[-8]=[-80],・・・ [ 9]*[-7]=[ -63],・・・ ・・・・ のようにするためにはどうすればいいですか? #include <stdio.h> int main(void) { int x,y,m,n; printf("x="); scanf("%d",&x); printf("y="); scanf("%d",&y); for(m=x;m<=x+3;m++) { printf("\n"); for(n=y;n<=y+14;n++) { printf("[%2d]*[%2d]=[%4d],",m,n,m*n); } printf("\n"); } return(0); }

  • 指数関数のプログラムを組んでいるのですが・・・(初心者)

    指数関数のマクローリン展開のプログラムです。 x=1の場合はしっかりと値が収束するのですが、それ以外ではうまくいきません。 以下のように組んだのですが、どこがまちがっているのでしょうか? 1.n!を求める。 2.x^nを求める。 3.これらを割る。 4.exに足していくという手順でやっているつもりです。 よろしくおねがいします。 ______________________ #include<stdio.h> main() { double a,i,j,k,l,m,n,x,ex; printf("x="); scanf("%lf",&x); n=1; ex=1; m=x; for(i=1;i<100;i++){ m=x; n=n*i; for(k=1;k<i;k++){ m=m*m; } a=m/n; if(a<0.000001){ return 0; }else{ m=x; ex=ex+a; } printf("%lf ",ex); } return() }

  • 偏微分のプログラムについてです.

    (∂^2 u)/(∂x^2 )+(∂^2 u)/(∂y^2 )=2(x^2+y^2 ) 境界上でu(0,y)=u(x,0)=0,u(1,y)=y^2,u(x,1)=x^2である.点(0.5,0.5)の値を求めよ.その際きざみ幅を幾つか変化させることで,反復回数がどのように変化するか確かめよ. という問題です.自分で以下のプログラムを作ったのですが,コンパイルされません.ぜひどこがおかしいか教えてください. #include<stdio.h> #define EPS 10e-6 #define N 100 #define M 100 main(void){ int i,j; int n=19,m=19,r=0; double h,x0,S; double u1[N][M],u2[N][M]; h=2.0/(n+1); for(i=0;i<n+2;i++){ for(j=0;j<m+2;j++){ u1[i][j]=0.0; } } do{ for(i=0;i<n+2;i++){ u2[i][0]=0.0; u2[i][m+1]=0.0; } for(j=0;j<m+2;j++){ u2[0][j]=0.0; u2[n+1][j]=0.0; } for(i=1;i<n+1;i++){ for(j=1;j<m+1;j++){ u2[i][j]=(u1[i-1][j]+u1[i][j+1]+u1[i+1][j]+u1[i][j-1]+2.0*h*h)/4.0; } } r++; S=fabs(u1[(n+1)/2][(m+1)/2]-u2[(m+1)/2][(m+1)/2]); for(i=0;i<n+2;i++){ for(j=1;j<m+1;j++){ u1[i][j]=u2[i][j]; } } } while(S>EPS); x0=u2[(n+2)/2][(m+2)/2]; printf("きざみ幅=%lf\n",h); printf("反復回数=%d\n",r); printf("点(0.5,0.5)=%lf\n",x0); }

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

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、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); }

  • C言語 二分法

    初投稿です。 お恥ずかしながらパソコンが苦手で、Cゲッが難しくてできません。 今回二分法です。 途中まではやったのですができません。 演習 0~1の乱数を12個発生させ,これらの平均をxi,yi とする。(s,tは乱数) xi=1/12(x1i+x2i+....x12i) yi=1/12(y1i+y2i+....y12i) このようなを1000個作り,(xi,yi)で散布図 を作りなさい。またx,yのそれぞれの平均を求 めよ。 この演習で #include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1.0e-5 float f(double x); void nibuin(void); int main () { int count; double a,b,m; count=0; printf("範囲の左の値を入力してください。\n"); scanf("%lf",&a); printf("範囲の右の値を入力してください。\n"); scanf("%lf",&a); if(count==1000){ printf("収束しませんでした。\n"); exit(1); } } while(!(fabs(a-b)<eps)); printf("解の値は%f\n収束するのに%d回かかりました。"m,count); } float f(double x) { reurn x*sin(x)+log(x); } まではできたのですが、 scanf("%lf",&a);とif(count==1000){の間に入る命令が打てません。 よろしくお願いします。

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

専門家に質問してみよう