Post on 27-Jun-2020
応用プログラミングM1 クラス : 応用プログラミング<5>
第一回 2014/9/24
教員紹介
高瀬 裕(たかせ ゆたか)
居室:12号館 1階 知的インタフェース研究室
連絡先 s02386@cc.seikei.ac.jp
メモして!資料置き場 http://iui.ci.seikei.ac.jp/~takase/
授業の進め方スライドで行います。
・筆記用具 ・テキスト ・(参考書)
毎回授業中に練習問題を出す予定です。
持ってきてほしいもの
参考書はどれでも可ですが 買うなら「やさしいC++」あたりが無難です
授業終了後にスライドをwebに載せます。
評価方法3,4限の実験とセットの授業です
中間・期末試験は授業内で行いますが実験はあります
試験 50% レポート・実験 50% (変動の可能性あり)
A) 2/3 以上の講義の出席 B) 期末試験 40% 以上の得点 C) 全レポートの提出
は最低ラインです
遅れてもレポートを出すことはかなり重要
レポート提出をしよう
4回レポート課題を出します
A) A4サイズの用紙を使う B) 表紙を用意する表紙の次に課題内容を明記 C) コメント文必須。重要な部分は処理の解説をする D) 実行結果 E) 考察
科目名/課題番号/出題日/締切日/グループ名/学籍番号/氏名表紙に載せるもの
コピペは両者とも減点になります
授業日程・内容回数 日程 内容 テキスト第1回 9/24 基本データ型, 制御構造 1章第2回 10/1 一次配列,string クラス 2章 3章第3回 10/8 関数定義とスコープ (Vector型) 4章(5章)第4回 10/15 ファイル操作 6章第5回 10/22 テキスト入力処理 7章第6回 10/29 ポインタの基本 8章第7回 11/5 配列とポインタ 9章第8回 11/12 中間試験第9回 11/19 多次元配列 10章第10回 11/26 構造体 11章第11回 12/3 関数宣言, 関数名の多重定義, デフォルト引数, 関数テンプレート 12章第12回 12/10 再帰呼び出し 13章第13回 12/17 アルゴリズム 14章第14回 1/14 配列を用いた間接参照 15章第15回 1/21 期末試験
はじめに
プログラムとは
(人間にとっては)面倒な作業をコンピュータにやらせる 命令文(を書く作業)
・何万件のデータから特定のデータを抜き出す ・吉祥寺から羽田空港まで最短時間で乗り換えたい
人手でやるのは大変
(自分はやりたくないけど)こうすればできる。 という戦略を書くのがプログラムです
コンピュータは融通が効かない
・コンピュータの知ってる言葉しか受け付けない ・命令通りにしか動かない
例えば: URLは1文字も間違えられない
間違えて命令すると間違えた通りに動く
コンピュータの知ってる言葉
機械語 : 人間が読み書きするのは困難
人が読み書きしやすい方法でプログラミング !
機械語に翻訳(コンパイル) !
実行可能ファイルを実行
人にもコンピュータにも理解しやすい命令書を書く練習 がプログラミングの授業です
Hello World(はろーわーるど)Hello World を出力するプログラム書いてみよう
\\ からはじまる文 コメント文 ・処理の内容 ・引数の内容 等
#include <iostream> using namespace std; !int main() { \\ Hello World の出力 cout << “Hello World” << endl; \\ 正常終了 retune 0; }
自分のため かつ 他人のためにコメントは書きましょう
コンパイルと実行実験環境下では次のようにコンパイル& 実行
g++ ソースファイル名 -o 任意の実行ファイル名コンパイル
% g++ helloworld.cpp -o hello
実行./実行ファイル名% ./hello
コンパイル時にエラーが出たら 必ず確認!
カレントディレクトリの hello を実行の意味
デバックのために
getchar();#include <iostream> using namespace std; !int main() { getchar(); cout << “Hello World” << endl; \\ 正常終了 retune 0; }
キー入力を待って,そのキーを返す
キー入力しないと 先に進まないので 要所要所で止められます
文章のアウトプットや コメントアウトを挟んで, 処理の流れを確認するのも 重要です
基本データ型復習
基本的な型
種類 名前 サイズ 値の範囲文字型 char 1 byte 英文字1文字
整数型 int 4 byte 整数 (-2147483648 ~ 2147483647)
浮動小数点型 double 8 byte 倍精度浮動小数点数 (1.7x10
論理型 bool 1 byte true または false ( 1 か 0 )
本来はもっとたくさん用意されています。 適切なものを選ぶほうがメモリの節約になります。
予め用意されている型(の一部)
変数の宣言と初期化
データ型名 識別子;変数の宣言
識別子:自由に決めた記号 変数の宣言によって識別子が変数名として扱える。値の代入
変数名 = 式;
変数の初期化データ型名 識別子 = 式;
宣言と同時に初期値を与える。
値の代入は「=」を使う。
int x;
x = 3;
int x = 3;
変数の宣言は箱の用意変数の宣言はよく入れ物(箱)用意に例えられます
#include <iostream> using namespace std; !int main() { int x; int y; ! x = 2; y = x * x; ! cout << y << endl; x =3;
メモリ(みなさんご存知あれです) 上に数値を入れるための箱を用意
x y
メモリx y
メモリ
2
x y
メモリ
4
43
数学とは違います
int x; x = 3 ; 3 = x;
これはOKこれはダメ
= は右辺を左辺に代入する演算です。 右辺は変数でないとだめです。
int x; 3*x =30;
これも無理です。 x= 10 とは解釈してくれません。
型による切り捨て整数値と実数値をちゃんと区別しましょう変数も整数と実数必要なものを用意する。 計算結果はどっちになるかも考慮して。
int x; x = 2; x = 2.5;
整数だと宣言x は 2
xは整数 切り捨てられて x は2
実数を代入しても型(箱の大きさ) は変わらないです箱
桁落ちとキャスト整数値と実数値を混ぜて計算する
#include <iostream> using namespace std; !int main() { int num1 = 5; int num2 = 4; double div; ! div = num1/num2; ! cout << div << endl; retune 0; }
左の結果は 1 になります。div = num1/num2;
右辺を計算してからdouble の箱へ 入れるのです。
右辺のどちらかを明示的にdoubleへ
div = (double) num1/num2;キャストといいます。(教科書の方法でもいいよ)
リテラル文字や数字の取り扱い方法
種類 対象 例 特徴文字リテラル 英文字1文字 ‘A’ ‘e’ ‘’ でくくる文字列リテラル 日本語/複数文字 “Hello!” “やあ!” “” でくくる
数値リテラル 実数 1, 3.14, -1000 そのまま表記
論理リテラル 真か偽か true, false 条件分岐等で使用
文字の種類によって扱い方が異なりますがこれだけです。 文字列リテラルについては次回詳しくやります。
制御構文復習
制御構文の種類
選択構造if文 if-else文 2方向分岐else-if文 多方向分岐switch文 多方向分岐
条件によって処理を分けるなら選択構造
条件によって処理を繰り返すなら反復構造反復構造
while文 不定回数反復for 文 指定回数反復
do -while文 不定回数反復
条件を上手く使うと様々に役立ちます
関係演算子制御構文の条件のための演算子群
分類 演算子 式が真となる場合 使用例
等値演算子右辺と左辺が等しい a == b右辺と左辺が等しくない a != b
比較演算子
右辺より左辺が大きい a > b右辺より左辺が等しいか大きい a >= b右辺より左辺が小さい a < b右辺より左辺が等しいか小さい a <= b
==!=>>=<<=
>=(<=)は順番が固定です。 =>(=<) ではエラーになります。
論理演算子と複数条件の指定
演算子 意味 式が真となる場合 使用例
&& AND 右辺が真 かつ 左辺が真 条件1 && 条件2
|| OR 右辺が真 または 左辺が真 条件1 || 条件2
! NOT 条件が偽 !(条件)
論理演算子を使えば,複数の条件を指定できます
◯ > △ || !(△ <= □) ◯が△より大きい または △が□以下ではない時に真の条件
if文特定の条件で別の処理を行いたい場合
!int main() { if(条件){ ! 条件が真の処理1; 条件が真の処理2; … } retune 0; }
条件を真(true)か偽(false)で判定 真なら処理を続ける 偽ならスキップ
if , if-else , else-if 文は全部まとめて覚えます。
if - else 文条件に応じて別の処理を行いたい場合
int main() { if(条件){ 条件が真の処理1; 条件が真の処理2; … }else{ 条件が偽の処理1; 条件が偽の処理2; … } retune 0; }
条件を真(true)か偽(false)で判定 それぞれの処理へ振り分ける。 !
必ずどちらかのルートに入る。
else if 文複数回条件による処理の振り分けを行う場合int main() { if(条件1){ 条件1が真の処理1; … }else if(条件2){ 条件1が偽かつ条件2が真の処理1; … }else if(条件3){ 条件1が偽かつ条件2が偽かつ条件3が真の処理1; … }else{ すべての条件が偽の時の処理1; … } retune 0; }
条件判定は上からされていく
最後のelseは必須ではない
for文回数指定の繰り返し処理
!for(式1;式2;式3){ ! 処理; … }
式1 : 初期化式 式2 : 継続条件式 式3 : 再初期化式
式の間をセミコロン(;)で繋ぐことに注意
初期化式 最初だけ実行する処理 (主にカウンタの初期化に使う) 継続条件式 繰り返すかどうか判定する条件式 (反復回数の指定に使う) 再初期化式 繰り返し処理が終わる度に実行 (カウンタの増加 or 減少に使う)
While文条件が真の間ずっと繰り返す
!while (条件){ ! 処理1; 処理2; … }
!while (条件) 処理;
処理の内容によって条件判定が変化するような場合に使用#include <iostream> use namespace std; !int main(){ double x = 7.0; while (x > 0.01){ cout << x << endl; x = x / 2; } cout << x << endl; return 0; }
x >0.01の間 2で割り続ける7 3.5 1.75 0.875 0.4375 0.21875 0.109375 0.0546875 0.0273438 0.0136719 0.00683594
While文と無限ループ
#include <iostream> use namespace std; !int main(){ double x = 7.0; while (1){ cout << x << endl; x = x / 2; } cout << x << endl; return 0; }
While文を使えば簡単に無限ループに入れます。
終わりません。
しかし, 特定の条件以外終わらせたくない 場合に役立ちます例えば,シミュレータ
速度更新 位置の更新 描画
その他
プロンプト入出力標準出力,標準入力の使い方
標準出力 cout 標準出力(ディスプレイ)に 文字列等を出力する
cout << 式・文字列; cout << 式1 << 式2 ;
標準入力 cin 標準入力装置(キーボード)から受け取る
cin >> 変数 ; cin >> 変数1 >> 変数2 ;複数個も受け取れる宣言済みの変数
#include <iostream> が必須
文とブロック{} で囲むとブロックになります。
int main(){ ! if(条件) 条件が真の処理1; else 条件が偽の処理1; ! retune 0; }
{}を使って いくつかの文をまとめられます
処理が二文以上だと{}が必要。 一見して関係性が分かりにくい。
テキストに頻出するので注意して見て下さい。
ライブラリ関数よく使う処理は既にあります。
例 : 数学関係の関数<cmath> ヘッダファイルをinclude して使います。
#include <iostream> #include <cmath> !use namespace std; !int main(){ hogehoge; return 0; }
sin(x), cos(x), tan(x) arcsin(x), arccos(x), arctan(x) exp(x), log(x), sqrt(x) pow(d,x) etc…sqrt(x) = √x pow(d,x) = dのx乗
自分で関数を作れますが,後日やります。
練習問題
モンテカルロ法によるπの導出
1
1
(0,0) ~ (1,1) の間のランダムな点 (x,y) が 1/4円の中に入る確率P は 面積比と等しい P = 0.25π / 1
π = 4P
x,yはdouble x,y; !x = rand() / 2147483647.0; y = rand() / 2147483647.0;
x2 + y2 >= 1 で円の外 x2 + y2 < 1 で円の中
int r = x2 + y2
とすれば r が 0 or 1以上で 場合分けできる
実験の注意