C言語で困っている問題:voidの使い方

このQ&Aのポイント
  • C言語で複素数の引き算と掛け算を計算するプログラムを作成したが、void show関数の使い方が分からない。
  • プログラムはcomplex構造体を引数とする2つの関数を作成し、計算結果を表示するプログラムである。
  • 質問者は以下のプログラムを作成したが、void show関数の使用方法が不明で困っている。
回答を見る
  • ベストアンサー

c言語の、voidの使い方で困っています

C言語の問題を教えて下さい。 この問題で困っています。 複素数z1,z2の引き算、掛け算を計算する構造体complexを引数、 戻り値とする関数 complex hikizan(complex z1,complex z2) complex kakezan(complex z1,complex z2) を作成し、 複素数を画面に表示する関数 void show(complex x) で結果を表示するプログラムを作りなさいという問題です。 z1=1+3i z2=2+2i です。 作ってみたのですが、void show(complex x)を使う方法が分かりません。 教えて下さい、お願いします。 以下、作ったプログラムです #include<stdio.h> typedef struct complex{ double re; double im; } complex; complex hikizan(complex z1,complex z2) { complex z; z.re=z1.re-z2.re; z.im=z1.im-z2.im; return z; } complex kakezan(complex z1,complex z2) { complex zz; zz.re=z1.re*z2.re-z1.im*z2.im; zz.im=z1.re*z2.im+z1.im*z2.re; return zz; } int main(void) { complex z1,z2,z,zz; z1.re=1; z1.im=3; z2.re=2; z2.im=2; z=hikizan(z1,z2); zz=kakezan(z1,z2); printf("z1-z2=%f+%fi \n",z.re,z.im); printf("z1*z2=%f+%fi \n",zz.re,zz.im); }

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

  • ベストアンサー
回答No.1

>printf("z1-z2=%f+%fi \n",z.re,z.im); これを、show(complex x) に置き換えたいということでしょうか? かなり推定ですみません。こうなるのかもしれません。 (全コード書きました) #include<stdio.h> typedef struct complex{ double re; double im; } complex; complex hikizan(complex z1,complex z2) { complex z; z.re=z1.re-z2.re; z.im=z1.im-z2.im; return z; } complex kakezan(complex z1,complex z2) { complex zz; zz.re=z1.re*z2.re-z1.im*z2.im; zz.im=z1.re*z2.im+z1.im*z2.re; return zz; } void show(complex x) { printf("%f+%fi",x.re,x.im); } int main(void) { complex z1,z2,z,zz; z1.re=1; z1.im=3; z2.re=2; z2.im=2; z=hikizan(z1,z2); zz=kakezan(z1,z2); printf("z1-z2="); show(z); printf("\n"); printf("z1*z2="); show(zz); printf("\n"); } 補足・・・ 実は、大して考えていません。 ですが、printfで、"z1-z2="とか表示しているので そこをあえてわけて 最小限の値をshow(z)等で表示したにすぎないものです。 もしかしたら、考え違いで不正解かもしれません。

o-saka-iru
質問者

お礼

助かりました。有難うございます。 上手く出来ました。

その他の回答 (2)

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.3

質問の(voidの使い方で困ってます)だと 皆さん、戻りvoidか引数(void *)など どこまで書けばいいか戸惑うと思います いずれポインタ使うようになるでしょう サンプルです、mainのコメントアウトすると intキャストポインタの実装が表示されます printf関数の"%s"は文字リテラルポインタの 実装を表示する特殊な役割を持っています #include<stdio.h> typedef struct{ double re; double im; void *str; }complex; complex hikizan(complex z1,complex z2){ complex z; z.re=z1.re-z2.re; z.im=z1.im-z2.im; z.str = "z1 - z2 = "; return z; } complex kakezan(complex z1,complex z2){ complex z; z.re=z1.re*z2.re-z1.im*z2.im; z.im=z1.re*z2.im+z1.im*z2.re; z.str = "z1 * z2 = "; return z; } void show(complex x){ printf("%s %f + %fi\n",x.str,x.re,x.im); } int main(void){ int integer_1 = 987,integer_2 = 123; complex z1 = {1,3,&integer_1},z2 = {2,2,&integer_2}; //printf("%d %d\n",*(int *)z1.str,*(int *)z2.str); show(hikizan(z1,z2)); show(kakezan(z1,z2)); return 0; }

o-saka-iru
質問者

お礼

助かります。ありがとうございます

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.2

1の方の補足 それぞれの関数の役割を振り分けましょう hikizan,kakezan関数は引数の値を計算し値を返す show関数は値を受けて、全て任され表示する show(hikizan(z1,z2)); show(kakezan(z1,z2)); 文字リテラルを加えたいなら グローバル変数 char *GLOBAL_1; などを構造体の後などに宣言して 計算関数内で GLOBAL_1 = "kansuumei"; show関数内で "%s",GLOBAL_1を表示する

o-saka-iru
質問者

お礼

ありがとうございます。助かりました

関連するQ&A

  • C言語プログラム

    N次の複素正方行列S,Tの積Uを計算するプログラムを作りたいのですが、実数で正方行列を計算するプログラムと 複素数の積、和のプログラム struct complex { double re; double im; }; を作ったのですが、この二つをまとめるとプログラムができるらしいのですがまとめ方が全然わかりません。どのようにしたらいいかヒントなど教えてください。

  • プログラム初心者で以下の問題が検討すらできません。どなたか参考にどのようなプログラムになるか教えてください。

    抵抗とコンデンサからなる並列回路の複素インピーダンスとその絶対値を求めるプログラムを作成。 プログラムは、抵抗の値、コンデンサの容量、周波数を入力すると、複素インピーダンスとその絶対値を求めその結果を表示するものである。 私の解答です /* * mycomplex.c: 複素数関数 */ #include <stdio.h> #include <math.h> #include "mycomplex.h" /* 複素数の文字列を作る */ char *printc(mycomplex z) { static char str[BUFSIZ]; sprintf(str, "(%lf, %lf)", real(z), imag(z)); return str; } /* 実数と虚数を与えて複素数を作る */ mycomplex mkcomplex(double r, double i) { mycomplex z; z.re = r; z.im = i; return z; } /* 絶対値と偏角を与えて複素数を作る */ mycomplex mkcomplex_at(double abs, double theta) { mycomplex z; z.re = abs * cos(theta); z.im = abs * sin(theta); return z; } /* ノルム */ double norm(mycomplex z) { return z.re * z.re + z.im * z.im; } /* 絶対値 */ double cabs(mycomplex z) { return sqrt(norm(z)); } /* 偏角 */ double carg(mycomplex z) { return atan2(z.im, z.re); } /* 共役複素数 */ mycomplex conj(mycomplex a) { mycomplex z; z.re = a.re; z.im = 0.0 - a.im; return z; } /* 逆数 */ mycomplex cinv(mycomplex a) { mycomplex z; double n; n = norm(a); z.re = a.re / n; z.im = 0.0 - a.im / n; return z; } /* 加算 */ mycomplex cadd(mycomplex a, mycomplex b) { mycomplex z; z.re = a.re + b.re; z.im = a.im + b.im; return z; } /* 減算 */ mycomplex csub(mycomplex a, mycomplex b) { mycomplex z; z.re = a.re - b.re; z.im = a.im - b.im; return z; } /* 乗算 */ mycomplex cmul(mycomplex a, mycomplex b) { mycomplex z; z.re = a.re * b.re - a.im * b.im; z.im = a.re * b.im + a.im * b.re; return z; } /* 除算 */ mycomplex cdiv(mycomplex a, mycomplex b) { mycomplex z; double n; n = norm(b); z.re = (a.re * b.re + a.im * b.im) / n; z.im = (a.im * b.re - a.re * b.im) / n; return z; } /* sin */ mycomplex csin(mycomplex a) { mycomplex z; double ep; ep = exp(a.im); z.re = sin(a.re) * (ep + 1.0 / ep) / 2.0; z.im = cos(a.re) * (ep - 1.0 / ep) / 2.0; return z; } /* cos */ mycomplex ccos(mycomplex a) { mycomplex z; double ep; ep = exp(a.im); z.re = cos(a.re) * (ep + 1.0 / ep) / 2.0; z.im = sin(a.re) * (1.0 / ep - ep) / 2.0; return z; } /* tan */ mycomplex ctan(mycomplex a) { return cdiv(csin(a), ccos(a)); } /* exp */ mycomplex cexp(mycomplex a) { mycomplex z; double ep; ep = exp(a.re); z.re = ep * cos(a.im); z.im = ep * sin(a.im); return z; } /* log 自然対数 (natural logarithm) */ mycomplex clog(mycomplex a) { mycomplex z; z.re = log(norm(a)) / 2.0; z.im = atan2(a.im, a.re); return z; } /* log10 常用対数 (logarithm to base 10) */ mycomplex clog10(mycomplex a) { mycomplex z; z.re = M_LOG10E * log(norm(a)) / 2.0; z.im = M_LOG10E * atan2(a.im, a.re); return z; }

  • 代入されません(C言語)

    こんにちは。 早速質問させていただきます。 申し訳ありませんが、問題の概要など話し始めるととても時間がかかってしまう為省略させていただきます。 下記のプログラムなのですが(私はプロではないため醜いプログラムですがご了承ください)、 #include <stdio.h> int num[8][5] = {{0,0,0,0,0},{0,0,1,0,0},{0,1,0,0,0},{0,1,1,0,0}, {1,0,0,0,0},{1,0,1,0,1},{1,1,0,1,0},{1,1,1,0,0}}; int ic = 0; int i=0, j=0; int id=0;//IDナンバー int m0=0, m1=0, m2=0; //中間層 int z0=0, z1=0; int t0=0, t1=0; double s0=0,s1=0; //総和 double w00=0, w01=0, w02=0, w10=0, w11=0, w12=0;//重み double sikii0=1, sikii1=1; //しきい値(θ) θ0とθ1 int t; //正解 double hoge = 0.1; double mm0, mm1, mm2; //p2. 4)学習 で使用 //プロトタイプ宣言 void input(void); void tyukan(void); void souwa(void); //総和 void hantei(void); void seikai(void); void omomi1(void); void omomi2(void); main(){ while(ic<70){ if(id > 7){ id=0; i=0; j=0; } getchar(); printf("IC = %d ID = %d\n", ic, id); input(); tyukan(); souwa(); hantei(); seikai(); if(z0 != t0) omomi1(); else if(z1 != t1) omomi2(); i++; ic++; id++; } return 0; } void input(){ printf("入力データ M=%d A=%d B=%d\n", num[i][j], num[i][j+1], num[i][j+2]); } void tyukan(){ if(id == 0){ m0=0; m1=0; m2=0; mm0=0; mm1=0; mm2=0; s0=0; s1=0; } m0=num[i][0]+num[i][1]+num[i][2]; m1=num[i][0]+num[i][1]; m2=num[i][0]+num[i][2]; //中間層m0m1m2に代入 mm0 = (double)m0; mm1 = (double)m1; mm2 = (double)m2; printf("中間層 m0=%d m1=%d m2=%d \n", num[i][0]+num[i][1]+num[i][2], num[i][0]+num[i][1], num[i][0]+num[i][2]); } void souwa(void){ printf("総和 s0=%f s1=%f\n",(double)m0*w00 + (double)m1*w01 + (double)m1*w02, (double)m0*w10 + (double)m1*w11 + (double)m2*w12); } //*****関数判定***************************************** void hantei(void){ printf("判定は "); if(s0 >= sikii0){ printf("z0 = 1 "); z0=1; } else{ printf("z0 = 0 "); z0=0; } if(s1 >= sikii1){ printf("z1 = 1\n"); z1=1; } else{ printf("z1 = 0\n"); z0=0; printf("sikii1 %f\n",sikii1); printf("sikii0 %f\n",sikii0); } } void seikai(void){ printf("正解は "); printf("t0 = %d t1 = %d\n", num[id][3], num[id][4]); t0=num[id][3]; t1=num[id][4]; } void omomi1(void){ if(z0 == 0 && t0 == 1){ w00 = w00 + (hoge*mm0); w01 = w01 + (hoge*mm1); w02 = w02 + (hoge*mm2); sikii0 = sikii0-hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } else if(z0 == 1 && t0 == 0){ w00 = w00 - (hoge*mm0); w01 = w01 - (hoge*mm1); w02 = w02 - (hoge*mm2); sikii0 = sikii0+hoge; printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02); printf("閾値 %f\n", sikii0); } } void omomi2(void){ if(z1 == 0 && t1 == 1){ w10 = w10 + (hoge*mm0); w11 = w11 + (hoge*mm1); w12 = w12 + (hoge*mm2); sikii1 = sikii1-hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } else if(z1 == 1 && t1 == 0){ w10 = w10 - (hoge*mm0); w11 = w11 - (hoge*mm1); w12 = w12 - (hoge*mm2); sikii1 = sikii1+hoge; printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12); printf("閾値 %f\n", sikii1); } } 問題はこのプログラムがID7になった時に発生します。 関数hanteiの部分で s0 >= sikii0とs1 >= sikii1がそれぞれ真だったらz0(またはz1)に1を代入するように 作ったのですが、 IC=7 ID=7の部分では,s0が1.20でsikii0が0.9(s0>=sikii0)にもかかわらず z0に1が代入されません(s1とsikii1も同様)。 いろいろ考えてみましたが、原因が分かりませんでした。 どなたかよろしくお願いします。

  • voidについて

    いつもお世話になってます。 最近プログラミングの授業に全然ついていけなくて、1から勉強しようと思ってます。 今回はvoidについて質問なのですが、たとえば下のようなプログラムがあるとします(あえてabcとcdfとxyzを使い分けています。) 数字を入力するとプロトタイプ宣言した関数で足して戻り値が答え(←日本語あってますか?)ってことですよね? 私はvoid関数についてあまり理解できていないので、void関数ではどのように数字が動いているかとどれを一致させなければいけないのかをabcdefxyzを使って詳しく解説していただきたいです。 あと関数の起動の仕方(←日本語あってますか?)も教えていただきたいです。      c=tasu(a,b); printf("%lg\n",c);という方法とか      tasu(a,b); ←これだけとか )   文章ぐだぐだで申し訳ないです。 どなたかおねがいいたします。   ) #include<stdio.h> void tasu(double x, double y, double z); int main(void){ double a,b,c;      printf("1つ目の数字を入力>"); scanf("%lg", &a); printf("2つ目の数字を入力>"); scanf("%lg", &b); c=tasu(a,b); printf("%lg\n",c); return 0; } void tasu(int x, int y, int z) { d = e + f; }

  • c言語の実行結果どうか教えてくださいませ

    double fA(double a) { printf("kansu fA\n'); returna/2.0 } double fB(double b) { double a; printf("kansu fB\n"); a=fA(b); printf("fA(b)=%f\n",a); return a; } int main(void) { fB(210.0); return 0; } 特に小数の表示でございます… 他のサイトでも聞いたのですモヤモヤしまして 何卒宜しくお願いします。

  • 複素数の四則計算

    複素数の四則計算を構造体を使って実行させたいのですが、いまいち構造体のことを理解できていません。 以下の何が間違っているのでしょうか? コンパイルはできますがおそらく間違った値が出てしまっているようです。 #include <stdio.h> typedef struct{ float re, im; } COMPLEX; COMPLEX cal ( COMPLEX a, char c, COMPLEX b ) { COMPLEX d; switch (c) { case '+' : d.re = a.re + b.re; d.im = a.im + b.im; break; case '-' : d.re = a.re - b.re; d.im = a.im - b.im; break; case '*' : d.re = (a.re * b.re) - (a.im * b.im); d.im = (a.im * b.re) + (a.re * b.im); break; case '/' : d.re = (a.re * b.re + a.im * b.im) / ( pow(b.re,2) + pow(b.im,2) ); d.im = (a.im * b.re - a.re * b.im) / ( pow(b.re,2) + pow(b.im,2) ); break; default :puts("不適切な演算です。"); break; } return d; } int main(void) { COMPLEX a; COMPLEX b; printf("aの実数部を入力:"); scanf("%f",&a.re); printf("aの虚数部を入力:"); scanf("%f",&a.im); printf("bの実数部を入力:"); scanf("%f",&b.re); printf("bの虚数部を入力:"); scanf("%f",&b.im); printf("%f + (%f)*i\n",cal(a,'+',b)); printf("%f + (%f)*i\n",cal(a,'-',b)); printf("%f + (%f)*i\n",cal(a,'*',b)); printf("%f + (%f)*i\n",cal(a,'/',b)); } 以上です。 ちなみに、例えばcal(a,'+',b)とすると和が返るようにしなさいという指示がありました。 どなたか教えて頂けるとありがたいです…。

  • C言語なんですがうまくうごきません。

    X=1においてX^nをm回微分した値を求めるプログラムを作っているのですが、 何度も考えて訂正したりしてるのですが、どこが悪いのかわかりません 再帰関数を使ってます。 デバッグして調べてみてるのですが、うまくいってるようにみえるのですが、最後の値が0になります。 nを大きい値にすると、マイナスになったりするんです。 よくわかりません。 ちなみにnとmは正で、mは10までの数を入力します。 このプログラムの基本形を変えないで問題改善することはできるのでしょうか? わかる人いましたら教えてください。 #include <stdio.h> double differentiate(double n, int m); int main(void) { int a, b; printf("Input 2 number\n"); fflush(stdout); scanf("%d %d", &a, &b); printf( "a = %d\nb = %d\n", a, b ); printf("Answer = %d\n", differentiate(a, b)); return 0; } } double differentiate(double n, int m) { if(m == 1){ return n; }else{ return n * n-1 * differentiate(n-1, m-1); } }

  • C言語でファイルから複素数の値を読み込んで表示させるプログラムを作って

    C言語でファイルから複素数の値を読み込んで表示させるプログラムを作っています。 扱う値が実数のみの場合に関しては問題ないのですが、 複素数を読み込む時には、実数のみの場合や、虚数のみの場合もあり、 どう読み込んでいいか分からず、アドバイスを戴きたいと考えております。 それ以外のデータの取り扱い自体は問題ないと思います。 下は実数の値を読み込むプログラムとデータセット、 それを拡張した複素数の値を読み込むプログラムとデータセットになっております。 アドバイス、よろしくお願いいたします。 -------------------------------------------------------------------------------- /*データセット sample.dat*/ 4 3.5 -2 9 12 37.8 65.4 0.4 79.5 3 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 int main(void){ int i,j; double x[LOW][COLUMN]; if((fp = fopen("sample.dat","r"))==NULL){ printf("The file is not found. : sample.dat \n"); exit(1); } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j]); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ printf("%lf\n",x[i][j]); } } return 0; } -------------------------------------------------------------------------------- /*データセット sample_C.dat*/ 4+i i -2 9+i 12 37.8-i 65.4i 0.4+i 79.5 3+i 23.4 5.3 -------------------------------------------------------------------------------- /*プログラム本体 read_C.c*/ #include <stdio.h> #include <stdlib.h> #define LOW 3 #define COLUMN 4 typedef struct{ double re; double im; }C_double; int main(void){ int i,j; C_double x[LOW][COLUMN]; if((fp = fopen("sample_C.dat","r"))==NULL){ printf("The file is not found. : sample_C.dat \n"); exit(1); } /*改良したい読み込み部分*/ for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ fscanf(fp,"%lf",&x[i][j].re); fscanf(fp,"%lf",&x[i][j].im); } } for(i=0;i<LOW;i++){ for(j=0;j<COLUMN;j++){ if(x[i][j].re!=0){ if(x[i][j].im!=0){ printf("x[%d][%d]=%lf+%lfi\n",i,j,x[i][j].re,x[i][j].im); } else{ printf("x[%d][%d]=%lf\n",i,j,x[i][j].re); } } else{ if(x[i][j].im!=0){ printf("x[%d][%d]=%lfi\n",i,j,x[i][j].im); } else{ printf("x[%d][%d]=0\n",i,j); } } } } return 0; }

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • (void *)と&の違い

    #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; } -------------------------------------------------------------- #include<stdio.h> void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; } 上記の2つは同じ結果になるのですが★1と★2のそれぞれの違いがわかりません。どなたかご教授をお願いします。

専門家に質問してみよう