Download presentation
Presentation is loading. Please wait.
1
地域情報学演習 集中講義 C++プログラミング 集中講義 2017年11月18日
三井真吾 居室:工作実習棟 HP:佐々木敏彦研究室HP
2
ビジネスメールの書き方 件名: ~~~~~について (件名は必ず付ける。) 本文: ○○様 (又は ○○先生) ~の○○と申します。 ~~~~~~~~ 以上、宜しくお願い致します。 所属 ○○○○ 学籍番号 ○○○○ 名前 ○○○○
3
C++とは? コンピュータプログラミング言語の一つ。 機械語(01001…)
C++(int main({cout<<“Hello!”; return 0;}) 自然言語(Hello!) C言語という基本となる言語がある。 コンピュータを命令どおりに動かすことが目的。 高速に大量に計算する。グラフを書く。等 本講義の目的 プログラミングに慣れ、ICTを理解して利活用できるようにする。
4
プログラムを作って実行するには? コンパイラでC++を実行ファイル(exeファイル、機械 語)に変換しなければならない。 コンパイラ
#include <iostream> int main() { std::cout<<“Hello World!!”; return 0; } プログラムファイル test.cpp オブジェクトファイル コンパイル リンク ↑ 実行ファイル test.exe test.o コンパイラ
5
環境設定1 コンパイラ(MinGW)のインストール http://www.mingw.org/にアクセス。
右上の「Download Installer」からダウンロード。 インストーラーを起動。 Install Continue 「mingw32-base」「mingw32-gcc-g++」のみにチェック 左上InstallationのApply Changes Apply 止まったら終了。
6
環境設定2 環境変数 環境変数とはアプリケーションを起動するときの検索先を指定すること。 設定方法
左下の検索窓から「システム環境変数の編集」を検索 環境変数をクリック。 Pathを探しだしクリック、編集を押す。 編集方法 win10:新規に C:\MinGW\bin を作る。 win8.1:一番最後に ;C:\MinGW\bin を追記。 PCを再起動。 起動確認 コマンドプロンプトでg++と打つ。 g++: fatal error: no input files… と出ればOK。
7
基本文法 #include <iostream> //インクルードファイル int main(){ //関数名 std::cout << “Hello World!!\n”; /*命令文*/ return 0; /*戻り値*/ } coutは、文字を出力する関数。 \nで改行。最後に << std::endl; でも改行できる。 ファイル名は、test.cpp (test.cc)として保存。 編集はメモ帳など、通常のテキストエディタで良い。
8
プログラミングのルール 基本的に1文字でも間違ったら動きません。 上から順番に実行される。 命令の最後には必ず「;」(セミコロン)を付ける。
余分な空白、改行は無視される。 基本的に半角英数字を使う。 大文字と小文字は区別される。 「//」で1行分、「/* ~ */」で囲まれた部分はコメントとして実行されない。 ファイルの拡張子は「.cpp」とする。(拡張子は見えるようにしておこう。) \と\(バックスラッシュ)は同じです。
9
コンパイル 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; } 例題:以下を出力せよ。 私は○○○○です。 ○○○○専攻です。 学籍番号は、○○○○です。
10
変数 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 ~ float 単精度浮動小数点型 (±)3.4E-38~3.4E+38 (7桁) double 倍精度浮動小数点型 8 (±)1.7E-308~1.7E+308 (15桁) 整数 小数
11
配列 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];
12
文字列 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
13
型変換 代入時 float␣pi = ; int␣x = pi; xは、小数点以下が切り捨てられて、3となってしまう。 式中 int␣i = 5; long␣l = 10; double␣d = 1.23; double␣kai = i * l + d; 一番精度の高いdoubleに拡張されて計算される。
14
明示的型変換 int␣a = 5; int␣b = 2; float␣c = a / b; 右辺はint同士の計算であるため小数点以下は捨てられてcに代入される。 c = 2となる。 float␣c = (float) a / (float) b; 明示的に右辺をfloatへ変換することが出来る。 c = 2.5となる。
15
入力 int a; cin >> a; // int型の変数aにキーボード入力値を格納する。
cin >> a >> b; //スペースで区切った2つの数字を入力できる。 例題 2つの数字を入力し、足し算、引き算、掛け算、割り算の 結果を出力せよ。割り算は、小数になることに注意。 入力した金額(例えば987円)が各硬貨何枚分になるか出 力せよ。
16
算術演算子 インクリメント・デクリメント演算子 例題 変数を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 を引く(前置演算)
17
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つ入力し、最大値を出力せよ。 じゃんけんゲームを作ってみましょう。
18
じゃんけんゲームの基礎 インクルードファイル #include␣<iostream> #include␣<stdlib.h> #include␣<time.h> pcの出し手を乱数を用いて、1(グー)、2(チョキ)、3(パー)の3つ で表現。 int␣pc = 0; srand( (unsigned) time(NULL) ); pc = rand() % 3 + 1;
19
#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; }
20
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
21
while文 int a=0; while(a<10){ cout << a <<endl; a++; }
一般に for文は「○回処理を繰り返す」ときに使用し、 while文は「~の条件の間処理を繰り返す」ときに使用する。 break;でループを1つ抜ける事ができる。 例題 どちらかが5回勝つまで行うじゃんけんゲームを作れ。
22
do~while文 int a=0; do{ cout << a <<endl; a++;
} while(a<10); 処理を行った後に継続条件を判定する。 必ず1回は処理するときなどに使われる。
23
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を入力して下さい。”; }
24
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次元以上の配列も可能。
25
ポインタ 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
26
ポインタ 文字列 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]のアドレスを取る
27
ポインタ 配列 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++;とは次のアドレスに移動するという意味。型によって移動量が異なる。
28
関数 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の値を返す
29
関数 複数の戻り値 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; //見かけ上複数の値が返る
30
関数 配列の引数 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;
31
関数 配列の引数(ポインタ) 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;
32
構造体 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; }
33
構造体の利用 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; }
34
ファイル入力 #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; 例題 構造体へのファイル入力をしよう。
35
ファイル出力 #include <fstream> int main() { ofstream ofs(“test2.txt”); ofs << “name" << << endl; return 0; } #include <fstream> int main() { ofstream ofs; ofs.open( “test.txt”, ios::app ); ofs << “name" << << endl; ofs.close(); return 0; } フラグ 説明 out 書き込み専用に開く。デフォルト。 app 追記用に開く。 ate ファイルを開くと、自動的に末尾に移動する。 trunc ファイルを開くと、以前の内容を全て削除する。 binary 特殊な文字を置換しない。 例題 data配列を読み込み、異なる順番で出力しよう。
36
ファイル入力 文字列配列 #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の配列可
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.