C言語
はじめまして。
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");
}
お礼
#include <stdio.h> void draw_u (int); void draw_odd (int); void draw_even (int); void draw_d (int); void SPACEx (int); void SPACEy (int); void main (void) { int suu; printf("数字2~9を入力してください:"); scanf("%d", &suu); while(suu < 2 || suu > 9) { printf("※入力エラー!! 2~9を入力してください:"); scanf("%d", &suu); } if(suu == 2*(suu/2)) { suu = suu+1; draw_u (suu); draw_even (suu); draw_d (suu); } else { draw_u (suu); draw_odd (suu); draw_d (suu); } } void draw_u (int suu) { int a, b, cnt; a=0; b=(suu-3)/2; cnt=1; while(cnt<=(suu-1)/2) { SPACEx (a); SPACEy (b); SPACEy (b); a++; b--; cnt++; printf("\n"); } } void draw_odd (int suu) { int kazu; for(kazu=1; kazu<=suu; kazu++) { printf("*"); } printf("\n"); } void draw_even (int suu) { int kazu; for(kazu=1; kazu<=suu; kazu++) { if(kazu != (suu+1)/2) { printf("*"); } else { printf(" "); } } printf("\n"); } void draw_d (int suu) { int a, b,cnt; a=(suu-3)/2; b=0; cnt=1; while(cnt<=(suu-1)/2) { SPACEx (a); SPACEy (b); SPACEy (b); a--; b++; cnt++; printf("\n"); } } void SPACEx (int a) { int kazu; kazu=1; while(kazu<=a) { printf(" "); kazu++; } printf("*"); } void SPACEy (int b) { int kazu; kazu=1; while(kazu<=b) { printf(" "); kazu++; } printf("*"); } 関数が増えて不格好になってしまいましたが、このような形で落ち着きました。 今回はありがとうございました。