dポイントプレゼントキャンペーン実施中!

はじめまして。

C言語を学習しております。

参考書の練習問題19(下記)で以下の部分がどうしても理解できません。


1、【(People*)mallock】の部分で、mallockの前のPeopleを()でくくる意味とPeopleの後に*を付ける意
味がわかりません。

2、InputPeople関数とShowPeople関数の最後の部分(●の印をしている部分)になぜretutn 0がいらないのでしょうか(原文にはretutn 0の記述がありません)。

3、【while (1)】の部分で、while文の使い方は、「while(条件式){ 繰り返す文;}」のはずですが、なぜ条件式の部分が1なのでしょうか(a > bなどの形ではないのでしょうか)。

4、【while (1)】の部分で、InputPeople関数の引数としてdata[count]がありますが、何を意味しているのかがわかりません。People型の変数dataとint型の変数countを組み合わせてどういう意味合いになるのでしょうか。dataとcountはどういう関係でしょうか。

5、【while (1)】の部分で、count++する意味がわかりません。

6、【while (1)】文内の下記の記述が何を意味しているのかがわかりません。 
     if (count >= datasize) {
      datasize += 10;
      data = (People*)realloc(data,sizeof(People) * datasize);
     }


ここでつまづいて先に進めず困っております。

どうか教えていただきたく、お願い致します。



●練習問題19
練習問題16(一番下に参考として解答を載せています)の、
「3人分の、名前、年齢、性別、を入力して表示するプログラムを作りなさい。
ただし、データは構造体で記憶することとし、
また、データの入力と表示はそれぞれ専用の関数を作って行うこととする。」
という問題を元に、何人分でも入力できるように改造しなさい。
なお、年齢に-1が入力されれば入力終了とする。
※配列番号がint型なのでint型の最大値まで扱えれば良い。

●練習問題19の解答
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
char name[256];
int age;
int sex;
} People;

void InputPeople(People *data);
void ShowPeople(People data);

int main(void)
{
int i,count,datasize;
People *data;

datasize = 10;
data = (People*)malloc(sizeof(People) * datasize);

count = 0;
while (1) {
InputPeople(&data[count]);
if (data[count].age == -1) break;
count++;

if (count >= datasize) {
datasize += 10;
data = (People*)realloc(data,sizeof(People) * datasize);
}
}

for (i = 0;i < count;i++) {
ShowPeople(data[i]);
}

free(data);

return 0;
}

void InputPeople(People *data)
{
printf("名前:");
scanf("%s",data->name);
printf("年齢:");
scanf("%d",&data->age);
printf("性別(1-男性、2-女性):");
scanf("%d",&data->sex);
printf("\n");
    /*●retutn 0は不要?*/
}

void ShowPeople(People data)
{
char sex[16];

printf("名前:%s\n",data.name);
printf("年齢:%d\n",data.age);

if (data.sex == 1) {
strcpy(sex,"男性");
} else {
strcpy(sex,"女性");
}

printf("性別:%s\n",sex);
printf("\n");
    /*●retutn 0は不要?*/
}


●練習問題16の解答
#include <stdio.h>
#include <string.h>

typedef struct {
char name[256];
int age;
int sex;
} People;

void InputPeople(People *data);
void ShowPeople(People data);

int main(void)
{
People data[3];
int i;

for (i = 0;i < 3;i++) {
InputPeople(&data[i]);
}

for (i = 0;i < 3;i++) {
ShowPeople(data[i]);
}

return 0;
}

void InputPeople(People *data)
{
printf("名前:");
scanf("%s",data->name);
printf("年齢:");
scanf("%d",&data->age);
printf("性別(1-男性、2-女性):");
scanf("%d",&data->sex);
printf("\n");
}

void ShowPeople(People data)
{
char sex[16];

printf("名前:%s\n",data.name);
printf("年齢:%d\n",data.age);

if (data.sex == 1) {
strcpy(sex,"男性");
} else {
strcpy(sex,"女性");
}

printf("性別:%s\n",sex);
printf("\n");
}

A 回答 (5件)

>1、【(People*)mallock】の部分で、mallockの前のPeopleを()でくくる意味とPeopleの後に*を付ける意


味がわかりません。

関数mallocは確か、データを格納する領域を確保するポインタ型の関数
(つまり、新しいデータを入れるためのスペースを作るための関数)だったと思います。
Peopleをカッコで括る意味は、くくらないとPeople*mallocの掛け算を意味するからだと思います。
というのは不本意で、ほんとうの意味は、Peopleという構造体型を指しているポインタであることを示すために、
あえて、(Peopele*)としていると思います。

2、InputPeople関数とShowPeople関数の最後の部分(●の印をしている部分)になぜretutn 0がいらないのでしょうか(原文にはretutn 0の記述がありません)。

voidが付いている関数は、戻り値が必要ないので、書かなくていい決まりになっているからです。
ただ、返り値がないので不安な場合は、最後にreturn;とだけしてもOKです。

3、【while (1)】の部分で、while文の使い方は、「while(条件式){ 繰り返す文;}」のはずですが、なぜ条件式の部分が1なのでしょうか(a > bなどの形ではないのでしょうか)。

これはwhile文やfor文の特殊な使い方で、テクニックの一つです。
while(1)とすると、1は0ではないので、永久に繰り返して命令が実行されますが、
ここで、ある条件をみたした時に、break;を置けば、そこで処理が停止されます。
つまり、ある条件を満たすまで永遠にループ(繰り返し)行いなさい。という命令文なのです。

4、【while (1)】の部分で、InputPeople関数の引数としてdata[count]がありますが、何を意味しているのかがわかりません。People型の変数dataとint型の変数countを組み合わせてどういう意味合いになるのでしょうか。dataとcountはどういう関係でしょうか。

dataとcountは型が違いますが、これはそれぞれ独立しているので、問題ありません。
data配列のcount番目のデータを指しています。ようは、dataというデータの箱から、1番目、2番目。。。として
いるわけです。dataとcountの関係はdata配列のcount番目といえば分かりやすいでしょうか。
countはたいてい、プログラマが暗黙の了解でカウント数を記録するための変数として用いることが多いです。

5、【while (1)】の部分で、count++する意味がわかりません。
count++している意味は、もしbreakで処理が停止されなければ、何回繰り返したのかを記録するために
countに1ずつ加算しています。処理がbreakで停止された後、使うんだと思います。

6、【while (1)】文内の下記の記述が何を意味しているのかがわかりません。 
     if (count >= datasize) {
      datasize += 10;
      data = (People*)realloc(data,sizeof(People) * datasize);
     }
これはちょっとお手上げです。インターネットにて「C言語 掲示板」と検索すると
プログラマの神たちが丁寧に回答して頂けるサイトがありますので、そちらをオススメします。
私もそこでかなりお世話になっていてすぐに返答が返ってきます。こことは大違いですよ。

参考URL:http://dixq.net/forum/viewforum.php?f=3&sid=665d …
    • good
    • 1
この回答へのお礼

丁寧に教えていただき、ありがとうございました。

勉強になりました。

お礼日時:2012/08/09 22:10

参考書の練習問題ということであれば、その練習問題以前にそれらに関する説明や練習問題があったはずです。

そこまで戻って理解を深めることをお勧めします。

ただ
>※配列番号がint型なのでint型の最大値まで扱えれば良い。
これはどうなんだろう。
少なくともsizeof(void *)==sizeof(int)の環境ではコンパイルはできてもINT_MAXより前にメモリ不足になると思うけど。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

復習に励みます。

お礼日時:2012/08/04 23:11

1:


(型名)は、キャストの構文だからです。mallocの戻り値は通常、(void *)なので、明示的にキャストしているのです。
2:
それら二つの関数には、戻り値がないからです。それは、
void InputPeople(People *data);
void ShowPeople(People data);
というプロトタイプ宣言を見れば明らかではありませんか?

3:
繰り返し構文(forの真ん中もそうですよ)やif文の制御条件は、通常、その評価結果が0か否かを判断します。(a>0)は、その結果がaがゼロ以上だったら1を返す式です。1という数字自体も式です。ですので、そこに固定的に1と書いてもOKです。試しに、プログラム中に
1;
と書いてみてください。ノーエラーでコンパイルが通ります。1が式で、「1;」が文として間違っていない証拠です。なんにも起こりませんけどね。
ちなみに、代入文も代入された値を結果に持つ式です。だから
if(a=b)とif(a==b)みたいな間違いがエラーも出ずに通るのを、多くの人が恐れるのです。
4:
data[count]は、People構造体型の配列のcount-1番目の要素を表しています。配列の勉強を思い出しましょう。
5:
InputPeople関数で入力する人データの配列中の位置を、一つ進めているのです。
6:
これはまさに、「何人分でも入力できるように改造しなさい。」の部分です、とりあえず最初に10人分のメモリを確保したけど、もっと入力が続く場合に、メモリをとりあえず10人分増やして、再割り当てしているのです。

全体的には、#1さんに同意。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

復習に励みます。

お礼日時:2012/08/04 23:11

ひとつの質問内に、6つも詰め込むのは、マナー違反なんでは。

すくなくとも、字数制限あるので、ひとつのポストで、回答するのは、難しい。で、1だけ。

data は、Peopleという構造体へのポインタ

malloc() の型の宣言は、stdlib.h の先か、どこかで、宣言されているが、char * くらいだろう。すなわち、charへのポインタ。

 a= b;

という代入式で、左辺と右辺の型が、違う場合は、普通、コンパイラは、ワーニングを出す。ワーニングが出ても、コード生成してくれるが、気分は悪い。そこで、型がちがうんだけど、同じ型として、扱います、ということを設計者である、あなたが、コンパイラに通知します。
 その為の方法が、キャストといって、

 a = (type_a) b;

とする。具体的には、(People *)など。これで、一応、型の違いは、合わせれるので、コンパイラのワーニングは出なくなる。より詳細は、キャスト、型チェック、などで、調べられたし。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

復習に励みます。

お礼日時:2012/08/04 23:09

失礼ですが、お見受けする限り、全然基礎が分かっておられないように思います。


もう一回 C言語をきちんと勉強れたほうが、よいかと。

特に、キャスト malloc realloc (これらはヒープ領域のメモリの割り当て) 無限ループ void型 あたりをきちんと勉強されたらよいかと思います。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。

お礼日時:2012/08/04 23:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!