![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
はじめまして。
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");
}
No.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 …
No.3
- 回答日時:
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さんに同意。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_02.png?5a7ff87)
No.2
- 回答日時:
ひとつの質問内に、6つも詰め込むのは、マナー違反なんでは。
すくなくとも、字数制限あるので、ひとつのポストで、回答するのは、難しい。で、1だけ。data は、Peopleという構造体へのポインタ
malloc() の型の宣言は、stdlib.h の先か、どこかで、宣言されているが、char * くらいだろう。すなわち、charへのポインタ。
a= b;
という代入式で、左辺と右辺の型が、違う場合は、普通、コンパイラは、ワーニングを出す。ワーニングが出ても、コード生成してくれるが、気分は悪い。そこで、型がちがうんだけど、同じ型として、扱います、ということを設計者である、あなたが、コンパイラに通知します。
その為の方法が、キャストといって、
a = (type_a) b;
とする。具体的には、(People *)など。これで、一応、型の違いは、合わせれるので、コンパイラのワーニングは出なくなる。より詳細は、キャスト、型チェック、などで、調べられたし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
二次元配列
-
C++/CLIのオブジェクト型配列
-
pythonでDBのカラム名で取得し...
-
stable diffusionのエラー
-
c言語の多次元配列で1から100ま...
-
2次元配列のソートについて。
-
C言語の構造体にてバブルソート...
-
ハッシュの配列???
-
linuxのシェルでファイル名に先...
-
Perl マッチング 1行だけ表示
-
チェックボックスからの値を受...
-
reallocでうまくメモリを拡張出...
-
gnuplotの出力グラフ名を外部で...
-
この花の名前を教えてください。
-
花の名前を教えて下さい。
-
'dataType' 引数を Null にする...
-
RegQueryValueExでの2バイト文字
-
連想配列をリターン値として返...
-
合計が決まった数で、数の組み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
pythonでDBのカラム名で取得し...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
linuxのシェルでファイル名に先...
-
C言語の構造体にてバブルソート...
-
c言語での wavファイルの編集(...
-
'dataType' 引数を Null にする...
-
H8/36064を使ったシリアル通信...
-
オセロゲーム 2次元配列で困...
-
10個の実数に対する降順ソート...
-
c言語の多次元配列で1から100ま...
-
c言語 配列から数字だけをint型...
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
おすすめ情報