SlideShare a Scribd company logo
1 of 38
プログラミング演習
第6回
6-1
6-1概要
• 乱数をn回生成する
• 生成した乱数の最小値と最大値を出力
• rand()で生成される最大値も出力
• 乱数を生成するシード値はユーザが設定
6-1考察
• for文を回して、その中のif文で最小値と最大値の処
理を行うのが良さそう
• この処理を関数に入れておくと、かっこいいソース
ができるはず
6-1ヒント
• シード値をこちらで決めなければいけないので
srand(変数);//この括弧の中に入力した値を入れたら
いいね
• 最大値や最小値の処理は今まで何回もやったはずな
のでできる!
注意としては最小値の初期化でmin = 0にせずに
限りなく大きい値である9999くらいにしておい
た方が良い
6-2
6-2概要
• 6-1のように乱数を作る
• 乱数を生成するのにかかった時間を求めよ
6-2考察
• ヒントにも書いてある通り時間を測定するには
処理後の時間ー処理前の時間 で測定できる
6-2ヒント
• プログラムを実行してからの時間はclock()を使うと
測定できます//time.hのインクルード必要
• このclock()を処理前と処理後においてその返り値を
変数に格納しておきましょう
• そして出力するときに計算で実行時間を求めよう
6-3
6-3概要
• 都道府県の人口を多い順に並び替えて出力せよ
6-3考察
• 並び替えは前回の課題でやったので簡単ですね
• でも、今回は都道府県も覚えなければいけないので
少し工夫がいるようです
6-3ヒント
• 選択ソートやバブルソートで実装すればできそう
• あとは前やったこと一緒ですね
6-4
6-4概要
• 人口増加率を求める
• 人口増加率の高い順に並び替えて出力
6-4考察
• 国税調査の結果を配列または、みんな大好き構造体
に入れておくと便利かな
• あとはいつも通り並び替えだね
6-4ヒント
• この課題で一番面倒なのはデータを手で入力するこ
とだね
• それ以外は今までやってきたことと一緒だからでき
る
6-A1
6-A1概要
• 0から9までの数字をn個使って
• 合計sになる組み合わせの数を出力
• この課題が一番難しい!
• この課題をノーヒントで解けたらすごい!
• 頑張ろう!
6-A1考察
• 複雑なプログラムになりそうな予感がする。
• 数字を適当にn個選んでそれがsになっているか確認
すればできそう
• 適当に数字を選ぶ方法を考えよう
6-A1ヒント
• 適当に選ぶ方法
• 一番簡単なのは2進数!!
• ????なんで?
• 10桁の2進数を考えてみよう!(解法1)
• すると…
6-A1解法1
• 10桁の2進数…例えば
• 1010010100 こんな感じ
• そして、1の時だけ足すという2進数の法則を考え
てみる
6-A1解法1
1010010100
これが1になってたらを0を足す!
これが1になってたら1を足す!
23456789
01
これが1になってたら7を足す!
というような感じにすれば
重複がなく足し算ができるね!
6-A1解法1
• 先ほどの法則で足してみる
• 2+4+7+9=22
• この場合nが4でsが22だったら条件に合うね!
• この処理を0000000000から
• 1111111111(2^10乗−1)
まで繰り返せばいいですね
1010010100
2479
6-A1解法1
• 1)繰り返しの中身はまず1の個数を数える!(nの数があってない
といけないからね)
• 2)規則通りに足し算してsと一致しているかを見る(こっちの方が
計算量が多そうなので後にした方がいいです)
• この二つをクリアしたら1カウントする
• 処理を早くするコツですが、条件に合わないとわかったらすぐに次
の値を読み込むと速くなります
• 例えばnの個数が合わなかったら足し算をせずに次の値に移るとかね
6-A1解法1
• そしてカウントした数を出力すれば完成!
• 計算量は多くなるけどこれが簡単!
• 次に示す解法2は再帰関数を使うので少し難しいね
• わからなかったら飛ばしておk!
6-A1解法2
• 数字の足し算や数字の個数の計算を関数でやらせる
とスマートなプログラムができます
• 説明の前に再帰関数とは?
• ユーザー定義関数の中で同じユーザー定義関数を呼
び出すことです!なんじゃそりゃ!
6-A1解法2
• 例えばcalc()という関数で考える
• int calc(int a){
//処理
calc(); ←同じ関数を呼び出してる!
}
• こんな呼び出しを再帰と言います。
• 再帰関数で使う変数はグローバル変数で宣言!
6-A1解法2
• では早速!
• 関数の概要を考える。
• 記憶するべきことは
• 今までの合計と今まで足してきた個数と次足すべき
数字の三つですね
• これらを引数として考えます
6-A1解法2
• void calc(int 合計,int 個数,int 次){
//処理
}
• こんな感じの関数ができます
次6-A1解法2
• calc関数に書くこと!パート1
• 今現在の合計がsになっているのか?
• 今現在の個数がnになっているのか?
• この2つがクリアできればカウントアップ!
→片方だけなら不正解なのでreturn;
• 今現在の次が10以上になっていないか?
→これが10以上になっていたらもう解はないのでreturn;
6-A1解法2
• calc関数に書くこと!パート2
• calc関数をもう一度呼び出す。
ーこの時、①次足すべき数字を足して呼び出すか、
②足さずその数字をスルーして次の数字に変える
か の2通りが考えられます。
• つまり→次のスライド
足してないでしょ!?
でも次はプラス1
6-A1解法2
• 関数を呼び出す時
• calc(合計+次,個数+1,次+1);
• と
• calc(合計,個数,次+1);
• この2つを書く必要があります。
足してる方
6-A1解法2
• この関数を完成させて
• 最初にcalc(0,0,0);
• を呼び出せば自然と答えが出てきます
6-A2
6-A2概要
• ガラケーのような入力をしてそれから文字を解読し
結果を出力する
6-A2考察
• 数字の先頭から0までの個数を数えたら文字が呼び出せそう
• でも9回とか押されたらどうしよう?
if文を使いますか?
• 文字は配列に格納しておけば簡単になるっぽい!
char moji[10][5] = {
“.,!?”,
{“abc”},
{“def”},
{ },
{ }
};//こんな感じで出来るかな?(実際にやってません)
6-A2ヒント
• 9回押された時とかは % を使うとあまりができます
ね
• 今回は文字列で入力なので’¥0’までのwhileで回すと良い
• その中でもう一回whileを使って次の0までの距離を調べ
よう!
• 数えた0までの距離を配列の要素番号にして出力すれば
完成

More Related Content

Viewers also liked (8)

Social Media (edited)
Social Media (edited)Social Media (edited)
Social Media (edited)
 
Business finance essentials
Business finance essentialsBusiness finance essentials
Business finance essentials
 
International Finance after the Sanction for Iranian Companies
International Finance after the Sanction for Iranian CompaniesInternational Finance after the Sanction for Iranian Companies
International Finance after the Sanction for Iranian Companies
 
Jaime fernandez
Jaime fernandezJaime fernandez
Jaime fernandez
 
Introduction to android
Introduction to androidIntroduction to android
Introduction to android
 
Introduction to RDM for trainee physicians
Introduction to RDM for trainee physiciansIntroduction to RDM for trainee physicians
Introduction to RDM for trainee physicians
 
Glosario
GlosarioGlosario
Glosario
 
Изучаем ФГОС дошкольного образования
Изучаем ФГОС дошкольного образованияИзучаем ФГОС дошкольного образования
Изучаем ФГОС дошкольного образования
 

Similar to 第6回

Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
nukaemon
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
Keisuke Umeno
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
Shintaro Fukushima
 
新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた
Tomoaki Ueda
 

Similar to 第6回 (20)

Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすくAlgebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
 
6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について6_C言語入門 - 式と演算子について
6_C言語入門 - 式と演算子について
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
PFI Christmas seminar 2009
PFI Christmas seminar 2009PFI Christmas seminar 2009
PFI Christmas seminar 2009
 
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby普通のコードがCodeGolfコードになるまで in Ruby
普通のコードがCodeGolfコードになるまで in Ruby
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた新しくプログラミング言語・・・Rubyでやってみた
新しくプログラミング言語・・・Rubyでやってみた
 

第6回