解説について
解説について
こんばんわ、学校の課題で千葉県,埼玉県,茨城県を引数として渡すと,戻り値として知事名,人口,年平均気温,県花を返すプログラムを作成せよ.ただし,それぞれの情報(知事名,人口,年平均気温,県花の順)は以下となる.
千葉県:堂本暁子,6,077,632人,15.4℃,菜の花
埼玉県:上田清司,7,075,965人,14.6℃,桜草
茨城県:橋本昌,2,971,798人,13.4℃,薔薇
という問題が出て解答は
#include<stdio.h>
#include<string.h>
struct ken{
char chiji[80];
int pop;
float tmp;
char flw[30];
};
struct ken a(char c[/url])
{
struct ken x;
if(strcmp(c,"千葉県")==0){
strcpy(x.chiji,"堂本暁子");
x.pop = 6077632;
x.tmp = 15.4;
strcpy(x.flw,"菜の花");
}
else if(strcmp(c,"埼玉県")==0){
strcpy(x.chiji,"上田清司");
x.pop = 7075965;
x.tmp = 14.6;
strcpy(x.flw,"桜草");
}
else if (strcmp(c,"茨城県")==0){
strcpy(x.chiji,"橋本昌");
x.pop = 2971798;
x.tmp = 13.4;
strcpy(x.flw,"薔薇");
}
else{
printf("正しい県を入力して下さい");
exit(0);
}
return x;
}
となるらしいのですが 人口や気温の定義など部分部分で少しわからないので、どなたかこの解答の詳しい解説をお願いできませんでしょうか。 よろしくお願いします
千葉県:堂本暁子,6,077,632人,15.4℃,菜の花
埼玉県:上田清司,7,075,965人,14.6℃,桜草
茨城県:橋本昌,2,971,798人,13.4℃,薔薇
という問題が出て解答は
#include<stdio.h>
#include<string.h>
struct ken{
char chiji[80];
int pop;
float tmp;
char flw[30];
};
struct ken a(char c[/url])
{
struct ken x;
if(strcmp(c,"千葉県")==0){
strcpy(x.chiji,"堂本暁子");
x.pop = 6077632;
x.tmp = 15.4;
strcpy(x.flw,"菜の花");
}
else if(strcmp(c,"埼玉県")==0){
strcpy(x.chiji,"上田清司");
x.pop = 7075965;
x.tmp = 14.6;
strcpy(x.flw,"桜草");
}
else if (strcmp(c,"茨城県")==0){
strcpy(x.chiji,"橋本昌");
x.pop = 2971798;
x.tmp = 13.4;
strcpy(x.flw,"薔薇");
}
else{
printf("正しい県を入力して下さい");
exit(0);
}
return x;
}
となるらしいのですが 人口や気温の定義など部分部分で少しわからないので、どなたかこの解答の詳しい解説をお願いできませんでしょうか。 よろしくお願いします
Re:解説について
> ほとんど全部の部分について解説していただきたいのですが。
下図が、kenという名前の構造体の定義 chiji, pop, tmp, flwの4つのメンバーからなる 4つのメンバーをひとくくりにして、 int型やfloat型などと同じくstruct ken型として扱う +---------+---------+---------+---------+ | chiji | pop | tmp | flw | | char型 | int型 | float型 | char型 | | 長さ80 | | | 長さ30 | +---------+---------+---------+---------+ ここまではいいですか?
Re:解説について
> struct ken a(char c[/url])
> {
> struct ken x;
>
> if(strcmp(c,"千葉県")==0){
>
> strcpy(x.chiji,"堂本暁子");
> x.pop = 6077632;
> x.tmp = 15.4;
> strcpy(x.flw,"菜の花");
> }
関数aは、「char型の配列cを呼び出し元から受け取って、
struct ken型を呼び出し元へ返す」関数です。
先頭部分で、呼び出し元へ返す領域xを用意しています。
受け取ったcには、県の名前が入っていることを想定しています。
cの中身(つまり県名)が「千葉県」なのか「埼玉県」なのか「茨城県」なのかによって、
xに入れる内容が異なります。
上に引用したのは、千葉県の場合です。
strcmp関数はC言語にもともと用意してある関数(標準関数といいます)で、
文字列どうしを比較する機能を持っています。
cの中身が「千葉県」ならば、xの各メンバーに千葉県の
・知事名
・人口
・年平均気温
・県花名
をセットします。
人口や年平均気温は数値ですので、普通に代入できます。
それに対して、知事名や県花名は文字列ですので、数値と同じ方法は採れません。
strcpyという標準関数を用います。
ここまではいいですか?
> {
> struct ken x;
>
> if(strcmp(c,"千葉県")==0){
>
> strcpy(x.chiji,"堂本暁子");
> x.pop = 6077632;
> x.tmp = 15.4;
> strcpy(x.flw,"菜の花");
> }
関数aは、「char型の配列cを呼び出し元から受け取って、
struct ken型を呼び出し元へ返す」関数です。
先頭部分で、呼び出し元へ返す領域xを用意しています。
受け取ったcには、県の名前が入っていることを想定しています。
cの中身(つまり県名)が「千葉県」なのか「埼玉県」なのか「茨城県」なのかによって、
xに入れる内容が異なります。
上に引用したのは、千葉県の場合です。
strcmp関数はC言語にもともと用意してある関数(標準関数といいます)で、
文字列どうしを比較する機能を持っています。
cの中身が「千葉県」ならば、xの各メンバーに千葉県の
・知事名
・人口
・年平均気温
・県花名
をセットします。
人口や年平均気温は数値ですので、普通に代入できます。
それに対して、知事名や県花名は文字列ですので、数値と同じ方法は採れません。
strcpyという標準関数を用います。
ここまではいいですか?
Re:解説について
> else if(strcmp(c,"埼玉県")==0){
>
> strcpy(x.chiji,"上田清司");
> x.pop = 7075965;
> x.tmp = 14.6;
> strcpy(x.flw,"桜草");
> }
>
> else if (strcmp(c,"茨城県")==0){
>
> strcpy(x.chiji,"橋本昌");
> x.pop = 2971798;
> x.tmp = 13.4;
> strcpy(x.flw,"薔薇");
> }
>
> else{
> printf("正しい県を入力して下さい");
> exit(0);
> }
>
> return x;
> }
さっきの続きで、文字列cの内容が「千葉県」ではない場合の話です。
「千葉県」ではなくて「埼玉県」だったら、
xの中に埼玉県に関するデータを格納しています。
さらに、「埼玉県」でもなくて「茨城県」だったら、
xの中に茨城県に関するデータを格納しています。
さらにさらに、「茨城県」でもなかったら、
正しい県名を入力するよう求めて、exitという、プログラムを終了させるための
標準関数を呼び出しています。
文字列cが「千葉県」「埼玉県」「茨城県」のいずれかならば
xの中にはその県に関するデータが入っています。それを、呼び出し元に返します。
ここまではいいですか?
>
> strcpy(x.chiji,"上田清司");
> x.pop = 7075965;
> x.tmp = 14.6;
> strcpy(x.flw,"桜草");
> }
>
> else if (strcmp(c,"茨城県")==0){
>
> strcpy(x.chiji,"橋本昌");
> x.pop = 2971798;
> x.tmp = 13.4;
> strcpy(x.flw,"薔薇");
> }
>
> else{
> printf("正しい県を入力して下さい");
> exit(0);
> }
>
> return x;
> }
さっきの続きで、文字列cの内容が「千葉県」ではない場合の話です。
「千葉県」ではなくて「埼玉県」だったら、
xの中に埼玉県に関するデータを格納しています。
さらに、「埼玉県」でもなくて「茨城県」だったら、
xの中に茨城県に関するデータを格納しています。
さらにさらに、「茨城県」でもなかったら、
正しい県名を入力するよう求めて、exitという、プログラムを終了させるための
標準関数を呼び出しています。
文字列cが「千葉県」「埼玉県」「茨城県」のいずれかならば
xの中にはその県に関するデータが入っています。それを、呼び出し元に返します。
ここまではいいですか?
Re:解説について
前回までの回答で、各県のデータをセットして呼び出し元に返す関数aの
説明は終わりました。
しかし、最初の投稿でもそうだったのですが、関数aを呼び出す側に関する
記述がまだありません。
Windowsベースでない、コンソールアプリケーションという種類の
プログラムをC言語で作成する際、main関数という関数が必要です。
コンソールアプリケーションのプログラムを実行すると、
まずmain関数を実行するようになっています。
今回の場合は、main関数から関数aを呼び出すことになります。
というわけで、main関数の例を含めたプログラム全体を提示します。
不明点があったらお聞きください。
説明は終わりました。
しかし、最初の投稿でもそうだったのですが、関数aを呼び出す側に関する
記述がまだありません。
Windowsベースでない、コンソールアプリケーションという種類の
プログラムをC言語で作成する際、main関数という関数が必要です。
コンソールアプリケーションのプログラムを実行すると、
まずmain関数を実行するようになっています。
今回の場合は、main関数から関数aを呼び出すことになります。
というわけで、main関数の例を含めたプログラム全体を提示します。
不明点があったらお聞きください。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct ken { char chiji[80]; int pop; float tmp; char flw[30]; }; struct ken a(char c[/url]) { struct ken x; if (strcmp(c, "千葉県") == 0) { strcpy(x.chiji, "堂本暁子"); x.pop = 6077632; x.tmp = 15.4; strcpy(x.flw, "菜の花"); } else if (strcmp(c, "埼玉県") == 0) { strcpy(x.chiji, "上田清司"); x.pop = 7075965; x.tmp = 14.6; strcpy(x.flw, "桜草"); } else if (strcmp(c, "茨城県") == 0) { strcpy(x.chiji, "橋本昌"); x.pop = 2971798; x.tmp = 13.4; strcpy(x.flw, "薔薇"); } else { printf("正しい県を入力して下さい\n"); exit(0); } return x; } int main(void) { struct ken data; /* 県のデータ */ char pref[10]; /* 県名 */ while (1) { printf("県名を入力してください(endで終了):"); scanf("%s", pref); if (strcmp(pref, "end") == 0) { break; } data = a(pref); printf("【%sのデータ】\n", pref); printf("知 事:%s\n", data.chiji); printf("人 口:%d人\n", data.pop); printf("年平均気温:%.1f度\n", data.tmp); printf("県 花:%s\n\n", data.flw); } return 0; }
Re:解説について
ありがとうございます 以下のような問題も同様に考えても大丈夫なのでしょうか
次のアイウの手順を参考にプログラムを作成せよ
(ア) 氏名,出身地,年齢,体重のそれぞれの変数名をname,hc,age,weightとして,それらの情報を持つ構造体profを宣言する.また,それぞれの変数に以下の3名分の情報を代入する.
 山本一郎,東京都,22才,65.3 kg
 近藤次郎,福岡県,21才,98.2 kg
 岡田三郎,北海道,19才,72.1 kg
(イ) 氏名を引数として戻り値をprof型とする関数rirekiを作成する.
(ウ) main関数内でgets関数を用いて氏名を入力し,関数rirekiに引数として渡し,氏名,出身地,年齢,体重の各情報を戻り値として得て,それらを画面に表示する.
最初の各メンバーの部分はこのような感じになるのでしょうか 間違っていたらごめんなさい
char name
int hc
float age
char weight
次のアイウの手順を参考にプログラムを作成せよ
(ア) 氏名,出身地,年齢,体重のそれぞれの変数名をname,hc,age,weightとして,それらの情報を持つ構造体profを宣言する.また,それぞれの変数に以下の3名分の情報を代入する.
 山本一郎,東京都,22才,65.3 kg
 近藤次郎,福岡県,21才,98.2 kg
 岡田三郎,北海道,19才,72.1 kg
(イ) 氏名を引数として戻り値をprof型とする関数rirekiを作成する.
(ウ) main関数内でgets関数を用いて氏名を入力し,関数rirekiに引数として渡し,氏名,出身地,年齢,体重の各情報を戻り値として得て,それらを画面に表示する.
最初の各メンバーの部分はこのような感じになるのでしょうか 間違っていたらごめんなさい
char name
int hc
float age
char weight