• 締切済み

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= "); まで友達と考えてみたのですが、このあとどうしたらいいのかわかりません>< どなたかお教えください。。お願いします。。。

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.5

>教えてもらう場所なのに、なんでせめられなきゃいけないんですか(;_;)??? 自助努力が足りないように見えるから…ではないですかね? 私の回答で「fgets()とかgetchar()とか」ってヒントもあるのですが……。 まぁ、これだけじゃちょっと足りなかったかも知れませんが。 「コンソール 閉じる」も追加すればよかったですかね。 「コンソール 閉じる getchar()」でソレっぽいページが見付かります。 # が、scanf()使っているとうまくいかない場合もあるようで……。 http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/d9e0c0aa-28fd-40eb-831a-f26e1ce4a63d/ こんなのも引っかかります。 # ただし、こちらはVSの場合なのでC++builderでは違うでしょうけど。 「コンソール 閉じる ブレークポイント」でもいくつかひっかかりますね。 やっぱりVSの方が多いようですが。 「コンソール 閉じる ブレークポイント C++builder」では…イマイチでしょうか。 C++builderでのデバッガの使い方を調べた方が効率良さそうです。

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

授業を 2か月受けたんでしょ? だとしたら, 授業中「プログラムの入力~コンパイル~実行」の方法も説明があっただろうし, 徹頭徹尾その方法と「全く同じ方法」を使えば「C++builderに入れたのですが、入力したあとWindowが閉じて、結果まで出ませんでした」なんてことにはならないんじゃないの?

minamiriira
質問者

補足

教えてもらう場所なのに、なんでせめられなきゃいけないんですか(;_;)??? できないものはできないんですよ(ToT) できないけど、できるようになりたいから質問してるのに。。。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

>入力したあとWindowが閉じて、結果まで出ませんでした(;_;) プログラム終了したからコンソール閉じられただけでは? コマンドプロンプト開いて、そこから実行したらどうですか? main()の最後のreturnの行にブレークポイントを設定するとか… fgets()とかgetchar()とか……。

minamiriira
質問者

補足

ごめんなさい、よくわかりません(;_;) 授業で2ヶ月やっただけの素人なのでわかりません(;_;)ごめんなさい 初心者向けにお願いします(;_;)

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

先日、同じ質問に関するサンプルコードをアップした者です。 参考にはならなかったでしょうか。

minamiriira
質問者

補足

C++builderに入れたのですが、入力したあとWindowが閉じて、結果まで出ませんでした(;_;)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> struct complex{ この位置で定義すると、main 関数の中だけで有効な構造体になります。 関数c_add,c_mulでも使いたいのなら、main関数の外で定義します。 > struct complex[3]; やりたいことがわかりません。配列を用意したいのなら、 struct complex carray[3]; 等と配列名(この例ではcarray)が必要です。 個別変数を3つ用意したいのなら struct complex a,b,g; とか struct complex a; struct complex b; struct complex g; などと、3つの変数名(この例ではa,b,g)が必要です。 > scanf("%d,&real); scanfのマニュアルで変換書式の箇所をよく読んで理解してください。 書式と引数の型は一致させないと正しく読み込めません。 今は %dが int型を要求→対応する引数は &real : double *型 となっています。 それと、変数real、 imagに読み込んでますが、そのあと、α、β、γの相当する構造体に読み込んだ値を設定している箇所がありません。 > (α+γ)=c_add(α,γ); こんな書き方はC言語にはありません。 問題文では通常の数学的な表現でα、β、γを使用していますが、これらをC言語的な表現に置き換える必要があります。 例えば struct complex alpha_gamma ; /* α+γの保存用 */ alpha_gamma=c_add(α, γ); の様に。 ※ α,γ のままにしましたが、当然、これらも適切な書き方に変更します。 > printf("result= "); 構造体を都合よく出力してくれる変換書式はありません。内容を考えて、組合せる必要があります。 例えば、 printf("result=%f+(%f)i\n",result.real, result.imaginary); 1つ目の%f→result.realで実数部 2つ目の%f→result.imaginaryで虚数部 等

関連するQ&A

  • 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言語:2つの複素数(分数)の四則演算

    下記のプログラムを組んでみて、発展として分数の形で複素数の四則演算のプログラムを作りたいのですが、どうにもややこしく、困っています。 よろしければ御指導よろしくお願いします。 /* 複素数を表す構造体 2つの複素数の四則演算 */ #include <stdio.h> #include <stdlib.h> typedef struct { double real; /* 実数部分 */ double imag; /* 虚数部分 */ }COMPLEX; /* 二つの複素数の和を返す */ COMPLEX comp_add(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real = x.real + y.real; /* 実数部分の和 */ tmp.imag = x.imag + y.imag; /* 虚数部分の和 */ return (tmp); } /* 二つの複素数の差を返す */ COMPLEX comp_sub(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real = x.real - y.real; /* 実数部分の差 */ tmp.imag = x.imag - y.imag; /* 虚数部分の差 */ return (tmp); } /* 二つの複素数の積を返す */ COMPLEX comp_mul(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real = (x.real * y.real) - (x.imag * y.imag); tmp.imag = (x.real * y.imag) + (y.real * x.imag); return (tmp); } /* 二つの複素数の商を返す */ COMPLEX comp_div(COMPLEX x, COMPLEX y) { COMPLEX tmp; tmp.real =(x.real*y.real+x.imag*y.imag)/(y.real*y.real+y.imag*y.imag); tmp.imag = (x.imag*y.real-x.real*y.imag)/(y.real*y.real+y.imag*y.imag); return (tmp); } int main( int argc, char **argv ) { COMPLEX a, b, c; a.real = strtod( argv[1], NULL ); a.imag = strtod( argv[2], NULL ); b.real = strtod( argv[3], NULL ); b.imag = strtod( argv[4], NULL ); c = comp_add(a, b); /* 複素数の和を c に代入 */ printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); c = comp_sub(a, b); /* 複素数の差を c に代入 */ printf( "(%f+j%f)*(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); c = comp_mul(a, b); /* 複素数の積を c に代入 */ printf( "(%f+j%f)+(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); c = comp_div(a, b); /* 複素数の商を c に代入 */ printf( "(%f+j%f)+(%f+j%f)=(%3.1lf+j%3.1lf)\n", a.real,a.imag,b.real,b.imag,c.real,c.imag ); return( 0 ); }

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • C言語の構造体で悩んでます。

    構造体で顧客情報を管理する課題に取り組んでいるんですが、言語は苦手な分野で解決しかねてます。みなさんの力を借りたいです。お願いします。 課題は、構造体で顧客情報を確保(顧客情報入力の前に、キーボードで1~50の顧客情報の数を入力し、その数の構造体を確保)し、その後、顧客情報を登録するというものです。 私が記述したのは下記のとおりです。 間違いだらけだと思います。すみません。 #define size_id (5) #define size_name (25) #define size_huri (25) #define size_tel (17) struct kokyaku { long *id; char *name; char *huri; char *tel; }; int main() { int a , i; // 構造体確保の数、構造体参照時使用 long c = 1; // id struct kokyaku *ko; printf("顧客情報がありません。何件分確保しますか?(1 - 50)"); scanf("%d",&a); ko = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a)); if(a >= 1 || a <= 50) { for(i = 0;i < a;i++){   ko[i].id = (long*)malloc(size_id);   ko[i].name = (char*)malloc(size_name);   ko[i].huri = (char*)malloc(size_huri);   ko[i].tel = (char*)malloc(size_tel);       } }else{ printf("<<入力範囲にありません>>\n"); printf("<<処理を中断します>>\n"); return 0; } while(c <= a) {  i = 0;  printf("***** 顧客登録画面 *****\n");  ko[i].id = &c;  printf("氏名  :");  scanf("%s", ko[i].name);  printf("ふりがな:");  scanf("%s", ko[i].huri);  printf("電話番号:");  scanf("%s", ko[i].tel);  c++;  i++; } } エラーとか特にないのですが、構造体を件数分確保できていないと思います。 この後にも削除やファイル出力といった展開をさせなければならないのですが、後はなんとか自力でがんばろうと思います。 乱文ですみません。 よろしくお願いします。

  • c言語 構造体

    大学での内容なのですが,『名前,数学の点数,英語の点数,国語の点数を格納できる(メンバに持つ)構造体を宣言し,この構造体の配列を用いて,3人分の情報をキーボードから入力後,各科目の平均点を画面に表示するプログラムを作成せよ.』という問題で,自分なりに作ってみたのですがうまくいきません.どなたか教えていただけませんか? 一応自分で作ったものを下に載せておきます. ================================================================ #include <stdio.h> #include <string.h> struct test { char name[20]; int sugaku; int eigo; int kokugo; }; int main(void) { struct test suzuki; int (suzuki.sugaku), (suzuki.eigo), (suzuki.kokugo); strcpy(suzuki.name, "Suzuki"); printf("氏名:鈴木 一馬\n"); printf("数学:"); scanf("%d", &suzuki.sugaku); printf("英語:"); scanf("%d", &suzuki.eigo); printf("国語:"); scanf("%d", &suzuki.kokugo); struct test tanaka; int tanaka.sugaku, tanaka.eigo, tanaka.kokugo; strcpy(tanaka.name, "Tanaka"); printf("氏名:田中 二郎\n"); printf("数学:"); scanf("%d", &tanaka.sugaku); printf("英語:"); scanf("%d", &tanaka.eigo); printf("国語:"); scanf("%d", &tanaka.kokugo); struct test yamamoto; int yamamoto.sugaku, yamamoto.eigo, yamamoto.kokugo; strcpy(yamamoto.name, "Yamamoto"); printf("氏名:山本 三弘\n"); printf("数学:"); scanf("%d", &yamamoto.sugaku); printf("英語:"); scanf("%d", &yamamoto.eigo); printf("国語:"); scanf("%d", &yamamoto.kokugo); printf("数学の平均点は%dです。\n", ((suzuki.sugaku + tanaka.sugaku + yamamoto.sugaku) / 3.0)); printf("英語の平均点は%dです。\n", ((suzuki.eigo + tanaka.eigo + yamamoto.eigo) / 3.0)); printf("国語の平均点は%dです。\n", ((suzuki.kokugo, + tanaka.kokugo + yamamoto.kokugo) / 3.0)); return (0); } ================================================================

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

  • c言語のポインタ

    学校で、名前、住所などを構造体に入力するというプログラムをc言語で書いています。 そこで、質問なんですが・・・ fgetsで文字を入力し、構造体にデータを入れる関数に渡すと セグメンテーションエラーになってしまいます。 文字列のポインタの問題だと思うのですが、よくわかりません。 誰か教えてください!! ーーーーソースーーーーー printf("name "); fgets(xx,255,stdin); printf("%s",xx); printf("tel "); scanf("%s",t); strcat(t,"\n"); printf("zip "); scanf("%s",z); strcat(z,"\n"); printf("add "); scanf("%s",ad); strcat(ad,"\n"); printf("email "); scanf("%s",em); strcat(em,"\n"); root = makenode( *xx,ss,y,t,z,ad,em, root ); //関数で構造体にデータを挿入する 関数 BinNode *makenode( char *x,char *t,char *z,char*ad,char *em, BinNode *current ) { if( current == NULL ) //currentに何も入っていないとき { current = (BinNode*)malloc(sizeof(BinNode)); //領域を確保する strcpy( current->data, x ); //読みを入力 strcpy( current->tel, t ); //電話番号を入力 strcpy( current->zip, z ); //郵便番号を入力 strcpy( current->add, ad ); //住所を入力 strcpy( current->email, em ); //emailを入力 current->left = current->right = NULL; //右と左のノードをNULLにする }

  • C言語の構造体について

    ご質問があります。 現在C言語について学習しているのですが、構造体を勉強しているときに下記のようなコードを作ったのですが storage size of 'mydata' isn't known というエラーが出てきてしまいます。 どこが間違っているのかがわかりません。 ご指南ご指導して頂けると助かります。 以下コード int main(void){ struct data mydata; mydata.name = "Yamada"; mydata.age = 30; mydata.height=173; mydata.weight = 65.4; printf("name = %s\n",mydata.name); printf("age = %d\n",mydata.age); printf("height = %d\n",mydata.height); printf("weight = %1f\n",mydata.weight); return EXIT_SUCCESS; }

  • C言語の構造体のファイルへの書き込みについて

    C言語を勉強しているものです。構造体を指定した番号の場所にファイルへ書き出し、その指定した番号の場所の構造体をファイルから読み込み表示というプログラムを作成したいのですが、うまくいかずどうしたらいいのかわかりません。説明不足ですがご教授お願いします。 ソフトはVisual C++ 2008 Express Editionを使ってます。 ↓↓↓作成ソースコード↓↓↓ #include<stdio.h> #include<stdlib.h> struct S_data{ char Name[10+1];/*名前*/ int Sex;/*性別*/ int Height;/*身長*/ float Weight;/*体重*/ }; void main(){ FILE *Fp; int pos; int Ret; struct S_data tag; memset(&tag,'\0',sizeof(tag)); Fp=fopen("aaa.dat","r+b"); if(Fp==NULL){ Fp=fopen("aaa.dat","w+b"); if(Fp==NULL){ printf("File not open\n"); exit(2); } } while(1){ scanf("%d",&pos); /*番号の入力*/ if (pos==0) break; scanf("%s",tag.Name);/*名前*/ scanf("%d",&tag.Sex);/*性別*/ scanf("%d",&tag.Height);/*身長*/ scanf("%d",&tag.Weight);/*体重*/ fseek(Fp,sizeof(tag)*(pos),SEEK_SET); fwrite(&tag,sizeof(tag),1,Fp); memset(&tag,'\0',sizeof(tag)); } while(1){ scanf("%d",&pos); if (pos==0) break; fseek(Fp,sizeof(tag)*(pos),SEEK_SET); fread(&tag,sizeof(tag),1,Fp); printf("%s\n",tag.Name); printf("%d\n",&tag.Sex); printf("%d\n",&tag.Height); printf("%d\n",&tag.Weight); memset(&tag,'\0',sizeof(tag)); } Ret=fclose(Fp); if (Ret!=0){ exit(2); } }

  • Visual Cのstat構造体の動作

    はじめまして。 stat構造体をprintf系の関数で出力するときの異常動作で悩んでいます。 stat関数で読み取った複数のstat構造体の日付情報をprintf関数で 出力書式を"%d %d \n"のように連続して出力するとvisual Cだけ、 二つ目の変数が期待した通りに出力できないのでソースをいじって どのような状態で出力できないのか確認したところ、 Visual studio 2012,2013のvisual Cに於いては、 stat構造体の time_t型変数をprintf系関数で出力する場合、その変数以降に 続けて出力する他の変数が正常に出力できなくなることに 気づきました。これはなぜでしょう? 以下のC言語のソースの例では、先にstring変数を出力してstat構造体の time_t型変数を出力した場合(debug2)には問題ないのに、 変数の出力順を入れ替えるとVisual Cではtime_t型変数以降は 正常に出力できません。(debug3) 尚、time_t変数のst_mtime、st_ctime共、同様の結果になります。 printfの書式通りに出力されないだけで、変数の中身は壊れていません。 // 以下サンプルソース wsttes.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/stat.h> #ifdef _HPUX_SOURCE //HP-UXのansi-Cでもコンパイルできるように #define _stat stat #endif int main() { char s1[100]; // s1 struct _stat t1; // t1 strcpy(s1,"testA"); t1.st_atime=111111; // stat構造体を変数として利用しているだけ printf("debug0 s1=%s\n",s1); printf("debug1 t1=%d\n",t1.st_atime); printf("debug2 s1=%s t1=%d\n",s1,t1.st_atime); printf("debug3 t1=%d s1=%s\n",t1.st_atime,s1); return 0; } /*実行結果 Borland C(BCC32) d:\users\work\bc>wsttes debug0 s1=testA debug1 t1=111111 debug2 s1=testA t1=111111 debug3 t1=111111 s1=testA Visual C(visual studio 2012 or 2013) d:\users\work\vc>wsttes debug0 s1=testA debug1 t1=111111 debug2 s1=testA t1=111111 debug3 t1=111111 s1=(null)  ←ここだけ異常? HP-UX ansi-C hp-ux % wsttes debug0 s1=testA debug1 t1=111111 debug2 s1=testA t1=111111 debug3 t1=111111 s1=testA */

専門家に質問してみよう