Tips

C言語練習問題

C言語練習問題

環境について

C言語の練習問題です。

開発環境は以下の通り。

PC:MacBook Pro 2011early 15inch

OS:Windows 8.1(デュアルブート)

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

コンパイラ:MinGW-w64 5.3.0 (posix, sjlj)

 

※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。

※※各問題へのリンク一覧を作成しました。

 

問題

次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。

 

プログラム(test22.c)

#include <stdio.h>
void swap(int **ppa, int **ppb);

int main(void){
  int a = 10;
  int *pa = &a;
  int b = 20;
  int *pb = &b;
  swap(&pa, &pb);

  printf(" a = %d, b = %d\n", a, b);

  return 0;
}

void swap(int **ppa, int **ppb){

  int *tmp = *ppa;
  *ppa = *ppb;
  *ppb = tmp;

  return;
}

 

問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。

A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。

なお、コマンドを入力する前はディレクトリ内のファイルはtest22.cのみであった。

gcc -o test22.exe test22.c

 

選択肢A,B,C

A.コンパイルに成功して( 空欄1 )が生成される。

B.( 空欄1 )ためコンパイルエラーが起こる。

C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。

 

 

問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。

 test22

 

選択肢A,B,C

A.ファイルが実行され( 空欄1 )と画面に表示される。

B.( 空欄1 )というファイルがないため実行できない。

C.コンパイルはされているが、( 空欄1 )という問題があるため実行結果は不定であり、実行は危険である。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

問1

A.コンパイルに成功して( test22.exe )が生成される

 

問2

A.ファイルが実行され( a = 10, b = 20 )と画面に表示される。

 

解説

問1,問2

今回はswapという関数を定義している。swap関数は2つの引数aとbの中身を入れ替える関数として定義している。関数を利用する際にはポインタのポインタを渡すように定義している。

前回の練習問題で扱ったように、C言語の場合は値を引数に関数を呼び出しても、呼び出し元(main)と呼ばれた側(swap)の間では、引数は共有されない。呼ばれた側(swap)の方での操作を呼び出し元(main)に反映させたければポインタを利用する必要がある。

 

今回のswap関数では、ポインタpaとポインタpbは入れ替えているが、aとbそのものは入れ替えていない。そのため、a,bそのものは入れ替わらない。paとpbも表示すると以下の通り。

プログラム(test22_0.c)

#include <stdio.h>
void swap(int **ppa, int **ppb);

int main(void){
  int a = 10;
  int *pa = &a;
  int b = 20;
  int *pb = &b;
  swap(&pa, &pb);

  printf("  a = %d,   b = %d\n", a, b);
  printf("*pa = %d, *pb = %d\n", *pa, *pb);

  return 0;
}

void swap(int **ppa, int **ppb){

  int *tmp = *ppa;
  *ppa = *ppb;
  *ppb = tmp;

  return;
}

実行結果

>gcc -o test22_0.exe test22_0.c
>test22_0
  a = 10,   b = 20
*pa = 20, *pb = 10

確かにaとbはそのままだが、ポインタpaとポインタpbの参照先は入れ替わっていることがわかる。

 

なお、今回のプログラムでは以下のようにすればmain側のaとbも入れ替わる。

プログラム(test22_1.c)

#include <stdio.h>
void swap(int **ppa, int **ppb);

int main(void){
  int a = 10;
  int *pa = &a;
  int b = 20;
  int *pb = &b;
  swap(&pa, &pb);

  printf("  a = %d,   b = %d\n", a, b);
  printf("*pa = %d, *pb = %d\n", *pa, *pb);

  return 0;
}

void swap(int **ppa, int **ppb){

  int tmp = **ppa;
  **ppa = **ppb;
  **ppb = tmp;

  return;
}

実行結果

>gcc test22_1.c -o test22_1.exe
>test22_1
  a = 20,   b = 10
*pa = 20, *pb = 10

 

なお、以下のようなプログラムではswap側ではppaとppbは入れ替わるが、main側にはそれが反映されない(=入れ替えはできない)ので注意。

プログラム(test22_2.c)

#include <stdio.h>
void swap(int **ppa, int **ppb);

int main(void){
  int a = 10;
  int *pa = &a;
  int b = 20;
  int *pb = &b;
  swap(&pa, &pb);

  printf("  a = %d,   b = %d\n", a, b);
  printf("*pa = %d, *pb = %d\n", *pa, *pb);

  return 0;
}

void swap(int **ppa, int **ppb){

  int **tmp = ppa; //test22_1と違って、ppaとppbを直接入れ替えている。
  ppa = ppb; //この方法だとswap内では入れ替えが反映されるが、
  ppb = tmp; //呼び出し元(main)には反映されない。

  return;
}

実行結果

>gcc test22_2.c -o test22_2.exe
>test22_2
  a = 10,   b = 20
*pa = 10, *pb = 20

 

他の問題へのリンク一覧はこちら

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search