課題 1: 様々な型の sizeofを表示

#03 の解答例
展開プログラム言語/演習
http://kujiraiken.sit.ac.jp/lecture.html
課題 1: 様々な型の sizeofを表示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
/* 各 型 の sizeof を表示する */
void hyouji_sizeof_kaku_kata(void)
{
printf("int 型は
%u バイト Yn",
printf("unsigned int 型は
%u バイト Yn",
printf("short int 型は
%u バイト Yn",
printf("unsigned short ing 型は %u バイト Yn",
printf("signed short int 型は %u バイト Yn",
printf("long int 型は
%u バイト Yn",
printf("unsigned long int 型は %u バイト Yn",
printf("signed long int 型は
%u バイト Yn",
printf("float 型は
%u バイト Yn",
printf("double型は
%u バイト Yn",
printf("long double型は
%u バイト Yn",
printf("char 型は
%u バイト Yn",
printf("unsigned char 型は
%u バイト Yn",
printf("signed char 型は
%u バイト Yn",
}
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
(unsigned
int)sizeof(int)
int)sizeof(unsigned int)
int)sizeof(short int)
int)sizeof(unsigned short int)
int)sizeof(signed short int)
int)sizeof(long int)
int)sizeof(unsigned long int)
int)sizeof(signed long int)
int)sizeof(float)
int)sizeof(double)
int)sizeof(long double)
int)sizeof(char)
int)sizeof(unsigned char)
int)sizeof(signed char)
);
);
);
);
);
);
);
);
);
);
);
);
);
);
/* エ ン ト リ ポ イ ン ト */
int main(void)
{
hyouji_sizeof_kaku_kata();
return 0;
}
• この課題は比較的簡単だと思います。
なお,この解答例では,あえて題意に関する部分を独立した関数に分離し,そちらで表示するように
しました。このように,main() 関数に何でも書いてしまうのはできるだけ避けて,いつでも関数を作
るように心がけましょう。これからの解答例もなるべくそのような構成で示します。
1 / 4
#03 の解答例
課題 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
展開プログラム言語/演習
http://kujiraiken.sit.ac.jp/lecture.html
typedefを使って binary_OR()関数を作る
#include <stdio.h>
typedef int BOOL;
/* 2 値 の OR 演算 */
BOOL binary_OR(BOOL in1, BOOL in2)
{
BOOL out;
if
(in1
out = 0;
}
else if(in1
out = 1;
}
else if(in1
out = 1;
}
else if(in1
out = 1;
}
== 0 && in2 == 0){
== 0 && in2 == 1){
== 1 && in2 == 0){
== 1 && in2 == 1){
return(out);
}
/* binary_OR() 関 数 を テ ス ト す る */
void test_binary_OR(void)
{
BOOL in_a;
BOOL in_b;
BOOL out;
in_a = 0; in_b = 0;
out = binary_OR(in_a, in_b);
printf("%d と %d の OR は %dYn", in_a, in_b, out);
in_a = 0; in_b = 1;
out = binary_OR(in_a, in_b);
printf("%d と %d の OR は %dYn", in_a, in_b, out);
in_a = 1; in_b = 0;
out = binary_OR(in_a, in_b);
printf("%d と %d の OR は %dYn", in_a, in_b, out);
in_a = 1; in_b = 1;
out = binary_OR(in_a, in_b);
printf("%d と %d の OR は %dYn", in_a, in_b, out);
}
/* エ ン ト リ ポ イ ン ト */
int main(void)
{
test_binary_OR();
return 0;
}
•
35
行めなどで,in_aと in_bを実引数として binary_OR()関数に渡していますが,6 行めを見ると仮
引数 in1と in2はともに BOOL型なので,実引数 in_aと in_bも BOOL型じゃないといけないわけです。
なので,29∼30 行めでもそのように宣言しています。
返却値の型についても同様です。
•
35
行めなどで,in_a, in_b, outの値を printf()していますが,このとき,
「BOOL型の書式指定子は
何を使えば良いの?」という疑問が沸くかもしれません。
これについては,BOOL型は int型の単なるあだ名なのだ,ということを思い出せば,int型用の「%d」
で良いことがわかります。
2 / 4
#03 の解答例
課題 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
展開プログラム言語/演習
http://kujiraiken.sit.ac.jp/lecture.html
enumで飛行機の座席を表現し,それを仮引数の型にする
#include <stdio.h>
#include <stdlib.h> /* for exit() */
/* 座 席 の グ レ ー ド を 表 す enum */
enum zaseki {ECONOMY, BUSINESS, FIRST};
/* enum zaseki 型で座席のグレードを受け取り,その値段を int 型で返す */
int nedan(enum zaseki a_zaseki)
{
switch(a_zaseki){
case ECONOMY:
return(10000);
case BUSINESS:
return(24000);
case FIRST:
return(32000);
}
return(-1); /* エ ラ ー 用 */
}
/* エ ン ト リ ポ イ ン ト */
int main(void)
{
int tmp;
enum zaseki my_zaseki;
printf("どの席をよやくしますか? 番 号 で 入 力 し て 下 さ い。 Yn");
printf("1= エ コ ノ ミー , 2= ビ ジ ネス , 3= フ ァ ー ス ト : ");
scanf("%d", &tmp);
switch(tmp){
case 1:
my_zaseki = ECONOMY;
break;
case 2:
my_zaseki = BUSINESS;
break;
case 3:
my_zaseki = FIRST;
break;
default:
printf("errorYn");
exit(1);
}
printf("Y n お席のお値段は %d 円 で す。 Yn", nedan(my_zaseki));
return 0;
}
•
8
行め:ここの間違いの例として,
「enum zaseki nedan(int x)」まで書いて悩む,というのが典型
的な間違いのパターンですが,
関数名の前に書くのは返却値の型
間数名の後ろの ()の中に書くのは仮引数の型 (呼び出し側から渡されてくるものを,こういう型
として受け取る)
という原則はつねに絶対に変わりません。だとすると,上記のように書くと「enum zaseki型」で返
却することになってしまいます。
問題文の方に「int型で返却」という指定がある以上,int nedan(...)と書くことがすぐわかるわけ
です。
3 / 4
#03 の解答例
展開プログラム言語/演習
http://kujiraiken.sit.ac.jp/lecture.html
課題 4: テストの得点を成績文字に変換して返す関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h> /* for exit() */
/* 得 点 の 数 値 を 受 け 取 り , 成 績 文 字 を 返 す */
char score_to_gradechar(int score)
{
if (score >= 90 && score <= 100){
return(’S’);
} else if (score >= 80 && score <= 89){
return(’A’);
} else if (score >= 70 && score <= 79){
return(’B’);
} else if (score >= 60 && score <= 69){
return(’C’);
} else if (score >= 0 && score <= 59){
return(’D’);
} else {
printf("%d: 不 正 な 得 点 で す。 Yn", score);
exit(1);
}
}
/* score_to_gradchar() を テ ス ト す る */
void test_score_to_gradechar(void)
{
int ten;
ten = 92;
printf("%d 点 は %c の 成 績 で す。 Yn", ten, score_to_gradechar(ten));
ten = 31;
printf("%d 点 は %c の 成 績 で す。 Yn", ten, score_to_gradechar(ten));
ten = -8;
printf("%d 点 は %c の 成 績 で す。 Yn", ten, score_to_gradechar(ten));
}
/* エ ン ト リ ポ イ ン ト */
int main(void)
{
test_score_to_gradechar();
return 0;
}
•
5
•
8 行めなど:そして,返却する(returnする)のは文字そのものです(より正確には文字コードの値)
。
行め:
「文字を返却する」わけですから,返却値の型は char型です。
ちなみに,char grade; grade = ’S’; return(grade); のようにしてももちろん OK です。
4 / 4