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)
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
※※各問題へのリンク一覧を作成しました。
問題
次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。
プログラム(test21.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> void swap( int a, int b); int main( void ){ int a = 10; int b = 20; swap(a, b); printf ( "a = %d, b = %d" , a, b); return 0; } void swap( int a, int b){ int tmp = a; a = b; b = tmp; return ; } |
問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。
A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。
なお、コマンドを入力する前はディレクトリ内のファイルはtest21.cのみであった。
1 | gcc -o test21.exe test21.c |
選択肢A,B,C
A.コンパイルに成功して( 空欄1 )が生成される。
B.( 空欄1 )ためコンパイルエラーが起こる。
C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。
問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。
1 | test21 |
選択肢A,B,C
A.ファイルが実行され( 空欄1 )と画面に表示される。
B.( 空欄1 )というファイルがないため実行できない。
C.コンパイルはされているが、( 空欄1 )という問題があるため実行結果は不定であり、実行は危険である。
解答
問1
A.コンパイルに成功して( test21.exe )が生成される
問2
A.ファイルが実行され( a = 10, b = 20 )と画面に表示される。
解説
問1,問2
今回はswapという関数を定義している。swap関数は2つの引数aとbの中身を入れ替える関数として定義している。関数を利用する際にはポインタではなく、値を直接渡すように定義している。
前回の練習問題で扱ったように、C言語の場合は呼び出し元(main)と呼ばれた側(swap)の間では、引数は共有されない。したがって、swap側でaとbの値を入れ替えてもmain側にはそれが反映されない。
今回の場合、入れ替え結果が反映されるようにするにはポインタを用いる方法がある。
今回のプログラムでは以下のようにすればswap側の入れ替えがmainにも反映される。
プログラム(test21_1.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> void swap( int *a, int *b); int main( void ){ int a = 10; int b = 20; swap(&a, &b); printf ( "a = %d, b = %d" , a, b); return 0; } void swap( int *a, int *b){ //ポインタを利用して渡す。 int tmp = *a; //aの指している値をtmpに一時退避させる。 *a = *b; //ポインタaの指している値をポインタbの指している値に変更する。 *b = tmp; //ポインタbの指している値を退避させておいたtmpに変更する。 return ; } |
実行結果
1 2 3 | > gcc test21_1.c -o test21_1.exe >test21_1 a = 20, b = 10 |
なお、以下のようなプログラムではポインタの指すアドレスは入れ替わるが、main側にはそれが反映されない(=入れ替えはできない)ので注意。
プログラム(test21_2.c)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> void swap( int *a, int *b); int main( void ){ int a = 10; int b = 20; swap(&a, &b); printf ( "a = %d, b = %d" , a, b); return 0; } void swap( int *a, int *b){ int *tmp = a; //test21_1と違って、ポインタそのものを入れ替えている。 a = b; //この方法だとswap内では入れ替えが反映されるが、 b = tmp; //呼び出し元(main)には反映されない。 return ; } |
実行結果
1 2 3 | > gcc test21_2.c -o test21_2.exe >test21_2 a = 10, b = 20 |
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載