地域情報学演習 集中講義 C++プログラミング 集中講義 2017年11月18日

Slides:



Advertisements
Similar presentations
プログラミング論 第八回数字の計算,整数の入出力. 本日の内容 前回の課題(続き) 前回の課題(続き) 数字の計算をする 数字の計算をする – 加減乗除を行う – インクリメント演算子とデクリメン ト演算子.
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
プログラミング基礎I(再) 山元進.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
C言語 第2講 生物機能制御学講座 濱田 農学部7号館209室.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
関数の定義.
プログラミング応用 printfと変数.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
基本骨格 #include #include : int main(void) { 変数の宣言 実行すること return 0; } #include int main(void) { int i; printf(”Hello world!\n”);
地域情報学演習 VBAプログラミング 第2回 2017年10月17日
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとプログラミング (Algorithms and Programming)
プログラムはどこに保存され,どこで実行されるのか?
プログラミング演習I 2003年5月7日(第4回) 木村巌.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
前回の練習問題.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラムはどこに保存され,どこで実行されるのか?
第11回 プログラミングⅡ 第11回
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
情報処理Ⅱ 第2回:2003年10月14日(火).
疑似乱数, モンテカルロ法によるシミュレーション
C言語 はじめに 2016年 吉田研究室.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
プログラミング演習I 2003年4月30日(第3回) 木村巌.
地域情報学 C言語プログラミング 第1回 導入、標準出力、変数 2017年10月13日
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
ネットワーク・プログラミング Cプログラミングの基礎.
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2016年11月25日
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
情報処理Ⅱ 第2回 2004年10月12日(火).
第3回簡単なデータの入出力.
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2017年11月1日
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
printf・scanf・変数・四則演算
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Presentation transcript:

地域情報学演習 集中講義 C++プログラミング 集中講義 2017年11月18日 三井真吾 メール:smitsui@staff.kanazawa-u.ac.jp 居室:工作実習棟 HP:佐々木敏彦研究室HP    http://next.w3.kanazawa-u.ac.jp/

ビジネスメールの書き方 件名: ~~~~~について (件名は必ず付ける。) 本文: ○○様 (又は ○○先生) ~の○○と申します。 ~~~~~~~~ 以上、宜しくお願い致します。 所属 ○○○○ 学籍番号 ○○○○ 名前 ○○○○

C++とは? コンピュータプログラミング言語の一つ。 機械語(01001…) C++(int main({cout<<“Hello!”; return 0;}) 自然言語(Hello!) C言語という基本となる言語がある。 コンピュータを命令どおりに動かすことが目的。 高速に大量に計算する。グラフを書く。等 本講義の目的 プログラミングに慣れ、ICTを理解して利活用できるようにする。

プログラムを作って実行するには? コンパイラでC++を実行ファイル(exeファイル、機械 語)に変換しなければならない。 コンパイラ #include <iostream> int main() { std::cout<<“Hello World!!”; return 0; } プログラムファイル test.cpp オブジェクトファイル コンパイル リンク ↑ 実行ファイル test.exe test.o コンパイラ

環境設定1 コンパイラ(MinGW)のインストール http://www.mingw.org/にアクセス。 右上の「Download Installer」からダウンロード。 インストーラーを起動。 Install Continue 「mingw32-base」「mingw32-gcc-g++」のみにチェック 左上InstallationのApply Changes Apply 止まったら終了。

環境設定2 環境変数 環境変数とはアプリケーションを起動するときの検索先を指定すること。 設定方法 左下の検索窓から「システム環境変数の編集」を検索 環境変数をクリック。 Pathを探しだしクリック、編集を押す。 編集方法 win10:新規に C:\MinGW\bin を作る。 win8.1:一番最後に ;C:\MinGW\bin を追記。 PCを再起動。 起動確認 コマンドプロンプトでg++と打つ。 g++: fatal error: no input files… と出ればOK。

基本文法 #include <iostream> //インクルードファイル int main(){ //関数名 std::cout << “Hello World!!\n”; /*命令文*/ return 0; /*戻り値*/ } coutは、文字を出力する関数。 \nで改行。最後に << std::endl; でも改行できる。 ファイル名は、test.cpp (test.cc)として保存。 編集はメモ帳など、通常のテキストエディタで良い。

プログラミングのルール 基本的に1文字でも間違ったら動きません。 上から順番に実行される。 命令の最後には必ず「;」(セミコロン)を付ける。 余分な空白、改行は無視される。 基本的に半角英数字を使う。 大文字と小文字は区別される。 「//」で1行分、「/* ~ */」で囲まれた部分はコメントとして実行されない。 ファイルの拡張子は「.cpp」とする。(拡張子は見えるようにしておこう。) \と\(バックスラッシュ)は同じです。

コンパイル test.cpp 任意の場所にworkフォルダを作る。 メモ帳で下記のtest.cppというファイルを作る。 フォルダ上で「Shift」を押しながら右クリック。 コマンドウィンドウをここで開く。 g++␣test.cpp でコンパイル。(後ろに␣-o␣test.exeで名前指 定。) test.exe で実行 「Hello World!」と出ましたか? test.cpp #include␣<iostream> using␣namespace␣std; int␣main(){ cout<<“Hello World!!”<<endl; return␣0; } 例題:以下を出力せよ。 私は○○○○です。 ○○○○専攻です。 学籍番号は、○○○○です。

変数 int␣data; //int型のdataと言う名前の変数を定義。 data = 10; などと書けば、いつでも整数を代入できる。 int␣toshi = 20; cout << “私は” << toshi << “歳です。”; toshi = 21; ←toshi = toshi + 1; でもOK! 出力:私は20歳です。私は21歳です。 ⇒算術演算子へ 型 データ型 バイト幅 扱える数値の範囲 char 文字型  1 -128~127 int 整数型  2 -32768~32767 long 倍長整数型  4 -2147483648~2147483647 float 単精度浮動小数点型 (±)3.4E-38~3.4E+38 (7桁) double 倍精度浮動小数点型  8 (±)1.7E-308~1.7E+308 (15桁) 整数 小数

配列 int no[5]; //int型のnoと言う名前の配列(箱)を5個定義。 出来る配列は、 no[0], no[1], no[2], no[3], no[4]の5個。 初期化 int no[5] = {1, 2, 3, 4, 5}; //5個別々に初期化。 int no[5] = {0}; //全て0で初期化。 代入 no[3] = 6; //変数と同様に扱える。 no[2] = no[0] + no[1];

文字列 char型は英字1文字しか扱えない。 char moji = ‘A’; //シングルクォーテーションで囲む。 char moji[4] = “ABC”; //ダブルクォーテーションで囲む。 moji[3]に終了コードとして0が格納される。 char str[10] = “HELLO”; //配列は大きくても良い。 C++では、stringクラスと言って複数文字が扱える。 string str1 = “HELLO” string str2 = “WORLD” string str3 = str1 + “ ” + str2

型変換 代入時 float␣pi = 3.14159; int␣x = pi; xは、小数点以下が切り捨てられて、3となってしまう。 式中 int␣i = 5; long␣l = 10; double␣d = 1.23; double␣kai = i * l + d; 一番精度の高いdoubleに拡張されて計算される。

明示的型変換 int␣a = 5; int␣b = 2; float␣c = a / b; 右辺はint同士の計算であるため小数点以下は捨てられてcに代入される。 c = 2となる。 float␣c = (float) a / (float) b; 明示的に右辺をfloatへ変換することが出来る。 c = 2.5となる。

入力 int a; cin >> a; // int型の変数aにキーボード入力値を格納する。 cin >> a >> b; //スペースで区切った2つの数字を入力できる。 例題 2つの数字を入力し、足し算、引き算、掛け算、割り算の 結果を出力せよ。割り算は、小数になることに注意。 入力した金額(例えば987円)が各硬貨何枚分になるか出 力せよ。

算術演算子 インクリメント・デクリメント演算子 例題 変数を2つ定義して、足し算、引き算、掛け算、割り算、剰余算の結果を出力せよ。 演算 意味 加算 + a + b a に b を加える 減算 - a - b a から b を引く 乗算 * a * b a に b をかける 除算 / a / b a を b で割る 剰余算 % a % b a を b で割った余り 例題 変数を2つ定義して、足し算、引き算、掛け算、割り算、剰余算の結果を出力せよ。 インクリメント・デクリメント演算子 演算 演算子 例 意味 インクリメント ++ a++ a に 1 を加える(後置演算) ++a a に 1 を加える(前置演算) デクリメント -- a-- a から 1 を引く(後置演算) --a a から 1 を引く(前置演算)

if文 if (a > 1000){aout<<“a は 1000 より大きい\n”;} else␣if(a > 500){aout<<“a は 1000以下で500より大きい\n";} else { “a は 500以下\n“ }; 演算子 意味 使用例 > より大きい if (a > b) >= より大きいか、等しい (以上) if (a >= b) < より小さい if (a < b) <= より小さいか、等しい (以下) if (a <= b) == 等しい if (a == b) != 等しくない if (a != b) 演算子 意味 使用例 && かつ if (a > 0 && b > 0) || または if (a > 0 || b > 0) ! でない if (!a) 例題 点数を入力し60点以上は合格、59点以下は不合格と出力せよ。 数字を5つ入力し、最大値を出力せよ。 じゃんけんゲームを作ってみましょう。

じゃんけんゲームの基礎 インクルードファイル #include␣<iostream> #include␣<stdlib.h> #include␣<time.h> pcの出し手を乱数を用いて、1(グー)、2(チョキ)、3(パー)の3つ で表現。 int␣pc = 0; srand( (unsigned) time(NULL) ); pc = rand() % 3 + 1;

#include␣<iostream> #include␣<stdlib. h> #include␣<time #include␣<iostream> #include␣<stdlib.h> #include␣<time.h> using namespace␣std; int␣main(){ int␣pc = 0; srand( (unsigned) time(NULL) ); pc = rand() % 3 + 1; cout << “じゃんけんゲームの基礎” << endl; if(pc == 1){ cout << “PCはグー” << endl; } else␣if(pc == 2){ cout << “PCはチョキ” << endl; } else{ cout << “PCはパー” << endl; } return 0; }

for文 二重ループ int␣i, sum = 0; for (i=0; i<5; i++){ sum = sum + i; 演算子 記述例 意味 += a += b a = a + b -= a -= b a = a - b *= a *= b a = a * b /= a /= b a = a / b %= a %= b a = a % b int␣i, sum = 0; for (i=0; i<5; i++){ sum = sum + i; cout<<sum<<endl; } 二重ループ 例題 以下のような九九の表を作れ。 5回勝負のじゃんけんゲームを作れ。 int␣i, n; for (n=0; n<5; n++){ for (i=0; i<10; i++){ cout<<“*”; } cout<<endl; 1の段: 1*1=1 1*2=2 … 1*9=9 2の段: 2*1=2 2*2=4 … 2*9=18 ・・・ 9の段: 9*1=9 9*2=18 … 9*9=81

while文 int a=0; while(a<10){ cout << a <<endl; a++; } 一般に for文は「○回処理を繰り返す」ときに使用し、 while文は「~の条件の間処理を繰り返す」ときに使用する。 break;でループを1つ抜ける事ができる。 例題 どちらかが5回勝つまで行うじゃんけんゲームを作れ。

do~while文 int a=0; do{ cout << a <<endl; a++; } while(a<10); 処理を行った後に継続条件を判定する。 必ず1回は処理するときなどに使われる。

switch文 int a, in1, in2; cout<<“1:和 2:差”<<endl; cin>>a; //分岐条件を入力 cout<<“数値を2つ入力”<<endl; cin>>in1>>in2; switch (a) { //aの値によって分岐 case 1: //aの値が1のとき cout<<“和は”<<in1+in2; break; //必ずbreakを入れる case 2: //aの値が2のとき cout<<“差は”<<in1-in2 break; default: //aの値がその他のとき cout>>“1又は2を入力して下さい。”; }

2次元配列 int no[3][4] = {{1, 2, 3, 4} {5, 6, 7, 8} {9, 10, 11, 12}}; // 縦3行、横4列の配列を定義 int no[3][4] = {{ }}; //全て0で初期化。 3次元以上の配列も可能。

ポインタ int x = 123; x //変数xの値123を表す(家) &x //変数xのアドレス1000を表す(住所) *pt //ポインタとはアドレスを記録する変数(住所録) int a, b; int *p; //ポインタpの宣言 p = &a; //ポインタpにaのアドレスを記録 *p = 100; //pの指す中身に100を代入 b = *p + 100; //bにpのさす中身+100を代入 メモリ 123 変数xのアドレス 1000番地 変数aのアドレス 2000番地 100 ポインタpのアドレス 3000番地 2000 変数bのアドレス 4000番地 200

ポインタ 文字列 char *p = “ABC”; //”ABC”の先頭アドレスがポインタに詰められる。 char *p; //上記と同じ p = “ABC” char *yobi[3] = {“getu”, “ka”, “sui”} //それぞれの先頭アドレスがyobi[0]、 yobi[1]、 yobi[2]に詰められる。 string yobi = “getuyoubi”; //stringのポインタを得る場合 yobi.c_str() //.c_str()で呼び出す yobi[0] = g //[0]のアドレスを取る

ポインタ 配列 a 配列aの先頭アドレス a[0] a[1] a[2] a[0] の値('A') a[1] の値('B') a[2] の値('\0') &a[0] &a[1] &a[2] a[0]のアドレス a[1]のアドレス a[2]のアドレス char a[3] = “AB”; このときa == &a[0]となる。 変数とは異なることに注意。 int a; //変数a &a; //変数aのアドレス char st[]=“AB”; char *pt1, *pt2; pt1 = st; cout<<*pt1<<endl; cout<<*(pt1 + 1)<<endl; cout<<*(pt1 + 2)<<endl; pt2 = st; cout<<*pt2<<endl; pt2++; pt2++;とは次のアドレスに移動するという意味。型によって移動量が異なる。

関数 float wa(float x, float y); //関数waのプロトタイプ宣言 //始めのfloatは戻り値の型 int main () { float sum, a=3, b=5; sum = wa(a, b); //関数waの戻り値をsumに代入 //aとbを引数と呼ぶ return 0; } float wa(float x, float y){ //関数waの本体 float z=0; z = x + y; //和を計算する return z; //zの値を返す

関数 複数の戻り値 void swap(float *x, float *y); //戻り値がない時はvoid型 int main () { float a=3, b=5; cout<<“a=”<<a<<“, b=”<<b<<endl; swap(&a, &b); //アドレスを渡す cout<<“a=”<<a<<“, b=”<<b; return 0; } void swap(float *x, float *y){ //アドレスをポインタに詰める float z=0; z = *x; *x = *y; //ポインタを書き換えることで *y = z; //見かけ上複数の値が返る

関数 配列の引数 float wa(float dt[5]); //仮引数に配列を指定 int main () { float sum[5]={1, 2, 3, 4, 5}; cout <<“\n合計は” <<wa(sum); //引数に配列名を渡す return 0; } float wa(float dt[5]){ float z = 0; for(int i=0; i<5; i++){ cout<<dt[i]<<“ ”; //通常の配列同様に使える z += dt[i]; return z;

関数 配列の引数(ポインタ) float wa(float *dt); //ポインタで渡す int main () { float sum[5]={1, 2, 3, 4, 5}; cout <<“\n合計は” <<wa(sum); return 0; } float wa(float *dt){ float z = 0; for(int i=0; i<5; i++){ cout<<*dt + i<<“ ”; z += *dt + i; //配列を進める return z; float wa(float *dt); int main () { float sum[5]={1, 2, 3, 4, 5}; cout <<“\n合計は” <<wa(sum); return 0; } float wa(float *dt){ float z = 0; for(int i=0; i<5; i++){ cout<<dt[i]<<“ ”; z += dt[i];    //配列風に使える return z;

構造体 struct seiseki { //構造体(複数の型のデータをまとめて扱える)の宣言 int bango; //メンバ:学生番号 char name[10]; //メンバ:氏名 float avg; //メンバ:平均点 }; int main() { struct seiseki no1 = { 1, “Aさん”, 83.5 }; //構造体変数の初期化 struct seiseki no2[20] = { //構造体配列の初期化 { 2, “Bさん", 78.6 }, { 3, “Cさん", 57.3 },}; cout << no1.bango << no1.name << no1.avg << endl << endl; for(int i = 0; i < 2; i++) cout << no2[i].bango << no2[i].name << no2[i].avg << endl; return 0; }

構造体の利用 struct seiseki { int no; char name[20]; float avg; }; int main() { struct seiseki seito[3]; for(int i = 0; i < 3; i++) {cin >> seito[i].no >> seito[i].name >> seito[i].avg;} for(int i = 0; i < 3; i++) { cout<<seito[i].no<<" "<<seito[i].name<<" "<<seito[i].avg<<endl;} return 0; }

ファイル入力  #include <iostream> #include <fstream> using namespace std; int main(){ ifstream ifs( “data.txt" ); string str; int no[5]={0}, i=0; while(!ifs.eof()){ //ファイルの最後まで読む ifs >> no[i] >> str; //数字を配列に詰める cout << no[i] << “ ” << str << endl; //文字をstringに詰める i++; } for(int ii=0; ii<5; ii++) cout << no[ii] << “ ” << str << endl; return 0; 例題 構造体へのファイル入力をしよう。

ファイル出力 #include <fstream> int main() { ofstream ofs(“test2.txt”); ofs << “name" << 12345 << endl; return 0; } #include <fstream> int main() { ofstream ofs; ofs.open( “test.txt”, ios::app ); ofs << “name" << 12345 << endl; ofs.close(); return 0; } フラグ 説明 out 書き込み専用に開く。デフォルト。 app 追記用に開く。 ate ファイルを開くと、自動的に末尾に移動する。 trunc ファイルを開くと、以前の内容を全て削除する。 binary 特殊な文字を置換しない。 例題 data配列を読み込み、異なる順番で出力しよう。

ファイル入力 文字列配列 #include <iostream> #include <stdio.h> ファイル入力 文字列配列 #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int main() { FILE *ifs; ifs = fopen("data3.txt", "r"); char c[10][5]; int no[5]={0}, i=0; while(!feof(ifs)){ fscanf(ifs, "%d %s",&no[i], c[i]); cout << no[i] << " " << c[i] << endl; i++; } fclose(ifs); return 0; stringの配列可