解説について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mai

解説について

#1

投稿記事 by mai » 17年前

こんばんわ、学校の課題で千葉県,埼玉県,茨城県を引数として渡すと,戻り値として知事名,人口,年平均気温,県花を返すプログラムを作成せよ.ただし,それぞれの情報(知事名,人口,年平均気温,県花の順)は以下となる.
千葉県:堂本暁子,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;
}
となるらしいのですが 人口や気温の定義など部分部分で少しわからないので、どなたかこの解答の詳しい解説をお願いできませんでしょうか。 よろしくお願いします

Yuki

Re:解説について

#2

投稿記事 by Yuki » 17年前

>人口や気温の定義など部分部分で少しわからない

どこをどのように解説すれば良いのかわからないので、
知りたいことを具体的に明記してもらえますか?

mai

Re:解説について

#3

投稿記事 by mai » 17年前

ほとんど全部の部分について解説していただきたいのですが。例えば float tmp なら気温の部分にどのように働きかけているとかです。 お願いします

box

Re:解説について

#4

投稿記事 by box » 17年前

> ほとんど全部の部分について解説していただきたいのですが。
下図が、kenという名前の構造体の定義
chiji, pop, tmp, flwの4つのメンバーからなる
4つのメンバーをひとくくりにして、
int型やfloat型などと同じくstruct ken型として扱う

+---------+---------+---------+---------+
|  chiji  |   pop   |   tmp   |   flw   |
|  char型 |  int型  | float型 |  char型 |
|  長さ80 |         |         |  長さ30 |
+---------+---------+---------+---------+

ここまではいいですか?

mai

Re:解説について

#5

投稿記事 by mai » 17年前

ありがとうございます 長さ30とか80とかの数字はどうしてその数字になるのでしょうか 初歩的な質問ですみません

box

Re:解説について

#6

投稿記事 by box » 17年前

> 長さ30とか80とかの数字はどうしてその数字になるのでしょうか

最初の投稿で、解答例として挙げられたプログラムの10行目までをごらんください。
そこに、知事名は長さ80の文字列、県花名は長さ30の文字列であることが書いてあります。
人や花の名前ですからそこまでの長さは必要ないと思いますが、
今回はそこに書いてあった内容に従いました。

mai

Re:解説について

#7

投稿記事 by mai » 17年前

ありがとうございます。続きをお願いします

box

Re:解説について

#8

投稿記事 by box » 17年前

> 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という標準関数を用います。

ここまではいいですか?

mai

Re:解説について

#9

投稿記事 by mai » 17年前

はい 大丈夫です

box

Re:解説について

#10

投稿記事 by box » 17年前

> 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の中にはその県に関するデータが入っています。それを、呼び出し元に返します。

ここまではいいですか?


box

Re:解説について

#12

投稿記事 by box » 17年前

前回までの回答で、各県のデータをセットして呼び出し元に返す関数aの
説明は終わりました。
しかし、最初の投稿でもそうだったのですが、関数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;
}

mai

Re:解説について

#13

投稿記事 by mai » 17年前

丁寧な解説ありがとうございます。 よろしかったらでいいのですが、もう一問だけ類題のご質問をさせていただいてもよろしいでしょうか

box

Re:解説について

#14

投稿記事 by box » 17年前

ここは、そういうための場所です。いくらでもどうぞ。

ただ、ご質問の中身によっては、boxが回答できないことがあります。
すべてのことを知っているわけではありませんので。

そういう場合、他の方から回答が寄せられますので、
安心して問い合わせてください。

mai

Re:解説について

#15

投稿記事 by mai » 17年前

ありがとうございます 以下のような問題も同様に考えても大丈夫なのでしょうか

次のアイウの手順を参考にプログラムを作成せよ
(ア) 氏名,出身地,年齢,体重のそれぞれの変数名をname,hc,age,weightとして,それらの情報を持つ構造体profを宣言する.また,それぞれの変数に以下の3名分の情報を代入する.
&#61557; 山本一郎,東京都,22才,65.3 kg
&#61557; 近藤次郎,福岡県,21才,98.2 kg
&#61557; 岡田三郎,北海道,19才,72.1 kg
(イ) 氏名を引数として戻り値をprof型とする関数rirekiを作成する.
(ウ) main関数内でgets関数を用いて氏名を入力し,関数rirekiに引数として渡し,氏名,出身地,年齢,体重の各情報を戻り値として得て,それらを画面に表示する.

最初の各メンバーの部分はこのような感じになるのでしょうか 間違っていたらごめんなさい
char name
int hc
float age
char weight

box

Re:解説について

#16

投稿記事 by box » 17年前

> ありがとうございます 以下のような問題も同様に考えても大丈夫なのでしょうか

せっかくアップしてくださったのに
申し訳ありません。

前の「千葉」「埼玉」「茨城」の問題とは別の話になりますので、
前の問題は「解決」にして、
新規投稿の形をとっていただけないでしょうか?

mai

Re:解説について

#17

投稿記事 by mai » 17年前

わかりました 丁寧な解説とても参考になりました boxさんありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る