C言語の復習2 関数・再帰関数・動的メモリ確保
この演習では、アルゴリズムを実装するときに必要となる関数、再帰関数の書き方と使い方、 また、メモリの構造を知り、動的に確保する方法について学びます。
問題の難易度の目安【易】⭐ 【標準】⭐⭐【難】⭐⭐⭐
問題1 ⭐
トライ&エラー
トライ&エラー
トライ&エラーよ!
と表示するように関数を完成させましょう。 ただし、main関数は変更しないように。
Note
ここでは関数の使い方を学びます。 プログラムは上から下に向かって実行されることを思い出しましょう。
問題2 ⭐
出力結果が
トライ&エラー
トライ&エラー
トライ&エラーよ!
となるようにプログラムを完成させましょう。 ただし、try_and_error関数のみ修正しましょう。
Note
ここでは引数で関数の動作を変える方法について学びます。
問題3 ⭐⭐⭐
出力結果が
トライ&エラー
トライ&エラー
トライ&エラーよ!
となるようにプログラムを完成させましょう。 ただし、try_recursive関数は必ず再帰関数にしましょう。
Note
ここでは再帰関数の基本的な使い方について学びます。
問題4 ⭐⭐⭐
引数で与えられた回数分、マジメさに価値があるのは義務教育までよを表示するようにプログラムを作りましょう。
たとえば,プログラムに引数2を与えて実行すると
マジメさに価値があるのは義務教育までよ
マジメさに価値があるのは義務教育までよ
となります。 gimu関数は必ず再帰関数にしましょう。
Warning
再帰関数のパターンを覚えましょう。 再帰関数は難しいので、ここで完璧に理解する必要はなく、 ふわっと理解するのもありです。
問題5 ⭐
引数として与えた数字を表示するように、プログラムを完成させましょう。
たとえば、引数が3だと
input = 3
となります。
Note
ここではmallocの使い方を学びましょう。
問題6 ⭐⭐
引数として、表示する数字、最初の数字、次の数字の間隔を与え、数列を表示するプログラムを作りましょう。
たとえば
./a.out 9 1 3
と実行すると、最初の数字は1、数字の間隔は3、数列の長さは9となり、
1 4 7 10 13 16 19 22 25
となります。
また、
./a.out 10 0 1
と実行すると
0 1 2 3 4 5 6 7 8 9
となります。
Note
ここでは連続した領域をmallocで確保する方法を学びましょう。
問題7 ⭐⭐
与えられた配列の要素すべてをN倍した新しい配列を作る関数mapを作成しましょう。
入力は、最初の値がNで、それ以降を配列の内容とします。
例えば
./a.out 3 90 10 8 45 1 3 30 149 82 9
と実行すると、Nが2で、配列はそれ以降の数字になり、プログラムの出力は以下のようになります。
90 10 8 45 1 3 30 149 82 9
270 30 24 135 3 9 90 447 246 27
Note
mallocを使って自分でメモリ領域を確保する方法について学びましょう。
問題8 ⭐⭐
与えられた文字列をコピーする関数copy_strと文字列の長さを返す関数lenを作りましょう。
例えば
./a.out sakura
と実行すると、入力された文字sakura
を新しく確保した文字列に保存し、以下のようにそのまま表示します。
sakura
Note
文字列は連続した領域に保存されており、最後が\0
で終わってることに注意しましょう。
問題9 ⭐⭐⭐
引数で与えた数字分だけ、文章が表示されるようにプログラムを完成させましょう。
たとえば、引数を5として実行すると
akira
引数を10で実行すると
akiramenai
引数を46で実行すると
akiramenaikokoronyebysakuramikoakiramenaikokor
となります。
Note
ここでは文字列と配列とmallocの関係を理解します。
問題10 ⭐⭐⭐
整数の配列がUpDown配列かどうかを判定する関数を作りましょう。
UpDown配列とは[0, 1, 2, 5, 2, 1]のように途中まで少なくとも数字が1以上増え、 一番大きい数字から配列の最後まで少なくとも数字が1以上減る配列をいいます。
例えば
./a.out 0 1 2 5 2 1
と実行すると、配列は[0, 1, 2, 5, 2, 1]となり、
ok
と表示されます。違う場合はnoと表示されます。
以下のような配列はUpDown配列ではありません。
[0, 1, 1, 5, 2, 1]
[3, 2, 1]
[1, 2, 3]