32
情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 1 情報ネットワーク導入ユニットⅠ(C 言語) 演習(1) ~プログラム作成練習~ 以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.そし てソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず入れ,実行 結果をプログラムの後にコメント文として添付して印刷すること. 問題1-1. 次のプログラムを入力して,ビルド・実行しなさい. (○○の場所は自分の名前を入れる) #include <stdio.h> int main(void) { printf("私の名前は\n○○です"); return(0); } (実行結果) 私の名前は ○○です 問題1-2. 右に示すような表示を行うプログラムを作成せよ. (実行結果) もしもし。 こんにちは。 それでは。 問題1-3. 次のプログラムを入力して,ビルド・実行しなさい. #include <stdio.h> int main(void) { printf("計算結果は%dです\n", 8+15 ); return(0); } (実行結果) 計算結果は 23 です 問題1-4. 15 から 37 を引いた値を計算して「15 から 37 を引いた値は-22 です。」と表示するプログラムを作成しなさい. (実行結果) 15 から 37 を引いた値は-22 です。

情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

1

情報ネットワーク導入ユニットⅠ(C 言語) 演習(1) ~プログラム作成練習~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.そし

てソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず入れ,実行

結果をプログラムの後にコメント文として添付して印刷すること.

□問題1-1.

次のプログラムを入力して,ビルド・実行しなさい.

(○○の場所は自分の名前を入れる)

#include <stdio.h>

int main(void)

{

printf("私の名前は\n○○です");

return(0);

}

(実行結果) 私の名前は ○○です

□問題1-2.

右に示すような表示を行うプログラムを作成せよ.

(実行結果)

もしもし。

こんにちは。

それでは。

□問題1-3.

次のプログラムを入力して,ビルド・実行しなさい.

#include <stdio.h>

int main(void)

{

printf("計算結果は%dです\n", 8+15 );

return(0);

}

(実行結果)

計算結果は 23です

□問題1-4.

15から37を引いた値を計算して「15から37を引いた値は-22

です。」と表示するプログラムを作成しなさい.

(実行結果)

15から 37を引いた値は-22です。

Page 2: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

2

□問題1-5.

下のサンプルプログラムを実行すると右のような実行結果①

(画面表示)になる.

① 下のサンプルプログラムを入力・ビルドして,右の実

行結果になることを確認しなさい.

② 下のプログラムの一部を変更して,右の実行結果②の

ような画面表示になるようにしなさい.

// 問題1-5 // 学籍番号:1122XXX // 氏名 :○○△△ #include <stdio.h> int main(void) { int nx, ny ; nx = 10; ny = 30 + nx; printf("nxの値は%dです\n", nx ); printf("nyの値は%d です\n", ny ); return(0); }

(実行結果①) nxの値は 10です nyの値は 40です

(実行結果②) nxの値は 50です

nyの値は 10です

□問題1-6.

キーボードから読み込んだ整数値に 10 を加えた値を表示す

るプログラムは下のようになる.

① 下のプログラムを入力・ビルドして,右のような実行

結果①が出ることを確認しなさい.

② 下のプログラムを一部変更して,右の実行結果例②の

ような画面表示になるようにしなさい.

(C 言語の演算記号: +, -, *, / )

// 問題1-6 // 学籍番号:1122XXX // 氏名 :○○△△ #include <stdio.h> int main(void) { int no; printf("整数を入力してください:"); scanf("%d", &no); printf("その数に 10を加えると%dです\n", no+10 ); return(0); }

(実行結果①) 整数を入力してください:57 その数に 10を加えると 67です ( 部分はキーボード入力)

(実行結果例②) 整数を入力してください:33 その数を 3倍すると 99です ( 部分はキーボード入力)

Page 3: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

3

情報ネットワーク導入ユニットⅠ(C 言語) 演習(2) ~変数・読込みと表示~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.そし

てソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず入れ,実行

結果をプログラムの後にコメント文として添付して印刷すること.

□問題2-1.

下のプログラムの実行結果が,右のようになるように を

埋めてプログラムを完成させなさい.

#include <stdio.h> int main(void) { int nx, ny ; nx = 10; ny = 30 + nx; printf("nxの値は%dです\n", nx ); printf("nyの値は%d です\n", ny ); return(0); }

(実行結果例) nxの値は 10です nyの値は 40です

□問題2-2.

キーボードから読み込んだ整数値に 10 を加えた値を表示す

るプログラムを作成しなさい.

(実行結果例) 整数を入力してください:57 その数に 10を加えると 67です ( 部分はキーボード入力)

□問題2-3.

キーボードから読み込んだ2つの整数値の積を表示するプロ

グラムを作成しなさい.

(実行結果例) 二つの整数を入力してください。 整数1:27 整数2:35 それらの積は 945です ( 部分はキーボード入力)

□問題2-4.

右に示すような表示を行うプログラムを,puts 関数を利用し

て作成しなさい.(printf 関数を使わないで表示)

(実行結果)

Page 4: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

4

□問題2-5.

キーボードから読み込んだ3つの整数値の和を表示するプロ

グラムを作成しなさい.

(実行結果例)

3つの整数を入力

整数1:7

整数2:15

整数3:23

それらの和は 45です

□問題2-6.

キーボードから読み込んだ整数値の2倍と2乗を表示するプ

ログラムを作成しなさい.

(実行結果例)

整数を入力:9

2倍は 18です

2乗は 81です

□問題2-7.

キーボードから読み込んだ実数値に 1.05を掛けた値を表示す

るプログラムを作成しなさい.

*実数値を扱う場合,変数は double型で宣言する

例)double vx; /*double(実数)型変数 vx*/ *実数値の読み込み %lfとする (小文字の Lと F) 例)scanf("%lf", &vx ); *実数値の表示 %fとする(%lfでも OK) 例)printf("結果は%fです\n", vx );

(実行結果例) 実数を入力:12.3 その 1.05倍は 12.915000です

□問題2-8.

キーボードから読み込んだ2つの実数値の平均値を計算し

て,表示するプログラムを作成しなさい.

*2つの実数値を vx1, vx2として,平均値を avgとすれば avg = ( vx1 + vx2 ) / 2 ; で平均値は計算できる.

(実行結果例) 実数を入力 実数1:1.6 実数2:2.7 その平均は 2.150000です

□問題2-9.

キーボードから2つの整数値を右のような形式(空白をおい

て2つを同時に入力)で読み込み,その和を右の形式で表示

するプログラムを作成しなさい.

*整数型(int型)の変数 n1,n2に対して scanf("%d%d", &n1, &n2 ); とすれば,2つの整数を空白をはさんで同時に入力できる. *printf("%d + %d = %d \n", n1, n2, wa ); とすれば,右のような表示ができる(waは n1と n2の和)

(実行結果例) 整数を2つ入力:20 50 -------------- 20 + 50 = 70

Page 5: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

5

情報ネットワーク導入ユニットⅠ(C 言語) 演習(3) ~演算・型~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.

そしてソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず

入れ,実行結果をプログラムの後にコメント文として添付して印刷すること.

□問題3-1.

キーボードから2つの整数値を読込み,その商と剰余(余り)

を表示するプログラムを作成しなさい.

(実行結果例) 整数値を2つ入力 整数A:47 整数B:7 商 :6 余り:5 ( 部分はキーボード入力)

□問題3-2.

キーボードから2つの整数値を読込み,その和と積を右のよ

うに表示するプログラムを作成しなさい.

(実行結果例) 整数値を2つ入力 整数A:54 整数B:12 54 + 12 = 66 54 * 12 = 648

□問題3-3.

キーボードから2つの実数値を読込み,その平均値を表示す

るプログラムを作成しなさい.

(実行結果例) 2つの値の平均を求めます 実数1 = 1.6 実数2 = 3.8 2つの値の平均値は 2.700000です

□問題3-4.

キーボードから読み込んだ整数値1つを,右に示すように表

示するプログラム作成しなさい.

(a) 整数値を少なくとも 5 桁で表示,

(b) 整数値を少なくとも 10 桁で表示

(実行結果例) 整数を入力:123 (a)値は 123 (b)値は 123

□問題3-5.

キーボードから実数値1つを読み込んで,右に示すように表

示するプログラムを作成しなさい.

(a) 実数値を少なくとも 8 桁で小数点以下は 2 桁で表示,

(b) 実数値を少なくとも 10 桁で小数点以下は 5 桁で表示.

(実行結果例) 実数を入力:123.456 (a)値は 123.46 (b)値は 123.45600

Page 6: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

6

□問題3-6.

長方形の縦と横の長さをキーボードから読み込み,面積を表

示するプログラムを作成しなさい.

なお,結果は少なくとも 7 桁で,小数点以下は 2 桁で表示し

なさい.

(実行結果例)

長方形の面積を計算します

縦の長さ:3.5

横の長さ:5.5

面積: 19.25

□問題3-7.

商品の単価と購入個数をキーボードから読み込み,消費税込

みの金額を表示するプログラムを作成しなさい.

(単価×購入個数×1.05)

*右のように金額は,小数点以下を表示する形式でもよい.

(実行結果例)

金額を計算します

単価:198

個数:5

税込み金額:1039.5

□問題3-8.

2つの整数値を読み込んで,前者の値が後者の値の何%であ

るかを表示するプログラムを作成しなさい.結果は,少なく

とも 5 桁,小数点以下 1 桁で表示しなさい.

*計算は A÷B×100 だが,キャスト演算子 p.31 を利用する.

*printf 関数で%そのものを表示する方法は p.19 下部参照.

(実行結果例)

2つの整数を入力してください

整数A:54

整数B:84

Aの値は Bの 64.3%です

□問題3-9.

身長を整数値として読み込んで(int 型変数に身長を読込む),

標準体重を実数で表示するプログラムを作成しなさい.標準

体重は(身長 - 100)×0.9 によって求め,小数点以下は 1

桁だけ表示する.

(実行結果例)

身長を入力:175

標準体重は 67.5 kgです

□問題3-10.

右に示すように,男子学生数と女子学生数を読み込んで,全

学生数(合計)と全学生に占める女子学生の割合を%で表示

するプログラムを作成しなさい.

割合に関しては小数点以下を 2 桁で表示する.

(実行結果例)

男子学生数:1349

女子学生数:128

全学生数:1477

女子学生割合:8.67%

Page 7: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

7

情報ネットワーク導入ユニットⅠ(C 言語) 演習(4) ~条件分岐:if,switch~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.

そしてソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず

入れ,実行結果をプログラムの後にコメント文として添付して印刷すること.

□問題4-1.

キーボードから読み込んだ整数値が,3 で割り切れない場合は

「3 で割り切れません」と表示するプログラムを作成しなさ

い.(割り切れる場合は,「プログラム終了」とだけ表示する.

実行結果例2を参照)

(実行結果例1) 整数を入力:10 10は 3で割り切れません プログラム終了

(実行結果例2) 整数を入力:15 プログラム終了 ( 部分はキーボード入力)

□問題4-2.

キーボードから読み込んだ整数値が,偶数の場合は「偶数で

す」,奇数の場合は「奇数です」と右の実行結果例のように表

示するプログラムを作成しなさい.

(実行結果例1) 整数を入力:234 234は偶数です

(実行結果例2) 整数を入力:123 123は奇数です

□問題4-3.

キーボードから2つの実数値を読込み,それらの値が等しい

場合は「値は同じです」,異なる場合は「値は違います」と画

面に表示するプログラムを作成しなさい.

(実行結果例1) 2つの実数を入力: 実数 A:1.23 実数 B:1.23 値は同じです

(実行結果例2) 2つの実数を入力: 実数 A:1.23 実数 B:1.32 値は違います

□問題4-4.

2つの実数(double 型)をキーボードから読込み,入力した

値により「A の方が大きい」,「B の方が大きい」「A と B は等

しい」と画面に出力プログラムを作成しなさい.(右の実行結

果例を参照)

(実行結果例1) 実数値 Aを入力 = 1.2 実数値 Bを入力 = 1.5 Bの方が大きい

(実行結果例2) 実数値 Aを入力 = 2.5 実数値 Bを入力 = 2.5 Aと Bは等しい

□問題4-5.

3つの整数値をキーボードから読込み,その最小値を求めて

表示するプログラムを作成しなさい.

(実行結果例)

3つの整数を入力

整数 1 = 12

整数 2 = 8

整数 3 = 9 最小値は 8です

Page 8: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

8

□問題4-6.

2つの整数値をキーボードから読込んで,小さい方の値を表

示するプログラムを作成しなさい.

*(a)if 文を使った場合と,(b)条件演算子を使った場合を考えよう.

(実行結果例) 整数 A = 83 整数 B = 45 小さい方は 45です ( 部分はキーボード入力)

□問題4-7.

2つの実数値をキーボードから読込んで,大きい方から小さ

い方を引いた値を表示するプログラムを作成しなさい.(結果

は少なくとも 6 桁,小数点以下 2 桁で表示)

(実行結果例 1) 実数X:3.45 実数Y:1.23 差は 2.22です

(実行結果例2) 実数X:1.23 実数Y:3.45 差は 2.22です

□問題4-8. (論理演算子 p.52-53)

キーボードから2つの整数 a と b を読込み,

a が 10 以上で,b が 0 未満 → 「正常」

a が 5 未満 または b が 5 以上 → 「異常」

その他の場合 → 「注意」

と表示するプログラムを作成しなさい.

*右の実行結果例以外の場合(値)も試して,上の条件どおりか

確認しよう.

(実行結果例1)

aの値:15

bの値:-5

→ 正常

(実行結果例2)

aの値:15

bの値:8

→ 異常

(実行結果3)

aの値:8

bの値:3 → 注意

□問題4-9. (switch文)

キーボードから1つの整数値を読込み,その値を 5 で割った

余りの値によって,下のような表示をするプログラムを作成

しなさい.

・割切れる場合 → S

・1 余る場合 → A

・2 余る場合 → B

・3 余る場合 → C

・4 余る場合 → E

*右の実行結果例以外の場合(値)も試して,上の条件どおりか

確認しよう.

(画面表示例:割切れる場合)

整数値を入力:20

S

(画面表示例:1余る場合)

整数値を入力:11

A

(画面表示例:2余る場合)

整数値を入力:2 B

Page 9: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

9

□問題4-10. (論理演算子 p.52-53)

キーボードから実数値1つを読込み,その二乗の値が 0 より

大きくて 10 以下の場合は「範囲内です」,それ以外の場合は

「範囲外です」と,二乗の値とともに画面に表示するプログ

ラムを作成しなさい.

* 二乗は C 言語では自分自身を掛けて求めるのが良い.

a の二乗を b に代入 ・・・ b = a*a;

* C 言語では「0 より大きく,10 以下 の条件を if( 0< a <= 10 )と

書くことはできない.「0 より大きく」,しかも「10 以下である」

と 2 つの条件をつないで表現する.

(実行結果例1)

実数を入力:1.5

2.250000:範囲内です

プログラム終了

(実行結果例2)

実数を入力:3.3

10.890000:範囲外です

プログラム終了

□問題4-11. (論理演算子 p.52-53)

3つの整数値を読込んで,

① 3つの値が等しい場合 → 「すべて等しい」

② どれか2つが等しい場合 → 「2つは等しい」

③ ①でも②でもなければ → 「すべて異なる」

と表示するプログラムを作成しなさい.

(実行結果例1)

3つの整数を入力してください

整数A:12

整数B:12

整数C:12

すべて等しい

(実行結果例2)

3つの整数を入力してください

整数A:12

整数B:8

整数C:12

2つは等しい

□問題4-12.

点数を整数値として読込んで,その値に応じた評価を表示す

るプログラムを作成しなさい.

・80~100 点 : 「A」

・70~79 点 : 「B」

・60~69 点 : 「C」

・60 点未満 : 「E」

・その他(100 より大きい,0 より小さい):「評価不可」

(実行結果例1)

点数を入力:93

(実行結果例2)

点数を入力:72

(実行結果例3)

点数を入力:55

□問題4-13.

今日が火曜日である場合,今日からn日後の曜日を求めるプ

ログラムを作成しなさい.n日後のn(整数)はキーボード

から読込む.

* nを一週間の日数7で割ったあまりにより,何曜日かを求める.

(実行結果例1)

何日後ですか?(n=):30

木曜日です

(実行結果例2)

何日後ですか?(n=):1000

月曜日です

Page 10: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

10

□問題4-14.

商品の単価と購入個数をキーボードから読込み,合計金額(単

価×購入個数)が 10,000 円以内であれば「購入可能です」,

10,000 円を超える場合は「予算オーバーです」と表示するプ

ログラムを作成しなさい. ただし合計金額が負になる場合は

「入力が間違っています」と表示しなさい.

(実行結果例1)

単価:1280

個数:5

-------------

合計:6400円

購入できます

(実行結果例2)

単価:2310

個数:5

-------------

合計:11550円

予算オーバーです

□問題4-15.

キーボードから西暦年(整数)を読込んで,その年が閏年(う

るう年)かどうかを表示するプログラムを作成しなさい.

閏年の条件は次の①と②を満たすことである

① 4 で割切れる

② 100 で割切れない,または 400 で割切れる

例)閏年 1988,1992,1996,1600,2000,2400

閏年でない 1700,1800,1900,2100

※西暦 1582 年以降に適応される

(実行結果例1)

何年? = 2007

2007年はうるう年ではありません

(実行結果例2)

何年? = 2004

2004年はうるう年です

(実行結果例3)

何年? = 2000

2000年はうるう年です

□問題4-16.

商品の単価 tanka と購入個数 kosu をキーボードから読込み

(ともに整数),合計金額を求めて画面に表示するプログラム

を作成しなさい.ただし,

・tanka が 0 以下の場合(kosu がどんな値であっても)

→ 「単価がおかしいです」

・kosu が 0 以下の場合(tanka は 0 より大きい場合)

→ 「個数が間違っています」

と表示するようにしなさい.

*変数名に tanka, kosu を使ってプログラムを作成すること

(実行結果例1)

単価を入力:1290

個数を入力:6

-------------------

合計は 7740円です

(実行結果例2)

単価を入力:-1200

個数を入力:-20

-------------------

単価がおかしいです

□問題4-17.

2つの整数m,nがあり,

(条件1)mが正,またはnが正

(条件2)mが 0,しかもnも 0

とする.

整数m,nをキーボードから読込み,

A:(条件1)が成立しなければ「条件A成立」

B:(条件1)は成立するが,(条件2)が成立しなければ

「条件B成立」

C: AでもBでもなければ,「条件C成立」

と画面に表示するプログラムを作成しなさい.

*mまたはnが正(0 より大)であれば条件B成立,それ以外は条件A成立で,

条件Cが成立することはない(たぶん)

(実行結果例1)

整数m:10

整数n:20

-----------

条件B成立

(実行結果例2)

整数m:-10

整数n:0

-----------

条件A成立

Page 11: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

11

情報ネットワーク導入ユニットⅠ(C 言語)

演習(5) ~繰返し:do 文・while 文・for 文~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.

そしてソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず

入れ,実行結果をプログラムの後にコメント文として添付して印刷すること.問題にて関数名や変数名が指定され

ている場合は,その名前でプログラムを作成すること.

□問題 5-1.

1 から 10 までの整数の和を求めるプログラムを,do 文を用い

て作成しなさい.

(実行結果の例) 1から 10までの和:55

□問題 5-2. (複合代入演算子などを利用)

キーボードから整数値を読込んで,その値から始めて,1ま

での整数を,カウントダウンして表示するプログラムを do 文

で作成しなさい.

(実行結果の例)

正の整数値を入力 = 12 12 11 10 9 8 7 6 5 4 3 2 1 終了 ( 部分はキーボード入力)

□問題 5-3.

キーボードからの整数値の読込みを繰り返して,読込んだ値

の合計が100以上になったら終了するプログラムをdo文で作

成しなさい.なお整数値を読込むたびにそれまでの合計を,

右の実行結果例のように表示しなさい.

(実行結果例)

整数を入力:15

ここまでの合計: 15

整数を入力:25

ここまでの合計: 40

整数を入力:35

ここまでの合計: 75

整数を入力:45

ここまでの合計: 120

100以上になりました

□問題 5-4.

キーボードから整数値を読込んで,その値から始めて,1ま

での整数を,カウントダウンして表示するプログラムを while

文で作成しなさい.

(実行結果例) 整数値を入力 = 12 12 11 10 9 8 7 6 5 4 3 2 1 おわり

□問題 5-5.

キーボードから整数値を読込んで,その値以下の,正の偶数

(2で割れる整数,ただし 0 は除く)を昇順で表示するプロ

グラムを while 文で作成しなさい.

(実行結果例)

整数値を入力 = 19

2 4 6 8 10 12 14 16 18

おわり

□問題 5-6.

キーボードから読込んだ整数値の個数だけ*を横に連続して

表示するプログラムを for 文で作成しなさい.なお 0 以下の

整数が入力された場合は何も表示しない(正確には改行と「おわり」

のみを表示).

(実行結果例1)

正の整数を入力: 15

***************

おわり

(実行結果例2)

正の整数を入力: -10

おわり

Page 12: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

12

□問題 5-7.

(a) 1 から 5 までの整数の和を求めるプログラムを,for 文を

用いて作成しなさい.

(b) キーボードから正の整数値を読込み,1 からその整数値ま

での整数の和を求めるプログラムを,for 文を用いて作成しな

さい.

(a)(実行結果例) 1から 5までを足した値:15 (b) (実行結果例) 正の整数値を入力:15 1から 15までの和:120

□問題 5-8.

キーボードから正の整数値 limit を読込む.そして,1 から順

番に整数値を足していった場合(1+2+3+・・・),その和が limit

を越えたときの値を表示するプログラムを while 文で作成し

なさい.(右の例では,1+2+3+・・・で 14 まで足すと 100 を超

えていた,ということ)

(実行結果例)

正の整数 limitを入力:100

14で 100を越えました(合計 105)

□問題 5-9.

キーボードから正の整数値 num を読込む.2 を num 回掛け

た値(つまり 2 の num 乗,2numの値)を表示するプログラム

を for 文で作成しなさい.(表示は右の実行結果のようにする

こと)

(実行結果例)

正の整数 numを入力:5

2の 1乗: 2

2の 2乗: 4

2の 3乗: 8

2の 4乗: 16

2の 5乗: 32

□問題 5-10.

キーボードから個数(整数値)を読込み,その個数分の実数

値をキーボードから読込んで,その合計と平均を表示するプ

ログラムを作成しなさい.なお結果は小数点以下 2 桁で表示

しなさい.

(実行結果例)

実数は何個ですか:5

[1] = 1.2

[2] = 2.3

[3] = 3.4

[4] = 4.5

[5] = 5.6

合計:17.00

平均:3.40

□問題 5-11.

キーボードから正の整数値を読込み,1 からその整数値までの

偶数の和を求めるプログラムを作成しなさい.

(実行結果例) 正の整数値を入力:333 1から 333までの偶数の和:27722

□問題 5-12.

キーボードから整数値を読込んで,1 からその値までの3の倍

数の個数と和(合計:3+6+9+・・・)を求めて,表示するプロ

グラムを作成しなさい.

*ヒント:ループの中で,if 文を用いて 3 の倍数の場合だけ,個数カウントした

り,合計変数に足したりする.

(実行結果例)

整数値を入力:1000

3の倍数の個数:333

合計:166833

Page 13: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

13

情報ネットワーク導入ユニットⅠ(C 言語) 演習(6) ~多重ループと復習など(繰返し)~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.

そしてソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず

入れ,実行結果をプログラムの後にコメント文として添付して印刷すること.問題にて関数名や変数名が指定され

ている場合は,その名前でプログラムを作成すること.

□問題6-1.

右に示すように,九九の表に縦横のタイトル(1~9 の数字),

区切り線を入れたものを画面に表示するプログラムを作成し

なさい.

(実行結果例)

| 1 2 3 4 5 6 7 8 9

------------------------------

1 | 1 2 3 4 5 6 7 8 9

2 | 2 4 6 8 10 12 14 16 18

3 | 3 6 9 12 15 18 21 24 27

4 | 4 8 12 16 20 24 28 32 36

5 | 5 10 15 20 25 30 35 40 45

6 | 6 12 18 24 30 36 42 48 54

7 | 7 14 21 28 35 42 49 56 63

8 | 8 16 24 32 40 48 56 64 72

9 | 9 18 27 36 45 54 63 72 81

□問題6-2.

右に示すように,キーボードから読込んだ整数値の段数をも

つ直角三角形(ただし左上側が直角)を表示するプログラム

を作成しなさい.

(実行結果例)

何段ですか:5

*****

****

***

**

*

おわり

( 部分はキーボード入力)

□問題6-3. (二重ループ)

右に示すように,読込んだ 1 桁の整数の段数をもつ直角三角

形を表示するプログラムを作成しなさい.

(実行結果例)

何段ですか(1-9まで):6

1

21

321

4321

54321

654321

おわり

□問題6-4. (二重ループ)

右に示すように,キーボードから読込んだ整数値の段数をも

つピラミッドを表示するプログラムを作成しなさい.

(実行結果例)

何段ですか:4

*

***

*****

*******

おわり

Page 14: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

14

□問題6-5.

キーボードから整数値を読込んで,1 からその値までの,「偶

数で,かつ3の倍数」の個数と和(合計:6+12+18+・・・)を

求めて,表示するプログラムを作成しなさい.

(実行結果例)

整数値を入力:123

個数:20

合計:1260

□問題6-6.

キーボードから整数値の読込みを繰り返して,読込ん

だ値の合計が 10 以上,または読込み回数が 4 回以上

になったら終了するプログラムを作成しなさい.

(合計が超えた例)

整数を入力:3

整数を入力:5

整数を入力:4

条件を超えました

合計:12 回数:3

(回数を超えた例)

整数を入力:2

整数を入力:3

整数を入力:1

整数を入力:2

条件を超えました

合計:8 回数:4

□問題6-7.

キーボードから2つの正の整数 a,b(a<b)を読込んで,a

から b までの奇数の値を順番に表示するプログラムを作成し

なさい.

(実行結果例)

整数a:25

整数b:39

25 27 29 31 33 35 37 39

□問題6-8.

キーボードから2つの整数を読込んで,小さい方の数以上で

大きい方の数以下の整数をすべて加えた値を表示するプログ

ラムを作成しなさい.

(実行結果例)

2つの整数を入力:

整数1:37

整数2:28

28以上 37以下の整数の和は 325です.

□問題6-9.

下のプログラムは疑似乱数列で作成した mon の値(0~9 の

いずれかの整数値)をキーボードから入力した値 ans と比較

して,mon と ans が

・ 同じであれば「正解」と表示してプログラム終了

・ 異なれば「不正解」と表示して再度 ans を入力して比

較を繰り返す

ものである. .部分のプログラム(数行)を作成して,プ

ログラムを完成させなさい.

#include <stdio.h> #include <stdlib.h> //rand()関数用ヘッダー #include <time.h> //time()関数用ヘッダー int main(void) { int mon, ans, num; //numは入力回数カウント用 /*問題となる数字を疑似乱数で作る*/ srand((unsigned) time(NULL)); //乱数列を変える mon = rand() % 10; //乱数発生(0~9の整数) printf("数字当てプログラム\n"); return(0); }

(実行結果例1)

数字当てプログラム

数字(0-9)を入力 = 0

不正解

数字(0-9)を入力 = 3

不正解

数字(0-9)を入力 = 5

不正解

数字(0-9)を入力 = 7

不正解

数字(0-9)を入力 = 9

正解

5回で正解でした!

(実行結果例2)

数字当てプログラム

数字(0-9)を入力 = 8

不正解

数字(0-9)を入力 = 1

正解

2回で正解でした!

Page 15: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

15

□問題6-10.

右に示すように身長と標準体重の対応表を表示するプログラ

ムを作成しなさい.なお,表示する身長の範囲(開始値,終

了値,増分)は整数値として読込み,標準体重は小数点以下

を 2 桁だけ表示すること.(教科書 p.77 演習 4-14 の問題)

* 標準体重(kg) = ( 身長(cm) – 100 ) × 0.9 で計算する

(実行結果例)

何 cmから:150

何 cmまで:190

何 cmごと:5

150cm 45.00kg

155cm 49.50kg

185cm 76.50kg

190cm 81.00kg

□問題6-11.

キーボードから整数 num を読込み,その後 num 個だけ整数

を読込んでいき,その合計と平均を表示するプログラムを作

成しなさい.

(実行結果例)

整数は何個:6

No.1:65

No.2:23

No.3:47

No.4:9

No.5:153

No.6:777

-----------------

合計値:1074

平均値:179.00

□問題6-12.

キーボードから整数 no を読込み,

・ no が正であれば 0 までカウントダウンを表示

・ no が負であれば 0 までカウントアップを表示

・ no が 0 ならば何もしない

プログラムを作成しなさい.

(実行結果例1)

整数 noは:8

8 7 6 5 4 3 2 1 0

(実行結果例1)

整数 noは:-6

-6 -5 -4 -3 -2 -1 0

□問題6-13.

キーボードから読込んだ行数 height,列数 width に対して,

右に示すように,1 行目は 1234567890 を width の個数だけ,

2 行目は 2345678901 を width の個数だけ,・・・・と表示す

るプログラムを作成しなさい.(表示については右の実行結果

を参照)

*i 行目の j 列目に 0~9 のどれを表示するか,その規則を見出す

(実行結果例)

行数:9

列数:13

1234567890123

2345678901234

3456789012345

4567890123456

5678901234567

6789012345678

7890123456789

8901234567890

9012345678901

□問題6-14.

キーボードから横幅,高さ,個数(すべて整数)を読込み,

右に示すように,「横幅」と「高さ」の長方形を「個数」分横

に並べて表示するプログラムを作成しなさい.なお,各長方

形の間はスペース1つとする.

(実行結果例)

長方形を表示

横幅:5

高さ:3

個数:4

***** ***** ***** *****

***** ***** ***** *****

***** ***** ***** *****

Page 16: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

16

□問題6-15.

右に示すように,キーボードから読込んだ整数値を高さとす

る山を連続して2つ表示するプログラムを作成しなさい.

* 頂上までは1つずつ高くなっていき(右にいく),頂上からは1

つずつ低くなっていく(左にいく).

* 1周期(ひと山)は(山の高さ-1)×2の長さである

* 右の結果では「山2つ+1」個の*を表示している.つまり最後

の*は余分な*である.(表示しなくても良い)

(実行結果例)

山の高さ(整数) = 5

* ←ひと山スタート

*

*

*

* ←ここが山の高さ

*

*

* ←ここまでがひと山

* ←次の山スタート

*

*

*

* ←ここが山の高さ

*

*

* ←ここまでがひと山

* ←余分

終了

□問題6-16.

ある月のカレンダーを表示させたい.

① その月の 1 日の曜日を示す数字

(0 が日曜,1が月曜,2 が火曜・・・6 が土曜)

② その月の日数(28~31 の整数)

をキーボードから読込み,その月のカレンダーを右

のように表示するプログラムを作成しなさい.

(実行結果例1)

この月の日数を入力(28~31) = 30

1日の曜日を入力(日:0,月:1,・・・土:6) = 0

-----------------------

日 月 火 水 木 金 土

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

(実行結果例2)

この月の日数を入力(28~31) = 31

1日の曜日を入力(日:0,月:1,・・・土:6) = 5

-----------------------

日 月 火 水 木 金 土

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

Page 17: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

17

情報ネットワーク導入ユニットⅠ(C 言語)

演習(7) ~配列~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.

そしてソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず

入れ,実行結果をプログラムの後にコメント文として添付して印刷すること.なお,問題文中で変数名等が指定さ

れている場合(例:変数 value に読込み・・・)は,その変数名等でプログラムを作成すること.

□問題7-1. (配列宣言,配列と for 文)

要素型が int 型であり,4 個の要素をもつ配列 vc を用意して,

順番に 10,20,30,40 を代入して表示するプログラムを作成し

なさい.

*配列と for 文を用いること

(実行結果) vc[0] = 10 vc[1] = 20 vc[2] = 30 vc[3] = 40

□問題7-2. (配列宣言,配列と for 文)

要素型が double 型であり,10 個の要素をもつ配列 vx を用意

して,キーボードから読込んだ実数値を,vx の全要素に代入

して,その後,配列の全要素を順番に表示するプログラムを

作成しなさい(小数点以下を 2 桁まで表示する).

(実行結果例)

実数値を入力:1.23

vx[0] = 1.23

vx[1] = 1.23

:(中略)

vx[9] = 1.23

( 部分はキーボード入力)

□問題7-3. (配列の初期化)

下のプログラムで,右の実行結果が表示されるように, を

埋めて,プログラムを完成させなさい.

#include <stdio.h> int main(void) { int i; int d[1] = { 9, 1, 3, 5, 3, 100 }; for( i=5 ; i>=0 ; i-- ) { /* 表示 */ printf("%d ", data[i] ); } putchar('\n'); return(0); }

(実行結果)

0 2 4 6 8 10

□問題7-4. (配列の要素に値を読込む:scanf 関数)

要素型が double 型であり 4 個の要素をもつ配列 vz を用意し

て,順番にキーボードから値を読込み,その後,その内容を

表示するプログラムを作成しなさい(表示は,少なくとも 8

桁,小数点以下 2 表示).

(実行結果例) vz[0] = 1.3 vz[1] = 2.5 vz[2] = 6.1 vz[3] = 8.2 -------------------- vz[0] = 1.30 vz[1] = 2.50 vz[2] = 6.10 vz[3] = 8.20

Page 18: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

18

□問題7-5. (配列のコピー)

下のプログラムで,右の実行結果が表示されるように, を

埋めて,プログラムを完成させなさい.

#include <stdio.h> int main(void) { int i; int va[5] = { 8, 3, 5, 1, 9 }; int vb[5]; for( i=0 ; i<5 ; i++ ) { vb[i] == va[5-i-1]; } for( i=4 ; i>=0 ; i-- ) { printf("%d ", vb[i] ); } printf("\n"); return(0); }

(実行結果)

8 3 5 1 9

□問題7-6. (配列の初期化など)

int 型配列 array の各要素は下表のとおりである.キーボード

から要素番号(添字)を読込むと,その要素の値を表示する

プログラムを作成しなさい.(array の各要素の値は初期化で設定)

添字 0 1 2 3 4

値 9 4 7 2 5

(実行結果例1) 要素番号を入力:3 ------------- array[3] = 2 (実行結果例2) 要素番号を入力:4 ------------- array[4] = 5

□問題7-7. (配列の初期化など)

商品番号 1~6 の商品の単価と売上げ個数は下表のとおりで

あった.商品番号をキーボードから読込むと,その商品の売

上げ金額(単価×個数)を表示するプログラムを作成しなさ

い.(単価,売上げのそれぞれを,要素数 6 の配列データとして,表の

値で初期化して用いる)

商品番号 1 2 3 4 5 6

単価 120 150 130 190 210 100

売上げ個数 13 24 11 20 18 16

(実行結果例1)

商品番号を入力:4

-------------

商品番号[4]の売り上げ

3800円

(実行結果例2)

商品番号を入力:1

------------

商品番号[1]の売り上げ

1560円

□問題7-8. (配列の初期化など)

各月(1~12 月)の日数(例えば,1 月は 30 日間など)を保存

する配列 month を用意して,各要素を各月の日数で初期化す

る.この配列 month を利用して,キーボードから月(1~12)

を読込むと,1 月 1 日からその月の末日までの日数を表示す

るプログラムを作成しなさい.(2 月は 28 日間とする)

(実行結果例1) 月(1-12)を入力 = 3 ------------------- 3月 31日までは 90日間です (実行結果例2) 月(1-12)を入力 = 12 ------------------- 12月 31日までは 365日間です

Page 19: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

19

□問題7-9. (変数の値の交換:配列は使用しないs)

整数 a,b の値をキーボードから読込み,値が a<b で

あれば a,b の中身を入れ換えるプログラムを作成し

なさい(a≧b ならばそのまま).

(実行結果例1) 整数 a:10 整数 b:20 ------------- 変数 aの値:20 変数 bの値:10

(実行結果例2) 整数 a:30 整数 b:10 ------------- 変数 aの値:30 変数 bの値:10

□問題7-10. (配列データの合計・平均)

4人の体重(実数)を保存する配列 weight に,キーボードか

ら値を読込んで,その合計・平均値を表示するプログラムを

作成しなさい(小数点以下を 1 桁まで表示する).

*人数の 4 は#define マクロで定義してみましょう.

(実行結果例)

1番目の体重 = 58.3

2番目の体重 = 60.5

3番目の体重 = 62.3

4番目の体重 = 59.4

---------------

合計 =240.5kg

平均値=60.1kg

( 部分はキーボード入力)

□問題7-11. (配列データの最大値・最小値)

5人の体重(実数)を保存する配列 weight に,キーボードか

ら値を読込んで,その最大値と最小値を表示するプログラム

を作成しなさい(小数点以下を 1 桁まで表示する).

(実行結果例)

1番目の体重 = 58.3

2番目の体重 = 62.3

3番目の体重 = 59.4

4番目の体重 = 61.4

5番目の体重 = 56.3

---------------

最大値 = 62.3kg

最小値 = 56.3kg

□問題7-12. (配列データ:条件にあうデータ)

6人の体重(実数)を保存する配列 weight に,キーボードか

ら値を読込む.次に上限値 limit(実数)を読込み,weight

に保存されたデータのうち,limit 以下(limit 含む)のデー

タのみを表示するプログラムを作成しなさい.

(実行結果例) 1番目の体重 = 61.4 2番目の体重 = 58.3 3番目の体重 = 60.5 4番目の体重 = 62.3 5番目の体重 = 59.4 6番目の体重 = 60.0 上限値 = 60

--------------- 2番目:58.3kg 5番目:59.4kg 6番目:60.0kg

□問題7-13. (配列データ:条件にあうデータ)

下表の double 型配列 v のうち,0 以上である要素の添字と値

を順番に表示するプログラムを作成しなさい.(下表の配列の値

は初期化で設定)

添字 0 1 2 3 4

配列 V 1.0 -0.5 -1.9 2.5 0.0

(実行結果)

[添字] = 0 [値] = 1.0

[添字] = 3 [値] = 2.5

[添字] = 4 [値] = 0.0

(裏面に続く)

Page 20: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

20

□問題7-14. (多次元配列:2次元)

学生 3 名の 4 科目の成績は下表のとおりである.各学生の合

計得点,各科目の平均点を表示するプログラムを作成しなさ

い.(配布資料を参照)

科目1 科目2 科目3 科目4

学生1 60 90 70 80

学生2 40 60 60 90

学生3 30 20 60 70

(実行結果) -------------------- 学生 1の合計得点:300 学生 2の合計得点:250 学生 3の合計得点:180 -------------------- 科目 1の平均点: 43.3 科目 2の平均点: 56.7 科目 3の平均点: 63.3 科目 4の平均点: 80.0

□問題7-15. (配列データの最大値・最小値)

5人の得点をキーボードから読込み,このうちの最大値およ

びその番号を表示するプログラムを作成しなさい.

(同じ得点があった場合は番号の小さい方を最大値の番号とする)

(実行結果例) 1番目の得点= 55 2番目の得点= 63 3番目の得点= 95 4番目の得点= 41 5番目の得点= 85 ---------------- 最大値:3番で 95点

□問題7-16. (配列データ:条件にあうデータ)

下表の5つの数値(整数)を配列 dat に格納して(下記の数

値を配列に代入する),これらのデータのうち,

(1)3の倍数 (2)5 の倍数

の個数を表示するプログラムを,配列 dat を用いて作成しな

さい.

39 75 20 21 19

(実行結果) 3の倍数:3個

5の倍数:2個

□問題7-17. (2次元配列)

3×3の計9つの整数をキーボードから読込み,その値が 100

以上であれば 1 を,100 未満であれば 0 を表示するプログラ

ムを作成せよ.(右の実行結果のように表示する)

例)

120 50 70 1 0 0

90 150 110 → 0 1 1

40 100 20 0 1 0

(実行結果例)

1行目の

1列目= 120

2列目= 50

3列目= 70

2行目の

1列目= 90

2列目= 150

3列目= 110

3行目の

1列目= 40

2列目= 100

3列目= 20

---------------

元のデータ

120 50 70

90 150 110

40 100 20

変換後のデータ

1 0 0

0 1 1

0 1 0

Page 21: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

21

情報ネットワーク導入ユニットⅠ(C 言語)

演習(8) ~関数~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.

そしてソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず

入れ,実行結果をプログラムの後にコメント文として添付して印刷すること.なお,問題文中で変数名等が指定さ

れている場合(例:変数 value に読込み・・・)は,その変数名等でプログラムを作成すること.

□問題8-1. (関数定義・呼出し)

(a)下のプログラム(a)は2つの整数 a,b の和を表示するもの

である. .に適当なプログラムを書きなさい.(和を求め

る際には,関数 sum を利用すること).

(b) 下のプログラム(b)は2つの実数 a,b の差(a-b)を表示

するものである. .に適当なプログラムを書きなさい.

((a)の実行結果)

答え:30

((b)の実行結果)

答え:-0.500000

(a)

#include <stdio.h> int sum( int x, int y ) { int z; z = x + y; return(z); } int main(void) { int a=10, b=20; printf("答え:%d\n", sum( a, b ) ); return(0); }

(b)

#include <stdio.h> double diff( double x, double y ) { double z; z = x - y; return( z ); } int main(void) { double a=1.5, b=2.0, c; c = diff( a, b ); printf("答え:%f\n", c ); return(0); }

□問題8-2. (関数定義・呼出し)

2つの整数 a,b の a÷b の剰余(余り)を返す関数 remainder

を作成して,この関数 remainder を利用して,キーボードか

ら2つの整数 a,b を読込み,a÷b の剰余を表示するプログ

ラムを作成しなさい.

*関数 remainder:引数の個数,個数,返却値の型,中身のプログラムを

考えて作成する.

*同じ動作をするプログラムはメイン関数だけでも作成可能であり,関数

remainder を利用する必要はないが,関数定義の演習なので必ず利用すること.

(実行結果例)

整数 a:37

整数 b:8

37÷8のあまり:5

( 部分はキーボード入力)

Page 22: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

22

□問題8-3. (関数定義・呼出し)

double 型実数xの n 乗xn(xをn回掛けた値.nは正の整

数)を返す関数 power を作成して,この関数 power を利用し

て,キーボードから実数 a と正数 m を読込み,a の m 乗 am

を求めるプログラムを作成しなさい.

(実行結果例) 実数 a:1.2 正数 m:10 --------------- 1.20の 10乗 = 6.19

□問題8-4. (関数の設計:値を返さない関数)

ブザー(ビープ音)を仮引数 no で指定された回数鳴らした後

に,画面に「警告です!」と表示して改行を行う関数 alert

を作成しなさい.関数 alert を用いて,5 回ブザーを鳴らして

「警告です!」と画面に表示するプログラムを作成しなさい.

* ブザーは printf("¥a");または putchar('¥a');で1回鳴る.

* ブザー回数を関数 alert の仮引数にする.

(実行結果例) (ブザーが 5回鳴って)

警告です!

□問題8-5. (関数の設計:値を返さない関数)

*を no 個連続して表示する関数 put_stars を作成し,この関

数を利用して,キーボードから読込まれた横幅と高さをもつ

長方形を表示するプログラムを作成しなさい.(長方形の形状

は実行結果例参照)

(実行結果例)

横幅: 5

高さ: 3

-----------------

*****

*****

*****

□問題8-6.(関数の設計:仮引数 double 型3つ,返却値 double

型)

実数3つの平均値を返す関数 mean を作成し,この関数 mean

を利用して,キーボードから3つの実数を読込み,その平均

値を画面に表示するプログラムを作成しなさい.結果表示は

少なくとも 8 桁,小数点以下 3 桁とする.

(実行結果) 実数 1:1.23 実数 2:4.32 実数 3:3.42 ----------------- 平均値 = 2.990

□問題8-7.(関数の設計:仮引数 double型2つ,返却値 int 型)

2つの実数 a,bに対して,

・ a>b なら 1

・ a=b なら 0

・ a<b なら-1

を返す関数 comp を作成し,この関数 comp を利用して,キー

ボードから読込まれた2つの実数(実数1,実数2)のどち

らが大きいか(または等しいか)を表示するプログラムを作

成しなさい.

(実行結果例) 実数 1:1.23 実数 2:1.22 実数1の方が大きい (実行結果例) 実数 1:3.33 実数 2:3.330 実数1と2は等しい

□問題8-8. (関数の設計:仮引数 int 型1つ,返却値 int 型)

1から順番に整数を足して,整数 num を超えた時(等しい場

合含む)の,最後に足した整数値を返す関数 func を作成なさ

い.この関数 func を利用して,1 からの整数の和が,キーボ

ードから読込まれた制限値(整数)を超えるためには,どこ

まで足せばよいかを表示するプログラムを作成しなさい.

(実行結果)

制限値= 10000

141まで足すと 10000を超える

Page 23: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

23

□問題8-9. (関数:配列の受渡し)

要素数が no である int 型の配列 vc の最小値を返却値として

返す関数 min_of を作成しなさい.この関数 min_of を利用し

て,キーボードから 10 名の得点データを入力すると,その最

小値を画面に表示するプログラムを作成しなさい.

(実行結果例)

1番目の得点 = 70

2番目の得点 = 50

:(途中省略)

10番目の得点 = 63

-------------------

最小値:50点

□問題8-10. (関数:配列の受渡し)

要素数が no である int 型の配列 vc の全要素に整数 x の値を

代入する関数 fill を作成しなさい(関数 fill は値を返さない).

この関数 fill を用いて,要素数 5 の int 型配列 xc の全要素を

キーボードから読込んだ値に設定するプログラムを作成しな

さい.

(実行結果例)

設定する値を入力= 7

-------------------

xc[0]=7

xc[1]=7

xc[2]=7

xc[3]=7

xc[4]=7

□問題8-11. (関数:配列の受渡し)

要素数が no である int 型の配列 vc の並び(格納されているデ

ータの順番)を逆順にする関数 rev_array を作成しなさい.関

数 rev_array を用いて,下記のような値をもつ配列 buf の各

要素の値を逆順に入替えて,buf[0]から順番に表示するプログ

ラムを作成しなさい.

添字 0 1 2 3 4

値 10 20 30 40 50

(実行結果) buf[0] : 50 buf[1] : 40 buf[2] : 30 buf[3] : 20 buf[4] : 10

□問題8-12. (関数の設計)

int 型の変数 num を引数として,1 から num までの整数の和

を返す関数 souwa を作成しなさい.関数 souwa を用いて,キ

ーボードから整数値を読込み,1からその整数値までの和を

求めるプログラムを作成しなさい.

(実行結果例) 整数を入力:98

1から 98までの和 = 4851

□問題8-13. (関数の設計)

2つの int 型変数 x0,x1(x0 < x1 とする)に対して x0 から

x1 までの整数の和を返す関数 souwa2 を作成しなさい.関数

souwa2 を用いて,キーボードから 2 つの整数値 a,b(a < b

とする)を読込み,その a から b までの和を求めるプログラ

ムを作成しなさい.

(実行結果例) 整数a:33 整数b:98

33から 98までの和 = 4323

□問題8-14. (関数の設計)

実数型引数x, yに対して x2+y2の値を返す関数power2を作成

し,関数 power2 を用いて,キーボードから読込まれた2つ

の実数 a,b に対して a2+b2の値を画面に出力するプログラム

作成しなさい.

(実行結果例) 実数 a:1.23 実数 b:9.87

答え = 98.93

Page 24: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

24

□問題8-15. (関数の設計)

要素数が numである double型配列 dataの値の平均値を返す

関数 meanv を作成しなさい.関数 meanv を用いて,キーボ

ードから読込まれた4つの値の平均値を表示するプログラム

を作成しなさい.

(実行結果例)

1番目のデータ= 1.55

2番目のデータ= 2.66

3番目のデータ= 3.77

4番目のデータ= 4.88

---------------- 平均値は 3.21

□問題8-16. (関数の設計)

要素数が num である int 型配列 vc の,値が最大である要素

の添字を返す関数 max_index を作成しなさい.関数

max_index を用いて,キーボードから読込まれた5つの値の

うち最大値は何番目だったかを表示するプログラムを作成し

なさい.

(実行結果)

1番目のデータ= 99

2番目のデータ= 120

3番目のデータ= 80

4番目のデータ= 110

5番目のデータ= 100

----------------

最大値は 2番目に入力

□問題8-17. (関数の設計)

要素数が同じ int 型配列 xa と xb の対応する要素(xa[i]と

xb[i])の値をすべて入れ替える関数 swap_array を作成し,

下記の配列 fa,fb の要素を入れ替えて,その結果を表示する

プログラムを作成しなさい.(下表の配列 fa と fb の元のデータは配

列の初期化で設定)

添字 0 1 2 3 4

fa 3 8 1 9 4

fb 9 1 7 6 5

(実行結果)

元のデータ

fa : 3 8 1 9 4

fb : 9 1 7 6 5

----------------

変換後のデータ

fa : 9 1 7 6 5

fb : 3 8 1 9 4

□問題8-18. (関数の設計)

要素数が同じ int 型配列 xa と xb の対応する要素(xa[i]と

xb[i])の値が

・ xa[i] < xb[i]ならば,xa[i]と xb[i]を入れ替え

・ xa[i] ≧ xb[i]ならば,そのまま

・ 入れ替えた要素の個数を返す

関数 swap_b を作成し,関数 swap_b を用いて,下記の配列

fa,fb で fa の要素が必ず大きい(または等しい)ように入れ

替えて,結果を表示するプログラムを作成しなさい.(下表の

配列 fa と fb の元のデータは配列の初期化で設定)

(元の配列要素)

添字 0 1 2 3 4

fa 3 8 1 9 4

fb 9 1 7 6 5

(変換後の配列要素)

添字 0 1 2 3 4

fa 9 8 7 9 5

fb 3 1 1 6 4

(実行結果)

元のデータ

fa : 3 8 1 9 4

fb : 9 1 7 6 5

----------------

変換後のデータ

fa : 9 8 7 9 5

fb : 3 1 1 6 4

入れ替えた個数 = 3

Page 25: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

25

情報ネットワーク導入ユニットⅠ(C 言語)

演習(6) ~多重ループと復習など(繰返し)~

以下の問題に関するプログラムを作成し,ソースプログラムを入力後,ビルド,実行して実行結果を確認しなさい.

そしてソースプログラムを印刷しなさい.なお,ソースプログラムの先頭には学籍番号,氏名をコメント文で必ず

入れ,実行結果をプログラムの後にコメント文として添付して印刷すること.なお,問題文中で変数名等が指定さ

れている場合(例:変数 value に読込み・・・)は,その変数名等でプログラムを作成すること.

□問題 9-1. (printfの書式)

キーボードから整数 a,b と実数 x,z を読込み,まず

「1234567890」を printf("1234567890¥n");で表示した後,

それぞれの変数の値を

a → 少なくとも7桁

b → 少なくとも3桁

x → 小数点以下1桁 (全体の桁数は指定なし)

z → 少なくとも7桁,小数点以下2桁

で表示するプログラムを作成しなさい.

(実行結果例)

整数 a:1234

整数 b:33

実数 x:123.456

実数 z:987.345

1234567890

1234

33

123.5

987.35

□問題 9-2. (while文)

二つの整数値 x,y を読込んで,x 以上で y 以下(x,y を含む)

の整数をすべて加えた値を表示するプログラムを,while 文を

用いて作成しなさい.

(実行結果例)

整数1:10

整数2:90

10以上 90以下の整数の和は 4050です

□問題 9-3. (if 文,switch 文)

キーボードから整数値を変数 no に読込み,その値を 5 で割っ

た余りが,0 なら「5の倍数」,1 なら「1あまり」,それ以外

なら「それ以外」と表示するプログラムを作成せよ.

*if 文を用いても,switch 文を用いてもどちらでもよい

(実行結果例1)

整数値を入力:10

5の倍数

(実行結果例2)

整数値を入力:19

それ以外

□問題 9-4. (for文, do文)

キーボードから整数値を変数 num に読込み,

画面に‘+’を num 個,for 文を用いて表示して,

また

画面に‘*’を num 個,do 文を用いて表示する

プログラムを作成しなさい.

(実行結果例)

numの値を入力:7

+++++++

*******

□問題 9-5. (for文, 二重ループ)

右のようなキーボードから指定された(読込まれた)段数 num

の図形を画面に表示するプログラムを作成しなさい.

(1 段目が 1 を num 個で*が 0 個,2 段目が 2 を(num-1)個で,*が 1 個・・・)

(実行結果例)

何段? num = 5

11111

2222*

333**

44***

5****

Page 26: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

26

□問題 9-6. (配列:合計・平均)

4種類の価格(整数)を保存する配列 price にキーボードから

値を読込んで,4 つの合計と平均値を表示するプログラムを作

成しなさい.(配列データの合計・平均.なお,種類数(ここでは 4)

は#define 文を使って定義すること)

(実行結果例)

1番の価格 = 125

2番の価格 = 214

3番の価格 = 198

4番の価格 = 191

合計 =728

平均値=182.0

□問題 9-7. (配列:2次元配列)

学生 3 名の 4 科目の成績は表 1 のとおりである.2 次元配列

ten を用いて各科目の平均点を求めて,画面に表示するプログ

ラムを作成しなさい.なお,得点は配列初期化を用いて配列

ten に設定する.

表 1 得点表

科目1 科目2 科目3 科目4

学生1 70 80 90 65

学生2 60 70 80 56

学生3 81 82 83 44

(実行結果)

科目 1の平均点: 70.3

科目 2の平均点: 77.3

科目 3の平均点: 84.3

科目 4の平均点: 55.0

□問題 9-8. (関数の定義・呼出し)

double 型実数の n 乗(実数xをn回掛けた値.nは正の整数)

を返す関数 powN を定義しなさい.この関数 powN を用いて

キーボートから読み込んだ実数 a,正数 r の ar(a の r 乗)を

画面に表示するプログラムを作成しなさい.

(表示は小数点以下3桁程度でよい)

(実行結果例)

実数 aの値:5.3

正数 rの値:6

5.300の 6乗 = 22164.361

□問題 9-9. (配列:データの最小値を求める)

5 名の体重をキーボードから読み込んで,最小値とそれが何番

目の人かを表示するプログラムを作成しなさい.

(同じ値の人がいた場合は,番号の小さい方を表示する)

(実行結果例)

1番目の体重= 60.5

2番目の体重= 57.3

3番目の体重= 68.1

4番目の体重= 52.4

5番目の体重= 65.2

----------------

最小値 : 52.4kg

その番号:4番目

□問題 9-10. (配列:条件にあうデータを探す)

5 名の体重と学年平均値をキーボードから読み込んで,そのう

ち学年平均値以下(平均値と同値含む)の人数と,平均値以

下の人の体重値を右のように表示するプログラムを作成しな

さい.

(実行結果例) 1番目の体重= 60.5 2番目の体重= 57.3 3番目の体重= 68.1 4番目の体重= 52.4 5番目の体重= 65.2 学年平均値= 60.0 ---------------- 60.0(kg)以下の人数:2名 [2]: 57.3(kg) [4]: 52.4(kg)

Page 27: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

27

□問題 9-11. (配列:合計・平均を求める+条件にあうデータ)

5 名の体重をキーボードから読み込んで,5 名の平均値以上の

値を持つ人の番号と体重を表示するプログラムを作成しなさ

い.

(実行結果例)

1番目の体重= 60.5

2番目の体重= 57.3

3番目の体重= 68.1

4番目の体重= 52.4

5番目の体重= 65.2

----------------

平均値: 60.7kg

3番目: 68.1kg

5番目: 65.2kg

□問題 9-12. (配列:データを小さい順に並べ替える)

5 名の体重をキーボードから読み込んで,それらの値を小さい

順に表示するプログラムを作成しなさい.

(実行結果例) 1番目の体重= 60.5 2番目の体重= 57.3 3番目の体重= 68.1 4番目の体重= 52.4 5番目の体重= 65.2 ---------------- (1): 52.4kg (2): 57.3kg (3): 60.5kg (4): 65.2kg (5): 68.1kg

□問題 9-13. (配列:データを小さい順に並べ替える)

5 名の体重をキーボードから読み込んで,値の小さい順に,何

番目の人かと,その体重を表示するプログラムを作成しなさ

い.なお,同じ値があれば,番号の小さい方を先に表示する.

(ヒント:番号を保存する配列を別途用意して,体重データを入れ替え

る時に番号も入れ替える)

(実行結果例)

1番目の体重= 60.5

2番目の体重= 57.3

3番目の体重= 68.1

4番目の体重= 52.4

5番目の体重= 65.2

----------------

(1) 3番目: 52.4kg

(2) 1番目: 57.3kg

(3) 0番目: 60.5kg

(4) 4番目: 65.2kg

(5) 2番目: 68.1kg

□問題 9-14. (関数の定義・呼出し)

三角形の「底辺の長さ」と「高さ」を仮引数として,三角形

の面積(底辺の長さ×高さ÷2)を返却値とする関数 triangle

を定義しなさい.この関数 triangle を用いてキーボートから

読み込んだ底辺の長さ,高さの三角形の面積を表示するプロ

グラムを作成しなさい.

(実行結果例)

三角形の面積計算

底辺の長さ:10.8

高さ:8.6

----------------

面積: 46.44

□問題 9-15. (関数の定義・呼出し)

3つの整数 tanka,kosu,pay を仮引数として,

pay - tanka×kosu

の値を返す関数 otsuri を定義しなさい.この関数 otsuri を用

いて,キーボートから読み込んだ単価,購入個数,支払金額

に対して,おつり(=支払金額 - 単価×個数)を表示するプ

ログラムを作成しなさい.

(実行結果例)

単価:129

購入個数:17

支払金額:5000

-----------------

おつり:2807円

Page 28: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

28

□問題 9-16. (関数:配列の受渡し)

要素数が no である int 型配列 data の値の合計を返す関数

CalcSum を定義しなさい.この関数 CalcSum を用いて,キ

ーボードから読込まれた5つの得点の合計得点を表示するプ

ログラムを作成しなさい.

(実行結果例) 1番目の得点= 59 2番目の得点= 68 3番目の得点= 75 4番目の得点= 51 5番目の得点= 64 ---------------- 合計は 317点

□問題 9-17. (関数:配列の受渡し)

要素数が num である double 型の配列 xv の全要素に,値 c

を代入する関数 SetValue を定義しなさい(関数 SetValue は

値を返さない void 型).この関数 SetValue を用いて,要素数

10 の double 型配列 buf_A と buf_B の全要素を,それぞれキ

ーボードから読込んだ値に設定するプログラムを作成しなさ

い.(設定後の bufA と bufB の全要素を画面に表示する)

(実行結果例) bufAに設定する値= 1.23 bufBに設定する値= 3.45 ------------------- bufA[0]=1.23 bufB[0]=3.45 bufA[1]=1.23 bufB[1]=3.45 : bufA[9]=1.23 bufB[9]=3.45

□問題 9-18. (関数:配列の受渡し)

要素数が no である int 型配列 xv の要素のうち,値 v の倍数

である(値 v で割切れる)要素の個数を返す関数 num_mul

を定義しなさい.この関数 num_mul を用いて,キーボード

から読込まれた 5 個のデータのうち,3 の倍数および 5 の倍

数が,それぞれいくつあるかを表示するプログラムを作成し

なさい.

*関数 num_mul の仮引数は,int 型 no, int 型配列 xv[ ],int 型 v の計

3 つで,返却値は個数(int 型)である.

(実行結果例)

0番の数値= 21

1番の数値= 45

2番の数値= 35

3番の数値= 31

4番の数値= 27

----------------

3の倍数 3個

5の倍数 2個

□問題 9-19. (関数:配列の受渡し)

要素数 no である int 型配列 data の値で lower 以上で upper

以下のデータの個数を返す関数 count_data を定義しなさい.

この関数 count_data を利用して,キーボードから 10 名の得

点と,点数範囲の下と上の点を読み込み,その点数範囲内の

人数を表示するプログラムを作成しなさい.

*関数 count_dataの仮引数は,int型 no, int型配列 data[ ],int型 lower,

upper の計 4 つで,返却値は個数(int 型)である.

(実行結果例) 1番目の得点= 70 2番目の得点= 60 3番目の得点= 45 4番目の得点= 87 5番目の得点= 39 6番目の得点= 72 7番目の得点= 83 8番目の得点= 94 9番目の得点= 52 10番目の得点= 76 下の点:80 上の点:90 ----------------

80点以上 90点以下の人数:2名

Page 29: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

29

情報ネットワーク導入ユニットⅠ(C 言語)

演習(7) 配列 補足資料

- 配列を用いたデータ処理の例 -

配列を用いた処理には,プログラムの基本的な型(パターン)がいくつかあります.以下の(1)~(3)のパターンをおぼえ

てしまいましょう.(できれば(4)も)

*下記のプログラム部分では変数宣言等が省略されているものもある.

(1)合計・平均値を求める (教科書:p.96~97)

int data[NUM], sum;

double avg;

sum=0; ①

for( i=0 ; i<NUM ; i++ ) { ②

sum += data[i]; ③

}

avg = (double)sum/NUM; ④

①合計を保存する変数 sumを 0で初期化する.

(sumが 0とは限らないので)

②for ループで,データすべて(データ数 NUM)を回

るようにする.

③i番目のデータを,それまでの sumに加算する.

④合計値をデータ数で割って平均値を出す.

(2)最大値(または最小値)を求める (教科書:p.98~99)

(例)NUM 個のデータの中の,最大値とその要素番号

を求める.

int data[NUM], max, max_no;

max=data[0]; max_no=0; ①

for( i=1 ; i<NUM ; i++ ) { ②

if( data[i] > max ) { ③

max = data[i]; ③’

max_no = i;

}

}

①0番のデータをとりあえず最大値とする.

②forループで,残りのデータ(1~NUM-1番)を回り,

大きな値が無いかをチェックする.

③i 番のデータが,それまでの最大値(max)よりも

大きいかをチェック.

③’大きい場合は,そのデータを新しい最大値と

して maxに代入する.同時にその要素番号も記録

する(max_no).

(3)条件にあうデータを探す (教科書:p.100)

(例)60以上のデータの数を数えて,またそのデータ

を表示する.

int data[NUM], count;

count=0; ①

for( i=0 ; i<NUM ; i++ ) { ②

if( data[i] >= 60 ) { ③

count++; ③’

printf("%d番:%d\n", i+1, data[i]); ③''

}

}

①条件にあるデータの数を保存する変数 countを 0で

初期化する.

②for ループで,データすべて(データ数 NUM)を回

るようにする.

③i番のデータが条件にあっているかをチェック.

③’条件に合っていれば,countを 1増やす.

③''また,そのデータを表示する.

(配列の要素番号は 0から始まるので,1から始

まる番号に直すために i+1とする)

Page 30: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

30

(4)大きい順(または小さい順)にデータを並べ替える (教科書:p.268~270 に関連説明)

例)データを大きい順に並べ替えて表示.

int data[NUM], i, j;

/*配列データを大きい順になるように入れ替える*/

for( i=0 ; i<NUM-1 ; i++ ) { ①

for( j=i+1 ; j<NUM ; j++ ) { ②

if( data[i] < data[j] ) { ③

temp = data[i];

data[i] = data[j];

data[j] = temp;

}

}

}

/*配列を順番に表示*/

for( i=0 ; i<NUM ; i++ ) { ④

printf("(%d):%d\n", i, data[i] );

}

①i番のデータに注目する.

(i番以降のデータで大きいものがあれば,それを

i番のデータする,という考え方)

②for ループで,i 番以降のデータすべてを回るよう

にする.

③i番のデータよりも j番のデータが大きければ,

データを入れ替える条件にあっているかをチェック.

④すでに配列の中身は,先頭から大きい順になってい

るはずなので,順番に表示すればよい.

(単純交換法によるデータ並べ替え:ソート)

データ数5で次の値だった場合

10

0

40

1

30

2

50

3

20

4

data[i]

i

(i=0):終了時には最大値が 0 番に保存されている

(j=1) 0 番と 1 番を比較して,1 番が大きいので入れ替える:

40

0

10

1

30

2

50

3

20

4

data[i]

i

(j=2) 0 番と 2 番を比較して,0 番が大きいので何もしない:

40

0

10

1

30

2

50

3

20

4

data[i]

i

(j=3) 0 番と 3 番を比較して,3 番が大きいので入れ替える:

50

0

10

1

30

2

40

3

20

4

data[i]

i

(j=4) 0 番と 4 番を比較して,0 番が大きいので何もしない:

50

0

10

1

30

2

40

3

20

4

data[i]

i

(i=1) :終了時には 2 番目に大きな値が 1 番に保存されている

(j=2) 1 番と 2 番を比較して,2 番が大きいので入れ替える:

50

0

30

1

10

2

40

3

20

4

data[i]

i

(j=3) 1 番と 3 番を比較して,3 番が大きいので入れ替える:

50

0

40

1

10

2

30

3

20

4

data[i]

i

(j=4) 1 番と 4 番を比較して,1 番が大きいので何もしない:

50

0

40

1

10

2

30

3

20

4

data[i]

i

(i=2) :終了時には 3 番目に大きな値が 2 番に保存されている

以下同様 i=3 までに続く.最終結果:

50

0

40

1

30

2

20

3

10

4

data[i]

i

Page 31: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

31

情報ネットワーク導入ユニットⅠ(C 言語)

多次元配列(教科書 p.102) 補足資料

教科書の例題とは違う問題で説明しています.

例題 1 学生5名の 3 科目の成績は表 1 のとおりである.2 次元配列を用いて,各学生の合計点を表

示するプログラムを作成せよ.

表1.各学生の得点

科目1 科目2 科目3

学生1 80 60 70

学生2 90 90 85

学生3 30 50 30

学生4 60 80 70

学生5 50 90 40

2次元配列 int ten[5][3];

科目1 科目2 科目3

学生1 ten[0][0] ten[0][1] ten[0][2]

学生2 ten[1][0] ten[1][1] ten[1][2]

学生3 ten[2][0] ten[2][1] ten[2][2]

学生4 ten[3][0] ten[3][1] ten[3][2]

学生5 ten[4][0] ten[4][1] ten[4][2]

#include <stdio.h> #define GAKUSEI 5 /*学生数*/ #define KAMOKU 3 /*科目数*/ int main(void) { int ten[GAKUSEI][KAMOKU]= { /*得点用 2次元配列*/ { 80, 60, 70 }, { 90, 90, 85 }, { 30, 50, 30 }, { 60, 80, 70 }, { 50, 90, 40 } }; int sum[GAKUSEI]; /*各学生合計用配列*/ int g, k; /* 各学生の合計得点を計算 */ for( g=0 ; g<GAKUSEI ; g++ ) { sum[g] = 0; /*学生gの合計初期値 0*/ for( k=0 ; k<KAMOKU ; k++ ) { sum[g] += ten[g][k]; /*gさんの各科目得点*/ } } /* 結果の表示 */ printf("--------------------\n"); for( g=0 ; g<GAKUSEI ; g++ ) { printf("学生%dの合計得点:%3d\n", (g+1), sum[g] ); } return(0); }

-------------------- 学生 1の合計得点:210 学生 2の合計得点:265 学生 3の合計得点:110 学生 4の合計得点:210 学生 5の合計得点:180

学生数 科目数

Page 32: 情報ネットワーク導入ユニットⅠ( 言語) 演習(1 ...jun/languages/kait/dist...情報ネットワーク導入ユニットⅠ(C 言語) 演習問題 2 問題1-5.

情報ネットワーク導入ユニットⅠ(C 言語) 演習問題

32

例題 2 例題 1において各学生の各科目の得点はキーボードから読込むように変更しなさい.

#include <stdio.h> #define GAKUSEI 5 /*学生数*/ #define KAMOKU 3 /*科目数*/ int main(void) { int ten[GAKUSEI][KAMOKU]; /*得点用 2次元配列*/ int sum[GAKUSEI]; /*各学生合計用配列*/ int g, k; /* 各学生の各科目得点の入力 */ for( g=0 ; g<GAKUSEI ; g++ ) { printf("学生%dの得点入力\n", (g+1) ); for( k=0 ; k<KAMOKU ; k++ ) { printf(" 科目%d: ", (k+1) ); scanf("%d", &ten[g][k] ); /* scanf関数 */ } } /* 各学生の合計得点を計算 */ for( g=0 ; g<GAKUSEI ; g++ ) { sum[g] = 0; /*学生gの合計初期値0*/ for( k=0 ; k<KAMOKU ; k++ ) { sum[g] += ten[g][k]; /*gさんの各科目得点*/ } } /* 結果の表示 */ printf("--------------------\n"); for( g=0 ; g<GAKUSEI ; g++ ) { printf("学生%dの合計得点:%3d\n", (g+1), sum[g] ); } return(0); }

学生 1の得点入力 科目 1: 80 科目 2: 60 科目 3: 70 学生 2の得点入力 科目 1: 90 科目 2: 90 科目 3: 85 学生 3の得点入力 科目 1: 30 科目 2: 50 科目 3: 30 学生 4の得点入力 科目 1: 60 科目 2: 80 科目 3: 70 学生 5の得点入力 科目 1: 50 科目 2: 90 科目 3: 40 ------------------- 学生 1の合計得点:210 学生 2の合計得点:265 学生 3の合計得点:110 学生 4の合計得点:210 学生 5の合計得点:180