printfとscanf

1データの表示と入力
1-1 プログラムの構成
/* 自己紹介を表示 */
#include <stdio.h>
main()
{
printf(“こんにちは。\n”);
printf(“私は小林浩です。\n”);
}
・/*
・・・
*/
実行結果(↓は改行を表すものとする)
こんにちは。↓
私は小林浩です。↓
コメント
/* */で囲まれた部分はプログラムの実行に関係なく、好きに記入する事が出来る。主にプロ
グラムの内容や処理の内容を書く説明文のようなもの。適度にコメントを入れる事で、プログ
ラムの内容が分りやすくなる。
o コメントは、複数行にわたって書く事が出来る。
/* ・・・・・・・・・・・・
・・・・・・・・・・・・・ */
o */の後に何か書くとエラーとなる。
/* ・・・・ */ and
は間違い。
o 文(後述)の後ろに書いてもよい。
printf(“and”);
/* 「and」と表示する */
問題 1-1
次のコメント文の書き方で間違っているのはどれか(一つとは限らない)。
A./* comment */
B./* /* comment */
C./* comment */ */
D./* /* comment */ */
E./ * comment * /
F./*************/
G./**/
H./* comment * / */
・#include <stdio.h>
とりあえずこれがないと始まらないという程度で。
・main()
「ここからが(メイン)プログラムの始まりですよ」という宣言。本などによっては「int
main(void)」と書く事もある(多分圧倒的に多い)がほぼ同じ意味(厳密に言うと違う)。
・{ }
括弧の間にプログラムを書く。
・printf(“こんにちは。\n”);
命令文
実行させる処理の内容。
特別な場合を除き、最後に「;」を付ける。
プログラムの実行は基本的に上から順に行われる。
1-2 printf(プリントエフ:f は format(書式)の意味)
データを表示させる関数。
命令文
printf(“print”);
実行結果
print
printf(“print\n);
print↓
printf(“print\nprint”);
print↓
print
print↓
↓
printf(“print\n\nprint”);
print
「\n」は改行を意味する。
命令文を書く時の注意:
・「printf(関数)」と「()」の間にスペースがあってもよい。
・命令文は続けてかける。
printf(“print\n”);printf(“print\n”);
ただしこういう書き方をすると見づらくなるので、適度に間を開けたり、長すぎる時は分け
て書いた方がよい。
・命令文の途中で改行してもかまわない。
print(
“printf\n”
)
こう書いても、エラーにならない。命令文が長くなる時には適当な位置で改行すると見やす
くなる。
*プログラムの見やすさについて
極論を言えばプログラムは正確に速く動けば何でもありである。しかし、後で機能の追加や
修正が生じたり、他人に見せる必要がある場合はどうだろう?
次の二つのプラグラムはまったく同じ動きをするが、見てすぐ内容が分るのはどちらであろ
うか。
#include<stdio.h>
main(){
int a;printf(“a の値を入力”);scanf(“%d”,a);printf(“%d の 2 倍は%d です。
\n”,a,a*2);
}
/* 入力した値の 2 倍を表示する */
#include<stdio.h>
main(){
int a;
/* a に整数を入力 */
printf(“a の値を入力”);
scanf(“%d”,a);
/* a の2倍の値を表示 */
printf(“%d の 2 倍は%d です。\n”, a, a*2);
}
このように適当にコメントを入れたり、改行をしたりする事により、プログラムが見やすく
なる。それよりエラー箇所の発見が早くなる等のメリットが生まれてくる。
問題 1-2
次のような表示を行うプログラムを作りなさい。ただし printf は 1 回のみ使う事。
1. 最
終
回
2.はじめまして。
私は小林浩です。
さようなら。
1-3 数値計算
基本的な演算子(計算のための記号)は次の通り。
+:足し算
-:引き算
*:かけ算
/:割り算
%:剰余。「a%b」で a を b で割った余りを求める。
手計算と同じで、*と/は+と-よりも優先順位が高い。%の優先順位は*、/と同じ。
3+4*5/2%3-4=3+(((4*5)/2)%3)-4=3+((20/2)%3)-4=3+(10%3)-4=3+1-4=0
1-4 C 言語で扱う数値の型
C で扱える主な数値の型は次の通り。
整数型:小数点の付かない数値
浮動小数点型(単精度):小数点の付く数値
浮動小数点型(倍精度):単精度よりも、扱える数値の範囲が大きい。
*2.0 と書くと感覚的には整数だが、小数点が付くので浮動小数点型として扱われる。
1-5 書式付き printf
/* 二数の和を表示 */
#include <stdio.h>
main()
{
printf(“%d”, 42 + 4);
}
実行結果
46
「%d」の部分が書式である。これは、
「%d」の部分に「42+4」の結果を代入する事を意味する。
主な書式の種類は次の通り。
%d:10 進数の整数型数値
%f:浮動小数点型数値(単精度、倍精度とも)
%o(オー):10 進数の整数型数値を 8 進数に直して表示。
%x または%X:10 進数の整数型数値を 16 進数に直して表示
%s:文字列を表示
d やfを変換指定子と呼ぶ。
・書式は文字列リテラル(“”で囲まれ文字の並び)の中に入れる事も出来る。
/* 二数の和を表示 */
#include <stdio.h>
main()
{
printf(“42+4 は%d です。
”, 42 + 4);
}
実行結果
42+4 は 46 です。
・書式はいくつも使う事が出来る。
/* 二数の和を表示 */
#include <stdio.h>
main()
{
printf(“%d+%d=%d”, 42, 2, 42 + 4);
}
実行結果
42+2=46
この場合、書式の順番と値の順番が一致することになる。
printf(“%d+%d=%d”, 42, 2, 42 + 4)
書式と値の数(個数)が合わない時の処理
書式の数<値の数:余った値は無視
書式の数>値の数:数値の場合は 0,文字列の場合は null が代入される
・書式と値の型は一致しなくてはならない。
合わなかった時の動作は保証されない。
問題 1-3
実行結果を参考に計算結果を表示するプログラムを書式を使って作りなさい。
なお、数字は何でもかまわない。
1.実行結果:13-20=-7
2.実行結果:13×3=39
3.実行結果:30-4×6=6
・書式で表示形式を指定する事が出来る
%(フラグ)(最小フィ-ルド幅).(精度)(変換修飾子)(変換指定子)
printf(“%5d”, 34);
␣␣␣34
printf(“%6.2f”, 3.446);
␣␣3.45
指定桁で四捨五入される。小数点も一文字としてカウント。
printf(“%6.4f”, 3.446);
3.4460
足りない分は 0 が補われる。
*数値演算についての補足
異なる型同士の演算が行われると精度の高い方の型にあわされる。
(整数型)+(浮動小数点型)=(浮動小数点型)
#include <stdio.h>
main()
{
printf(“%.2f”, 2, 3.5);
}
実行結果
7.00
実行結果を参考に計算結果を表示するプログラムを作りなさい。
なお、数字は何でもかまわない。
1.実行結果:13+5=␣␣18
2.実行結果:13×0.3=␣0.3900
3.実行結果:2.3-4.5=␣␣-2.20
問題 1-4
問題 1-5
次の計算結果がどうなるか。プログラムを組まずに考えなさい。
1.3*4/5
2.3*4/5.0
3.3*4.0/5
4.3.0+4/5
5.3.0*4/5
6.3/4/5
7.3.0/4/5
8.3/4.0/5
9.3/4/5.0
10.3.0/(4/5)
1-6 変数
変数とはデータを納めるための箱のようなものである。
変数は使う前に型宣言をしなければ行けない。
int a;
これは「a を int 型として使う」という宣言文である。
型名:int
float
double
整数型
単精度の浮動小数点型
倍精度の浮動小数点型
・変数は使う前にデータが代入されていなくてはならない。
宣言しただけでは変数には何も入っていない(0 すらもはいっていない)。
#include <stdio.h>
main()
{
int a;
printf(“%d”, a);
左のプログラムは実行時エラーとなる。
}
変数の代入は右のように行われる。
変数=値
これは次のように読み替える事が出来る。
変数←値
値の部分は定数でも、式でもよい。
a=15
a=3+15
・全ての変数はプログラムの最初で宣言されなくてはならない。
#include <stdio.h>
左の b のようにプログラムの途中で型宣言するとコンパ
main()
{
int a;
a = 15;
printf(“%d”, a);
int b;
イル時エラーになる。
b = 5;
printf(“%d”, b);
}
・同じ型であれば、続けて宣言できる。また、宣言しただけで使わない変数があっても、警告
はされるかもしれないがエラーにはならない(実行はする)。
#include <stdio.h>
main()
左のプログラムでは変数 c が使われていないが、問題
なく動く。
{
int a, b, c;
a = 15;
printf(“%d”, a);
b = 5;
printf(“%d”, b);
}
・宣言と同時に変数への代入が出来る。また、同じ型であれば続けて宣言&代入が出来る。
#include <stdio.h>
main()
{
int a = 2;
int b = 2, c =
printf(“%d”,
printf(“%d”,
printf(“%d”,
3;
a);
b);
c);
}
・変数同士で演算が出来る。
#include <stdio.h>
main()
変数も定数同様、演算が出来る。その時の規則は定数
と同じ。
{
左のプログラムでは c に a+b つまり 7 が代入される。
int a, b, c;
a = 2;
b = 5;
c = a + b;
printf(“%d”, c);
}
・変数の名前のつけ方に関する規則。
変数名に使える文字はアルファベット(大小文字)と数字、”_(アンダーバー)”である。た
だし、名前の最初に数字は使えない。また”_”で始まる名前や、大文字一文字の名前は PC で
特別な使い方をしている場合があるので使わない方がよい。
*これは慣用的なものだが、変数の一文字目は小文字で始める事が多い。
正) abc, ab_cd, AbCd, a123, F123_a,・・・
誤) 12a, $26, ・・・
間違いと言い切れないが避けた方が良いもの) A, x, _pot, ・・・
名前は、面倒でなければ変数の内容を表すものの方が、後で見直すと気楽である。
学籍番号:number テストの得点:point 名前:name など
・キーワード(予約語)
プログラミング言語で特別に使われる語句をキーワードもしくは予約語と呼び、これらを変
数等に使う事は出来ない。
C 言語における予約語は次の通り(ただし、他の語句が予約語になっている場合もある)
auto
default
break
do
case
double
char
else
const
enum
continue
extern
float
register
volatile
for
switch
while
goto
typedef
if
union
int
unsigned
long
void
また予約語ではないが、printf などの関数も使うべきではない。
ただし、予約語でも if_not のように字を付け加えたり、一部を大文字にしたりすれば変
数名として使える。
問題 1-6
次の中で変数名として誤っているものをすべて選びなさい。
A.NO7
G.val$
B. BIGDiamond_Stone
H.large-Number32
C.22_largeNumber
D.register
E.switchOff
F.foryou
I.For
J.#value
K.total_123
L.large_seize_integural_cirsuit_unit_number
問題 1-7
実行結果を参考に四角の中に適当な語を入れて、プログラムを完成させなさい。た
だし、入るのは 1 語とは限らない。
/* 球の表面積と体積を求めて表示する a.
#b.
<stdio.h>
c.
{
d.
r = 3.5, pi = 3.14;
double area, volume;
area = e.
;
volume = f.
;
printf(g.
printf(h.
printf(i.
/* r = 球の半径 pi = 円周率 */
/* area = 表面積 volume = 体積 */
/* 表面積=4×π×(半径の 2 乗)*/
/* 体積=(4/3)×π×(半径の 3 乗) */
);
);
);
}
実行結果:
半径␣␣3.5 の球は
表面積:␣␣153.860
体 積:␣␣179.503
1-7 scanf(スキャンエフ)
データの入力には
ようにする。
scanf 関数を使う。例えば、整数型の変数 num に値を入力したい時は次の
scanf(“%d”, &num);
printf と似ているが、いくつか違いがある。
・””の中は%と変換指定子のみ。
・変数名の前に&を付ける。
・浮動小数点型の変換指定子は、float 型は f、double 型は lf(エルエフ)を用いる。
また、printf では一文で複数の変数を表示する事が出来た。scanf でもできない事はないが、
入力する時に値の間をスペースで区切らなければいけないので何かと不便である。一変数一
scanf にした方がよいだろう。
#include <stdio.h>
main()
{
int num;
float fl;
double db;
printf(“整数を入力して下さい:”);
printf(“実数を入力して下さい:”);
printf(“実数を入力して下さい:”);
printf(“num = %d\n”, num);
printf(“fl = %f.2\n”, fl);
scanf(“%d”, &num);
scanf(“%f”, &fl);
scanf(“%lf”, &db);
printf(“db = %f.2\n”, db);
}
実行結果
整数を入力して下さい:120
実数を入力して下さい:34.575
実数を入力して下さい:1234.567
num = 120
fl = 34.58
db = 1234.57
問題 1-8
1.英語、数学、国語のテストの得点(100 点満点)を入力して、その合計点と平
均点を表示するプログラムを作りなさい。
表示の際、各科目の得点を改めて表示するようにしなさい。
2.次のプログラムには何ヶ所か間違いがあるため、正しく動かない。正しく動く
ようにプログラムに直しなさい。
/* 税抜き価格から税額と税込み価格を求める(税額は円以下切り捨て)
include <stadio.h>
main
int price, tax, sale /* price=税抜き価格 tax=税額 sale=税込み価格 */
int tax_rate=0.05; /* 税率 5% *///
printf(“税抜き価格:”, price); scanf(“%4d”, price);
tax = price * tax_rate; Sale = price + tax;
printf(“消費税は%D 円です。\n”,tax);
printf(“税込み価格は%5.1f 円です。%n”, sale);
練習問題解答
1-1
C、D、E
C、D はいずれも*/の後に文字がある。E は*と/の間が離れていて、コメント文として成
立していない。B の二つ目の/*はコメントの一部と見なされ、H は*と/の間が離れている
ので OK。
1-2
1.
#include <stdio.h>
main()
{
printf(“最\n 終\n 回\n”);
}
2.
#include <stdio.h>
main()
{
printf(“はじめまして。\n 私は小林浩です。\n\n さようなら。\n”);
}
1-3
1.printf(“%d-%d=%d\n”, 13, 20, 13 - 20);
2.printf(“%d×%d=%d\n”, 13, 3, 13 * 20);
3.printf(“%d-%d×%d=%d\n”, 30, 4, 6, 30 – 4 * 6);
1-4
1.printf(“%d+%d=%4d”, 13, 5, 13 + 5);
2.printf(“%d×%f=%7.4f”, 13, 0.3, 13 * 0.3);
3.printf(“%.1f-%.1f=%7.2f”, 2.3, 4.5, 2.3 – 4.5);
1-5
① 2
② 2.4
3*4=12:12/5=2.4 だが 0.4 は切り捨てられる
12/5.0 は、精度の高い方にあわされる
③
④
⑤
⑥
⑦
⑧
3*4.0 の段階で浮動小数点型となる
4/5=0
2.4
3.0
2.4
0
0.15
0.15
3/4=0
3.0/4=0.75 : 0.75/5=0.15
⑨ 0.0
⑩ 実行時エラー
4/5=0:3.0/0 となり、0 で割っているというエラーになる。
* 実行時エラーとは、文法的には間違いではないが、実行したらおかしな事になって
いたというエラー。コンパイルエラーは主に文法エラー。
1-6
C、D、G、H、J
C は最初に数字。D は予約語。G は$、J は#の使えない文字が入っている。
E、F は予約語が入っているが、別の文字が付いているので OK。
I も予約語だが、大文字が混じっているので OK。
1-7
/* 球の表面積と体積を求めて表示する */
#include <stdio.h>
main ()
{
double
double
area =
volume
r = 3.5, pi = 3.14
/* r = 球の半径 pi = 円周率 */
area, volume;
/* area = 表面積 volume = 体積 */
4 * pi * r * r; /* 表面積=4×π×(半径の 2 乗)*/
= 4 * pi * r * r * r / 3;
/* 体積=(4/3)×π×(半径の 3 乗) */
printf(“半径%5.1f の球は”, r\n);
printf(“表面積:%9.3f\n”, area);
printf(“体 積:%9.3f\n”, volume);
}
*体積を求める時に先に 4/3 とすると、整数型同士の計算なので 1 となってしまう。こ
れを避けるために解答のような書き方をしたが、これが気持ち悪いという時は 4.0/3.0
と書くのも一つの方法。
1-8
1.
#include <stdio.h>
main()
{
int eng, math, kokugo;
/* eng=英語
math=数学
int total;
/* total=3 教科の合計 */
double ave;
/* 平均は小数点以下まで出したいので */
/* 各教科の得点の入力 */
printf(“英語:”);
scanf(“%d”, &eng);
printf(“数学:”);
scanf(“%d”, &math);
printf(“国語:”);
scanf(“%d”, &kokugo);
total = eng + math + kokugo;
kokugo=国語 */
ave = total / 3.0;
/* 3 で割ると ave が整数型になるので、3.0 とした */
printf(“英語=%3d:数学=%3d:国語=%3d\n”, eng, math, kokugo);
printf(“合計=%3d:平均=%5.1f”, total, ave);
}
2.
1 行目:コメントの最後の*/がぬけている。
2 行目:include の前の#が抜けている。
3 行目:main の後の()が抜けている。
3~4 行の間:{が抜けている。
4 行目:命令文の後の;が抜けている。
5 行目:浮動小数点型を代入しているのに、型宣言は int(整数型)。
6 行目:scanf で%4d と 4 が余計。
7 行目:sale が Sale になっている(大文字と小文字は別物)。
8 行目:%D に D が大文字。
9 行目:整数型の sale を浮動小数点型で書式設定している。
最後:}が抜けている。