苦しんで覚えるC言語

練習問題19



基本知識


1-1
プログラムの実行中に自由に作ることができる配列をなんと呼ぶか。
1-2
長期的に使用され、サイズの大きなメモリ領域のことをなんと呼ぶか。
解答例

目次に戻る

プログラム読取


2-1
次のプログラムには大きな問題点がある。
それはどのような問題なのか簡潔に説明せよ。
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i;
	int *data;

	data = (int *)malloc(sizeof(int) * 10);

	return 0;
}
解答例

目次に戻る

プログラム書取


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

目次に戻る

記述式


4-1
配列を使えばデータの格納はできるのに、
あえて動的配列を使うのは何故か簡潔に説明せよ。
解答例
目次に戻る

基本知識(解答例)


1-1
動的配列
1-2
ヒープ
問題

目次に戻る

プログラム読取(解答例)


2-1
動的配列を解放していないため(free関数を呼び出し忘れているため)、
メモリ領域が無駄に残る可能性がある。
問題

目次に戻る

プログラム書取(解答例)


3-1
#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");
}

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");
}

※InputPeopleとShowPeople関数は変更していませんが、  
 InputPeople関数を変更すれば入力しやすくできます。  
※realloc関数の呼び出しを減らすために10ずつ増やしています。  
 もしより大量のデータが想定される場合には、倍々で増やしたほうが効率が良くなります。
※free関数を呼び出していない場合は大幅減点です。  
問題

目次に戻る

記述式(解答例)


4-1
要素数をプログラム実行中に自由に決められるため、
メモリを効率よく扱えるから。
問題

目次に戻る