===== 100問問題集 ===== 俺様がお前らのために問題集を作ってやったぞ。\\ 100問ねーぞとかそんなツッコミは受け付けません。\\ ぜひ挑戦してみてくださいな。\\ ==== 問1 ==== 変数名が value, 変数の型が double という変数を定義する 1 行の文を書いてください.\\ 配列名が name, 配列の要素数が 10, 配列の型が int という配列を定義する 1 行の文を書いてください.\\ double 型で要素数 3 の配列 data[ 3] を定義し, 同時に, 3 つの要素に [5. 2, 2. 0, 3. 1] を代入する 1 行の文を書いてください.\\ ==== 問2 ==== - 2つの int 型の変数 a, b があります. 変数 a に, 変数 b を 2 で 割った余りを代入する 1 行の文を書いてください.\\ - int 型で要素数 5 の配列 c[ 5] があります. \\ * 要素の値は [2, 4, 6, 8, 10] とします. \\ * 1 番目の要素” 2” の値を, 7に変更する( 7 を代入する) 1 行の文を書いてください.\\ - int 型で要素数 5 の配列 d[ 5] があります. \\ * 要素の値は [2, 4, 6, 8, 10] とします. \\ * 2 番目の要素” 4” に, 1 番目の要素の値” 2” を代入する 1 行の文を書いてください.\\ ==== 問3 ==== int型の変数eにある値が入っています. eの値に2を加えてeを更新する命令文を書いてください(1行)\\ double型の変数fにある値が入っています。fの値を半分にしてfを更新する命令文を書いてください(1行)\\ ==== 問4 ==== int型の変数helloを宣言し初期値を3に設定する命令文を書きなさい\\ 画面上に”hello”の文字を表示する命令文を書きなさい\\ 画面上にhelloの値を表示する命令文を書きなさい\\ ==== 問5 ==== int型の変数xがあります。キーボードから入力される値(整数)を、変数xに代入する分を書きなさい\\ ==== 問6 ==== int型の変数gがある。gが5より大きい場合は”BIG”と表示、そうでない場合は”SMALL”と表示する命令文を書きなさい ==== 問7 ==== int型の変数hがある。switch-case文をつかって\\ * hが1の時: “主人公の攻撃!”と表示 * hが2の時: “敵の攻撃”と表示 * それ以外の場合: “それはできない!”と表示 ==== 問8 ==== for文を使って “hello⏎”と10回繰り返し表示する命令文を書きなさい。\\ ==== 問9 ==== for文を使ってカウンタ変数 i が50~65までとiを表示する命令文を書きなさい。\\ ==== 問10 ==== int型の変数kとwhile文を使って、kの値が1000を超えるまでkを2倍ずつ増やしていく文を書きなさい。\\ ==== 問11 ==== #include < iostream > using namespace std; int main (void){ //ここに命令文を追加 return 0; } - キーボードから整数を入力し、それを変数$input_num$に代入 - 1行目に入力された整数を2倍したものを表示 - 次に、キーボードから実数値を入力し、それを変数$input_val$に代入 - それを3で割った値を2行目に表示 入出力はstd::cin, std::coutをつかう\\ 改行はstd::endlをつかう\\ ==== 問12 ==== - キーボードから入力された値を、整数型の変数input_numに代入 - input_numの値に応じて、 (1) 奇数の時 ⇒ 「奇数」と表示 \\ (2) (1)以外で、さらに3の倍数の時 ⇒ 「偶数活3の倍数」と表示 \\ (3) (1)(2)以外のその他の時 ⇒ 「その他」と表示 \\ ==== 問13 ==== (1) forループを使って11~19までを画面出力させなさい。 \\   条件:使って良い数値は11と20のみ \\ (2) forループを使って、20から10までを以下の様に画面出力させなさい。 \\ 20 18 16 14 12 10 (3) forループを使って、1から64までを以下のように画面出力しなさい\\ 1 2 4 8 16 32 64 ==== 問14 ==== - キーボードから整数1~4のを入力 - 1の時:「可です」 - 2の時:「良です」 - 3の時:「優です」 - 4の時:「秀です」 - それ以外:「不可です」 - と表示する。(変数名などは自分で考える) ==== 問15 ==== - キーボードから整数numを繰り返し入力する。入力された値によって - 7の倍数ではないとき - 「7の倍数ではありません」と表示し入力待ちに戻る - 7の倍数の時 - 「7の倍数です」と表示してプログラムを終了する ==== 問16 ==== - 九々の計算結果を以下の洋に表示させなさい 1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 1 * 7 = 7 1 * 8 = 8 1 * 9 = 9 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 5 * 6 = 30 5 * 7 = 35 5 * 8 = 40 5 * 9 = 45 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 6 * 7 = 42 6 * 8 = 48 6 * 9 = 54 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 7 * 8 = 56 7 * 9 = 63 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 8 * 9 = 72 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81 ==== 問17 ==== - 複合条件の問題 - numにキーボードから正の整数を入力 - 50より小さい偶数、または、50より大きい奇数の場合 - 「条件Aを満たす」と表示 - "3の倍数、または、5の倍数" かつ、"20より小さい値、または40より大きい値" - 「条件Bを満たす」と表示 - それ以外の時 - 「条件AもBも満たさない」と表示 ==== 問18 ==== - 整数型変数 num を用意し、初期値を0とします. - 以下を処理を行うプログラムを作成しなさい 1. 入力値を input_ tmp に代入し、 num に足す. 2. num の値を表示 3. 合計が100以上になるまで, 1. ~ 2. を繰り返す. ==== 問19 ==== - 変数名は適切なものを付ける(aとかbとかはダメです) - 台形の面積を求めるプログラムを作りなさい。 - キーボードから上底、下底、高さを実数値で入力する - 面積を計算して、実数で表示しなさい ==== 問20 ==== - 1月1日が日曜日だった時、1月の日付を(1日~31日)を入力し、その曜日を表示するプログラムを書きなさい。 - 必要な変数の用意、変数の命名、適切な変数の型を使うを意識する。 ==== 問21 ==== - 2つの整数型変数a = 1, b = 2がある。aとbの値を入れ替えなさい。 - 1つだけ作業用変数を宣言してもよい。 ==== 問22 ==== - クイズです。 - 2つの整数型変数a = 1, b = 2がある。aとbの値を入れ替えなさい。 - aとbの2つの変数だけを使い、作業用変数を使ってはいけません。 - ヒント:上書きすると値は失われます。整数は足したり引いたりしたときに、その逆の計算をすると元に戻ります。 3 ⇒ 3 + 5 ⇒ 3 + 5 - 5 = 3 ==== 問23 ==== - 以下のアルゴリズムを使って、肥満と痩せすぎを診断するプログラムを作れ 1. 画面に「身長をcm単位で入力」と表示 2. 入力された値を実数変数に代入 3. 画面に「体重をkg単位で入力」と表示 4. 入力された値を実数変数に代入 5. 入力値(2.と3.のやつ)をもとにBMIを計算し、実数変数に代入  - BMI = 体重(kg)÷身長^2(m)  6. 「身長:〇〇〇cm 体重:〇〇〇kg BMI:〇〇」を表示  7. 以下の表示を行う  - BMIが30より大きい時 ⇒ 「肥満に注意」  - BMIが18より大きい時 ⇒ 「痩せすぎに注意」 ==== 問24 ==== - 要素数10の整数型の配列 intArray[10]に、正の整数を入力(for文とかwhile文とか使う) - 配列を走査し、最大の値を持つ要素の値を表示する ==== 問25 ==== - 要素数10の整数型の配列 intArray[10]に、正の整数を入力(for文とかwhile文とか使う) - 配列を走査し、全ての要素の平均値を実数型変数に代入し、そのご平均値の値を表示 - 表示は小数点以下3桁まで表示し、カッコよく表示されるよう工夫すること ==== 問26 ==== - 以下処理をするのプログラムを作りなさい - 整数numをキーボードから入力 - 100以下の自然数のうち - numの約数 - numの倍数 - であるものを、大きい順に表示する - ヒント:ある数xがnumの約数である、ある数xがnumの倍数である、という条件を剰余を使って式に表してみよう ==== 問27 ==== int i, j; //for ループ 用 の 変数 int array[ 2][ 5] = { {1, 2, 3, 4, 5}, { 6, 7, 8, 9, 0} }; for( i = 0; i < 2; i ++){ for( j = 0; j < 5; j ++){ cout << array[ i][ j]; } cout << endl;// 行 の 数 だけ 改行 する } - このソースコードをコンパイルして実行すると以下のような実行結果になった。(お決まりの部分は、省略) 12345 67889 - このプログラムのfor文以降を変更し、以下のような出力になるように書き換えなさい。 16 27 38 49 50 - 注意:配列の定義や値を変更するのはダメです。 ==== 問28 ==== - ツルの数をn_tsuru、亀の数をn_kameとします。 - 鶴と亀の頭の総数を n_head、 鶴と亀の足の総数をn_footとしたときに、鶴と亀の数を計算したい - キーボードから - 鶴と亀の頭の総数 - 鶴と亀の足の総数 - を入力したとき、ツルの数と亀の数を表示しなさい。 - 計算上買いが存在しないときは「解なし」と表示しなさい。 ==== 問29 ==== - 順に入力された5つの実数を配列に格納します。 - 格納された配列が等比数列になっているかどうかを判定してください。 - 判定結果によって - 「数列〇、〇、〇、〇、〇は等比数列です」(〇は%-5.2lfで表示) - 「数列〇、〇、〇、〇、〇は等比数列ではありません」(〇は%-5.2lfで表示) - を表示 ==== 問30 ==== - 3桁の自然数÷3桁の自然数の解の組み合わせを全探索します。 - 解の組み合わせの中で、円周率(3.14159265359)に一番近いものを表示しなさい。 - いろいろな数学定数がC++標準ライブラリで宣言されています。πを表すものを探してみよう。 - https://zenn.dev/tetsurom/books/cpp11-cpp20-for-game-developers/viewer/002-mat-constant - C++20だからちょい新しすぎる話題かもだけど。。。 ==== 問31 ==== - 3つの自然数$a,b,c$が $a^2+b^2 = c^2$を満たすとき、その自然数の組をピタゴラス数と呼ぶ。 - 100未満(2桁)の自然数のピタゴラス数を全て列挙しなさい。 - 同じ組み合わせになるとき注意だよね!$(3,4,5) (5,4,3) (4,3,5)$ は同じ! ==== 問32 ==== - ユークリッドの互除法 - https://www.try-it.jp/chapters-4962/sections-5064/lessons-5065/ - 説明を呼んでアルゴリズムを自分で記述してみる - 記述どおり実装する - ユークリッドの互除法はアルゴリズムの授業をすると必ずと言っていいほど出てくる、基本的なアルゴリズムです。 - 数学的記述から、手続き的記述(アルゴリズム)を導き出して、プログラムを書くという基本がわかっているか、確認するのにとても良い例題となっています。 - これができない人は、問題を論理的に順序だてて解決していく方法が身についていません。 ==== 問33 ==== - 以下のような配列がある。 int iArray[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} }; - この配列を以下の様に2パターンの表示方法で出力しなさい #### パターン1 123 456 789 #### パターン2 693 582 471 ==== 問34 ==== - 100未満のすべての素数を表示しなさい。 - 素数は、自然数、かつ2以上で自分自身と1以外では割り切れない数です。 - 素数を判定する方法はいろいろありますが、単純に定義通りに判定してみよう ==== 問35 ==== - 素数関連でもう一問 - 31は素数です - 331も素数です。 - 3331も素数です。 - 3を最左桁に追加した数を判定して行き - 一番初めに出現した素数ではない3・・・31の数字を出力しなさい ==== 問36 ==== - 完全数(perfect number)とは、3や6の様にその数の約数を全て並べたときに、 - 「自分自身=残りの約数の和」になっている数です。 - 3 = 1 + 2 (3の約数は1, 2, 3) - 6 = 1 + 2 + 3 (6の約数は1, 2, 3, 6) - 15000以下の完全数をすべて表示しなさい。 ==== 問37 ==== - 3つの自然数a, b, cがある( a,b,c < 100 ) - ただし、bは奇数、cは3の倍数ではない。 - (1/a)+ (1/b) + (1/c) = 1 を満たす全てのa, b, cの組を出力しなさい。 - 最後は整数の1を判定になるけど、途中は分数なので型の変換が必要になるね! - 実数は (変数==1.0) や (変数-変数 == 0.0) のような比べかたをすると文法は有っているけど、誤差でバグを生みます。 - どうやったらいいでしょうね? - https://koze.hatenablog.jp/entry/2015/06/25/230000 - 通常は差分をとって、0に限りなく近い場合は同値とみなす、という判定をします。 - 大事なことなので覚えてね。 ==== 問38 ==== - 3つの自然数a,b,cがあります。 - この3つの数の私大公約数(GCD)と最小公倍数(LCM)を求めなさい。 - ヒント:少なくとも最小公倍数は必ず a*b*c以下になる - でかい空間を全探索しなければならないときは、その空間をいかに効率的に走査するか - が重要になります。(条件で、いらない領域を省いたりなんだりかんだり) ==== 問39 ==== - 自然数を小さい順に並べると、(5, 7)、(11,13)、(17,19)のように差が2の素数のペアが現れることがある。 - これらのペアを双子素数と呼びます。 - 1000未満の双子素数をすべて表示しなさい。 ==== 問40 ==== - 2つの1以上の正の整数a,bがある。 - a自身を除くaの約数の和 = b が成立し、かつ b自身を除くbの約数の和 = a が成立するとき、 - (約数は1を含む)そのペアを友愛数と呼ぶ。 - 1000未満の友愛数のペアをすべて表示しなさい。 - うまく計算しないと1000x1000解の計算が必要だからうまく計算効率を上げよう ==== 問41 ==== サイコロがあります。\\ サイコロははじめ1の目(1だね)を上面に向けて置いてあります(初期状態)\\ プログラムへの入力として、2次元平面上の方向(↑, →, ↓, ←)=('U','R','D','L')と回転数Nが入力されます。\\ 入力に'E'が入力されるまで繰り返しサイコロを指定された方向に転がします。\\ 指定された方向に90度転がす操作を1回転(1コロコロ?)とします。\\ 'E1'が入力されたときの状態の上面の数字を表示するプログラムを作りなさい。\\ **入力例**\\ - 入力:R1 の時、右に1回転がすと上面は3 - 入力:L2 の時、左に2回転がすと上面は6 - 入力:U1 の時、上に1回転がすと、上面は5 ==== 問42 ==== 2次元平面上に円が複数個あります。(最大10個)\\ 円は、中心座標と半径のパラメータを持ちます。\\ これらの円の交点がいくつ出現するか数え、交点の数を出力しなさい。\\ ただし、円が完全一致する場合は交点0、接する場合は交点1として数える\\ **ヒント:中心と半径が入力されるたびに過去に入力された円と判定を行う**\\ - 2つの円を考えたときに - お互いの半径の合計 < 中心間の距離 - お互いの半径の差分 > 中心間の距離 (どっちかの円にどっちかが含まれる) - 同心円、または円が一致する - 時は交点がない ==== 問43 ==== - ゴールドバッハの予想「4以上のすべての偶数は、2つの素数の和で表すことができる」 - 1000未満の自然数について、この判例が見つからないことを確認しなさい ==== 問44 ==== - サイコロでできるゲームを考えます。 - 賽の目によって以下の様に点数が与えられます。 - 6:10pt - 5:5pt - 4:4pt - 3:3pt - 2:1pt - 1:得点が0にリセットされる - 30ptに到達したら上がり! - 乱数を使ってサイコロを繰り返し振って、1000回シミュレーションしたときに、15回以内で上がりになる回数を調べなさい。 ==== 問45 ==== - スロットマシンのシミュレーションを作ります。 - 以下のような当たり確率を持ったスロットマシンがあります。 - 投入枚数は一度にメダルを3枚使います - 各役の確立と払い出し枚数は以下の通りです -  2枚役 : 4分の1 -  3枚役(リプレイ): 8分の1 -  4枚役      :16分の1 -  8枚役      : 8分の1 - 15枚役      :50分の1 - 300枚役(大当り):300分の1 - 手持ち100枚でスタートしたときの1000回のシミュレーション結果を表示するプログラムを作りなさい。 - 1回ごとに以下の情報を表示します。 - 手持ち 〇〇〇〇枚 回転数 〇〇〇回 出現役〇〇で+〇枚 - と子役カウント 2枚役 : 〇〇〇/回転数  3枚役(リプレイ): 〇〇〇/回転数 4枚役      : 〇〇〇/回転数 8枚役      : 〇〇〇/回転数 15枚役      : 〇〇〇/回転数 300枚役(大当り): 〇〇〇/回転数 ### 出力例 手持ち  102枚 回転数 001回 出現役2枚役で+2枚 はずれ : 0000/0001 2枚役 : 0001/0001 3枚役(リプレイ): 0000/0001 4枚役      : 0000/0001 8枚役      : 0000/0001 15枚役      : 0000/0001 手持ち  99枚 回転数 002回 出現役はずれ-3枚 はずれ : 0001/0002 2枚役 : 0001/0002 3枚役(リプレイ): 0000/0002 4枚役      : 0000/0002 8枚役      : 0000/0002 15枚役      : 0000/0002 手持ち  114枚 回転数 003回 出現役15枚役で+15枚 はずれ : 0001/0003 2枚役 : 0001/0003 3枚役(リプレイ): 0000/0003 4枚役      : 0000/0003 8枚役      : 0000/0003 15枚役      : 0001/0003 手持ち  122枚 回転数 004回 出現役8枚役で+8枚 はずれ : 0001/0004 2枚役 : 0001/0004 3枚役(リプレイ): 0000/0004 4枚役      : 0000/0004 8枚役      : 0001/0004 15枚役      : 0001/0004 - .exeのあるフォルダ(DebugフォルダやReleaseフォルダなど)でShiftキーを押しながら右クリックすると、 - コマンドプロンプトをここで開く、又は、Powershell Windowをここで開く、メニューが出るのでどちらかを選択 - .exeファイルの名前を自分で入力するとプログラムが実行できます。 - これから自分でプログラムのフォルダを開いたり、実行したりする機会が増えますので、自分で作ったプログラムがどこにあるのか把握できるようにしてください。 - 実行するときに xxxx.exe > result.txt とすると、表示結果をresult.txtにテキストファイルとして保存してくれます。 - この操作を実行結果のテキストファイルへのリダイレクトと呼びます。 ==== 問46 ==== - 高校野球のピッチャーのシミュレーションをします。 - 統計によると、高校野球のピッチャーは全体の平均で6割ストライク、4割ボールを投げることができます。 - ストライク率がN割のピッチャーが1試合投球をした時の結果をシミュレーションして表示してみます。 - 初めにピッチャーのストライク率を入力します。(定数で定義してもいいよ) - ただし、バッターは - スイングしない(バットを振らない) - 塁に出ても盗塁しない、とする。 - 1球ごとに、イニング、得点、走者の人数、投球結果、カウントを以下の様に表示してください。 - その時の投球が - ストライクの時:Strike! - ボールの時:ball - 3ストライクでアウトの時:Strike Out! - 4ボールの時:Ball4! - と表示します。 - また、3アウトでチェンジの時は、 - 改行して「-------------- change Inning --------------」を表示 1回表 失点:〇〇 走者:〇人 投球:〇〇〇球目 投球結果:Strike!   B:〇  <=今、投球した後のカウントを表示   S:〇   O:〇 1回表 失点:〇〇 走者:〇人 投球:〇〇〇球目 投球結果: Ball   B:〇     S:〇   O:〇 1回表 失点:〇〇 走者:〇人 投球:〇〇〇球目 投球結果: Ball   B:〇     S:〇   O:〇 ...(省略)・・・ -------------- change Inning -------------- 2回表 失点:〇〇 走者:〇人 投球:〇〇〇球目 投球結果: Ball   B:〇     S:〇   O:〇 ...(省略)・・・ - のように1試合分表示してください。 - リダイレクトでテキストファイルに出力すると見やすいです。 ==== 問47(書きかけ、ちょいまって!) ==== - 2Dのゲームのキャラクターを考えます。 - 2Dアクションゲームのキャラクターは現在の状態を持っていて、その状態にあったグラフィック表示を毎フレーム行います。 - 現在の位置 x, y - 現在のライフ life_point - 現在の状態 - idle(何もしていない、立ち状態) - walk(歩いている) - jump(ジャンプしている) - kick(キックしている) - 各フレームでは、上下左右とパンチボタン、入力無し ⇒ ('U','D','L','R','K','N')の入力があります。 - このゲームは30f/sで動いていると仮定します。 - アイドル状態の時に左右を入力すると歩き出す(左右の別はとりあえずスルー)を - idle(R,L)->walk と表してみます - idle状態からの入力 - idle(R,L)->walk - idle(D,N)->idle - idle(U)->jump - idle(K)->kick - walk状態からの入力 - walk(R,L)->walk - walk(D,N)->idle - walk(U)->jump - walk(K)->kick - jump状態からの入力(ジャンプ状態は1秒継続したのちidleに戻る) - 上昇30フレーム下降30フレームとする(jump(count--)をジャンプ開始からのカウントとする) - jump(U, D, R, L, N) -> jump(count--) - 上昇中にjump(K) -> jump(count--)+kick (ジャンプキックが下降中に出る) - 下降中にjump(K) -> jump(count--) - jump(count == 0) -> idle - キック状態からの入力 - キック状態は30フレーム継続 - kick(U,D,L,R,K,N) -> kick(count--) - kick(count == 0) -> idle - このような状態遷移を実現しなさい。 - 入力は簡易的なものでよく、while文で、cinしながら、毎フレームの入力をシミュレーションしてみる。 - キックやジャンプなどの入力がスキップされるところは自働でスキップしてよい。