• 締切済み

C言語プログラミングで、多項式の展開をする

プログラミングの初心者です。 emacsを使って次のようなプログラムを作りたいのですがよくわかりません。 たとえば、a=2 b=3 を入力すると、 f(X)=(x+a)(x+b)=x^2+5x+6 と出力されるようなものです。 いろいろやってみてはいるのですが、「xの変数の型が宣言されていません」などと、(やってるつもりなんだけど)表示されたりしてうまくいきません。どなたか助けてください。

みんなの回答

  • chiezo2005
  • ベストアンサー率41% (634/1537)
回答No.2

質問の意味がいまいちはっきりしませんが,おそらく,数式処理を行おうとしているのだと思います。 数式処理(変数に直接数値を入れて計算するものでなく,多項式の展開,因数分解,微分,不定積分などを式の形で求める処理)は基本的にまず,文字列として式を読み込みます。 したがって,おっしゃられるようなXの変数の型などは宣言すること自体へんな話です。 文字列として読み込んだ式を解析してXについての多項式に展開するという作業をします。 この問題の例はきわめて単純な例のひとつなので,これに限ってのプログラムはきわめて簡単だと思います。 この場合の多項式はC言語のprogramのなかではあくまでも文字列であって,式ではありません。 文字列の処理をするprogramであると言う認識が大切です。 「数式処理」で検索されるといろいろ情報が得られると思います。

参考URL:
http://ja.wikipedia.org/wiki/%E6%95%B0%E5%BC%8F%E5%87%A6%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0
biscuit-19
質問者

お礼

なるほど! ありがとうございます。 「関数」を扱っているのではないことは自分でもうすうす気づいていたのでが・・・。 おかげで知りたい情報を検索できそうです。

回答No.1

int a, b; /* a, b を入力 */ printf("f(X)=(x+a)(x+b)=x^2+%dx+%d\n", a+b, a*b);

biscuit-19
質問者

お礼

できました!! ありがとうございます。

biscuit-19
質問者

補足

もうひとつ教えてもらってもいいですか?? この前は展開でしたが、今度は逆に因数分解をしたいと思います。 たとえばp、qを入力して、 うまく、p=a+b q = a*bとなるa,bが見つかったときにだけ g(x)= x^2 + px + q = (x+a)(x+b) となるようにするにはどうしたらいいのでしょうか? あと、たとえば、 x+a という式に a=-4 を代入すると、x + -4 と表示されます。 これは地道に、ifで場合わけしてaがマイナスの時には-aを出力する ’というようなことをしなければならないのでしょうか?

関連するQ&A

  • C言語プログラミングで困っています。助けて下さい。

    C言語プログラミングで困っています。助けて下さい。 課題1-1: 実数 a と実数 b を入力すると、一次方程式ax + b = 0 の解を求めるプログラムを作る 課題1-2: 1-1 で作成したプログラムについて、さらにa として1が入力されたとき、方程式の表示       部分が1x + 3 = 0ではなくx + 3 = 0となるようにせよ 課題1-3: 1-2 で作成したプログラムについて、さらにb として0 や負の数が入力されたとき、方程式     の表示部分が2x = 0 や2x – 3 = 0となるようにせよ 課題1-4: 1-3 で作ったプログラムについて、さらにa の値として0が入力された場合、「解けません」     と表示するようにせよ 課題1-5: 係数 a, b, c を入力すると、 2次方程式ax2 + bx + c =0の解を表示するプログラムを作     れ ※ 1-2 ~ 1-4 のような機能を盛り込む ※ a が0の場合には、先に作った1次方程式のプログラムが動く という問題です。最終的にこれらを一つのプログラムにしてください。判別式や解の公式、ルート√などを使ってよろしくお願いします。C言語でお願いします

  • c言語プログラミングHELP!

    c言語でプログラムを組んでるんですが、どうしてもわからないものがありまして、 まず一つ目がキーボードから英小文字を一つ入力し、その文字を大文字に変換して出力するプログラミングです。結果がまずひとつの英小文字を入力して、入力した文字と、大文字に変換した文字を出力するプログラミングです。 ちなみにヒントは'a'=97,'A'=65です 二つ目が二桁の16進数('41'から'49','50'から'59')を入力すると対応する文字を表示するプログラミングです。また、%xは使用しないこと。なお、入力に間違いはないものとする。(ヒントは入力は一つの数値か、二つの文字か?だそうです。) 結果は二桁の16進数('41'から'49','50'から'59')を入力して、文字コードの二桁の数字と文字を出力するプログラミングです。 お願いします。

  • プログラミングC言語の問題ですがわかりません。

    プログラミングC言語の問題ですがわかりません。 5つのint型変数a,b,c,ans,responseを宣言する。a,b,cの値はscanf関数で読みこむことにより初期化する。 a(1)b(2)c= と表示して、scanf関数によりユーザーの答案をresponseに読み込み、演算結果が正しければ1、間違っていたら0を表示するプログラムを作成しなさい。ここで(1)と(2)には算術演算子(+,-,*,/,%)がはいる。5×5=25通りの演算をすべて実行するようにしなさい。 特に正しければ1、間違っていたら0を表示するプログラムがわかりません。 まだprintfとscanf関数と演算子しかやっていないのでそれを踏まえたプログラムを1通りだけでいいので書いて頂けると幸いです。

  • C++でのプログラミングについてです

    プログラミング初心者です C++で二次方程式の解のプログラムを作成したのですがうまく作動させることができません…どこがおかしいのでしょうか、またどのように変更すればよいでしょうか 発生したエラーは 15行 型voidの値をintのエンティティに割り当てることはできません 34行 宣言が必要です 55行 宣言が必要です 15行 voidが他の型と同時に使われました 34行 '{'を見つけました(関数のヘッダーがないかもしれません). 68行 構文エラー:'}' です よろしくお願いいたします #include<stdlib.h> #include<math.h> void solve(double, double, double); int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; int ret; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りです。\n"); ret = solve(a, b, c, &x1, &x2, &r1, &r2); switch (ret) { case-1: printf("係数がおかしい\n"); break; case 0: printf("解は虚数解で%.2f+%.2fi と%.2f-%.2fi です\n", r1, r2, r1, r2); break; case 1: printf("解は実数解となり、%f です。\n", x1); break; case 2: printf("解は実解解で、%f と %f です。¥n", x1, x2); break; } return 0; } void solve(double a, double b, double c, double x1, double x2, double r1, double r2); { if (a == 0.0) { if (b == 0.0) { return -1; } { x1 = -c / b; return 1; } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); return 1; } if (D == 0) { x1 = -b / (2 * a); return 1; } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); return 0; } } }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語を使用したプログラミング方法で質問です。

    次のように数値(16進数)を入力して小さい順に並べる(scanfで入力時に数値はカンマで区切る) 例: 入力:A1,05,B1,30,29最後はenterキーで出力  出力:05,29,30,A1,B1 というように出力する方法をプログラミングを教えていただけますか? 宜しくお願いします。

  • C言語 PICプログラムについて質問です

    さっそく中身を書きます PIC16F84Aのプログラムで RB0,RB1,RB6を出力ポートと宣言し、RB7を入力ポートと宣言しています。 PORTB=0x03; とすると、RB7ポートは変な異なったりしちゃいますか。

  • C言語プログラミングで因数分解

    たとえばp、qを入力して、 うまく、p=a+b q = a*bとなるa,bが見つかったときにだけ g(x)= x^2 + px + q = (x+a)(x+b) となるようなプログラムを作りたいのですが、どうしたらいいのでしょうか? あと、たとえば、 x+a という式に a=-4 を代入すると、x + -4 と表示されます。 これは地道に、ifで場合わけしてaがマイナスの時には-aを出力する ’というようなことをしなければならないのでしょうか?

  • C言語でのsinxのマクローリン展開について

    課題で、「n 番目の値が、1*10^-8 よりも小さくなるまでの級数を求め任意のxに対するsinxの値をマクローリン展開を利用して近似せよ。」というものが出たので、プログラムを作成してみたのですが、間違った値が出力されてしまいます。以下にプログラムを示しますので、間違っている点の指摘をお願いします。 #include<stdio.h> int main(void) { long double a,b,c,d,n,x,ans,xx; ans = 0; a = c = d = 1; printf("xを入力"); scanf("%lf",&x); b = x; for(n = 1; d >= 1e-8; a *= (n - 1) * n , b *= xx){ xx = x * x; d = b / a; ans += (b * c)/a; c *= -1; n += 2; } printf("%.8f",ans); return 0; }

  • C言語のプログラミングについて教えてください

    課題で下記に示すのようなデータをファイル名を入力してのそのデータを読み込みyの最大値とそのときのxの値を表示するプログラムを作成しろと言われたのですが、僕はプログラミングが初心者でむしろ苦手でホント困ってます。だれか助けてください、お願いします! データ    x  y 0.12132 3.45355 0.12353  3.415451 . . . . . . のようにxとyの行列となっていて、その数は2000個を超えています。 自分なりにやってみたのですがデータをすべて読み込まないし、まずどのようにして、yの最大値をだし、なおかつそのxの値を表示させるのもわかんなくてホント困っています。 本末転倒になりますが、プログラムを書いていただけるとほんと助かります。よろしくお願いいたします。 ちなみにこれが自分で考えたプログラムです。とりあえず、yの値がでかいのでyの最大値だけだすつもりでやってみたけど駄目でした。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char *list[256]; char buf[1024]; char filename1[80]; printf("入力ファイル名"); gets(filename1); fin=fopen(filename1,"r"); if (fin ==NULL) { printf("%sをオープンできません\n",filename1); exit(1); } while (fgets(buf, 1024, fin) !=NULL) { printf("%s",buf); } static float max; int x; fscanf(fin,"%f",&x); if(x>max){ max=x; printf("yの最大値=%f\n",max); } fclose(fin); }