• 締切済み

C言語に関して質問です。構造体について

構造体についての課題を出されたのですが、よくわかりません。教えてください。 問.複素数の構造体を作成し、その構造体変数2つを引数にもつ四則演算の関数を作成せよ。ただし、それぞれの四則演算の構造体を作成し、main関数内で、(a + bi) + (c + di)の形にし、a=2, b=3,c=4,d=5とすること。 この問題で以下までしか作れませんでした。解説を付けてソースをお願いします。 戻り値の型あってますか? #include<stdio.h> typedef struct{ double x,y; }Complex; void add(Complex z1 , Complex z2); void sub(Complex z1 , Complex z2); void multi(Complex z1 , Complex z2); void divide(Complex z1 , Complex z2);

みんなの回答

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

暇だったので、別解を書いてみました。 #include <stdio.h> #include <math.h> typedef struct { double x; double y; } Complex; typedef Complex (*func)(Complex, Complex); Complex add(Complex z1, Complex z2) { Complex z; z.x = z1.x + z2.x; z.y = z1.y + z2.y; return z; } Complex sub(Complex z1, Complex z2) { Complex z; z.x = z1.x - z2.x; z.y = z1.y - z2.y; return z; } Complex multi(Complex z1, Complex z2) { Complex z; z.x = z1.x * z2.x - z1.y * z2.y; z.y = z1.x * z2.y + z1.y * z2.x; return z; } Complex divide(Complex z1, Complex z2) { Complex z; z.x = (z1.x * z2.x + z1.y * z2.y) / (z2.x * z2.x + z2.y * z2.y); z.y = (z1.y * z2.x - z1.x * z2.y) / (z2.x * z2.x + z2.y * z2.y); return z; } void print(Complex z) { printf("%f %s %fi\n", z.x, (z.y >= 0) ? "+" : "-", fabs(z.y)); } int main(void) { func f[] = { add, sub, multi, divide }; Complex z1 = { 2, 3 }, z2 = { 4, 5 }, z; int i; for (i = 0; i < sizeof(f) / sizeof(f[0]); i++) { z = f[i](z1, z2); print(z); } return 0; }

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

適当に作り替えてください。 #include <stdio.h> typedef struct { double x; double y; } Complex; Complex add(Complex z1, Complex z2) { Complex z; z.x = z1.x + z2.x; z.y = z1.y + z2.y; return z; } Complex sub(Complex z1, Complex z2) { Complex z; z.x = z1.x - z2.x; z.y = z1.y - z2.y; return z; } Complex multi(Complex z1, Complex z2) { Complex z; z.x = z1.x * z2.x - z1.y * z2.y; z.y = z1.x * z2.y + z1.y * z2.x; return z; } Complex divide(Complex z1, Complex z2) { Complex z; z.x = (z1.x * z2.x + z1.y * z2.y) / (z2.x * z2.x + z2.y * z2.y); z.y = (z1.y * z2.x - z1.x * z2.y) / (z2.x * z2.x + z2.y * z2.y); return z; } int main(void) { Complex z1 = { 2, 3 }, z2 = { 4, 5 }, z; z = add(z1,z2); printf("%f + %fi\n", z.x, z.y); z = sub(z1, z2); printf("%f + %fi\n", z.x, z.y); z = multi(z1, z2); printf("%f + %fi\n", z.x, z.y); z = divide(z1, z2); printf("%f + %fi\n", z.x, z.y); return 0; }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

何で困ってる?

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

戻り値の型は、4つともComplex型である必要がありそうです。

関連するQ&A

  • C言語 構造体 2

    三つの構造体α、β、γの実数部、虚数部の値(実数)をそれぞれ入力し、 (α+γ)(γ+β)を求めて表示せよ。 ただし、複素数を、実数部と虚数部に対応するメンバで構成される構造体として表し、複素数の加算用関数c_add()と乗算用関数c_mul()を作成して、これを利用すること。 これらの関数は、sとtを複素数を表す構造体としたとき、c_add(s,t)、c_mul(s,t)と呼び出すと、それぞれ戻り値として、sとtを加算、または乗算した結果である複素数の構造体を返すものとする。 という問題なのですが。。。。 #include<stdio.h> int main(void){ struct complex{ double real; double imaginary; }; struct complex[3]; double real; double imag; printf("α= "); scanf("%d,&real); scanf(%d,&imag); printf("β= "); scanf("%d,&real); scanf(%d,&imag); printf("γ="); scanf("%d,&real); scanf(%d,&imag); (α+γ)=c_add(α,γ); (β+γ)=c_add(β,γ); (α+γ)(β+γ)=c_mul(α+γ,β+γ) result=(α+γ)(β+γ) printf("result= "); まで友達と考えてみたのですが、このあとどうしたらいいのかわかりません>< どなたかお教えください。。お願いします。。。

  • 構造体

    プログラミングの授業で構造体を習ったのですが、課題がよく分からないので質問させていただきます。その課題ですが、 複素数を表す構造体を、 struct complex{float r;(実部)float i;(虚部)}; の形で定義したとして、2つの複素数を入力し、その2つの絶対値の2乗、和、差、積、商を求めるプログラムを作るというものです。 ただし、条件として、 複素数を入力する関数void inputComp(struct complex*c)、複素数をa+biのような形に表示する関数void printComp(struct complex*c)、複素数の絶対値の2乗を関数値として返す関数float asqrComp(struct complex*c)を作成せよというのがあって困っています。 条件がなければprintfを多用してできないこともないでしょうが、条件を満たすプログラムを教えてください。

  • C言語(c++)の構造体

    プログラミング(c++)の本に書いてあった問題の答えが分かりません。 課題 実部(実数)と虚数(実数)をメンバとして持つ複素数型(構造体)を定義し、複素数の四則演算を行う関数をそれぞれ定義してその動作を確認せよ どなたか答えを教えてください 本に書いてあるのでプログラミングの基本はわかるのですが自分で組むとコンパイルに失敗します 「構造体とポインタ」という章の問題なのでそれを踏まえてお願いします

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

  • 不正な構造体の演算

    ある構造体を戻り値として関数からかえして、変数に代入すると不正な構造体の演算というエラーになります。 これは、どういったことが原因と考えられますか?

  • C言語について質問です

    複素数演算について各演算を作成し、関数を扱うために関数complex.cを作成したいです. 今回は和差積商と絶対値,偏角,共役複素数まででよいのですが、解き方がわかりません。 よろしくお願いします

  • C言語 構造体でつまずいています

    以下、番号と点数を入力して構造体配列に入力し、番号に0が入力されたら、入力処理をやめ、平均点を表示するプログラムです。  今のコードでは、最初から番号に0を入力すると、0除算になりエラーになります。どうすれば良いのでしょうか? #include <stdio.h> #define MAX 50 //配列の要素数を定義 int count=0; //グローバル変数 struct data { //構造体の定義 int num; //メンバの宣言 int ten; }; void nyuryoku(struct data *); //プロトタイプ宣言 float heikin(struct data *); //プロトタイプ宣言 void main() { struct data score[MAX]; //構造体の宣言 printf("**学生番号/点数入力**\n"); printf("\n"); nyuryoku(score); //nyuryoku関数呼び出し printf("\n**以上%d名の平均点:%0.1f点**\n",count,heikin(score)); //heikin関数の戻り値表示 } //nyuryoku関数 //機能:構造体配列にデータを入力する void nyuryoku(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; for(i=0;i<MAX;i++){ printf("学生番号>>"); scanf("%d",&pd->num); if(pd->num==0){ //学生番号に0を入力するとループを抜ける break; } printf("点  数>>"); scanf("%d",&pd->ten); count++; //人数のカウント pd++; //構造体配列を一つずらす } } //heikin関数 //機能:構造体配列の点数の平均を計算、戻り値として返す float heikin(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; int sum=0; float ave=0; for(i=0;i<MAX;i++){ if(pd->num==0){ break; } else{ sum+=pd->ten; //点数を加算 pd++; } } ave=(float)sum/count; //平均値を求める return(ave); //平均値を戻り値として返す }

  • C言語 構造体と関数

    三つの複素数α、β、γの実数部、虚数部の値(実数)をそれぞれ入力して、 (α+γ)(β+γ) を求めて表示せよ。 という問題ですが、 #include〈stdio. h〉 #include 〈string. h〉 int main void{ struct vector{ double α; double β; double γ; }; このあと、実数部と虚数部はわけて入力する式を作るのでしょうか? c_ add()、c_mul()を使うのですが、よくわかりません(*_*) また、sとtを複素数を表す構造体としたとき、c_ add(s、t)、c_mul(s、t)と呼び出すと、それぞれ戻り値として、sとtを加算またはsとtを乗算した結果である複素数の構造体を返す、というのはどういうことでしょうか?

  • C言語での構造体

    C言語で、 キュー構造を作りたいのですが、うまくできません。 途中まで作ったのですが、うまく動きませんでした。 EnqueueやDequeueでデータの出し入れをするのですが、そのままではデータを取り出したときにデータが先頭に来ないので、refreshで先頭に持ってくるようにプログラムを組みました。 ----------------------------------------------------- #include<stdio.h> #define MAXQUEUE 10 typedef struct queue{ int head, tail; char entry[MAXQUEUE]; } Queue; //キュー構造にデータを入れる。 void Enqueue(char item,Queue *q){ q->entry[q->tail]=item; q->tail++; } //キュー構造からデータを取り出す。 void Dequeue(char *item,Queue *q){ *item=q->entry[q->head]; q->head++; } //キュー構造内のデータを先頭にずらす。 void refresh(Queue *q){ while(q->head==0){ q->entry[q->head-1]=q->entry[q->head]; q->head--; q->tail--; } } void main(){ Queue qu; Enqueue('w1',&qu); Enqueue('w2',&qu); Enqueue('w3',&qu); Enqueue('w4',&qu); Dequeue(&qu,&qu); Dequeue(&qu,&qu); refresh(&qu); } ---------------------------------------------------------------- mainからEnqueueやDequeueを呼び出すときに、引数として何を渡せばいいのでしょうか?構造体をそのまま渡してみたのですが、「error C2664: 'Dequeue' : 1 番目の引数を 'Queue *' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。」というエラーを吐いてしまいます。 分かりづらい説明で申し訳御座いませんが、ご回答宜しくお願いいたします。

  • 構造体の纏め方

    関数のポインタを使用して、 /* プロトタイプ宣言 */ void func1 ( void ); void func2 ( void ); void func3 ( void ); /*******************/ /* プロトタイプ纏める */ void ( *funcs[] ) ( void ) = { func1, func2, func3 }; /*********************/ と言うのが、構造体でも出来ないでしょうか?と言うのが質問です。 変数(添字)によって、見るべき構造体を自由に変更させたいと言うのが主な使用方法です。 typedef struct _tag { int arg1; int arg2; } tag; tag watch1 , watch2 , watch3; とある変数が1なら、watch1、とある変数が2なら、watch2、とある変数が3なら、watch3を見ると言うようなプログラムにしたくて、質問しました。 witch文を使うしかないのでしょうか? 良き回答、お待ちしています。