質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

4回答

8852閲覧

C言語の構造体のプログラムの関数を分割したい

subterraneanphi

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/11/16 03:36

編集2015/11/16 03:37

###前提・実現したいこと
C言語で構造体Recordを宣言し、それを使用して構造体変数dataを定義し、dataにキーボード入力し、その後データの内容を出力するプログラム

#include <stdio.h>
int main()
{

struct record { char name[10]; int birthday[3]; int gender; }; struct record data; printf("データを入力してください "); printf("名前(性) ->"); scanf( "%s", data.name); printf("生まれた年(西暦) ->"); scanf( "%d", &data.birthday[0]); printf("生まれた月 ->"); scanf( "%d", &data.birthday[1]); printf("生まれた日 ->"); scanf( "%d", &data.birthday[2]); printf("性別(0:男性、1:女性) ->"); scanf( "%d", &data.gender); printf("名前(性):%s\n",data.name); printf("生年月日:"); printf("%d年%d月%d日", data.birthday[0], data.birthday[1], data.birthday[2]); if(data.gender==0) printf("(男性)\n"); else printf("(女性)\n");

}

を作成した。このプログラムを
Record input(void):キーボードから構造体への入力
void output(Record):構造体内容のディスプレイへの表示
main:inputとoutputをそれぞれ一回ずつ呼ぶ
という3つの関数に分割したプログラムにしたいです。
お手数おかけしますがご指導宜しくお願いします。

###発生している問題・エラーメッセージ
main.c:11:26: error: expected ';' after top level declarator
struct record input(void)
^
;
main.c:12:27: error: expected function body after function declarator
void output(struct record):
^
main.c:12:26: error: parameter name omitted
void output(struct record):
^
warning: format specifies type 'char *' but the argument has type
'<dependent type>' [-Wformat]
main.c:26:15: error: use of undeclared identifier 'data'
scanf( "%s", data.name);
^
main.c:28:15: warning: format specifies type 'int *' but the argument has type
'<dependent type>' [-Wformat]
scanf( "%d", &data.birthday[0]);
~~ ^~~~~~~~~~~~~~~~~
main.c:28:16: error: use of undeclared identifier 'data'
scanf( "%d", &data.birthday[0]);
^
main.c:30:15: warning: format specifies type 'int *' but the argument has type
'<dependent type>' [-Wformat]
scanf( "%d", &data.birthday[1]);
~~ ^~~~~~~~~~~~~~~~~
main.c:30:16: error: use of undeclared identifier 'data'
scanf( "%d", &data.birthday[1]);
^
main.c:32:15: warning: format specifies type 'int *' but the argument has type
'<dependent type>' [-Wformat]
scanf( "%d", &data.birthday[2]);
~~ ^~~~~~~~~~~~~~~~~
main.c:32:16: error: use of undeclared identifier 'data'
scanf( "%d", &data.birthday[2]);
^
main.c:34:15: warning: format specifies type 'int *' but the argument has type
'<dependent type>' [-Wformat]
scanf( "%d", &data.gender);
~~ ^~~~~~~~~~~~
main.c:34:16: error: use of undeclared identifier 'data'
scanf( "%d", &data.gender);
^
main.c:35:9: error: use of undeclared identifier 'data'
return data;
^
main.c:38:33: error: function definition is not allowed here
void output(struct record data){
^
main.c:47:2: error: expected '}'
}
^
main.c:22:27: note: to match this '{'
struct record input (void){
^
5 warnings and 11 errors generated.

###ソースコード

C言語

1#include <stdio.h> 2 3 struct record{ 4 char name[10]; 5 int birthday[3]; 6 int gender; 7 8 }; 9 10 11struct record input(void) 12void output(struct record): 13 14int main() 15{ 16 struct record data; 17 18 data = input(); 19 output(data); 20} 21//-------------------------------------------------------------------- 22struct record input (void){ 23 24 printf("データを入力してください "); 25 printf("名前(性) ->"); 26 scanf( "%s", data.name); 27 printf("生まれた年(西暦) ->"); 28 scanf( "%d", &data.birthday[0]); 29 printf("生まれた月 ->"); 30 scanf( "%d", &data.birthday[1]); 31 printf("生まれた日 ->"); 32 scanf( "%d", &data.birthday[2]); 33 printf("性別(0:男性、1:女性) ->"); 34 scanf( "%d", &data.gender); 35 return data; 36 37//-------------------------------------------------------------------- 38 void output(struct record data){ 39 printf("\n名前(性):%s\n",data.name); 40 printf("生年月日:"); 41 printf("%d年%d月%d日", data.birthday[0], data.birthday[1], data.birthday[2]); 42 if(data.gender==0){ 43 printf("(男性)\n"); 44 }else{ 45 printf("(女性)\n"); 46 } 47}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

とりあえず、11行目12行目に記述してあるプロトタイプ宣言なので、行末のセミコロンが抜けています
input()、output()はそれぞれ関数なので、hskさんが述べているようにそれぞれを中カッコで括る必要があります

あとは、パラメータやリターン値の渡し方や、グローバル、ローカル変数の定義など、少し理解が不足しているので、そのあたりをしっかり理解したほうが良いと思います

投稿2015/11/16 06:21

KatsumiTanaka

総合スコア924

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

KatsumiTanakaさんの回答のとおりですので同じことは書きませんけど、
このままでは、コンパイルエラーの取除き方になってしまうので、質問者さんのやりたいことをするならば
関数mainは、

c

1int main() 2{ 3 struct record data; 4 input(&data); 5 output(&data); 6 return(0); 7}

として、各関数は、

void input(struct record *data) { 処理 } void output(struct record *data) { 処理 }

というふうにしてみたらどうでしょう。たぶん出題意図は構造体dataを使いまわすことなんじゃないかと。
この場合、関数inputと関数outputの内側は、**data.**でなく、 data->になります。dataを構造体のポインタにしたからです。

投稿2015/11/17 13:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。ざっと拝見した感じでは...

>//--------------------------------------------------------------------
は、ただのコメント行です。関数分割したことになりません。

>main.c:11:26: error: expected ';' after top level declarator
は、宣言文のうしろを ; で終えてくださいね。と書かれたエラーです。
このような文法エラーのあとのエラーメッセージは、的を射ていない場合が多いので、まずは先頭のこのエラーを修正してから、再度コンパイルしてみましょう。

関数は、開き中括弧 { で始まり、閉じ中括弧 } で終わります。
また、行や命令文は、セミコロン ; で終わります。

投稿2015/11/16 03:47

hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラー・メッセージがたくさんでてますが、C言語は頭の方ででているエラーが原因で他のエラーがでることが非常に多いです。
まず、先頭と2番目のエラーについて、ちゃんとよく見て、ソースを見て修正してみてください。

答え過ぎるとためにならないと感じましたので、私からは一旦ここまでで終わります。

投稿2015/11/16 03:44

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問