MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
 English 

しんで覚えるC言語
しんで覚える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 <stdlib.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)
{
    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
要素数をプログラム実行中に自由に決められるため、
メモリを効率よく扱えるから。



本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く