応用理工学情報処理 2回目

1回目提出課題についてのコメント

(1)プログラムのインデントや改行は適切に行って下さい。

#include <stdio.h>
int main(void)
{
    printf("こんにちは。\n"); 
    return (0);
}
このプログラムは以下のように書いても正常にコンパイル・実行できます。
#include <stdio.h>
int main(void){printf("こんにちは。\n"); return (0);}
(注:#から始まるプリプロセッサ命令は改行が意味を持つため同じ行に続けることは出来ません。)
しかし、このような書き方は読みにくく、少し長いプログラムになると何をどのように処理しているか理解出来なくなります。
インデントが 全く出来ていない提出課題は不可・再提出としています。

(2)上のプログラムで、return (0);の行は無くても正常に動作します。これは、C99ではmain関数に限りその戻り値の型がint型であればreturn (0);が記述されたものとみなされるという規則があるからです。しかし、他の場合には警告が出たりエラーとなったりするので、return (0);は記述するようにして下さい。

(3)double型をscanf関数で読み込むときの変換指定は"%lf"です。浮動小数点数にはfloat型とdouble型があり、このコンピュータールームの環境ではそれぞれ4バイトと8バイトのサイズを持っています。float型では変換指定は"%f"で、double型では読み込む場所のサイズが大きくなるため変換指定が"%lf"となります。printf関数で出力する場合にはそれらは区別する必要が無く、どちらも"%f"で出力できます。double型の出力でprintf( "%lf", x);としてもエラーにはなりませんが、"エル"は単に無視されます。

(4)double型へ変換するキャスト演算子(double)について
a, bをそれぞれint型の変数とします。(double)(a/b)とすると、最初にa/bの計算が行われて小数点以下が切り捨てられるのでご注意下さい。また、(double)a/bと(double)a/(double)b)の値は同じです。これは、片側がdouble型だともう一方は自動的にdouble型への型変換が行われてから計算されるためです。

 

2回目は、テキスト第3章に従ってプログラムを分岐させる方法として、if文とswitch文を学びます。

(A)分岐(1) if

if文 もし何々ならば何々するという構文

if (式) 式1 else 式2 =>式が0以外であれば式1を実行し、そうでなければ式2を実行

式1及び式2は単一の文、あるいは{ }で囲った複合文(ブロック)

条件判断の式には、関係演算子<, >, <=, >=, ==, !=, 論理演算子&&, ||が用いられる。

「1」簡単な if 文 テキストp.36 List3-1、下のプログラムを実行してみて下さい。

/*
	読み込んだ整数値は5で割り切れないか
*/

#include  <stdio.h>

int main(void)
{
	int	 vx;

	printf("整数を入力してください:");
	scanf("%d", &vx);

	if (vx % 5)
		puts("その数は5で割り切れません。");

	return (0);
}
ここで、if 文の条件判断に用いている式、vx % 5 に注目しましょう。C言語では、条件判断に何らかの数値を持つ数式を用い、その値が0ならば偽(False), その値が0以外であれば真(True)と判断します。この%は余りを求める演算子であり、vx % 5が0以外である、つまりvxが5で割り切れないときに次の文が実行されます。

関係演算子<, >, <=, >=, ==, !=, や論理演算子&&, ||を用いた式も通常の数式と同じように値を持つことに注意してください。例えばint型変数をxとして、

x = 5 という式はxに5を代入する式であるが、式としても5という値を持つ。このため、y = x = 5 という式を書くことができる。

x == 5 という式は、x と 5 を比較して等しければ 1 という値になり、違っていれば 0 という値になる。

これら2つの式の値は異なりますが、どちらも整数値を持ちます。

「2」 if文で、Falseのときも何か実行したいときにはelseを使います。テキストp.38 List3-3のプログラムで確認しましょう。

/*
	読み込んだ整数値は5で割り切れないか割り切れるか
*/

#include  <stdio.h>

int main(void)
{
	int	 vx;

	printf("整数を入力してください:");
	scanf("%d", &vx);

	if (vx % 5)
		puts("その数は5で割り切れません。");
	else
		puts("その数は5で割り切れます。");

	return (0);
}

「3」 if 文で多数に分岐する場合は、下のプログラム(テキストp.44 List3-9)のようにします。

/*
	読み込んだ整数値の符号を判定
*/

#include  <stdio.h>

int main(void)
{
	int	 no;

	printf("整数を入力してください:");
	scanf("%d", &no);

	if (no == 0)
		puts("その数は0です。");
	else if (no > 0)
		puts("その数は正です。");
	else
		puts("その数は負です。");

	return (0);
}

このように続けていけばいくらでも条件分岐できるが、それではプログラムが読みにくくなるので一定の条件での多数の分岐には次のswitch文を使用するほうがプログラムの構造がわかりやすくなります。

====== 演習問題 2A (p2a.c) ==============

3つの整数値をキーボードから読み込んで、その中央値を表示するプログラムを作成せよ。

(例)
整数1:3
整数2:5
整数3:9
中央値は5です。
===============================

(b) 分岐(2) 条件演算子, switch

switch文 単一の式の値によって多数に分岐させたいとき

switch (式) {

case 定数1:

文1; break; // 式の値が定数1と一致すれば文1が実行される。

case 定数2://break;が無ければ次のcaseの文も実行される。

文2; break; //break;に出会うとswitch文を終了する{ }の外まで飛ぶ。

default :// どのcaseの定数とも一致しないときはここに飛ぶ。省略可。

文3; break;

「4」switch文 テキストp.65 List3-19のプログラムを実行してみよう。

/*
	読み込んだ整数値を3で割った剰余を表示(switch文)
*/

#include  <stdio.h>

int main(void)
{
	int	 num;

	printf("整数を入力してください:");
	scanf("%d", &num);

	switch (num % 3) {
	 case 0 : puts("その数は3で割り切れます。");	  	break;
	 case 1 : puts("その数を3で割った余りは1です。");	break;
	 case 2 : puts("その数を3で割った余りは2です。");	break;
	}

	return (0);
}

switch文で注意する点は、(1)条件判断の制御式の型は整数でなければならないこと、(2)break;文が無いと次の文が実行されること、です。

「5」条件演算子

  if (a) b;
  else c;
というプログラムは、a ? b : c; という形で簡潔に表現することが可能です。次のプログラム(p.56 List3-14)で確認してみましょう。
/*
	読み込んだ二つの整数値の大きい方の値を求めて表示(条件演算子)
*/

#include  <stdio.h>

int main(void)
{
	int	 n1, n2, max;

	puts("二つの整数を入力してください。");
	printf("整数1:");	scanf("%d", &n1);
	printf("整数2:");	scanf("%d", &n2);

	max = (n1 > n2) ? n1 : n2;		/* 大きい方の値をmaxに代入 */

	printf("大きい方の値は%dです。\n", max);

	return (0);
}

====== 演習問題 2B (p2b.c) ==============

何月かを整数値として読み込んで、その季節を以下の例のように表示するプログラムをswitch文を用いて作成せよ。(List3-17とList3-20参照, swich文を用いていない場合は不可。1から12以外の整数を入力した場合には、"入力した数値が間違っています"と表示して終了すること。)

(例)
今は何月ですか?:10
10月の季節は秋です。
==================================

====== 演習問題 2C (p2c.c) ==============

演習問題2Bと同じ処理を行うプログラムをswitch文を用いずにif文を用いて作成せよ。
==================================