• ベストアンサー

Cというよりロジックです。

bikkuriの回答

  • ベストアンサー
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

A,B,C,D,...のデータ構造やデータ格納方法はなんとかなったとして、 そこからの組み合わせを求めることについてです。 A,B,C,Dと組み合わせる対象の個数が決まっていれば(この場合4個) その個数分のループでも簡単ですが、対象の個数が決まっていない場合は 再帰で処理するのが、普通で簡単でしょう。 (といってもなれない人には敷居が高いようですが) とりあえず、サンプル作ってみました。 質問にあったデータの場合、30個(3x2x5x1)の値が出力されます。 #include <stdio.h> char data[][10] = { {'x', 'y', 'z'}, {'a', 'b'}, {'i', 'j', 'k', 'l', 'm'}, {'d'} }; int max_row = 4; int cnt = 0; void kumiawase(char ans[], int row) { int i; if(row == max_row) { ans[row] = '\0'; printf("%s\n", ans); cnt++; return; } for(i=0; data[row][i] != 0; i++) { ans[row] = data[row][i]; kumiawase(ans, row+1); } } int main() { char buf[20]; kumiawase(buf, 0); printf("cnt=%d\n", cnt); return 0; }

winyu-no
質問者

お礼

すんません、締め切るの忘れてました・・・(汗 あれから2日くらいかえて目的のプログラムを つくることができました。ありがとうございました。

関連するQ&A

  • C言語の演算について

    次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y+++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。

  • C言語の演算について

    次のプログラムを実行したらどう出力されますか。 微妙な代入演算の違いが分からないので、教えていただけないでしょうか。 #include<stdio.h> void main (void) { int x = 5; int y = 8; int z = 3; int a,b,c,d,e,f; a = y == x + z; b = !x; c = x + y / z; d = x *=z - 1; e = --y / --z; f = y++ % x++; printf("%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f); } できれば途中のトレースも書いていただけると助かります。 よろしくお願いします。 なお、先ほど記述ミスがあるのにも関わらず投稿してしまいました…。 正しい記述はこちらの質問です。 大変失礼しました。 前の質問は削除可能になり次第、削除いたします。

  • C言語でファイルから読み込んだデータの処理

    こんにちは C言語についてかじった程度でほとんど初心者なので、どうぞよろしくお願いします。 テキストファイルからデータを読み込み、そのデータをもとに計算してその結果を違うファイルに出力する。 というプログラムを組みたいと思っています。 例えば、 1 2 3 4 5 … 400 401 …     440 : 1600 …    2000 というデータだとします。 4項目ごとのデータを(a,b,c,d)として、このデータを x=a+b y=a+c z=a+d といったように計算して、これを [x y z] [ …  :  … といったように出力したいんです。 この場合では [3 4 5] [11 12 13] … [  ]  : [ ]… [ ] となると思います。 ファイルの入出力だけならいろんなところで例題にもなっているので何とかなると思っていたのですが [ ] [ ] : といったように下につながるか [ ][ ][… といったようにすべて横につながってしまいます。 対応するように並べるにはどのようにすればいいのでしょうか。 うまく説明できず、非常にわかりにくい質問だとは思いますが、皆さんどうぞヒントだけでも与えてくれるとうれしいです。 よろしくお願いします。

  • c言語 プログラミング

    以下のプログラムで分からないところがあります。 数式をxpyの形式で入力して、(x,y:整数、p:x,-,*,/のいずれかの演算記号) 答えを表示するというプログラムなのですが、 5行目と9行目にある”-'0'”の意味が分からないので教えてください。 01: int x=0,y=0,z,i;char a[30],p; 02: printf("式を入力してください。:);gets(a); 03: for(i=0;a[i];i++) 04:  if('0'<=a[i] && a[i]<='9') 05:   x=10*x+a[i]-'0'; 06:  else{p=a[i]-'0';break;} 07: for(i++;a[i];i++) 08:  if('0'<=a[i] && a[i]<='9') 09:   y=10*y+a[i]-'0'; 010: switch(p){ 11:  case '+':z=x+y;break; 12:  case '-':z=x+y;break; 13:  case '*':z=x*y;break; 14:  case '/':z=x/y;break; 15:  default:puts("入力エラーです。");return 0; 16: } 17: printf("%d%c%d=%d\n",x,p,y,z); よろしくお願いします。(読みにくかったらメモ帳などにコピペしてください)

  • 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); }

  • ガウスの消去法を用いたC言語のプログラムについて

    現在あらかじめ与えられた連立方程式をガウスの消去法を用いて、 求めるというプログラムをC言語で作っています。 しかし学校ではまだ行列のやっておらず、 ガウスの消去法についても説明があやふやでした。 一応プログラムは出来たのですが明らかに無駄が多すぎて困っています。 与えられた方程式は下記の通りです。 2x + 3y + 4z = 20 3x - 2y + 5z = 14 5x + 4y - 7z = -8 プログラムは以下の通りです。 #include <stdio.h> int main(void){ double a[3][3] = {{2, 3, 4}, //(1) {3, -2, 5}, //(2) {5, 4, -7}}; //(3) double b[3] = {20, 14, -8}; double x = 0; double y = 0; double z = 0; int i; //前進消去 //(1)÷2 ・・・(1)' for(i = 0; i < 3; i++){ a[0][i] = a[0][i] / 2; } b[0] = b[0] / 2; //(2)-(1)'×3 ・・・(2)' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] - a[0][i] * 3; } b[1] = b[1] - b[0] * 3; //(3)-(1)'×5 ・・・(3)' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] - a[0][i] * 5; } b[2] = b[1] - b[0] * 5; //(2)'÷6.5 ・・・(2)'' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] / 6.5; } b[1] = b[1] / 6.5; //(2)''×3.5 + (3) ・・・(3)'' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] + a[1][i] * 3.5; } b[2] = b[2] + b[1] * 3.5; //(3)''÷3.53846でzを求める z = b[2] / a[2][1]; //後退代入 //(2)''にzを代入してyを求める a[1][1] = a[1][1] * z; y = b[1] - a[1][1]; //(1)'にyとzを代入してxを求める a[0][1] = a[0][1] * y; a[0][2] = a[0][2] * z; x = b[0] - a[0][1] - a[0][2]; printf("\n x = %f \n y = %f \n z = %f \n", x, y, z); return 0; } 制作はvc++を用いています。 ここからどうやって短くしていけばよいかがわかりせん。 アドバイスや指摘があればお願いいたします。

  • 方程式 x(a^2+b^2)+y(c^2+d^2)+z(ac+bd)=0

    x,y,zを定数とするとき、  x(a^2+b^2) + y(c^2+d^2) + z(ac+bd) = 0 を満たす a,b,c,d はどのように求められるのでしょうか?

  • a>0,b>0,c>0,d>0とする

    a>0,b>0,c>0,d>0とする 2ax+λ_1-λ_2=0 2by+λ_1-λ_3=0 2cz+λ_1-λ_4=0 λ_2x=λ_3y=λ_4z=0 λ_2>=0, λ_3>=0, λ_4>=0, λ_1は任意 x+y+z=d x>=0, y>=0, z>=0 この連立方程式解ける方いらっしゃれば よろしくお願い致します(>_<)

  • 問題がとけません

    以下の問題が解けません。 わかる方、教えていただけないでしょうか? ・キーボードから3整数を読み込み,小さい順に出力せよ。 ヒント------------------------------------------------- キーボードから読み込む変数をa,b,c,出力する変数をx,y,z(x<y<z)とするとよい かもしれない。 プログラムの構造は次のようになる。 #include <stdio.h> int main() { int a,b,c,x,y,z; scanf("%d%d%d",&a,&b,&c); ...//ここが本体 printf("%d %d %d\n",x,y,z); return 0; } もちろん,目的が達成されるなら,上の例のようにならなくても良い。 

  • この問題の回答、解説お願いします。数C

    この問題の回答、解説お願いします。 問1,正方行列Aの逆行列を消去法で求める解法では,未知行列をXと置いて,AX=Eを満たす行列Xを求めている.XがAの逆行列であるためにはもう一つの条件,XA=Eを満たさなければならない.Xgaこの条件を満たすことを証明せよ。 問2.4次の行列式の定義を述べ,ファンデルモンデの行列式の値を求めよ. |1 x x*2 x*3 | |1 y y*2 y*3 | |1 z z*2 z*3 | |w w*2 w*3 | x*2はxのニ乗でx*3はxの三乗です。y,z,wのもおなじです。 問3,連立方程式{ax + by =0が,x=0,y=0以外の解を持つとき,           {cx + dy =0 |a b|=0が成り立つことを証明せよ。 |c d| {は下の{とつながっています。 。←気にしないでください。すみません。 問4,連立方程式 {a1x + b1y + c1z = 0 {a2x + b2y + c2z = 0 が, x=0,y=0,z=0以外の解を持つとき, {a3x + b3y + c3z = 0 |a1 b1 c1 | |a2 b2 c2 |=0が成り立つことを証明せよ。 |a3 b3 c3 | {は3行つながっています。 わかりづらいと思いますが、よろしくお願いします。