C言語 家系図プログラムの作成方法

このQ&Aのポイント
  • C言語で家系図を表すプログラムを作成する際に、正しく動作しないエラーが発生しました。
  • プログラムの問題点は、 print_person 関数内でのデータ型の不一致と、文字列の出力方法の誤りです。
  • エラーを修正してプログラムを復元すると、正しく本人の情報と両親の情報を表示することができます。
回答を見る
  • ベストアンサー

C言語 家系図

問題 構造体personを以下のように仮定する。 struct person { int age; char name[20]; struct person *father; struct person *mother; }; この構造体の表す人の名前、年齢、その人の父親の名前、およびその人の母親の名前を出力する関数 void print_person(struct person *p) を作成せよ。出力の形式は name: 本人の名前 age: 本人の年齢 father: 父親の名前 mother: 母親の名前 となるようにすること。 また、ポインタ father や mother の値が NULL のときには、名前のかわりに unknown と出力するようにせよ。 以上が問題なのですが自分でプログラムを作ってみたところ実行したら、エラーになって矯正終了されてしまいました。 以下が私の作ったプログラムです。 #include <stdio.h> struct person { int age; char name[20]; struct person *father; struct person *mother; }; void set_name(struct person *p, char name[]) { int i; i = 0; while (name[i] != 0) { p->name[i] = name[i]; i++; } p->name[i] = 0; } void print_person(struct person *p) { printf("name:%s", p->name); printf("age:%s\n",p->age); if(p->father != NULL){ printf("father:%s\n",p->father); } else{ printf("unknown"); } if(p->mother != NULL){ printf("mother:%s\n",p->mother); } else{ printf("unknown"); } } int main(void) { struct person me, dad, mom; set_name(&me, "Michael"); me.age = 16; me.father = &dad; me.mother = &mom; set_name(&dad, "David"); dad.age = 38; dad.father = NULL; dad.mother = NULL; set_name(&mom, "Susan"); mom.age = 36; mom.father = NULL; mom.mother = NULL; print_person(&me); print_person(&dad); print_person(&mom); return (0); } どこが違うのか教えていただけないでしょうか?

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

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

#1さんの指摘通りだと思います。 手元で試した感じでもint型の表示をするところで%dを使い、fatherやmotherを表示するところはp->father->nameやp->mother->nameとすることで出力の形式に近い表示が出ます。 具体的な変更点はこんな感じです。 @@ -19,15 +19,15 @@ void print_person(struct person *p) { printf("name:%s", p->name); -printf("age:%s\n",p->age); +printf("age:%d\n",p->age); if(p->father != NULL){ -printf("father:%s\n",p->father); +printf("father:%s\n",p->father->name); } else{ printf("unknown"); } if(p->mother != NULL){ -printf("mother:%s\n",p->mother); +printf("mother:%s\n",p->mother->name); } else{ printf("unknown"); #2さんの指摘は半分以上は間違っているのでその部分を訂正します。 > まず、mainは一番上に記述するのが作法です。 そんな必要は全くありません。 > 構造体とポインタの扱いと構造体宣言と実態とローカル変数とグローバル変数とかがゴッチャになっています。 このプログラムにグローバル変数はひとつも出てきていません。 set_nameなど、ポインター渡しがちゃんとできていますし、me.father = &dad;などポインターを使いこなせているように見えます。 おそらく、#2さんはポインターを使いこなせていないのではないかと予想します。 > 宣言したばかりで値は不定のはず。ありえない。 アドレスの代入なので問題ありません。構造体の実体のアドレスはここを実行した時には既に決まっています。 > char型なのに数値で判定????? この指摘は正しいと思います。これが文字列であることを考えると0ではなくnull character('\0')と比較するのが正しいです。 しかし、たいていのC言語処理系ではこの問題が露見することはないと思います。 C99の仕様書のドラフトらしきもの http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf の5.2.1 Character setsによれば、null characterとはすべてのビットが0となった値となっています。 一方、数値の0もすべてのビットが0となった値で表現されるのが普通だと思います。 よって、0と書いてあっても'\0'と書いてあっても同じ機械語に翻訳されて実行されるでしょう。 ちなみにこの箇所は自分だったらstrlcpyの使用を真っ先に検討します。 あるいは、strncpyしてdst[sizeof(dst) - 1] = '\0'するか。 > って何故に数値の0を入れる? これも上記と同じで文字列なので'\0'で閉じるのが正しいと思います。 > この宣言が回帰的な宣言になっている。自分自身の中で自分自身を参照していることになる。 これは全く問題ありません。 リスト構造や木構造を作る場合に普通に使われる書き方です。 同じくC99の仕様書のドラフトらしきものに 6.7.2.1 Structure and union specifiers の2節にこういう文が出てきます。 | (略) (hence, | a structure shall not contain an instance of itself, but may contain a pointer to an instance | of itself), (略) 構造体がその実態を持つことはできませんが、ポインタ変数として自分を参照することは問題ありません。 #3さんがstrcpy関数を使うよう薦めていますが、個人的にはstrlcpyかstrncpyのあとに'\0'をつけるほうが良いと思います。 #5さんの > ここのループ終了条件に0を使っているので、配列の範囲を超えて強制終了、ということではないかと。 というのはかなり眉唾です。 Intel x86 や AMD64などの環境だと、先にも述べた通り、0と'\0'は機械語レベルでは同じ値になっていることが普通だと思います。よって、これによる無限ループというのはまずありません。 ただ、文字の比較ですから、'\0'と比較する習慣をつけたほうが良いとは思います。 > この場合、print_personと、set_nameをプロトタイプ宣言する必要があります。そうしないとコンパイル・リンクできません。 厳しくチェックするコンパイラーでもない限り、警告が出るだけでコンパイルは出来ると思います。おっしゃるとおり、この場合はプログラムの最初のほうで関数のシグニチャをプロトタイプ宣言しておいたほうが良いです。 なお、同一ファイル内にprint_personやset_nameがあるのでリンクには全く問題がありません。 あとは落穂拾い的に気づいたことを指摘します。 1. struct personの中でchar name[20]と固定値を書いていますが、#define NAME_LENGTH 20などして、char name[NAME_LENGTH]としたほうが良いと思います。将来、名前が長い人が出てきた時に20から30に変えようとするとマクロだと1箇所の変更で済みますが、固定値を書いていると1箇所ではすみません。(ファイルに書き込んだりネットワークで渡したりするところで、名前が20文字だと想定していると1箇所の変更では済まないですが...) 2. while (name[i] != 0)の箇所は先にも述べたようにstrlcpyの使用を検討してください。strlcpy(p->name, name, NAME_LENGTH);とするか、strncpyを使った上で、strncpy(p->name, name, NAME_LENGTH); p->name[NAME_LENGTH - 1] = '\0';とするかです。 (strncpyを使う理由、strncpyのあとにp->name[NAME_LENGTH - 1] = '\0';とする理由はhttp://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strcpy.3.html の注意を見るとよいでしょう。 3. 細かいことですが、"name: %s\n"と\nをつけたほうが良いです。 4. 細かいことですが、unknownのところはfather: unknown\nとしたほうがずっと見やすく表示されます。 5. いっそのこと与えられたものがNULLだったらunknownへのポインタを返し、そうでない場合は名前へのポインタを返す関数を作っても良いかもしれません。 char* get_name(struct person *p) { if(p != NULL) { return p->name; } else { return "unknown"; } } そうすると、fatherを表示する部分はprintf("father:%s\n", get_name(p->father));となります。 以上。 頑張って。

hanagedaiou
質問者

お礼

非常に解説がわかりやすかったです。 ありがとうございます。 実際にコンパイルして成功しました。 またよろしくお願いします。

その他の回答 (6)

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

本題からはずれてしまうけど 1点だけ: C において '\0' は「値が 0 であるような int 型の定数」になります. 一方 0 は「値が 0 であるような int 型の定数」です. したがって, 見た目を除き '\0' と 0 とは全く同じです. その結果として, 例えば int *p = '\0'; も全く合法だったりするんだけどさすがにこれはぼろくそに突っ込まれそう (「見た目」以外は問題ないんだけど). あと落穂ひろいの重箱の隅を突っついてみると strlcpy は標準じゃないので strncpy だけを挙げた方が安全だろうし, get_name の返り値の型は const char * にしたかったりする....

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.5

申し訳ありません。訂正させてください。 1) while (name[i] != 0) { 0 → '\0' ここのループ終了条件に0を使っているので、配列の範囲を超えて強制終了、ということではないかと。 文字列の終端ナル文字は\0です。 --- >まず、mainは一番上に記述するのが作法です。 これは違います。 この場合、print_personと、set_nameをプロトタイプ宣言する必要があります。そうしないとコンパイル・リンクできません。 void set_name(struct person *p, char name[]); void print_person(struct person *p); >この宣言が回帰的な宣言になっている。 これも問題ありません。(理由はリスト構造を調べていただければ分かります。)

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

試してないけど #1 で指摘されている通りだと思う. コンパイラによっては警告を出してくれるよ. ちなみに #2 は 100 % 間違っているので無視して OK.

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.3

1) while (name[i] != 0) { ← \0 ここのループ終了条件に0を使っているので、配列の範囲を超えて強制終了、ということではないかと。 文字列の終端ナル文字は\0です。 あるいはwhile{}をやめ、string.hをincludeして、strcpy関数を使います。 詳細は調べてください。 2) printf("age:%s\n",p->age); #1の回答者の方の仰るとおりです。

  • papapa0427
  • ベストアンサー率25% (371/1472)
回答No.2

まず、mainは一番上に記述するのが作法です。 間違いだらけでどこをどう指摘したらよいのか判りませんね。 構造体とポインタの扱いと構造体宣言と実態とローカル変数とグローバル変数とかがゴッチャになっています。 >int main(void) { >struct person me, dad, mom; > >set_name(&me, "Michael"); >me.age = 16; >me.father = &dad;    ←宣言したばかりで値は不定のはず。ありえない。 >me.mother = &mom;    ←宣言したばかりで値は不定のはず。ありえない。 >void set_name(struct person *p, char name[]) { >int i; >i = 0; >while (name[i] != 0) { ←char型なのに数値で判定????? >p->name[i] = name[i]; >i++; >} >p->name[i] = 0;     ←って何故に数値の0を入れる? >} そもそも >struct person { >int age; >char name[20]; >struct person *father; >struct person *mother; >}; この宣言が回帰的な宣言になっている。自分自身の中で自分自身を参照していることになる。 ありえないプログラムですね。

  • honor
  • ベストアンサー率35% (25/71)
回答No.1

intや構造体をを%sで表示したらまずいのでは

関連するQ&A

  • C言語のプログラムで...

    下のプログラムは参考書にあったサンプルプログラムなのですが /* 関数の宣言 */ int print_struct(struct person dat); のところはなぜint型なのですか? #include <stdio.h> #include <string.h> /* 構造体の定義 */ struct person { char name[20]; /* 名前 */ double height; /* 身長 */ double weight; /* 体重 */ int bpl; /* 最低血圧 */ int bph; /* 最高血圧 */ }; /* 関数の宣言 */ int print_struct(struct person dat); /* main関数 */ int main(void) { /* 変数の宣言 */ struct person dat; /* 構造体のメンバーに値を代入 */ strcpy(dat.name,"山田太郎"); dat.height = 173.5; dat.weight = 63.0; dat.bpl = 98; dat.bph = 113; /* struct person関数を実行 */ print_struct(dat); return 0; } /* print_struct関数 */ int print_struct(struct person dat) { /* 画面に出力 */ printf("%s\n",dat.name); printf("%f\n",dat.height); printf("%f\n",dat.weight); printf("%d\n",dat.bpl); printf("%d\n",dat.bph); return 0; }

  • c 言語初心者です。

    c 言語初心者です。 私は下記の構造体配列をつくりました。 しかしバッファオーバーランが起きてエラーが起きてしまいます。 ヒープ領域に問題があるのかもしれませんが、プログラム上どこに原因があるのかが良くわかりません。 どなたかよろしければ教えていただけないでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include<memory.h> struct s { int i; char name[25]; char huri[25]; char num[23]; }; void touroku(struct s *p); void hyouji(struct s *p); int main(void) { struct s data; touroku( &data ); hyouji( &data ); //data.num *= 1; /* dataはポインタではないのでドット演算子 */ hyouji( &data ); return 0; } /* 構造体のメンバを設定する */ void touroku(struct s *p) { int i=0; for(i=1;i<3;i++) { printf( "25文字以内の名前を入力して下さい\n" ); memset(p[i].name, 0, sizeof(p[i].name)); fgets( p[i].name,sizeof(p[i].name) , stdin ); if(strchr(p[i].name,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].name[strlen(p[i].name)-1]=='\n')//改行解除 { p[i].name[strlen(p[i].name)-1] = '\0'; } printf("25文字以内のふりがなを入力してください\n"); memset(p[i].huri, 0, sizeof(p[i].huri)); fgets(p[i].huri,sizeof(p[i].huri),stdin); if(strchr(p[i].huri,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].huri[strlen(p[i].huri)-1]=='\n')//改行解除 { p[i].huri[strlen(p[i].huri)-1] = '\0'; } printf( "整数を入力して下さい\n" ); memset(p[i].num, 0, sizeof(p[i].num)); fgets(p[i].num,sizeof(p[i].num),stdin ); if(strchr(p[i].num,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].num[strlen(p[i].num)-1]=='\n')//改行解除 { p[i].num[strlen(p[i].num)-1] = '\0'; } } } /* 構造体のメンバを出力する */ void hyouji(struct s *p) { int i=0; for(i=1;i<3;i++) printf("%-8s %3s %3s %d\n" ,p[i].name , p[i].huri , p[i].num , i); puts("----------------------------------------------------------------"); return ; }

  • プログラミングの質問です

    #include<stdio.h> #include<stdlib.h> #include<string.h> struct person{ char name[10]; int gender; int age; }; void printPersonList(struct person *person_p, int size); void outputPersonList(struct person *person_p, int size); double getAverageOfAge(struct person *person_p, int size); int countMales(struct person *person_p, int size); int countFemales(struct person *person_p, int size); int main(void){ struct person *person_p; int i, count, gender, age, maleCount, femaleCount; char name[20]; double average; printf("登録する人数を入力してください。\n"); scanf("%d", &count); person_p = (struct person*)malloc(sizeof(struct person)* count); for(i=0; i < count; i++){ printf("名前・性別(男性:0, 女性:1)・年齢をスペース区切りで入力してください。\n"); scanf("%s %d %d", name, &gender, &age); strcpy((person_p + i) -> name, name); (person_p + i) -> gender = gender; (person_p + i) -> age = age; } printPersonList(person_p, count); outputPersonList(person_p, count); average = getAverageOfAge(person_p, count); printf("平均年齢:%f\n", average); maleCount = countMales(person_p, count); femaleCount = countFemales(person_p, count); printf("男性:%d名, 女性:%d名\n", maleCount, femaleCount); free(person_p); return 1; } void printPersonList(struct person *person_p, int size){ int i; printf("登録リスト\n"); printf(" name | gender | age\n"); printf("----------+--------+-----\n"); for(i=0; i < size; i++){ printf("%10s | %1d | %2d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } } void outputPersonList(struct person *person_p, int size){ FILE *output; int i; if((output = fopen("meibo.c", "w")) == NULL){ printf("meibo.cを開けませんでした。\n"); return; } for(i=0; i < size; i++){ fprintf(output, "%s, %d, %d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } fclose(output); } 上は、「キーボードで入力した個人データ(名前、性別、年齢)を構造体に入れて、一覧を画面に出し、かつ、ファイルに書き出す」ことをするプログラムです。これを名前が辞書順になるようにしたいです。どう書くのか教えてください。

  • プログラミング構造体について。

    include<stdio.h> #include<stdlib.h> #include<string.h> struct person{ char name[10]; int gender; int age; }; void printPersonList(struct person *person_p, int size); void outputPersonList(struct person *person_p, int size); double getAverageOfAge(struct person *person_p, int size); int countMales(struct person *person_p, int size); int countFemales(struct person *person_p, int size); int main(void){ struct person *person_p; int i, count, gender, age, maleCount, femaleCount; char name[20]; double average; printf("登録する人数を入力してください。\n"); scanf("%d", &count); person_p = (struct person*)malloc(sizeof(struct person)* count); for(i=0; i < count; i++){ printf("名前・性別(男性:0, 女性:1)・年齢をスペース区切りで入力してください。\n"); scanf("%s %d %d", name, &gender, &age); strcpy((person_p + i) -> name, name); (person_p + i) -> gender = gender; (person_p + i) -> age = age; } printPersonList(person_p, count); outputPersonList(person_p, count); average = getAverageOfAge(person_p, count); printf("平均年齢:%f\n", average); maleCount = countMales(person_p, count); femaleCount = countFemales(person_p, count); printf("男性:%d名, 女性:%d名\n", maleCount, femaleCount); free(person_p); return 1; } void printPersonList(struct person *person_p, int size){ int i; printf("登録リスト\n"); printf(" name | gender | age\n"); printf("----------+--------+-----\n"); for(i=0; i < size; i++){ printf("%10s | %1d | %2d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } } void outputPersonList(struct person *person_p, int size){ FILE *output; int i; if((output = fopen("meibo.c", "w")) == NULL){ printf("meibo.cを開けませんでした。\n"); return; } for(i=0; i < size; i++){ fprintf(output, "%s, %d, %d\n", (person_p + i) -> name, (person_p + i) -> gender, (person_p + i) -> age); } fclose(output); } 残り3つの関数をすべて定義する(それぞれ10行程度) getAverageOfAge, countMales, countFemales どう定義すればいいのか教えてください。お願いします。

  • C言語

    3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。というプログラムなんですが、なぜかこのままだとコンパイルはとおるんですが文字入力を3回とfor文で定めているはずなのに、4回になってしまいます。なぜなんでしょうか・・・?prints関数内のfor文はちゃんと動作していて3つ出力されているんですが。コンパイルエラーは無しです。分かるかた教えて頂けないでしょうか? #include <stdio.h> struct tag{ char name[20]; int age; char sex[20]; }; void put (struct tag *ai); void prints(struct tag *sei); int main(void) { struct tag kansuu[3]; put(kansuu); prints(kansuu); return 0; } void put (struct tag *ai) { int i; for(i=0;i <3;i++){ scanf("%s %d %s\n",(ai+i)->name,& (ai+i)->age,(ai+i)->sex); } return;} void prints(struct tag *sei) { int i; for(i=0;i <3;i++) printf("%s %d %s\n",(sei+i)->name,(sei+i)->age,(sei+i)->sex); return;}

  • C言語の自己参照型プログラムについて

    #include <stdio.h> #include <string.h> #include <stdlib.h> struct list { int key; /* キー */ char name[20]; /* 名前 */ struct list *next; /* 次のデータへのポインタ */ }; struct list *add_list(int key, char *name, struct list *head); void show_list(struct list *p); void free_list(struct list *p); int main(void) { struct list *head; /* 先頭ポインタ */ char name[20]; int key = 0; head = NULL; /* 先頭ポインタにNULLを設定 */ printf("キーと名前(MAX:19文字)を入力(終了:CTRL+Z)\n"); while (scanf("%d %s", &key, name) != EOF) { /* リストにデータを登録 */ head = add_list(key, name, head); } /* リストの表示 */ show_list(head); /* リストの開放 */ free_list(head); return 0; } /*** リストにデータを登録 ***/ struct list *add_list(int key, char *name, struct list *head) { struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(EXIT_FAILURE); } /* リストにデータを登録 */ p->key = key; strcpy(p->name, name); /* ポインタのつなぎ換え */ p->next = head; /* 今までの先頭ポインタを次ポインタに */ head = p; /* 新たな領域を先頭ポインタに */ return head; } /*** リストの表示 ***/ void show_list(struct list *p) { while (p != NULL) { /* 次ポインタがNULLまで処理 */ printf("%3d %s\n", p->key, p->name); p = p->next; } } /*** リストの開放 ***/ void free_list(struct list *p) { struct list *p2; while (p != NULL) { /* 次ポインタがNULLまで処理 */ p2 = p->next; free(p); p = p2; } } これを実行すると、 新しく入力された順にリストが表示されます。 そうではなく、キーの昇順に表示したいです。 どなたかそのように実行できるようにプログラムを書き換えてくれませんか? 図々しいですがよろしくお願いいたします。m(_ _)m

  • 二進検索木

    下記のプラグラムで二進検索木を作りたいのですが、うまくいきません(2つまでしか保存ができない)。 たぶん、ポインタがおかしいと思うのですが・・・。お願いします。 入力 年齢 1 名前 a メアド a@ 年齢 2 名前 b メアド b@ 年齢 3 名前 c メアド c@ 年齢 -1 出力 b  ×  c   ×   × 歳 2 名前 b メアド b@ 歳 3 名前 c メアド c@ #include<stdio.h> #include<stdlib.h> struct node{ char *name; char *email; int age; struct node *left; struct node *right; }; void getline(char *s,int n){ int c; while(--n>0&&((c=getchar())!=EOF && c!='\n')) *s++=c; *s='\0'; } char* dupstr(char* strg){ char* newstr; newstr = (char*)malloc(sizeof(char)*strlen(strg)); strcpy(newstr,strg); return newstr; } struct node *new(int n,char *na,char *em){ struct node *p; p=malloc(sizeof(struct node)); p->age=n; p->name=na; p->email=em; p->left=NULL; p->right=NULL; return p; } void print(struct node *p){ if(p==NULL)return; else{ print(p->left); printf("\n歳:%d ", p->age); printf("\n名前:%s ", p->name); printf("\nメアド:%s ", p->email); print(p->right); } } void print_tree(struct node *p,int level){ int i; for(i=0;i<level;i++)printf(" "); if(p==NULL)printf("×\n"); else{ printf("%s\n",p->name); print_tree(p->left,level+1); print_tree(p->right,level+1); } } void *insert(struct node *p,int n,char *na,char *em){ int c; c=strcmp(p->name,na); if(c==0); else if(c>0){ if(p->left==NULL) {p->left=new(n,na,em); return p;} else insert(p->left,n,na,em); } else{ if(p->right==NULL){ p->right=new(n,na,em); return p;} else insert(p->right,n,na,em); } } main() { int age,g; char buf[80],a[80],b[80],*email,*name; struct node *root=NULL; g=1; printf("\n歳を入力:"); getline(buf,sizeof(buf)); printf("\n名前入力:"); getline(a,sizeof(a)); name=dupstr(a); age=atoi(dupstr(buf)); printf("\nメアド入力:"); getline(b,sizeof(b)); email=dupstr(b); root=new(age,name,email); while(g==1){ printf("\n歳を入力:"); getline(buf,sizeof(buf)); age=atoi(dupstr(buf)); if(age==-1) break; printf("\n名前入力:"); getline(a,sizeof(a)); name=dupstr(a); printf("\nメアド入力:"); getline(b,sizeof(b)); email=dupstr(b); root=insert(root,age,name,email); } print_tree(root,0); print(root); }

  • C言語 「構造体のソートと結果のファイル出力」 緊急です。助けてください。

    授業で課題が出され内容は以下となってます。 1.歴代アメリカ大統領の情報を構造体とする. 2.ソートを昇順で行うこと 3.結果を出力すること〔参考:http://www-it.sci.waseda.ac.jp/CPR1/class08/kekka.log) 以下が自分で作ってみたものですが、多数のエラーが出てしまいどうしたらいいのか分かりません。。。抜本的な変更でもかまいませんので、分かる方助けてください。 -----作成分------ #include <stdio.h> #include <string.h> struct president { int no, age; char name1[20], name2[20]; /* 氏名 */ }; int main(void) { int i; struct president pre1[44] = { {1,57,"George","Washington"}, {2,61,"John","Adams"}, {3,57,"Thomas","Jefferson"}, //リストが長いので省略// {44,47,"Barack","Obama"}, }; struct president *pres; pres = pre1; //ポインタ// sort(pres, 44, sizeof(struct president), president_cmp);//ソート構文 エラーがでます。。。// printf("---------sortted list by age------- \n # age first last \n");} for (i = 0; i < 44; i++){printf("------------------------------------ \n") printf("%d %d %s %s \n, pres[i]->no, pres[i]->name, pres[i]->name1, pres[i]->name2);} for(i = 0; i < 44; i++) { if (i==0){printf("---------list of presidents---------- \n");//RAW DATAの表示を行ない。ここは問題ないみたいです// printf(" age first last \n");}; printf("%d %d %s %s \n", pres->no, pres->age, pres->name1, pres->name2); ++pres; } return 0; } int president_cmp(const void*p1, const void*p2){ //比較関数// struct president *cmp1 = (struct president*)p1; struct president *cmp2 = (struct president*)p2; return strcmp(cmp1->age, cmp2->age); } ここにファイル出力の分をたしたいのですが、どこにどうすればいいのでしょう。 大変申し訳ありませんが、緊急です!!お願いします。

  • c言語つくってみました

    #include<stdio.h> #define N 5 struct MEMBER{ int no; char name[8+1]; int run; int jump; int power; int sum; double avg; }; void Calc_Sum(struct MEMBER *data) { data->sum=data->run+data->jump+data->power; return(0); } void Calc_Avg(struct MEMBER *data) { data->avg=data->sum/3.0; return(0); } void Display_Data(struct MEMBER data) { printf("---判定---\n"); printf("背番号:%5d\n",data.no); printf("名前:%5s\n",data.name); printf("走力 :%5d 点数\n",data.run); printf("跳躍力:%5d 点数\n", data.jump); printf("筋力 :%5d 点数\n", data.power); printf("総計 :%5d 点数\n", data.sum); printf("平均 :%5.1f 点数\n", data.avg); return(0); } int main(void) { int i; struct MEMBER member[N] ={{51,"イチロー",95,95,80,0,0}, {55,"松井秀喜",70,80,90,0,0}, {18,"松坂大輔",75,75,80,0,0}, {18,"黒田博樹",80,85,85,0,0}, {19,"上原浩治",85,85,85,0,0}, }; struct MEMBER *p=member; /*総計の算出*/ for(i=0;i<N;i++) Calc_Sum(p+i); /*平均の算出*/ for(i=0;i<N;i++) Calc_Avg(p+i); /*結果の出力:*/ for(i=0;i<N;i++) Display_Data(member[i]); return(0); } 以上のようなのc言語をつくりました。 他に関数を2つ使用しなければならないのですが アドバイスよろしくお願い致します。

  • C言語 プログラミング

    C言語、プログラミングの質問です。 構造体について、 プログラムを組んでみたのですが、上手く出力されません。実行時にはエラーはないのですが、出力時に上手くいきません。どなたかどこがおかしいかわかる方、教えていただけませんでしょうか? #include <stdio.h> struct user{ char *name; char *id; int books; }; int main (void) { struct user u; printf("氏名を入力して下さい。"); scanf("%s",u.name); printf("パスワードを入力してください。"); scanf("%s",u.id); printf("年齢を入力してください。"); scanf("%d",&u.age); printf("氏名 %s\n",u.name); printf("パスワード %s\n",u.id); printf("年齢 %d\n",u.age); return 0; } よろしくお願いします。

専門家に質問してみよう