Document

プログラミング入門2
第2回
演算と型
条件分岐
芝浦工業大学情報工学科
青木 義満
今回の講義内容
 いろいろな演算(四則演算)
 整数だけでなく小数データも!(int以外の変数の型)


前回 → 点数の合計
今回 → 平均点(小数データ)
 演算と型の関係
第2回
プログラミング入門2
2
前回の復習も兼ねて…
 キーボードから2つの整数を読み込み、和を表示するプログラムを作
成せよ。
これに他の演算(差,積,商,剰余)
を加えていく
第2回
プログラミング入門2
3
四則演算
 コンピュータに様々な計算を実行させる
→ 四則演算が基本 (和、差、積、商)
 四則演算を実現する演算子(演算の働きを持った記号)
演算子
用法
+
a+b
aとbの和
ー
a-b
aとbの差
*
a*b
aとbの積
/
a/b
aをbで割った商
%
a%b
aをbで割った剰余
a
+
第一(左)オペランド
説明
b
第二(右)オペランド
二項演算子
第2回
プログラミング入門2
4
四則演算の例題
 ソースファイル名:list0201.c
 目的: 四則演算を実行し、結果を確認する(特に / , % 演算子の結果に注意)
/* 読み込んだ二つの整数値の和・差・積・商・剰余を表示 */
#include <stdio.h>
int main(void)
{
int
vx, vy;
puts("二つの整数を入力してください。");
printf("整数vx:");
scanf("%d", &vx);
printf("整数vy:");
scanf("%d", &vy);
printf("vx + vy = %d\n", vx + vy);
printf("vx - vy = %d\n", vx - vy);
printf("vx * vy = %d\n", vx * vy);
printf("vx / vy = %d\n", vx / vy);
printf("vx %% vy = %d\n", vx % vy);
return (0);
}
第2回
プログラミング入門2
5
型と演算結果の関係
整数 / 整数
商の整数部
5 / 3 → 1, 3 / 5 → 0
整数 % 整数
剰余
5 % 3 → 2, 3 % 5 → 3
整数(int型)と整数(int型)の四則演算
第2回
プログラミング入門2
結果も整数
6
整数演算から実数演算へ
 これまでの計算 → 整数のみ(int型)
 実際の数値計算では、実数計算がほとんど
 例)



点数の平均点を求める
平方根の計算
sin, cos
その他
第2回
プログラミング入門2
7
平均値を求めるプログラム(整数版)
 ファイル名:heikin_int.c
/* 2科目の点数の平均を表示するプログラム 整数版*/
#include <stdio.h>
int main(void)
{
int sugaku;
int english;
int heikin;
printf(“数学の点数は?: ”);
scanf(“%d”, &sugaku);
printf(“英語の点数は?: ”);
scanf(“%d”, &sugaku);
heikin = (sugaku + english) / 2;
•演算は、*, / (乗算、除算)が優先される
•+, -を先に計算させる場合には、
半角( )でくくる
/* 平均点を求める */
printf(“平均点は、%d 点 です。”, heikin );
return(0);
}
第2回
プログラミング入門2
8
平均値を求めるプログラム(実数版)
 ファイル名:heikin_dbl.c
/* 2科目の点数の平均を表示するプログラム 実数版*/
#include <stdio.h>
int main(void)
{
int sugaku;
int english;
int を double に!
double heikin;
printf(“数学の点数は?: ”);
scanf(“%d”, &sugaku);
printf(“英語の点数は?: ”);
scanf(“%d”, &sugaku);
heikin = (sugaku + english) / 2.0;
• 割る数を 2 → 2.0 に!
/* 平均点を求める */
printf(“平均点は、%f 点 です。”, heikin );
return(0);
}
第2回
%d を %f に!
プログラミング入門2
9
解説 ~ 変数の”型”と”実体”
 C言語 実数を 浮動小数点数で表す
 整数 → int 型
 浮動小数点 → double型,float型
整数 変数の宣言
宣言
型名
変数名
int
sugaku;
タコ焼のカタ
(設計図)
タコ焼
(実体)
int型
sugaku
double型
heikin
浮動小数点数 変数の宣言
型名
宣言
第2回
変数名
double heikin;
プログラミング入門2
10
int, double型に対するprintf, scanf関数
int型の場合
double型の場合
printf
printf( “%d”, no );
printf( “%f ”, no );
scanf
scanf( “%d”, &no );
scanf( “%lf ”, &no );
忘れずに!
忘れずに!
%lf (パーセント・エル・エフ)
第2回
プログラミング入門2
11
double型変数への値の入力と表示
 ファイル名:list0207.c
 目的: double型変数に対する printf, scanf の使い方をマスター
/* 二つの実数値を読み込んで和・差・積・商を実数で表示 */
#include <stdio.h>
int main(void)
{
double
/* 浮動小数点数 */
vx, vy;
puts("二つの数を入力してください。");
printf("実数vx:");
scanf("%lf", &vx);
printf("実数vy:");
scanf("%lf", &vy);
printf("vx + vy = %f\n", vx + vy);
printf("vx - vy = %f\n", vx - vy);
printf("vx * vy = %f\n", vx * vy);
printf("vx / vy = %f\n", vx / vy);
return (0);
}
第2回
プログラミング入門2
12
型と代入(重要!)

int型変数に小数値(double)を代入すると……
9.99
9.99
小数点以下は切り捨て!
型に入らない!
nx
int型
dx
OK!
double型
 double型に整数値(int)を代入すると…
9
dx
printf → 9.000000
double型
第2回
プログラミング入門2
13
型と演算(重要!)
 同じ型どうし、異なる型どうしの演算
5
/ 2 → 2
→ int
int / int
5.0 / 2.0
→ 2.0
double / double
→ double
同じ型どうしの演算
5.0
/ 2
5 / 2.0
double / int
int / double
格上げ
格上げ
5.0 / 2.0 → 2.5
double / double → double
5.0 / 2.0 → 2.5
double / double → double
異なる型どうしの演算
第2回
プログラミング入門2
14
型と演算
重要
異なる型どうしの演算では、
小さい方の型のオペランドは、より大きい方の型に変換
された上で演算が行われる
int
double
<
整数のみ
実数
第2回
プログラミング入門2
15
例題(演算と型)
 ソースファイル名:list0208.c (p.29)
 確認事項: 同じ型,異なる型どうしの演算結果
/* 型と演算について確認する */
#include <stdio.h>
int main(void)
{
int
double
printf("n1 = %d\n", n1);
printf("n2 = %d\n", n2);
printf("n3 = %d\n", n3);
printf("n4 = %d\n\n", n4);
n1, n2, n3, n4;
d1, d2, d3, d4;
printf("d1 = %f\n", d1);
printf("d2 = %f\n", d2);
printf("d3 = %f\n", d3);
printf("d4 = %f\n", d4);
n1 = 5 / 2;
n2 = 5.0 / 2.0;
n3 = 5.0 / 2;
n4 = 5 / 2.0;
d1 = 5 / 2;
d2 = 5.0 / 2.0;
d3 = 5.0 / 2;
d4 = 5 / 2.0;
第2回
return (0);
}
プログラミング入門2
16
キャスト演算子 ~ 値の型を(強引に)変換
(型)
aの値を型名で指定された値に
変換したものを生成
a
例1)
(double) 5 → 5.0 を生成
(int) 2.55 → 2 を生成
例2)
int na, nb;
double heikin;
heikin = (double) (na + nb) / 2 ;
85(int型)
na = 40;
nb = 45;
代入
85.0(double型)
45.2 (double)
第2回
85.0 / 2
(double) / (int)
プログラミング入門2
17
if文による条件分岐
 条件にもとづいて、プログラムの流れを変える
 例えば、
キーボードから入力した整数値が…
・ もし、5で割り切れなかったら、“5の倍数でありません。”
と表示する。
・ そうでなかったら(5で割り切れたら)、“5の倍数です。”
と表示する。
第2回
プログラミング入門2
18
例題 ~ 最初のif文プログラム
 ソースファイル名: list0301.c
 概要: 読み込んだ整数値が5で割り切れないかどうか判定
 目的: if 文の動作を確認
/* 読み込んだ整数値は5で割り切れないか */
#include <stdio.h>
int main(void)
{
int
%: 余り
if文
vx;
printf("整数を入力してください:");
scanf("%d", &vx);
if (vx % 5)
puts("その数は5で割り切れません。");
return (0);
}
第2回
プログラミング入門2
19
例題解説(1) ~ if文の動作
式
if (vx % 5)
文
puts("その数は5で割り切れません。");
構文
if ( 式 )
vxが5の倍数 → vx%5 = 0
vxが5の倍数でない → vx%5 ≠0(非ゼロ)
文
•(式)を評価
•式の結果が非0だったら、文を実行
•式の結果が0だったら、文を実行せず
第2回
プログラミング入門2
20
例題~ if文プログラム(2)
 ソースファイル名: list0303.c
 概要: 割り切れなくても,割り切れても,その結果を表示
 目的: if ~else~文の動作を確認
#include <stdio.h>
int main(void)
{
int
If~else~文
vx;
printf("整数を入力してください:");
scanf("%d", &vx);
if (vx % 5)
puts("その数は5で割り切れません。");
else
puts(“その数は5で割り切れます。");
return (0);
}
第2回
プログラミング入門2
21
例題解説(2): if~else~文の動作
 If(もしも~なら・・・),else(それ以外の時は・・・)という意味
式
if (vx % 5)
puts("その数は5で割り切れません。");
else
puts(“その数は5で割り切れます。");
文1
文2
構文
if ( 式 )
式を評価,その値が,
文1
else
第2回
文2
もし(if),非0だったら・・・
→ 文1 を実行
そうでなければ(else),(0以外であれば)
→ 文2 を実行
プログラミング入門2
22
「式の評価」とは??
 C言語における「式」



x (int型変数)
38 (int型定数)
x + 38 (演算)
X
15
+
53
全てその値を評価できる
「式」
38
X
%
38
7
2
5
式全体の評価値
式全体の評価値
第2回
5
プログラミング入門2
23
値を比較するには? ~ 等価演算子,関係演算子

条件分岐における条件判定

人間の日常生活の中での様々な判断は,1つの条件,またはいくつかの条件を総合し
て判断している。
例えば…




只今の所持金は財布の中の2000円のみ
欲しい品物が2000円より高い → 買えない
2000円以下 → 買える!
大学の成績評価
A(80~100),B(70~79),C(60~69),D(~59)
駅から歩くか,学バスが来るまで待つか,タクシーに乗るか
判断要素: 天候,次のバスが来るまでの時間,所持金,疲労度,授業までの残り時間
など
ある値の大小によって,処理を分岐する必要になる!
第2回
プログラミング入門2
24
値比較のプログラム(1)
 ファイル名:list0306.c
/* 読み込んだ二つの整数値は等しいか */
#include <stdio.h>
int main(void)
{
int
x1, x2;
puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &x1);
printf("整数2:");
scanf("%d", &x2);
if (x1 == x2)
puts("それらの値は同じです。");
else
puts("それらの値は違います。");
return (0);
}
第2回
プログラミング入門2
25
値比較のプログラム(2)
 ファイル名:list0307.c
/* 読み込んだ二つの整数値は等しいか */
#include <stdio.h>
int main(void)
{
int
x1, x2;
puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &x1);
printf("整数2:");
scanf("%d", &x2);
if (x1 != x2)
puts("それらの値は違います。");
else
puts(“それらの値は同じです。");
return (0);
}
第2回
プログラミング入門2
26
等価演算子
 2つの式の値が等しいか,等しくないかを判定
==演算子
a == b
aとbの値が等しければ1,そうでなければ0
!=演算子
a != b
aとbの値が等くなければ1,そうでなければ0
等価演算子
値が1(等しい)
if (x1 == x2)
値が0
(等しくない)
puts("それらの値は同じです。");
else
puts("それらの値は違います。");
第2回
プログラミング入門2
※ != はこの逆
27
3つ以上の条件分岐をするには?
 これまでは流れを2つに分岐 → 3つ以上の場合は?
 例)

所持金2,000円
(1) 商品が2,000円より高かったら,惜しくも買えない.
(2) 商品が2,000円ピッタリだったら,ビンゴ.
(3) 商品が2,000円より安ければ,余裕で買える.
 値が等しいかどうかを判定:等価演算子(==,!=)
値の大小を比較する演算子が必要!!
値の比較により,処理の流れを3つに分岐したい
第2回
プログラミング入門2
28
値比較のプログラム(3)
 ファイル名:list0309.c
/* 読み込んだ整数値の符号を判定 */
#include <stdio.h>
int main(void)
{
int no;
printf("整数を入力してください:");
scanf("%d", &no);
if (no == 0)
puts("その数は0です。");
else if (no > 0)
puts("その数は正です。");
else
puts("その数は負です。");
return (0);
}
第2回
プログラミング入門2
29
3つ以上の分岐: if ~, else if ~, else ~

if(条件式1) ①
文1
else if(条件式2) ②
文2
else
③
文3
If(もし) 条件1であれば,文1実行
①でなく,条件2であれば,文2実行
①, ②のどの条件にもあてはまらない場合
① if (no == 0)
puts("その数は0です。");
② else if (no > 0)
puts("その数は正です。");
③ else
①,②以外,つまり,0でも正でもない場合
puts("その数は負です。");
※else if は何個でも書ける.
第2回
プログラミング入門2
30
大小関係を比較する ~ 関係演算子
< 演算子
a<b
aがbより小さければ1,そうでなければ0
>演算子
a>b
aがbより大きければ1,そうでなければ0
<=演算子
a <= b
aがb以下であれば1,そうでなければ0
>=演算子
a >= b aがb以上であれば1,そうでなければ0
if ( a >= b
第2回
)
○ → 値は1
× → 値は0
プログラミング入門2
31
2つの整数の大きい方の値を求める(1)
 ファイル名:list0310.c
/* 2つの整数の大きい方の値を求める */
#include <stdio.h>
int main(void)
{
int n1, n2;
puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);
if (n1 > n2)
printf("大きい方の値は%dです。\n", n1);
else
printf("大きい方の値は%dです。\n", n2);
return (0);
}
第2回
プログラミング入門2
32
2つの整数の大きい方の値を求める(2)
 ファイル名:list0311.c
 求めた値を,後の処理のために変数に格納
/* 2つの整数の大きい方の値を求める */
#include <stdio.h>
int main(void)
{
int
n1, n2, max;
puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);
if (n1 > n2)
max = n1;
else
max = n2;
printf("大きい方の値は%dです。\n", max);
return (0);
}
第2回
プログラミング入門2
33
大きい方の値, 小さい方の値両方を求める(3)
 ファイル名:list0315.c
/* 2つの整数の大きい方,小さい方の値両方を求める */
#include <stdio.h>
int main(void)
{
int
n1, n2, max, min;
puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);
if (n1 > n2) {
max = n1;
min = n2;
}
else {
max = n2;
min = n1;
}
今までに無かった中括弧
}
文が2つ(複数)
今までに無かった中括弧
}
文が2つ(複数)
printf("大きい方の値は%dです。\n", max);
printf("小さい方の値は%dです。\n", min);
return (0);
}
第2回
プログラミング入門2
34
複合文(ブロック)
重要
単一の文が要求されるところで,複数の文を実行しなければ
ならない時には,{}の中にまとめて,複合文(ブロック)として実現.
例1)
if (n1 > n2) {
max = n1;
min = n2;
}
複合文(ブロック)
※文が一つの場合,
{}は書いても書かなくてもOK.
実はこんなところにも…
#include <stdio.h>
int main(void)
{
printf(“こんにちは。”);
return (0);
}
第2回
複合文(ブロック)
プログラミング入門2
35
複数の条件から判断 ~ 論理演算子
 一つの条件だけでなく,複数の条件が成立,またはどちらからか
が成立した時,というように複数の条件から処理を判断.
 例)

とある飲み会へ参加しようかどうか迷っている
(1)友人AとBが両方とも(AかつB)参加表明 → 私も参加
(2)友人AとBの少なくともどちらかが(AまたはB)参加表明 → 参加微妙
(3)友人AとB,両方とも不参加 → 私も不参加
論理演算子
第2回
プログラミング入門2
の導入
36
論理演算子
~ AかつB,AまたはB の実現
 読み込んだ月から季節を判定するプログラム
 仕様


整数値(月:変数名 month )を入力
その数字が,




3,4,5 → 春
6,7、8 → 夏
9,10,11 → 秋
12,1,2 → 冬
条件を
?以上?以下で表現できる
条件を
12または1または2
と表現できる
と判定したい
第2回
プログラミング入門2
37
論理演算子
 条件の「かつ」,「または」を表現
&&(and) 演算子
a && b
aとbがどちらも非0であれば1,そうでなければ0
|| (or)演算子
a || b
aとbの一方でも非0であれば1,そうでなければ0
例) もし,3月以上(かつ)5月以下だったら…
3 <= month <= 5
①,②の両方成り立てば○
第2回
「かつ」
①
month >= 3
&&
②
month <= 5
○(1:正)
○(1:正)
○(1:正)
×(0:誤)
×(0:正)
○(1:正)
×(0:誤)
×(0:誤)
プログラミング入門2
→ ○(1:正)
→×(0:誤)
→×(0:誤)
→×(0:誤)
38
論理演算子
 条件の「かつ」,「または」を表現
&&(and) 演算子
a && b
aとbがどちらも非0であれば1,そうでなければ0
|| (or)演算子
a || b
aとbの一方でも非0であれば1,そうでなければ0
例) 12月,または1月だったら
「または」
①
②
month == 12 || month == 1
○(1:正)
○(1:正)
○(1:正)
×(0:誤)
×(0:正)
○(1:正)
×(0:誤)
×(0:誤)
第2回
①,②のどちらかが成り立てば○
→ ○(1:正)
→○(1:正)
→○(1:正)
→×(0:誤)
プログラミング入門2
39
季節判定プログラム(論理演算子)
 ファイル名:list0316.c
/* 読み込んだ月の季節を表示 */
#include <stdio.h>
int main(void)
{
int
month;
/* 月 */
printf("何月ですか:");
scanf("%d", &month);
if (month >= 3 && month <= 5)
puts("春です。");
else if (month >= 6 && month <= 8)
puts("夏です。");
else if (month >= 9 && month <= 11)
puts("秋です。");
else if (month == 1 || month == 2 || month == 12)
puts("冬です。");
else
puts("そんな月はありませんよ!!\a");
return (0);
}
第2回
プログラミング入門2
40
もう一つの条件分岐文 ~ switch 文
 ソースファイル名: list0317.c 読み込んだ整数値を3で割っ
た剰余を表示(if文使用)
/* 読み込んだ整数値を3で割った余りを表示 */
#include <stdio.h>
int main(void)
{
int num;
printf("整数を入力してください:");
scanf("%d", &num);
同じ式が2回登場 → 無駄?
if (num % 3 == 0)
puts(“3で割った余りは0です");
else if (num % 3 == 1)
puts(" 3で割った余りは1です");
else
puts(“3で割った余りは2です");
処理を自分で記述
return (0);
}
第2回
プログラミング入門2
41
switch 文
 単一の条件式の値によって,処理を複数に分岐させる場合
→ if文よりも簡潔に記述できる!
 ソースファイル名: list0318.c
/* 読み込んだ整数値を3で割った余りを表示 */
#include <stdio.h>
int main(void)
{
int num;
printf("整数を入力してください:");
scanf("%d", &num);
switch ( num % 3 ) {
case 0 : puts(“3で割り切れます”); break ;
case 1 : puts(“余りは1です”);
break ;
case 2 : puts(“余りは2です”);
break ;
}
return (0);
}
第2回
プログラミング入門2
42
switch文の構造
条件式①
switch ( num % 3 ) {
①の値が
0の場合
case 0 : puts(“3で割り切れます”);
case 1 : puts(“余りは1です”);
case 2 : puts(“余りは2です”);
1の場合
2の場合
break ;
break ;
break ;
}
(Switch文終了)
break で
switch文を抜ける
()カッコ内の式を評価し,case で書かれた
値と一致するところにプログラムの流れを移行
第2回
プログラミング入門2
43
switch文の break; と default : の役割
 ソースファイル名: list0319.c
/* switch文の動作を確認するプログラム */
#include <stdio.h>
int main(void)
{
int
sw;
printf("整数を入力してください:");
scanf("%d", &sw);
switch (sw) {
case 1 : puts("A");
case 2 : puts("C");
case 5 : puts("D");
case 6 :
case 7 : puts("E");
default : puts("F");
}
return (0);
}
第2回
puts("B"); break;
break; がない
break;
break; がない
break;
break;
新しい default :
switch文の動作を確認
プログラミング入門2
44
switch (sw) {
case 1
case 2
case 5
case 6
case 7
: puts("A"); puts("B"); break;
: puts("C");
: puts("D"); break;
:
: puts("E"); break;
default : puts("F"); break;
“sw” が 1, 2, 5, 6, 7 以外の場合
}
第2回
プログラミング入門2
45
switch文 と if文
 Switch文
→ 単一の式の値によって,プログラムの流れを分岐
 if 文
→ 複数の式の値によって,複雑な条件判断
を行い,処理を分岐することができる
第2回
プログラミング入門2
46
演習課題(簡単な数値計算)
1.
身長を整数値として読み込んで(scanf)、それに対する標準体重を実数で表示(printf)す
るプログラムを作成せよ。なお、標準体重の計算式は以下で与えられるものとする。
標準体重 = (身長-100)×0.9
kadai2-1.c
2. あるサッカーチームのゴール決定率を計算・表示するプログラムを作成せよ。
ただし、決定率は小数点2桁まで表示すること。
手順)
・チーム名を表示(printf)
・シュート数を入力
・ゴール数を入力
・ゴール決定率を計算(ゴール数÷シュート数)×100 (%)
・ゴール決定率を表示 (小数点2桁まで)
第2回
プログラミング入門2
kadai2-2.c
47
演習課題(条件分岐)
3.if文を用いて,点数を入力すると、その評価を出力するプログラム
を作れ。
なお評価は、以下のとおりとする。
kadai2-3.c
・80点以上: A(優), 70点以上80点未満: B(良),60点以上70点未満: C(可),
60点未満: D(不可)
4.月を数字で読込み,その月が何日あるかを表示するプログラムを
作れ。なお、1〜12以外の数字を入力した際には、”1〜12まで
の数字を入力してください ”と表示すること。
ただし,
・2月 →28日
・ 4, 6, 9, 11 → 30日
・1,3,5,7,8,10,12 → 31日
第2回
kadai2-4.c
プログラミング入門2
48
プログラミング入門2 レポート課題(第1回目)
 演習課題1〜4のプログラムを作成し,動作確認した上で
ソースファイル4つ(それぞれ,kadai2-1.c 〜 kadai2-4.c) をメール
に添付して提出せよ。
(授業中にできた課題は授業中にチェックしてもらうこと。)
 提出方法:

メールの題名(subjet)を, “学籍番号”+”自分の苗字”(全て半角英数文字にて)とする。
例) L02001 aoki


提出先: [email protected] (青木アドレス)
提出期限: 10月12日(金) 18:00まで(時間厳守)
第2回
プログラミング入門2
49
次回の講義予定

繰り返し文
で、プログラミングの幅を広げよう!
第2回
プログラミング入門2
50