講義資料

プログラミング初級
第3回 2016年4月25日
演算・入出力
1
第5章 演算
2
3
演算記号を覚えよう
<ポイント>
計算に使う記号は以下の通りである。 (余りは整数演算でのみ用いられる概念)
+ 加算
- 減算
* 乗算
/ 除算
%
例 100を6で割った商と余りを表示させる。
#include <stdio.h>
int main(void)
{
int a, b, wa, sa, syo, amari;
a = 100;
b = 6;
syo = a / b;
amari = a % b;
Int型:商と余りは整数として計算される
printf("%dと%dの商は%d 余りは%dです。¥n", a, b, syo, amari);
return 0;
}
余り
実行結果
演算記号を覚えよう
<ポイント>
(1)計算の順位は括弧が優先される。(2)乗法と除法が加減法に優先する。
例 上底1.5下底3.5高さ3.0の台形の面積を表示させる。
int main(void)
{
double a, b, h, S;
小数を扱うからdouble型
a = 1.5;
b = 3.5;
h = 3.0;
S = (a + b) * h / 2;
(上底+下底)を先に計算
×高さ÷2
printf("上底%f、下底%f、高さ%fの台形の面積は%fです。¥n", a, b, h, S);
return 0;
}
実行結果
4
例 (p.65)
#include <stdio.h>
int型:商と余りは整数として計算される
int main(void)
注意:余りの概念は整数の演算だからある
{
int a, b, wa, sa, seki, syo, amari;
a = 100;
b = 3;
wa = a + b;
sa = a – b;
seki = a * b;
syo = a / b;
amari = a % b;
printf("和=%d", wa);
printf("差=%d", sa);
printf("積=%d", seki);
printf("商=%d", syo);
printf("余り=%d", amari);
//出力
//出力
//出力
//出力
//出力
和=103
差=97
積=300
商=33
余り=1
return 0;
}
5
型を変更する = キャスト演算子
6
教科書66ページ
<ポイント>
1. (double)を変数の前につけることで、int型の変数を一時的にdouble型に
変換して使用することができる。
2. (int)を変数の前につけることで、double型の変数を一時的にint型に変換
して使用することができる。
// 本体価格(税抜き)計算プログラム
#include <stdio.h>
int main(void)
{
実行結果
int kakaku;
double hontai;
printf("消費税込み販売価格は?");
scanf("%d", &kakaku);
hontai = (double) kakaku / 1.08;
printf("消費税ぬきの価格は%f円です¥n",hontai);
printf("消費税ぬきの価格は端数を切り捨てれば%d円
です¥n", (int) hontai);
return 0;
}
kakaku:int型⇒double型へ変換
(注:この式のようにint型とdouble型が混在しているときは自
動的にdouble型へ変換してくれるので省略は可能)
hontai:double型⇒int型へ変換
インクリメント演算子とデクリメント演算子
<ポイント>
(1)a++や++aはaに1加え、a--や--aはaから1減らす演算子
(2)代入式で用いた場合
b = a++ や b = a-- は b = a の代入の後でaへの加減が行われる
b = ++a や b = --a は aの加減が実行された後で代入される
例 インクリメント演算子の使い方
#include <stdio.h>
int main(void)
{
int a, b, c;
a=1;
a++;
aに1加える: a = a +1(= 2)
b = a++;
bにaを代入してからaに1加える: b = a (= 2), a = a +1(= 3)
c = ++a;
aに1加えてからcにaを代入 : a = a + 1(= 4), c = a (= 4)
printf("a=%d, b=%d, c=%d¥n", a, b, c);
return 0;
}
実行結果
7
8
演算記号を覚えよう
<ポイント>
インクリメント演算子やデクリメント演算子は代入の式で書きかえることができる。
例 次の2つのプログラムは同じ働きをする。
#include <stdio.h>
int main(void)
{
int a, b, c;
a=2;
#include <stdio.h>
int main(void)
{
int a, b, c;
a=2;
a++
a=a+1
aに1加える
b=a++;
b=a;
a=a+1;
bにaを代入してからaに1加える
a=a+1;
c=a;
aに1加えてからcにaを代入
c=++a;
printf("a=%d, b=%d, c=%d¥n",
a, b, c);
printf("a=%d, b=%d, c=%d¥n", a, b, c);
return 0;
}
return 0;
}
例 (p.67)
#include<stdio.h>
int main(void)
{
int a, b=5;
++b;
//
printf("b=%d", b);
--b;
//
printf("b=%d", b);
b = 5;
a = ++b;
//
printf("a=%d b=%d", a,
b = 5;
a = b++;
//
printf("a=%d b=%d", a,
b = b + 1, b++ と同じ
b = b - 1, b-- と同じ
bに1加算してからaに代入
b);
aにbを代入してから1加算
b);
return 0;
}
9
10
代入処理を行う
<ポイント>
a = b = C =… のように、多重代入処理ができる。
a = a (演算子) b の式を a (演算子) = b に書きかえることができる。
例 代入処理をする(p68)
#include <stdio.h>
int main(void)
{
int a, b, c;
a = 10; printf("a=%d¥n",a);
aは10
a = b = c = 20; printf("a=%d, b=%d, c=%d¥n", a, b, c);
a = 10; a += 5; printf("a=%d¥n",a);
a =10 → a = a + 5 → aは15になる
a = 10; a *= 5; printf("a=%d¥n",a);
a =10 → a = a * 5 → aは50になる
return 0;
}
aとbとcは20
数値計算における約束
■計算記号は、加算(+)、減算(-)、乗算(*)、除算(/)、余り(%)
■計算順位は、乗算(*)、除算(/)、余り(%) が優先され
加算(+)、減算(-) はその後で計算される
■ただし括弧()のある計算ではその部分が最優先で計算される
■同じ順位のものでは左側から計算される
■型が混在した場合は表現能力の高いものにあわせて計算される
(変更が必要ならキャスト演算子を用いる)
■+ + は1加算、- - は1減算を表す
代入式の場合その位置によって代入の前か後に加算・減算が行われる
■a = a (演算子) b の式を a (演算子) = b に書きかえることができる
例: a = a - b ⇒ a -= b
11
第6章 入出力
12
入力の基本はscanf
13
(詳細は85ページ)
<ポイント>
変数名は自由につけてよいが、必ず&をつける (アドレス指定のため:p.180)
整数を扱うときはint型で宣言し、%dで受け付ける
小数を含む数を扱うときはdouble型で宣言し、%lf(エル・エフ)で受け付ける
// 表示プログラム
// 0123456
学院太郎
// practice22.c
#include <stdio.h>
int main(void)
{
int seisu; 小数入力は%lf
double hankei;
実行結果
scanf("%d" , &seisu);
scanf("%lf", &hankei);
printf("seisuは%dです¥n",seisu);
printf("hankeiは%fです¥n",hankei);
return 0;
}
ユーザーが
入力する
(%fではない)
小数出力は%f
scanf内の変数には
&
をつけるのが基本
!
14
入力案内メッセージをつけよう
<ポイント>
scanf()の前にprintf()で「何に関する入力を求めるのか」を書くようにする
(入力案内メッセージ)
#include <stdio.h>
int main(void)
{
int seisu;
double hankei, menseki;
printf("個数は?");
scanf(“%d”,&seisu);
入力案内メッセージ
printf("半径は?");
scanf("%lf",&hankei);
入力案内メッセージ
menseki=3.14*hankei*hankei;
printf("個数は%dです¥n",seisu);
printf("半径%fの円の面積は",hankei);
printf("%fです¥n",menseki);
return 0;
}
実行結果
1文字の表示 (putchar関数)
15
<ポイント>
・文字であっても「数値」であるので、int型で扱うことができる
・putchar関数は1文字を画面に出力する
// 文字を表示する
// 0123456
学院太郎
// practice23.c
実行結果
#include <stdio.h>
int型を用いる!
int main(void)
{
int moji = 'A';// int moji = 65 と同じ
printf("1文字を表示:");
putchar(moji);//putchar('A') と同じ
putchar('¥n');
return 0;
}
mojiを1文字表示
16
1文字の入出力
<ポイント>
getcharで1文字入力し、int型(数値型)変数に代入することができる。
// 入力した文字を表示する
// 0123456
学院太郎
// practice23.c
実行結果
#include <stdio.h>
int main(void)
{
int moji;
int型を用いる!
moji = getchar();
printf("入力した文字:");
putchar(moji);
putchar('¥n');
return 0;
}
1文字入力され
た文字コードを
mojiに格納
1文字表示
ユーザーが
入力する
17
文字列の表示
<ポイント>
1.文字列を扱う場合、宣言はchar型で、配列として扱う
=“最大文字数”を宣言する必要がある
2. 「どこまでが文字列か」を判断するため文字列終端マーク(¥0)がつく
3.文字列の表示にはputs関数を使うことができる
// 文字列を表示する
// 0123456
学院太郎
// practice23.c
実行結果
#include <stdio.h>
int main(void)
{
char ss[80]="TOHOKUGAKUIN";
printf("文字列=");
//puts("文字列=")と改行の動作を除いて同じ
puts(ss);
return 0;
}
文字列ssを表示する
最大80-1=79文字まで受け付けることができる
1文字分は¥0(null文字)のためにとっておく
ssには"TOHOKUGAKUIN¥0"と格納される
¥0はnull文字ともいわれ、その後ろにある
データは無視される
18
文字列の入出力
<ポイント>
1行の文字列を入力するときは gets を使う(空白も入力可能)
1行の文字列を出力するときは puts を使う(printfとの違い
=文字列のみの出力&改行つき)
// 入力した文字列を表示する
// 0123456
学院太郎
// practice23.c
実行結果
ユーザーが
入力する
#include <stdio.h>
int main(void)
{
char ss[80];
printf("文字列?");
gets(ss);
printf("文字列=");
puts(ss);//printf("文字列=%S¥n", ss)と同じ
return 0;
}
文字列ssを表示する
最大80-1=79文字まで受け付けることができる
getsを使うと、1行の文字列を読み込む
(入力文字数に注意すること):ssへ格納
19
文字列の入出力(2) : printf scanf の利用
<ポイント>
・文字列の場合、宣言はchar型、printf・scanfは%sで対応する
(詳細は教科書scanfの用法(85ページ), printfの用法(87ページ)を参照)
・文字列を扱う場合、 scanfの変数に&はつけない
// 入力した文字列を表示する
// 0123456
学院太郎
// practice23.c
#include <stdio.h>
実行結果
ユーザーが
入力する
int main(void)
{
char ss[80];
printf("文字列?");
scanf("%s", ss);
printf("文字列=%s¥n", ss);
return 0;
}
最大80-1=79文字まで受け付けることができる
[ ]付きの変数(配列)の場合に限り&は不
要⇒文字列のscanfに&なし!
注意:%sによる入力は空白で区切られ
てしまうため、入力するデータに注意
20
文字列を文字単位で表示: printfと %c の利用
<ポイント>
・文字列は配列として扱われている
・文字列を1文字単位で表示する場合、 printfの変換指定は%c
s:
配列として扱われている
// 文字列のなかの1文字を表示する
// 0123456
学院太郎
文字列
T
O
H
O
#include <stdio.h>
s[0]
s[1]
s[2]
s[3]
int main(void)
{
char s[7] = "TOHOKU";
K
U
s[4]
s[5]
¥0
s[6]
変換指定%cを使って文字列sの3
文字目であるs[2]を1文字表示
printf("文字列の3文字目 = %c¥n", s[2]);
//putchar(s[2])でもs[2]は表示可能
return 0;
}
実行結果
21
練習問題1
<ポイント>
インクリメント演算子やデクリメント演算子は代入の式で書きかえることができる
【問題1】(ex3-1.c)
次のプログラムを「インクリメント演算子」と「デクリメント演算子」を用いずに同じように
動作するプログラムにかきかえよ。
#include <stdio.h>
int main(void)
{
int a, b, c;
a = b = 5 ;
a++;
aに1を加える
b--;
bから1を引く
c = a--;
cにaを代入して次にaから1を引く
printf("a=%d, b=%d, c=%d¥n", a, b, c);
return 0;
}
練習問題2
<ポイント>
■入力の基本scanf 整数値を扱うならscanf("%d", &変数名);←&に注意
■2つの整数値の平均値=二つの整数の値の和÷2←和の計算が先
■平均値の計算に適する型はdouble型、ところが入力した数値はint型⇒
型をdouble型へ変換して計算し、表示させよう(教科書66ぺージ)
書式: (double) 変数名
【問題2】(ex3-2.c)
2つの整数値(int型)をキーボードから入力し、その数値の平均値を出力するプログラムを
作成せよ。
実行結果
2個の数値を入力して下さい
数値1:45
数値2:72
平均値 = 58.500000
22
練習問題3
23
<ポイント>
・文字列はchar型の配列として扱われる
・文字列の最後にはnull文字(¥0)が入るため、読み込む文字数+1の宣言が必要
・1行の文字列を入力するときは gets を使う
注意:scanf("%s",文字列名)は空白を含む文字列は空白の前方の文字列しか入力できない
・文字列の文字単位の表示の変換指定は%C
この問題の場合にはprintf("最初の1文字:%C",文字列名[位置])の書式
・「プログラミングの基礎」でやったように2文字目に'¥0'を入れて%sで表示
してもよい
【問題3】(ex3-3.c)
1行(49文字以内)の文字列をキーボードから入力し、その文字列の最初の文字を出力
するプログラムを作成せよ。
実行結果