C言語 の演習問題を解いてみましょう。今回はポインタについて扱います。
問題文で提示された要件を満たすプログラムを作成してみて下さい。
この記事はシリーズ記事です。全シリーズはこちらからご覧になれます。
(C言語の基礎、操作方法等の記事⼀覧は こちら)
第1問
変数aをポインタpを使って間接参照し、その値を表示するプログラムを作成して下さい。また、下記の条件を満たすようにしてください。
・条件
①変数aを用意し、そのアドレスをポインタpに保存する。
②ポインタ変数pを使って変数aの値をprintfで表示できる。
◆回答例◆
#include <stdio.h>
int main(void) {
int a = 0;
int* p = &a; // ポインタpに変数aのアドレスを代入
printf("aの値を入力-> ");
scanf("%d", &a);
printf("ポインタpで参照したaの値 : %d\n", *p); // ポインタを使ってaの値を表示
return 0;
}
第2問
変数aのアドレスをポインタpに保存し、ポインタpを使って変数aの値を変更し表示するプログラムを作成して下さい。また、下記の条件を満たすようにしてください。
・条件
①変数aを用意し、そのアドレスをポインタpに保存する。
②ポインタpを使ってaの値を任意の整数に変更し、その変更後の値を表示する。
◆回答例◆
#include <stdio.h>
int main(void) {
int a = 0;
int* p = &a; // aのアドレスをポインタpに保存
printf("aの初期値: %d\n", a);
*p = 10; // ポインタpを使ってaの値を変更
printf("aの変更後の値: %d\n", a); // 変更後のaの値を表示
return 0;
}
第3問
ポインタを使って、整数変数の値を2倍にする関数を作成し、その関数を使って変数の値を変更するプログラムを作成して下さい。また、下記の条件を満たすようにしてください。
・条件
①関数doubleValueを定義し、ポインタを引数として受け取る。
②関数内で、ポインタを使って渡された変数の値を2倍にする。
◆回答例◆
#include <stdio.h>
// ポインタを使って整数変数の値を2倍にする関数
void doubleValue(int* x) {
*x = *x * 2;
}
int main(void) {
int num;
printf("整数を入力してください: ");
scanf("%d", &num);
doubleValue(&num); // 関数doubleValueを呼び出して値を2倍にする
printf("変更後の値: %d\n", num);
return 0;
}
第4問
ポインタを使って、整数変数の値を変更する関数を作成して下さい。
・条件
①2つの整数変数aとbを用意し、値はキーボードから入力する。
②関数addを定義し、ポインタを使ってaの値を+1し、bの値を+2する。
③関数addは戻り値として、aとbを足した値を返す。
④add関数は、引数としてポインタを受け取る。
◆回答例◆
#include <stdio.h>
// aの値を+1し、bの値を+2し、それらの合計を返す関数
int add(int* x, int* y) {
*x += 1; // aを+1
*y += 2; // bを+2
return *x + *y; // aとbの合計を返す
}
int main(void) {
int a, b, result;
printf("整数aを入力してください: ");
scanf("%d", &a);
printf("整数bを入力してください: ");
scanf("%d", &b);
result = add(&a, &b); // aとbを操作し、その結果をresultに格納
printf("変更後のa: %d\n", a);
printf("変更後のb: %d\n", b);
printf("a + b の合計: %d\n", result);
return 0;
}
第5問
配列の要素をポインタを使って表示するプログラムを作成してください。また、下記の条件を満たすようにしてください。
・条件
①int型の配列arr[5]を作成し、適当な値を代入する。
②ポインタ変数pを使って配列の各要素の値を順番に表示する。
ヒント:
配列名は、配列の先頭要素へのポインタとして扱われます。
ポインタを使って、配列の要素にアクセスするには*(p + i)の形式を使用できます。
◆回答例◆
#include <stdio.h>
int main(void) {
int arr[5] = { 1, 2, 3, 4, 5 }; // 配列を初期化
int* p = arr; // 配列名arrは先頭要素へのポインタ
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, *(p + i)); // ポインタを使って配列要素を表示
}
return 0;
}
第6問
ポインタを使って、文字列を逆順に表示するプログラムを作成して下さい。
・条件
①文字列をポインタで扱う。
②文字列を入力させ、その文字列をポインタを使って逆順に表示する。
③文字列の末尾はヌル文字(’\0’)で終わる。
ヒント:
文字列は配列として扱われるため、ポインタを使って各文字にアクセスできます。
文字列の最後から逆順に表示するには、ポインタを文字列の末尾に移動させ、前に向かって表示すれば実現できます。
◆回答例◆
#include <stdio.h>
#include <string.h>
int main(void) {
char str[100]; // 最大100文字の文字列
char* p;
printf("文字列を入力してください: ");
scanf("%s", str); // 文字列の入力
p = str + strlen(str) - 1; // 文字列の末尾にポインタを移動
printf("逆順: ");
while (p >= str) {
printf("%c", *p);
p--; // ポインタを前に移動
}
printf("\n");
return 0;
}
第7問
動的メモリを使って、ユーザーが指定したサイズの整数配列を作成し、その配列の合計を計算するプログラムを作成して下さい。
条件:
①mallocを使ってユーザーが指定したサイズの配列を動的に確保する。
②確保したメモリに値を代入し、配列内のすべての値の合計を計算する。
③配列の使用後にfreeを使ってメモリを解放する。
◆回答例◆
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int* arr;
int n, i, sum = 0;
// 配列サイズを入力
printf("配列のサイズを入力してください: ");
scanf("%d", &n);
// 動的メモリ確保
arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
printf("メモリの確保に失敗しました。\n");
return 1;
}
// 配列に値を入力
for (i = 0; i < n; i++) {
printf("arr[%d] = ", i);
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++) {
sum += arr[i];
}
printf("配列の合計: %d\n", sum);
free(arr); // メモリを解放
return 0;
}
プログラミングは、練習と経験が鍵となります。ぜひ問題に挑戦し続けてください。別の記事で、より複雑な課題にも取り組みスキルをさらに磨いていきましょう。
この記事はシリーズ記事です。全シリーズはこちらからご覧になれます。
コメント