Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
プログラミング演習2第1回
丸⼭勝久⽴命館⼤学 情報理⼯学部2020年度 春学期
注意
1
第1回課題の提出はありません
このスライドに書かれている説明とWebサイトの内容をみて,各⾃取り組んでください
プログラミング環境は各⾃で準備して下さいうまくいかない場合は,メールで質問して下さい
第1回の到達⽬標
2
演習課題のサイトの閲覧に慣れる
演習課題の取り組み⽅に慣れる
ソースコードの書き⽅,コンパイルのやり⽅を思い出すEmacs や vim のようなテキストエディタを使うのでもよいですが,Visual Studio Code や Eclipse(CDT) のような統合開発環境の利⽤もぜひ検討してください.クラウド環境もあります.
https://code.visualstudio.com/download
https://www.eclipse.org/cdt/
テストコードの書き⽅を知る
https://aws.amazon.com/jp/cloud9/
演習課題のサイト(1/2)
3
http://www.ritsumei.ac.jp/~maru/prog2/
クリック
演習課題のサイト(2/2)
4
クリックすることで,ソースコードのテンプレートがダウンロードできます
第1回は課題が5つあります
この資料がダウンロードできます
課題1-1: ソースコードの作成とプログラムの実⾏
5
#include <stdio.h>
int main(){
int x = -1;int y = -1;
printf("Please input two positive integer values: ");scanf("%d %d", &x, &y);
if (x > 0 && y > 0) {if (x > y) {
printf("The greater value is %d¥n", x);} else {
printf("The greater value is %d¥n", y);}
} else {printf("Not positive value(s)¥n");
}
return 0;}
% gcc -o prog1-1 prog1-1.c
% ./prog1-1Please input two positive integer values: 15 10The greater value is 15
% ./prog1-1Please input two positive integer values: 10 15The greater value is 15
prog1-1.c のコードを実際にコンパイルして,いくつかの値を⼊⼒して実⾏結果を確認せよ
実⾏の様⼦(MacOS)
6
Terminal での実⾏例
https://hacknote.jp/archives/53322/
gccを利⽤するためにはXcodeのインストールが必要です
参考サイト
実⾏の様⼦(Windows)
7
https://webkaru.net/clang/setup/https://hacknote.jp/archives/53289/
gccを利⽤するために,MinGWをインストールすることをすすめます
Windowsでは,テキストの改⾏コードが異なることに注意してください
PowerShellにおける実⾏例
参考サイト
https://support.microsoft.com/ja-jp/help/4028485/windows-10-add-an-exclusion-to-windows-security
「Windows セキュリティに除外を追加する」
セキュリティ上の問題で作成したプログラムが実⾏できない場合は,以下のサイトを参考にして下さい
課題1-2: 関数の抽出(1)
8
int max(int x, int y){
return x;}
int main(){
int x = -1;int y = -1;
printf("Please input two positive integer values: ");scanf("%d %d", &x, &y);
if (x > 0 && y > 0) {int m = max(x, y);printf("The greater value is %d¥n", m);
} else {printf("Not positive value(s)¥n");
}
return 0;}
% gcc -o prog1-2 prog1-2.c
% ./prog1-2Please input two positive integer values: 15 10The greater value is 15
% ./prog1-2Please input two positive integer values: 10 15The greater value is 10
誤り(“15”が正しい)
prog1-2.c の関数 max(int x, int y) が2つの引数のうち⼤きな⽅の整数を返すように,ソースコードを修正せよ
max()の中⾝を修正してください
関数の抽出
課題1-2: 関数の抽出(1) [解答例]
9
int max(int x, int y){
if (x > y) {return x;
} else {return y;
}}
int main(){
int x = -1;int y = -1;
printf("Please input two positive integer values: ");scanf("%d %d", &x, &y);
if (x > 0 && y > 0) {int m = max(x, y);printf("The greater value is %d¥n", m);
} else {printf("Not positive value(s)¥n");
}
return 0;}
% gcc -o prog1-2 prog1-2.c
% ./prog1-2Please input two positive integer values: 15 10The greater value is 15
% ./prog1-2Please input two positive integer values: 10 15The greater value is 15
修正後のソースコードの例
課題1-3: 関数の抽出(2)
10
int max(int x, int y){
if (x > y) {return x;
} else {return y;
}}
int main(){
...
int result = max(x, y);if (result > 0) {
printf("The greater value is %d¥n", result); } else {
printf("Not positive value(s)¥n"); } return 0;
}
% gcc -o prog1-3 prog1-3.c
% ./prog1-3Please input two positive integer values: 15 10The greater value is 15
% ./prog1-3Please input two positive integer values: 15 -1The greater value is 15
誤り(“Not positive …”が正しい)
prog1-3.c の関数 max(int x, int y) において,2つの引数のうち⼤きな⽅の正の整数を返すままで,どちらかの引数が正の整数でない場合,戻り値は -1 となるように,ソースコードを修正せよ
max()の中⾝を修正してください
課題1-3: 関数の抽出(2) [解答例]
11
int max(int x, int y){
if (x > 0 && y > 0) {if (x > y) {
return x;} else {
return y;}
} else {return -1;
}}
int main(){
...
int result = max(x, y);if (result > 0) {
printf("The greater value is %d¥n", result); } else {
printf("Not positive value(s)¥n"); } return 0;
}
% gcc -o prog1-3 prog1-3.c
% ./prog1-3Please input two positive integer values: 15 10The greater value is 15
% ./prog1-3Please input two positive integer values: 15 -1Not positive value(s)
修正後のソースコードの例
課題1-4: テストコードの作成(1)
12
#include <stdio.h>#include <assert.h>
int max(int x, int y){
return x;}
void test1(){
assert(max(4, 7) == 7);
printf("Success: %s¥n", __func__);}
int main(){
test1();}
% gcc -o prog1-4 prog1-4.c
% ./prog1-4Assertion failed: (max(4, 7) == 7), function test1, file prog1-4.c, line 13.Abort
テストコード
main関数をテスト関数の呼出しに変更
max(4,7)の戻り値が7となることを検査
max(4,7) の戻り値が4である(誤りが存在する)ため,テストに失敗
assert 関数を利⽤するために宣⾔を追加
課題1-4: テストコードの作成(1) [解答例]
13
int max(int x, int y){
if (x > 0 && y > 0) {if (x > y) {
return x;} else {
return y;}
} else {return -1;
}}
void test1(){
assert(max(4, 7) == 7);
printf("Success: %s¥n", __func__);}
int main(){
test1();}
% gcc -o prog1-4 prog1-4.c
% ./prog1-4Success: test1
テストコード
max(4,7)の戻り値が7となることを検査
max(4,7) の戻り値が7となるため,テストに成功
修正後のソースコードの例
prog1-3.c [解答例]からコピー
他のテストも考えてみてください
課題1-5: テストコードの作成(2)
14
int max(int x, int y){
if (x > y) {return x;
} else {return y;
}}
int max3(int x, int y, int z){
int m1 = max(x, y);int m2 = max(m1, z);return m2;
}
assert(max(4, 7) == 7);
assert(max(7, 4) == 7);
assert(max3(1, 2, 3) == 3);
assert(max3(3, 2, 1) == 3);
2つの引数のうち⼤きい⽅の整数を返す
3つの引数のうちもっとも⼤きな整数を返す
max(4,7)の戻り値が7となることを検査
max(7,4)の戻り値が7となることを検査
max3(1,2,3)の戻り値が3となることを検査
max3(3,2,1)の戻り値が3となることを検査
関数 max3(int x, int y, int z) に対して,3つの引数の値を変えたテスト⽤の関数を prog1-5.c に追加し,実⾏結果を確認せよ
課題1-5: テストコードの作成(2) [解答例]
15
void test5(){
assert(max3(1, 3, 2) == 3);
printf("Success: %s¥n", __func__);}
void test6(){
assert(max3(1, 0, 2) == 2);
printf("Success: %s¥n", __func__);}
void test7(){
assert(max3(0, 0, 0) == 0);
printf("Success: %s¥n", __func__);}
max3(1,3,2)の戻り値が3となることを検査
max3(1,0,2)の戻り値が2となることを検査
max3(0,0,0)の戻り値が0となることを検査
他にも考えてみてください
実際のソフトウェア開発では
16
テストコードを書く関数の中⾝を作成する
繰り返し
int max3(int x, int y, int z){
int m1 = max(x, y);int m2 = max(m1, z);return m2;
}
void test5(){
assert(max3(1, 3, 2) == 3);}
テストがあれば,ソースコードを安⼼して修正できるなぜなら,修正で間違えても,テストで間違いに気づける
関数の中⾝をかく前にテストを作成する⽅法もある→ テスト・ファースト⼿法 (課題1-4のようなやり⽅)
最初はテストに失敗するが,テストが成功するまでソースコードを修正する
第1回のまとめ
17
次回からは演習課題に⾃分で取り組める
課題に対して,ソースコードが書ける
テストコードを書ける
ソースコードをコンパイルして実⾏できる