プログラミング実習

プログラミング論
第九回
文字・文字列の入出力
If文を使ったプログラミング
本日の内容

文字列の入出力を行う
– scanf関数と入力の変換仕様



言葉の学習としてのプログラミング
(復習)
if文を使ったプログラミング
関係演算子と等価演算子
文字列の入出力を行う

次のプログラムの動作を確認しましょう。
//ensyu24.c 文字列の入出力を行う
#include <stdio.h>
int main(void)
{
char ss[80];
gets(ss);
puts(ss);
return 0;
}
文字列変数です。
最大80文字まで
保存可能です。
文字列の入出力を行う

次のプログラムの動作を確認しましょう。
//ensyu24.c 文字列の入出力を行う
#include <stdio.h>
int main(void)
{
char ss[80];
gets(ss);
puts(ss);
return 0;
}
キーボードから文字列を
入力する関数です。
文字列を保存する配列名
を与えます。
文字列の入出力を行う

次のプログラムの動作を確認しましょう。
//ensyu24.c 文字列の入出力を行う
#include <stdio.h>
int main(void)
{
char ss[80];
gets(ss);
puts(ss);
return 0;
}
文字列を出力する関数です。
文字列変数(配列名)を指定します。
“ABC”のように直接文字列を指定する
こともできます。
演習

ensyu24.cのプログラムにおいて,
puts(ss); と同じ働きをするように,この処
理をprintfで置き換えてください。
文字列の終端について





文字列は,終わりを指定しなければ,どこまでを正
しい文字列データとして表示すればよいのか分か
りません。
文字列を入力したとき,その終端には「文字列終端
マーク」が自動的に挿入されます。
文字列終端マークのことを「NULL文字」といいます
。
通常は「数値の0」です。
「数値の0」では,通常の数値変数の意味なのか,
終端マークの意味なのか分かりにくいので,’\0’と
特殊表現することもあります。
演習-文字列終端マーク




ensyu25.cは,文字列変数に初期値として
”hamamoto kazuhiko”という文字列が与えら
れているプログラムです。
このまま実行すると,
hamamoto kazuhiko
と表示されます。
5文字目に「数値の0」を代入した場合の出力を
確認してください。
同様に,「特殊文字’\0’」を代入した場合の出
力を確認してください。
scanfによる文字列の入力
//ensyu26.c scanfを用いた文字列の入力
#include <stdio.h>
int main(void)
{
char ss[80];
scanf("%s", ss);
puts(ss);
return 0;
}
文字列の変換仕様
は%sとなります。
配列変数の場合は,&が必
要ありません。
詳しくは,後期に学習します。
scanfによる文字列の入力


ensyu26.cにおいて,
hamamoto kazuhiko
と入力してみましょう。
どのように出力さましたか?
hamamoto のみの出力・・・?
scanf(“%s”, …); では,スペースは文字列終端マーク
として判断されるので注意が必要です。
演習 - scanfとgetsの違い





ensyu27.cを実行してみましょう。
入力は hama kazu でお願いします。
gets()とscanf()とで,2回入力します。
それぞれの場合において,一文字ずつ文
字コード(十進数)を出力させるプログラ
ムです。
hamaとkazuの間の「スペース」の扱いの
違いを確認してください。
言語の学習としてのプログラミング
(復習)

基本文型を覚えよう
– 英語には「基本5文型」があります。
S+V
 S+V+C
 S+V+O
 S+V+O+O
 S+V+O+C

– プログラミング言語に基本文型はあるのでしょ
うか?

あります!
言語の学習としてのプログラミング
(復習)

基本文型を覚えよう
– 「制御構造」とも呼ばれます。文(処理)の並べ方
の決まりです。次の3つです。

順次構造
– 順番に処理を実行していく構造。

選択構造
– もしAならば処理Bを実行し,そうでない場合処理Cを実行す
る。

繰り返し構造
– Aが成り立っている間,処理Bを繰り返し実行する。
– 全てのプログラムは,この3つの構造で書かれ
ています
言語の学習としてのプログラミング
(復習)

基本文型を覚えよう
– 「制御構造」とも呼ばれます。文(処理)の並べ方
の決まりです。次の3つです。

順次構造
– 順番に処理を実行していく構造。

選択構造
– もしAならば処理Bを実行し,そうでない場合処理Cを実行す
る。

繰り返し構造
– Aが成り立っている間,処理Bを繰り返し実行する。
– 全てのプログラムは,この3つの構造で書かれ
ています
if文を使ったプログラム






次の処理を考えましょう。
「定価が10000円以上なら
1000円引き,そうでないと
きは500円引きする」
これが,条件処理の基本
形になります。
これは,右の図のように図
式化すると分かり易くなり
ます。
これをフローチャートと言
います。
プログラムは,このように
各部の処理を図式化して
,これを組みあわせて作る
と作りやすくなります。
条件
真
処理1
1000円引き
10000円
以上
偽
処理2
500円引き
if文を使ったプログラム
条件
真
処理1
1000円引き
10000円
以上
if(
偽
処理2
条件
処理1
}
else{
処理2
500円引き
}
){
if文を使ったプログラム
ensyu28.c
#include <stdio.h>
int
main(void)
{
int teika;
printf(“定価= ”);
scanf("%d", &teika);
if(teika >= 10000) {
teika = teika – 1000;
}
else {
teika = teika - 500;
}
printf("代金=%d\n",teika);
return 0;
}
この部分ですね
if文を使ったプログラム
#include <stdio.h>
int
main(void)
{
int teika;
printf(“定価= ”);
scanf("%d", &teika);
if(teika >= 10000) {
teika = teika – 1000;
}
else {
teika = teika - 500;
}
printf("代金=%d\n",teika);
return 0;
}
条件の設定です。
「teikaが10000以上」
は,このように表現
します。
>=のように,二つの数値の
大小関係を判定する演算子
を「関係演算子」といいます
関係演算子と等価演算子

二つの値の大小関係を判定する演算子です。
関係演算子
演算子
>
>=
<
<=
説明
記述例
記述の意味
より大きい
if(a>100)
より大きいか等しい
if(a>=100) aが100以上なら
より小さい
if(a<100)
より小さいか等しい
if(a<=100) aが100以下なら
aが100より大きいなら
aが100未満なら
等価演算子
演算子
説明
記述例
記述の意味
==
等しい
if(a==100) aが100なら
!=
等しくない
if(a!=100)
aが100でないなら
if文を使ったプログラム
#include <stdio.h>
int
main(void)
{
int teika;
printf(“定価= ”);
scanf("%d", &teika);
if(teika >= 10000) {
teika = teika – 1000;
}
else {
teika = teika - 500;
}
printf("代金=%d\n",teika);
return 0;
}
条件が「真」(成り立つ)
場合の処理を記述します
この時,「どこからどこまで
を実行するのか」分かる
ように,{ }で囲みます。
もし{ }が無いと,1文だけ
が処理されます。つまり,
1文の処理なら{ }は必要
ありません。
if文を使ったプログラム
#include <stdio.h>
int
main(void)
{
int teika;
printf(“定価= ”);
scanf("%d", &teika);
if(teika >= 10000) {
teika = teika – 1000;
}
条件が「偽」(成り立たない)
else {
場合の処理も同様です
teika = teika - 500;
}
printf("代金=%d\n",teika);
return 0;
}
if文を使ったプログラム
#include <stdio.h>
int
main(void)
{
int teika;
printf(“定価= ”); scanf("%d", &teika);
今回のプログラムは,処理
if(teika >= 10000)
が各1文なので,{ }を省略
teika = teika – 1000; してこのようにも書けます
else
実行して確認しましょう。
teika = teika - 500;
printf("代金=%d\n",teika);
return 0;
}
重要:例え処理が1文であっても{ }で範囲を明確に
した方が間違いありません!
演習




先ほどの問題は,次のようにも考えられ
ます。
「定価が10000円未満であれば500円値
引きし,そうでなければ1000円値引きす
る。」
このプログラムを作ってみましょう。
ensyu29.cを完成して下さい。
正負に対応した四捨五入
実数aを入力


a>0
a=a+0.5;
– aが正の場合,0.5を
追加
– aが負の場合,0.5を
引く
a=a-0.5;
整数b=(int)a;
まず,実数aを入力し
ます。
if文を使い処理を分
岐します。

整数値に変換(小数
点以下を切り捨て)し
て整数値とする
if文を使ったプログラム

「偽」の場合の処理が不要なとき
条件
偽
if(
処理
真
処理
条件
}
){
if文を使ったプログラム




先ほどの問題をもう一度よく考えてみまし
ょう。
定価として300円を入力するとどうなりま
すか?
-200円,という答えになりますよね。
どうすればよいでしょう?
if文を使ったプログラム

次のように考えなおしましょう。
– 定価が10000円以上なら1000円引き
– そうでないとき(else)
定価が1000円以上なら500円引き
 そうでないとき(else)
 タダにする


フローチャートにすると分かり易くなりま
す。
if文を使ったプログラム
条件1
真
偽
定価が
10000円以上
処理1
条件2
真
1000円引き
定価が
1000円以上
偽
処理2
500円引き
処理3
タダ
if文を使ったプログラム
一見難しく見えますが。。。。
条件1
真
定価が
10000円以上
処理1
偽
このように考えれば,
既に学んだif文ですね
処理4
そして,処理4も
通常のif文なわけ
です。
条件2
真
1000円引き
定価が
1000円以上
偽
処理2
500円引き
処理3
タダ
つまり,2つのif
文を組みあわせ
ればいいんです
if文を使ったプログラム
まず,このように考えてみましょう。
if(
条件1
条件1
処理1
}
else{
処理1
処理4
処理4
}
){
if文を使ったプログラム
次に,このように考えてみましょう。
if(
条件1
条件1
処理1
処理4
}
else{
処理1
処理4
}
){
if文を使ったプログラム
要するに,処理4の所にもう一つif-elseが入ればいいんです。
if(
条件1
){
条件1
処理1
}
else{
条件2
if(
処理1
処理2
条件2
処理2
処理3
}
else{
処理3
}
}
){
if文を使ったプログラム
ensyu30.cがこのプログラムになります。確認しましょう。
#include <stdio.h>
int
main(void)
{
int teika;
printf("定価= "); scanf("%d", &teika);
if(teika >= 10000) {
teika = teika – 1000;
}
else {
if(teika>=1000){
teika = teika-500;
}
else{
teika=0;
}
}
printf("代金=%d\n",teika);
return 0;
}
if文を使ったプログラム
else if 文を使うと,このように書く事も出来ます。
#include <stdio.h>
int
main(void)
{
int teika;
printf("定価= "); scanf("%d", &teika);
if(teika >= 10000) {
teika = teika – 1000;
}
else if(teika>=1000){
teika = teika-500;
}
else{
teika=0;
}
printf("代金=%d\n",teika);
return 0;
}