型と 色々 前回の復習 最初の C 言語 include lt stdioh gt int mainvoid printf Hello Worldn return 0 上のプログラムを実行する このセットを ID: 810993
Download The PPT/PDF document "3. プログラミング応用" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
3.プログラミング応用
型と
色々
Slide2前回の復習
Slide3最初のC言語
#include <
stdio.h
>
int main(void){ printf("Hello World!\n"); return 0;}
上のプログラムを実行する
Slide4このセットを
必ず覚える
こと!
#include <
stdio.h>int main(void) { return 0;
}
…
プログラムを書く
Slide5変数の宣言
Slide6varの代わりに変数で使うもの
char
1
文字
int整数long整数float実数double実数c
har
を
配列
にすることで文字列にすることができる
Slide7printf()
printf
()
は黒い画面
(コマンドプロンプト)に文字を表示する命令です。「“(ダブルクォーテーション)」で囲まれた文字列を表示します。その中で\nは改行を意味します。これらの特殊文字はJavaScriptの場合と同じです。\n改行\tタブ\\文字としての
¥
\?
文字としての
?
\”ダブルクォーテーション\’
シングルクォーテーション
%%
文字としての
%
Slide8%d
は
整数
の変数を表示する場合に使用します。後ろにある「
,コンマ」の変数や数値を文字列に変換して黒い画面(コマンドプロンプト)に表示します。printf("%dは%dより大きい\n
"
, 3, 2);
小数の変数は
%f
となります
Slide9printfを変える
#include <
stdio.h
>
int main(void){ printf("1+1=%dです\n", 2);
return 0;
}
Slide10printfで計算させる
#include <
stdio.h
>
int main(void){ printf("1+1=%dです\n"
,
1+1
);
return 0;
}
引数の値が
%d
に表示される
Slide11scanf_s()
scanf_s
()
は
キーボードの入力を受け取る命令です。「“(ダブルクォーテーション)」で囲まれた型でアドレスとしてデータを受け取ります。
Slide12%d
は
整数
を意味し、キーボードから入力された整数が変数として代入されます。
int hensu;scanf_s("%d",
&
hensu
);
小数の変数は
%f
となります
受け取るデータが
数値
のとき
入力された値が
hensu
に入る
&
が入ることに気を付ける
Slide13scanf
と
scanf_s
との違い
scanfはC++で禁止されているこの授業ではC++上でC言語を実行しているすなわち、scanfは使えないその代わりscanf_sを使う文字列をキーボードから入力するときだけ気を付ける!
Slide14実行してみる
#include <
stdio.h
>
int main(void){ char str[128]; printf("文字列を入力してください\n"); scanf_s("%s", str, 128);
printf
("
入力された文字列は
%s です。\n", str);
return 0;
}
scanf_s
("%s", str, 128);
文字列は
&
がつかない
配列
の個数
Slide15どうしてもscanf
を使いたいとき
#define _CRT_SECURE_NO_WARNINGS
#include <
stdio.h>int main(void){ char str[128]; printf("文字列を入力してください\n");
scanf
("%s", str);
printf("
入力された文字列は
%s
です。
\n", str);
return 0;
}
追加
変更
Slide16C言語の四則演算
計算の基本は
,
四則演算と剰余算
.足し算と引き算は「+」「-」.掛け算と割り算には「*」と「/」.剰余算には「%」.Java Scriptと同じ
Slide17#include <
stdio.h
>
int
main(void){ printf("10 + 3 = %d\n", 10 + 3); printf("10 - 3 = %d\n", 10 - 3); printf("10 * 3 = %d\n", 10 * 3); printf
("10 / 3 = %d\n", 10 / 3);
printf
("10
mod 3 = %d\n", 10 % 3); return 0;
}
上のプログラムを実行する
練習問題①
整数の変数
a=123
と実数の変数
b=0.456を加算した結果a+bをprintfで表示しなさい。実数として表示させること。
Slide19解答例
#include <
stdio.h
>
int
main(void){
int
a
= 123
;
double b = 0.345;
printf("%
.5f
\n",
a+b
);
return 0;
}
Slide20練習問題②
身長
h(m)
と体重
w(kg)を変数に代入して、BMIと肥満度f(%)を計算し、身長、体重、BMIそして肥満度を表示する。BMI = w ÷ h2sd = 22 × h2f = (w - sd) ÷ sd ×100
Slide21#include <
stdio.h
>
int
main(void) {
double h = 1.7;
double w = 65.0;
double BMI = w / (h * h);
double
sd = 22 * h * h;
double f = ((w -
sd
) /
sd
) * 100;
printf
("%f m, %
fkg
\n", h, w);
printf
("BMI = %f \n", BMI); printf("肥満度 = %f \n", f); return 0;}解答例
Slide22復習はここまで
Slide23p
rintf
をさらに詳しく
出力とは
Slide24printfの書式指定
書式指定
意味
例
%d整数(小数のついていない数)1, 2, 3,-45%f実数(小数のついている数)0.1, 1.0,2.2%c
1
文
字
('
で囲まれた半角文字1個)'a', 'A'
%s
文字列
(
"
で囲まれた文字)
"A", "ABC",
"
あ
"
Slide25実行してみる①
#include <
stdio.h
>
int main(void){ printf("%d - %dは%dです \n", 3, 2, 3-2); return 0;}
Slide26実行してみる②
#include <
stdio.h
>
int main(void){ printf("%s %c %f \n", "6 / 5", '=', 1.2); return 0;}
Slide27よくやる間違い
printf
("1+1=%d
です
\n", 2);printf("1+1=%dです \n"2);printf("%f", 2);printf
(
"%c", "
abc
"
);Printf
(
"%s", 'a'
);
Slide28型とは、変数のカタチ
Slide29変数
C
言語の変数を詳しく説明します
Slide30変数には入れること
のできる
データの大きさが
i
ntやdoubleによって全然違ってくる!
Slide31整数型
型の名前
入る値の範囲
サイズ
(ビット数)intシステムによる-unsigned int
システムによる
-
long
-2147483648
~
2147483647
32(64)
unsined
long
0
~
4294967295
32(64)
short
-32768
~
32767
16
unsined short
0~6553516char-128~1278
unsined
char
0
~
255
8
Slide32実数型
型の名前
入る値の範囲
サイズ
(ビット数)float-3.4×1038~3.4×103832
double
-1.7×10
308
~
1.7×10
308
64
Slide33実行してみる①
#include <
stdio.h
>
int main(void){ char a = 'X'; int b = 10, c = 100; double d = 1.1; printf("%c, %d, %d, %f \n", a, b, c, d); return 0;}
Slide34実行してみる②
#include <
stdio.h
>
int main(void){ unsigned char age = 25; double height = 166.7; float weight = 58.5; printf("年齢: %d歳\n", age);
printf
("
身長:
%fcm\n", height);
printf
("
体重:
%
fkg
\n", weight);
return 0;
}
Slide35printfがややこしい!
printf
%d
%f%s1280.9
"ABC"
とりあえずは
%d
、
%f
、
%s
を覚えておく!
Slide36printfはさらにややこしい!
#include <
stdio.h
>
int
main(void){
double
hoge
= 12345.12345;
printf
("
小数
4
桁:
%.4f
\n",
hoge
);
printf
("全体10桁と小数2桁: %10.2f \n", hoge); printf("0が追加される: %010.2f
\n", hoge);
printf("小数点以下倍精度: %lf \n", hoge); return 0;}実行してみよう
Slide37printfの表示桁指定
printf
% 全体の桁数 . 小数の桁数 d, fなど0を入れると0が追加される
%lf
は
%f
の2倍の小数表現ができる
Slide38整数(
int
)型とは
0
1
1
0
0
1
0
0
2
7
2
6
2
5
2
4
2
3
2
2
2
12012864
32
16
8
4
2
1
パソコンのメモリ上
64
32
4
100
i
nt
a = 100;
Slide39浮動小数点(float)型とは
正負
小数の桁数
(指数部)
各桁の数値(仮数部)パソコンのメモリ上全体で32bit 、 64bit
-5
256
2.56×10
-5
float
a = 0.0000256;
Slide40固定小数点だと
1
0
0
00000.
0
a
=
0
.
0
0
0
0
0
0
0
1
b=
固定
a
+ b
をしたとき
bit
サイズによって桁落ちするbitサイズ
Slide41文字列とは配列
Slide42文字型(1文字のとき)
文字は
0〜127
の番号の
ASCIIコードで表すcharは-128〜127の整数だが、C言語では文字と文字コード( 0〜127)を同等とみなす'A'は数値の65と同じである
Slide43Slide44実行してみる①
#include <
stdio.h
>
int main(void){ char a = 'A'; printf("%d \n", a); printf("%c \n", a); return 0;}
Slide45実行してみる②
#include <
stdio.h
>
int main(void){ int i = 72; printf("%d \n", i); printf("%c \n", i); return 0;}
Slide46よくやる間違い
char a = 'ABC';
char a = "ABC";
char a = "
あ";
Slide47文字列(複数文字のとき)
文字列は文字の集まり、
配列
で表す
ダブルクォート " は文字列、シングルクォート 'は1文字を表すchar s[6]の配列で5文字を表すことができる
Slide48実行してみる①
#include <
stdio.h
>
int main(void){ char m[6] = "Hello"; printf("%c%c%c%c%c \n", m[0], m[1], m[2], m[3], m[4]); printf("%c \n", m[3]); printf("%s \n", m);
return 0;
}
Slide49実行してみる②
#include <
stdio.h
>
int main(void){ char str1[] = "Fukui"; char str2[] = "National"; char str3[] = "College"; char str4[] = "of Technology"; printf("%s %s %s %s \n", str1, str2, str3, str4); return 0;}
Slide50文字列は配列
c
har m[6] = "Hello";
‘\0’
NULL文字
Slide51日本語は気をつける!
#include <
stdio.h
>
int
main(void){
char a[3] = "
あ
";
char m[11] = "こんにちは
";
printf
("%s \n", a);
printf
("%s \n", m);
return 0;
}
日本語は全角(
2
バイト)なので、配列の個数は
2倍になる
Slide52よく間違える、文字の代入
c
har a = 'A';
a = 'B';
printf("%c ¥n", a);char a[6] = "Hello";a = "Good!";printf("%s ¥n", a);文字列をそのまま代入することはできない
Slide53実行してみる①(strcpy_s
)
#include <
stdio.h
>
#include <
string.h
>
int
main(void){
char m[
10
] = "Hello";
printf
("%s \n", m);
strcpy_s
(m, 10, "Good bye!");
printf
("%s \n", m);
return 0;}strcpy()を使うためのヘッダファイル文字列を代入するための関数
‘\0’ もコピーするので文字列a はその分も考えて大きさを宣言すること
Slide54実行してみる②(memcpy
)
#include <
stdio.h
>
#include <
string.h
>
int
main(void){
char m[
10
] = "Hello";
printf
("%s \n", m);
memcpy
(m, "Good bye!", 10);
printf
("%s \n", m);
return 0;}memcpy()を使うためのヘッダファイルメモリをコピーするための関数
第3引数のバイト数だけのすべての配列をコピーする
Slide55strcpy
_s
の
’\0’
#include <
stdio.h
>
#include <
string.h
>int main(void) { char a[10] = "
abc
\0
def";
char b[10] = "123
\0
456";
strcpy_s
(a, 10, b);
for(int
i = 0; i < 10; i++) printf("%c", a[i]); return 0;
}
‘\0’NULL文字
Slide56memcpyの
’\0’
#include <
stdio.h
>
#include <
string.h
>
int main(void) {
char a[10] = "
abc
\0
def";
char b[10] = "123
\0
456";
memcpy
(a, b, 10);
for(int
i = 0; i < 10; i++) printf("%c", a[i]); return 0;
}
‘\0’NULL文字
Slide57どちらも配列をコピーしている
"
abc
\0 def""123 \0 456"a
b
"123
\0
"
"123
\0
456"
a
b
s
trcpy_s
"
abc
\0
def"
"123
\0
456"
ab"123 \0 456""123
\0
456"
a
b
memcpy
\0
まで
指定した個数
すべて
Slide58s
trcpy_s
と
memcpy
どちらを使っても良い‘\0’をどうするかで判断すること
Slide59s
trcpy
もあるが
MS
が推奨していないstrcpy_sを使うこと#define _CRT_SECURE_NO_WARNINGSがあれば使える
Slide60文字列は配列
c
har m[6] = "Hello";
‘\0’
NULL文字何もしなくても文字列を代入すれば’\0’はつく!
Slide61C
言語でいう
s
ize
とは
Slide62bit と byte
(
sizeof
演算子)
10101010
8
ビット=
1
バイト
1
ビット
sizeof
演算子
を使うと、
バイト数
がわかる
Slide63実行してみる
#include <
stdio.h
>
int main(void){ char ch[20]; int data[20]; printf("char のサイズ : %d\n",
sizeof
(char));
printf
("int
のサイズ
: %d\n",
sizeof
(
int
));
printf
("
配列
ch
のサイズ : %d\n", sizeof(ch)); printf("配列 data のサイズ : %d\n", sizeof(data));
return 0;}
Slide64型の変換
<
誤>
3
÷2の結果を求める<正>3÷2の結果を求める3(整数) / 2(整数) 答え↓ 1(
整数
で小数の切り捨て)
3.0
(
実数) / 2.0(実数) 答え↓
1.5
(
実数
)
正確な計算をするためには
型を統一しなければならない
Slide65実行してみる
#include <
stdio.h
>
int main(void){ printf(" 3÷2= %d\n", 3 / 2); printf(" 3÷
2=
%d\n", 3.0 / 2.0);
printf
(" 3÷
2=
%d\n", 3.0 / 2);
printf
("
3
÷
2=
%d\n", 3 / 2.0);
return 0;
}
警告文をなくすためにはどうしたらいい?
Slide66暗黙の変換
異なる型が現れたときは、
精度の高い型に統一される
Slide67m
emcpy
のバイトサイズ
Slide68memcpyでの
バイトサイズ
#include <
stdio.h
>
#include <
string.h
>
int
main(void){
char
m[
10
] = "Hello";
printf
("%s \n", m);
memcpy
(m, "Good bye!",
10
); printf("%s \n", m); return 0;}バイトのサイズを入れなければならない
charは1バイト
intだった場合、システムによってバイトサイズが変わってくる配列の個数でいい
Slide69int
だった
とき
#include <
stdio.h
>
#include <
string.h
>
int main(void) {
int
m[10] = {11,12,13,14,15,16,17,18,19,20};
int
n[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
memcpy
(m, n,
10 *
sizeof
(int)
); for (int i = 0; i < 10; i++) printf("%d", m[
i]); return 0;}
strcpy_sは文字列専用の関数で、char型でしか使えないシステムに関係なくmemcpyが使える
Slide70結局m
emcpy
がやっていること
#include <
stdio.h
>
#include <
string.h
>
int main(void) {
int m[10] = { 11,12,13,14,15,16,17,18,19,20 };
int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int
i
= 0;
i
< 10;
i
++)
m[
i
] = n[i]; for (int i = 0; i < 10; i++)
printf("%d", m[i]);
return 0;}memcpy
Slide71キャスト
Slide72実行してみる①
#include <
stdio.h
>
int main(void){ int i = 5; long l = 5; double d = 23.6; double kekka;
kekka
=
i
* l + d; printf
("%
lf
\n",
kekka
);
return 0;
}
Slide73実行してみる②
#include <
stdio.h
>
int main(void){ unsigned char a = 1000; unsigned char b = -3; printf("%d \n", a); printf("%d \n", b); return 0;}
Slide74キャスト演算子(明示的変換)
int
float
1
1.0(float)
型キャスト
Slide75実行してみる①
#include <
stdio.h
>
int main(void){ int a = 3; int b = 2; float f; f = (float) a / b;
printf
("
3
÷
2= %f\n", f); return 0;
}
Slide76実行してみる②
#include <
stdio.h
>
int main(void){ printf("3÷2= %f\n", 3 / (float)2); return 0;}
Slide77演算子の優先順位
Slide78実行してみる
#include <
stdio.h
>
int main(void){ printf("2×8-6÷2= %d\n", 2 * 8 - 6 /2); printf("
2
×
(8-6)
÷
2= %d\n", 2 * (8 - 6) / 2);
printf
("
1-2+3=
%d\n", 1 - 2 + 3);
printf
("
1ー(2+3)=
%d\n", 1 - (2 + 3));
return 0;
}
Slide79複雑な式になって優先順位がわからなかったら…
適度な位置に
( )
を使う!
Slide80型の再定義
Slide81実行してみる
#include <
stdio.h
>
int main(void) { typedef unsigned char u_char; u_char c; c = 100; printf("%d \n", c);
return 0;
}
Slide82型の名前を変更する
型の名前は「
unsigned char
」などを組み合わせると、長くなる。そんなとき
typedefを使うと、任意の名前を付けることができるtypedef unsigned char u_char既存の型名
新しい
型名
自由に名前を付けなおせる
Slide83マクロ(
値を定義
)
#
から始まる命令文#define
Slide84不変の値、定数①(
#define
)
#include <
stdio.h
>
#define PI 3.14
int
main(void) {
int
r = 5;
printf
("%f \n", r * r *
PI
);
return 0;
}
main.c
3.14
に置き換わる
Slide85不変の値、定数②(
#define
)
#include <
stdio.h
>
#define PI 3.14
int
main(void) {
int
r = 5;
PI = 3;
printf
("%f \n", r * r * PI);
return 0;
}
main.c
エラーになる
Slide86#defineの書き方
#define LOOPNUM 10
スペース
セミコロンは
いらない
大文字
セミコロン自体が値になってしまう
Slide87不変の変数enum
(定数)①
#include <
stdio.h
>
enum
{
aiu
,
eo
,
kakiku
,
keko
};
int
main(void) {
printf("%d, %d \n", aiu, eo); printf("%d, %d \n", kakiku
, keko); return 0;
}0,1,2…と定数が代入される
Slide88不変の変数enum
(定数)②
#include <
stdio.h
>
enum
{
aiu
,
eo
= 5,
kakiku
,
keko
= 6
};
int
main(void) {
printf("%d, %d \n", aiu, eo); printf("%d, %d \n", kakiku
, keko); return 0;
}別の定数に代入することもできる
Slide89マクロ
(関数の詳細は次々回くらいになる)
#
から始まる命令文
#defineする簡易関数
Slide90簡易関数①(#define
)
#include <
stdio.h
>
#define
HIKU(
x,y
) ((x) - (y))
int
main(void) {
printf
("%d \n",
HIKU(5,3)
);
return 0;
}
main.c
実行してみよう!
Slide91簡易関数②(#define
)
#include <
stdio.h
>
#define
HIKU(
x,y
) ((x) - (y))
int
main(void) {
printf
("%d \n",
HIKU(5+2,1+3)
);
return 0;
}
main.c
実行してみよう!
Slide92簡易関数③(#define
)
#include <
stdio.h
>
#define
HIKU(
x,y
) (x - y)
int
main(void) {
printf
("%d \n",
HIKU(5+2,1+3)
);
return 0;
}
main.c
違いを確認しよう!
Slide93簡易関数④(#define
)
#include <
stdio.h
>
#define PRINTM(X)
printf
("%d\n", X)
int
main(void) {
PRINTM(10);
return 0;
}
main.c
実行してみよう!
Slide94今週はここまで何か質問はありませんか?
Slide95とりあえず、実験や数値計算で
やりそうなことは、
網羅したはず
…