• 締切済み

C言語のプログラム作成で・・・

NaOH 濃度を入力すると、水酸化ナトリウム水溶液の pH を出力するプログラム(naoh.c)を作成せよ。 NaOH の解離度は、1.0 とし、Kw=1.0x10-14 [(mol/dm3)2] とする。 という問題でプログラムは #include <stdio.h> #include <math.h> main() { float fx,dfx,x,x0,eps,Kw,C,pH,x_an,pH_an; int i; Kw=1.0e-14; printf("x0="); scanf("%f",&x0); printf("C="); scanf("%f",&C); i=1; eps=fabs(x0*x0+C*x0-Kw); while ( eps > C/1e8 ) { fx=x0*x0+C*x0-Kw; dfx=2*x0+C; x = x0 - fx/dfx; eps=fabs(fx); printf("i=%3d fx=%.4e eps=%.4e x=%.4e\n",i,fx,eps,x); x0=x; i=i+1; } としました。そこで次に、濃度 Ca [mol/l] の塩酸 Va [ml]と濃度 Cb [mol/l] のNaOH水溶液 Vb [ml]を混ぜた溶液のpH を計算するプログラムを作成せよ。 という問題が出たのですがどうやって作成すればいいのでしょうか? HCl,NaOH の解離度は、1.0 とし、Kw=1.0x10-14 [(mol/dm3)2] とするらしいです。 めんどくさいと思いますがお願いします。

  • myjam
  • お礼率36% (113/310)

みんなの回答

回答No.1

> 濃度 Ca [mol/l] の塩酸 Va [ml]と濃度 Cb [mol/l] のNaOH水溶液 Vb [ml]を混ぜた溶液のpH を計算するプログラムを作成せよ。 > という問題が出たのですがどうやって作成すればいいのでしょうか? あなたはこの問題を'紙とエンピツ'で解けますか? それができるなら、その過程をそのまま素直に コードに表現すればいい。 入力部と出力部をアタマとオシリにくっつけて。 # 課題の丸投げは嫌われます。 # 'めんどくさいと思います' ならなおさら。

関連するQ&A

  • c言語プログラミングについて

    ニュートン法でx^2-2の根を初期値2、試行回数を200回までで求めるプログラムを作成しているのですがうまくいきません。 どなたかご教授お願いいたします。 #include<stdio.h> #include<math.h> int main() { int i; int N = 200; double x = 2.0; double xnew; double eps = 1e-16; for (i = 0; i < N; i++) { xnew = x - ( x * x - 2.0 ) / 2.0 * x; if (fabs(x - xnew) < eps) break; x = xnew; } printf("x=%.20lf\n", xnew); return(0); }

  • c言語について

    このプログラムであと2行削れるとこがあるそうです。 どこがけずれますか? #include <stdio.h> #include <math.h> #define f(x) ((x)+(log(x))) #define EPS 1e-8 main( ) { double a, b, c, fa, fb, fc; int i=1; printf("input a and b: "); /*区間[a,b]の入力, a<b とする*/ scanf("%lf%lf", &a, &b); fa = f(a); fb = f(b); do { c = (a+b) / 2; /*cの値の更新*/ fc = f(c); printf(" %2d : a = %f, b = %f, c = %f, fc = %f\n", i, a, b, c, fc); if (fb*fc < 0){ a = c; fa = fc; } if (fa*fc < 0) { b = c; fb = fc; } if(fabs(fc) < EPS ) break; }while(++i<100); /*iが100以上になったら繰り返し終了*/ }

  • C言語プログラミング

    プログラミングについてです。 osはLinuxです。 x+logx=0の解を求めるプログラムを作れで ニュートン法を使ってみましたがあってますか? #include <stdio.h> #include <math.h> #define EPS 1e-8 main( ) { double a, old_x, new_x; int i; printf(" a="); scanf("%lf", &a); new_x = a; for(i=1; i<=100; i++) { old_x=new_x; new_x = old_x*(1-log(old_x))/(old_x+1); printf("x%d = %f\n", i,new_x); if(fabs(old_x*(1-log(old_x))/(old_x+1)) < EPS) break; } } いろいろな数字で実行してみた結果 nanと 0.567143の二つに分かれました。 どこか間違いがあるのですか

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

    C言語です。 exp(x)のテイラー展開を数値計算で求めるプログラムですが、 プログラムでは相対打ち切り誤差をEPSと定義しています。 具体的には double myexp(double x){ double EPS=1e-08; double s=1.0,e=1.0,d; int k; for(k=1;k<=200;k++){ d=s; e=e*x/k; s=s+e; if(fabs(s-d)<EPS*fabs(d)) return s; } と上の様に書かれています。 わからない点は上記のプログラムでEPS=1e-08のeは10の意味をしているでしょうか?EPS=10^-8理解 してよろしいでしょうか? またEPSのeと二つ目のe=1.0は全く異なるものでしょうか。 ご教授よろしくお願いします。

  • C言語の質問です

    ニュートン法のプログラムを組んだのですがPAD図が描けなくて困ってます どなたか回答お願いします /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double a;    //グローバル変数 double f(double x)  //fは関数f(x) { return x * x - a; //f(x)=x~2-a } double df(double x)  //dfはf(x)の導関数f’(x) { return 2 * x; //df(x)/dx = 2x } double newton(double x, double (*f)(double), double (*df)(double), double eps) { int n = 0;     //初期化 double x0, err;    //x0は初期値 printf("# n, x, err\n"); printf("%4d, % .15e\n", n, x); do { n++; x0 = x; x = x0 - f(x0) / df(x0); //切片でy=0、x=x1 err = fabs(x-x0); printf("%4d, % .8e, % .15e\n", n, x, err); } while (err >= eps); return x; } /*メインルーチン*/ int main(void) { double x, eps = 1.0e-10; //収束条件 char s[128]; fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); while (a <= 0.0) { fprintf(stderr, "'a' には正の数を入れてください。\n"); fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a); } x = (a + 1.0) / 2.0; x = newton(x, f, df, eps);   //ニュートン法の実装 printf("\n# √(%e) = % .15e\n", a, x); return 0; }

  • C言語 ニュートン法

    何をすればいいかよくわからなくて躓きました わかる方どうかお願いします 問 以下に示すプログラムで、x1 = x0 - f (x0) / f '(x0)を用いて、方程式の左辺関数 f (x) (= x 2 - a ) およびその導関数 f '(x) を独立させろ。 入力変数 a はグローバル変数としてよい。 導関数 f '(x)はプログラム内ではdfと表記することとする。 また、適切なコメントも追加すること。 /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double newton(double x, double (*f)(double), double (*df)(double), double eps) {   int n;   double a = 0, x, x0, err, eps = 1.0e-10;   printf("# n, x, err\n");   printf("%4d, % .15e\n", n, x);   do {     n++;     x0 = x;     x = (x0 + a/x0) / 2;     err = fabs(x-x0);     printf("%4d, % .8e, % .8e\n", n, x, err);   } while (err > eps);     return x; } int main(void) {    double a = 0, x, x0, err, eps = 1.0e-10;    char s[128];   fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);   while (a <= 0.0) {    fprintf(stderr, "'a' には正の数を入れてください。\n");   fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);   }   x = (a + 1.0) / 2.0;   printf("\n# sqrt(%e) = % .15e\n", a, x);    return 0; }

  • C言語のプログラム

    C言語で2つの微分方程式をEuler法、Heun法、Runge-Kutta法により求めるプログラムを作りたい。ただし、初期条件はx=0,y=1とする。また、間隔Δxを変えたときの解の変化を調べたい。 Euler法のプログラムはどうにか分かったのですが、Heun法、Runge-Kutta法のプログラムがわかりません。 Euler法のプログラム #include_<stdio.h> #include_<math.h> int_main(){ __double__a=0; __double__b; __int_____m=10; __int_____n; __double__h; __double__x,y; __double__dydx; __int_____k; __double__e; __double__f; __printf("オイラー法計算例:y=e^x,_y=1/e^4x\n\n"); __//_y_=_e^x __b_=_1; __for(n=100;n<=10000;n*=100){ ____h_=_(b-a)/n; ____printf("y'_=_y:_h(=dx)_=_%.1e_(y=e^x)\n",h); ____x_=_a;_y_=_1; ____for(k=0;k<=n;k++)_{ ______x_=_k*h; ______if(k%(n/m)==0)_{ ________f_=_exp(x); ________e_=_fabs(y-f); ________printf("x=%.2f,_y=%f,_e^x=%f_er=%.0e\n", ________x,y,f,e); ______} ______dydx_=_y; ______y_=_y_+_dydx*h; ____} __} __printf("\n"); __//_y_=_1/e^4x __b_=_4; __for(n=100;n<=10000;n*=100){ ____h_=_(b-a)/n; ____printf("y'_=_-4y:_h(=dx)_=_%.1e_(y=1/e^4x)\n",h); ____x_=_a;_y_=_1; ____for(k=0;k<=n;k++)_{ ______x_=_k*h; ______if(k%(n/m)==0)_{ ________f_=_exp(-4*x); ________e_=_fabs(y-f); ________printf("x=%.2f,_y=%f,_1/e^4x=%f_er=%.0e\n", ________x,y,f,e); ______} ______dydx_=_-4*y; ______y_=_y_+_dydx*h; ____} __} __return_0; } 分かる方がいましたら、回答よろしくお願いします。

  • C言語のプログラムで質問です。

    C言語のプログラムで質問です。 ヤコビ法で固有値・固有ベクトル絵を求めたいのですが、固有値は上手く出るのですが、 固有ベクトルがめちゃくちゃな値が出ます。何が間違っているのでしょうか教えてください。下のは一応自分で作ってみたプログラムです。 #include <stdio.h> #include <math.h> #define N 4 #define PI 3.14159 void jacobi(double a[N][N], double λ[N], double v[N][N]); int main(void) { int i, j; double a[N][N], λ[N], v[N][N], x; for(i=0;i<N;i++){ printf("\n a[%d][0] a[%d][1] a[%d][2] a[%d][3]=",i,i,i,i); scanf("%lf %lf %lf %lf",&a[i][0],&a[i][1],&a[i][2],&a[i][3]); } jacobi(a, λ, v); for(j=0; j<N; j++){ printf("\n固有値λ[%d]=%lf", j, λ[j]); printf("\n固有ベクトル\n"); for(i=0; i<N; i++){ printf("%lf\n", v[i][j]); } } return 0; } /* ヤコビ法による固有値計算 */ void jacobi(double a[N][N], double λ[N], double v[N][N]) { int i, j, kmax=100, repeat, p, q; double eps, c, s,theta, gmax; double apq, app, aqq, apqmax, apj, aqj, vip, viq; gmax=0.0; for(i=0; i<N; i++){ s=0.0; for(j=i+1; j<N; j++){ s += fabs(a[i][j]); } if(s>gmax) gmax=s; } eps=0.000001*gmax; for(i=0; i<N; i++){ for(j=0; j<N; j++){ v[i][j]=0.0; } v[i][i]=1.0; } for(repeat=1; repeat<kmax; repeat++){ /* 収束判定 */ apqmax = 0.0; for(p=0; p<N; p++){ for(q=0; q<N; q++){ if(p!=q){ apq=fabs(a[p][q]); if(apq>apqmax) apqmax=apq; } } } if(apqmax<eps) break; for(p=0; p<N-1; p++){ for(q=p+1; q<N; q++){ apq=a[p][q]; app=a[p][p]; aqq=a[q][q]; if(fabs(apqmax)<eps) break; /*回転角計算*/ if(fabs(app-aqq)>=1.0e-15){ theta= 0.5*atan(2.0*apq/(app-aqq)); }else{ theta= PI/4.0; } c = cos(theta); s = sin(theta); a[p][p] = app*c*c + 2.0*apq*c*s + aqq*s*s; a[q][q] = app*s*s - 2.0*apq*c*s + aqq*c*c; a[p][q] = 0.0; a[q][p] = 0.0; for(j=0; j<N; j++){ if(j!=p && j!=q){ apj = a[p][j]; aqj = a[q][j]; a[p][j] = apj*c + aqj*s; a[q][j] = -apj*s + aqj*c; a[j][p] = a[p][j]; a[j][q] = a[q][j]; } } /*固有ベクトル*/ for(i=0; i<N; i++){ v[i][p] = v[i][p]*c+v[i][q]*s; v[i][q] = -v[i][p]*s+v[i][q]*c; } } } eps=eps*1.05; } for(i=0; i<N; i++) λ[i] = a[i][i]; }

  • C言語プログラム

    したのプログラムでgetch()の代わりにscanf()を使って、入力した数が負なら終了、正なら"次の数を入力してください"と表示してループを続けるプログラムを作りたいのですが、どこを変えればよいのですか? #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c='m'; while(c!='e')//eでない限りwhileループを実行する { sum=sum+i; printf("\n1 kara %d madewo tasuto %d desu.\n",i,sum); i++; printf("nanikakeywo oshitekudasai.owaru tokiha 'e'\n"); c=getch(); } printf("loopwo nukemashita\n"); getch(); }

  • はさみうち法のプログラム(C言語)について

    調べたりしながら私なりに書いてみたのですが上手くいきません。 「ans=1.048404」とならなければいけないのに 「nan」で返ってきてしまうのです。 どこをどの様に変えたら良いのでしょうか・・・? ※課題の締め切りが近いので,早急にご回答宜しくお願い致します! 以下、はさみうちのプログラム↓ #include<stdio.h> #include<math.h> /*初期値x0,*/ /*f(x)を定義*/ double f(double x){ return sqrt(x*x+10.0) - 10.0*exp(-x*x); } /*はさみうち法の関数*/ double hasamiuchi(double x0,double x1,double eps,double imax){ double x2; /*x軸との交点*/ int i; /*繰り返しの回数*/ if(f(x0)*f(x1)>0){/*x0とx1が同符号の場合x1をx0とする*/ x0=x1; } for(i=0;i<imax;i++){ x2=(x1*f(x0)-x0*f(x1))/(f(x0)-f(x1)); /*x0とx1で出来る直線とx軸の交点x2を求める*/ x1=x2; /*x2の値を次のループにおけるx1とする*/ } if(fabs(x1-x0)<eps) return x2; /*収束したら解x2を返す*/ return 0.0/0.0; /*収束しなかったらnanを返す*/ } int main(void){ printf("ans = %f\n", hasamiuchi(2.0,1.0,1e-6,20));/*値を代入してはさみうちの実行*/ return 0; }

専門家に質問してみよう