第1回(10月2日)

プログラミングⅡ
第1回
今日の内容
•
•
•
•
変数の型
演算
入力と出力
制御文
– if文
– for文
変数とは
• 変数:数値を格納しておく器(入れ物)
98
xyz
xyzという変数に,98という整数値を格納(代入)
• 変数は,実際にはメモリ上にある.
• 器には,色々な大きさや形がある⇒データ型
変数のデータ型
• 変数には,データ型が決まっている
データ型 データの種類
サイズ
値の範囲
char
文字型
1バイト
-127~128
int
整数型
4バイト
-2,147,483,648~2,147,483,647
float
実数型
4バイト
-3.4×10-38~3.4×10+38
double
実数型
8バイト
-1.7×10-308 ~ 1.7×10+308
char型
int型
float型
double型
必要に応じて
使い分ける
変数の型宣言
• 変数を使うためには,型宣言が必要
– 扱う値に合った器(型)の形・大きさを決める
データ型
int x;
double w, z;
int a = 3;
変数名 [,変数名・・・];
//xという名前の変数をint型で宣言
//wとzという2つの変数を宣言
//変数aを宣言すると同時に3を代入
(⇒「初期化する」という)
変数に値を入れる
65
x
xという変数に,65という整数値を格納(代入)
x = 65;
①
②
③
④
⑤
30 = x;
//間違い
x = 10 + 20; //10+20の計算結果をxに代入
x = x + 1; //x + 1の計算結果をxに代入
x = 0x41
//16進数の41をxに代入
x = ‘A’;
//x = 0x41と同じこと
式の評価
• 式は評価されて値を持つ
式
評価結果
7
7
3 + 2
5
20 / 10
2
X = 8
8
1 + 2
3
3 * 4
12
(1 + 2) * 4;
3
* 4;
12;
演算
•
•
•
•
•
•
代入
足し算
引き算
かけ算
割り算
剰余算
「=」
「+」
「ー」
「*」
「/」
「%」
x = 100;
y = x + 20;
y = 180 – 110;
z = x*x;
a = b / c;
amari = N % 2;
8%3 → 8を3で割った余り(2)
演算の優先順位
• 優先順位の高い演算から順番に計算される
演算子
意味
優先順位
()
括弧
高い
*
掛け算
/
割り算
%
剰余算
+
足し算
―
引き算
=
代入
低い
• 同じ優先順位の演算がある場合は,「結合規則」に
従って計算順序が決まる
• 優先順位
– 優先順位の高い演算から順に行われる
– (例) d = a + b * c (「*」,「+」,「=」の順)
• 結合規則
– 同じ優先順位が複数ある場合は,結合規則(方
向)に従って順に演算が行われる
– (例)d = a / b * c (「/」と「*」は同じ順位なので,
結合規則に従って,「左から右の順」に演算する)
プログラム例
#include <stdio.h>
int main()
{
char
x,y,z;
x = 10;
y = 3;
z = x + y;
printf(“%d\n”, z);
return 0;
}
10
3
x
yx
1013+ 3
xz
複合演算子
複合演算子
演算子
使用例
意味
算術演算子
+=
a += b
aにbを加えた値をaに代入
a=a+b
-=
a -= b
aからbを引いた値をaに代入
a=a–b
*=
a *= b
aにbを掛けた値をaに代入
a=a*b
/=
a /= b
aをbで割った値をaに代入
a=a/b
%=
a %= b
aをbで割った余りをaに代入
a=a%b
様々な演算
• インクリメント
a = a + 1; //aに1を加えて,その結果をaに代入
a++; //aを評価したのちに1を加算
++a; //aに1を加算したのちにaを評価
様々な演算
• デクリメント
a = a - 1; //aから1を減算し,その結果をaに代入
a--; //aを評価したのちに1減算
--a; //aを1減算したのちにaを評価
様々な演算
• 不等号演算子
– 「>」:左辺は右辺より大きい
– 「<」:右辺は左辺より大きい
– 「>=」:左辺は右辺より大きい,または等しい
– 「<=」:右辺は左辺より大きい,または等しい
「5>3」 ⇒ 真(True):値は1
「5<3」 ⇒ 偽(False):値は0
様々な演算
• 等価演算子と非等価演算子
– 「==」:左辺と右辺は等しい
– 「!=」:左辺と右辺は等しくない
a = 3;
「a == 3」 ⇒ 真(True):値は1
「a != 3」 ⇒ 偽(False):値は0
データ型と計算(同じ型同士)
以下の式を計算(評価)結果はいくらか?
10 / 3
整数型
結果:
3
数学では,
10/3 = 3.33333となる
はずなのに…
整数型
整数型になる
同じ型同士の計算を行うと、結果も同じ型になる
この場合,結果は整数型のため,小数以下は切り捨てられる
データ型と計算(違う型同士)
以下の式を計算(評価)結果はいくらか?
10 * 3.14
整数型
実数型
結果:
31.40
実数型になる
違う型同士の計算では、結果は大きい型(実数型)に
合わせられる(格上げ)
様々な演算
• キャスト演算子
– 型を変換することが目的
– 使い方:
(キャストしたい型)変数名;
y = (int)x;
b = (double)a;
様々な演算
• キャスト演算子
– 型を変換することが目的
int a = 10, b = 3;
double c;
c = a / b;
printf(“%f”, a / b);
printf(“%f”, c);
int型の値
を%fで表示
切り捨てが発生
printf(“%f”, (double)a / b );
aをdouble型に
変換
printf関数
• 変数の中身を表示することが可能
• 書式指定を指定することが可能
型
意味
例
結果
d
整数を10進数で表示
a = 123; printf(“%d”,a);
123
x
整数を16進数で表示
a = 123; printf(“%x”,a);
7b
c
1文字を表示
a = ‘R’; printf(“%c”,a);
R
s
文字列を表示
char *a=“ABC”; printf(“%s”,a);
ABC
f
実数を10進数で表示
a = 123.45; printf(“%f”,a);
123.450000
printf関数
printf (“表示したい文字列”, 引数1, 引数2, ・・);
文字列
書式指定文字列
エスケープシーケンス
書式指定文字列
“ ・・・・ % ― 0 5 d ・・・ “
型の指定
表示する最大桁数
数値の場合(0:ゼロサプレス無)
―:左詰め(省略値は右詰め)
+:符号を表示
printf関数(テキストp.51)
• 浮動小数点型の値を表示する場合
double pi = 3.14159265358979323;
//桁数指定なし(小数点以下6桁で表示)
printf(“円周率 = %f”, pi);
//全部で5桁、小数点以下は2桁で表示
printf(“円周率 = %5.2f”,pi);
scanf関数(テキストp.92)
• 機能:標準入力(キーボード)から値を入力させる
• 引数:書式(変換指定子)と,変数
• 変換指定子:
–
–
–
–
–
–
%d :
%f :
%lf :
%c:
%s:
%x:
10進整数
float型浮動小数点数
double型浮動小数点数
文字
文字列
16進数整数
• 使い方:
scanf(“変換指定子”, &変数);
scanf関数
• 例:
int
x;
int型の変数 x に入力
float y;
double z;
printf(“xに入力してください”);
scanf(“%d”,&x);
printf(“yに入力してください”);float型の変数 y に入力
scanf(“%f”,&y);
printf(“zに入力してください”);
doubleの変数 z に入力
scanf(“%lf”,&z);
printf関数とscanf関数の書式指定
int型
float型
double型
char型
printf関数
%d
%f
%lf (%fでもOK)
%c
scanf関数
%d
%f
%lf
%c
制御文
(プログラムの流れを変える!)
今までのプログラムの流れ(処理手順)
• プログラムの処理順序は,
「上から下へ」
開始
変数xとyを宣言
int main()
{
int x, y;
x = 10;
y = x * x;
printf(“xの2乗は,%d”, y);
}
xに10を代入
yにx*xを代入
yの値を表示
終了
if文
• ある条件を満たしたときだけ,実行される
制御式という
if (条件)
{
制御式が真のときだけ,文1,文2,...
という具合に中括弧内が実行される
文1;
文2;
:
}
制御式: 条件を決める評価式
真文: 制御式が真のときに実行される文
a = 3;
b = 5;
if (a < b)
{
文1;
文2;
}
文3;
if文
a = 8;
b = 5;
if (a < b)
{
文1;
文2;
}
文3;
制御式が1 ⇒ 真文が実行される
制御式が0 ⇒ 真文は実行されない
(注意)制御式が0以外⇒ 真文は「実行される」
処理の流れ
a = 3;
b = 5;
if (a < b)
{
文1;
文2;
}
文3;
開始
a←3, b←5
真(TRUE)
a<b
偽(FALSE)
文1
文2
文3
終了
if文での良くある間違い
aが3のときだけ,真文を実行したい!
scanf(“%d”,&a);
if (a = 3)
{
文1;
}
文2;
「==」と「=」
の間違いは深
刻な結果を招く
「a = 3」の評価値は,「3」
制御式が0以外 ⇒ 真文(文1)は「実行される」
if文
• 真文が1つだけの場合は,中括弧{}はなくて
もよい
if (条件)
{
文1;
}
インデントを付
文2;
if (条件)
文1;
文2;
けないと見にく
くなる
この場合,文2は「常に」実行される
例題:if文を使ってプログラミング
• 映画の料金を教えるプログラムを作る.
– 年齢ageをscanf関数で入力させる
– もし,13歳未満ならば,「無料です」と表示
– もし,13歳以上ならば,「1000円です」と表示
例題:if文を使ってプログラミング
13歳未満ならば,「無料です」と表示.
13歳以上ならば,「1000円です」と表示.
int main()
{
int age;
printf(“あなたの年齢は?”);
scanf(“%d”, &age);
if (age < 13)
printf(“無料です\n”);
if (age >= 13)
printf(“1000円です\n”);
return 0;
}
if~else文
ageが13歳未満ならば,「無料です」と表示.
ageが13歳以上ならば,「1000円です」と表示.
ageが13歳未満ならば,「無料です」と表示,
それ以外ならば,「1000円です」と表示
if~else文
ageが13歳未満ならば,「タダです」と表示,
それ以外ならば,「料金は1000円です」と表示
if (条件) {
文1;
文2;
} else {
文3;
文4;
}
条件以外
の場合
処理の流れ
if (条件) {
文1;
文2;
} else {
文3;
文4;
}
条件
真(TRUE)
偽(FALSE)
文3
文1
文4
文2
例題:if~else文でプログラミング
ageが13歳未満ならば,「無料です」と表示,
それ以外ならば,「1000円です」と表示
int main()
{
int age;
printf(“あなたの年齢は?”);
scanf(“%d”, &age);
if (age < 13)
printf(“無料です\n”);
else
printf(“1000円です\n”);
return 0;
}
if~else if文
13歳未満ならば,「無料です」と表示,
13歳未満でもなく,学生ならば,「800円です」と表示
13歳未満でもなく,学生でもないならば,「1000円です」と表示
if (条件1) {
文1;
文2;
} else if (条件2) {
文3;
文4;
} else {
文5;
文6;
}
条件1:TRUE
条件1:FALSE
条件2:TRUE
条件1:FALSE
条件2:FALSE
処理の流れ
真(TRUE)
if (条件1) {
文1;
文2;
} else if (条件2){
文3;
文4;
} else {
文5;
文6;
}
条件1
真(TRUE)
文1
偽(FALSE)
条件2
偽(FALSE)
文2
文3
文4
文5
文6
例題:if~else if文でプログラミング
13歳未満ならば,「無料です」と表示,
13歳未満でも,学生ならば,「800円です」と表示
13歳未満でもなく,学生でもないならば,「1000円です」と表示
int main()
{
int age, is_student;
printf(“あなたの年齢は?”);
scanf(“%d”, &age);
printf(“学生ですか?(Yes:1, No:0)”);
scanf(“%d”,&is_student);
if (age < 13)
printf(“無料です\n”);
else if (is_student == 1)
printf(“800円です\n”);
else
printf(“1000円です\n”);
return 0;
}