2.処理の繰り返し
Copyright(C) 29Aug2013 coskx
このページでは「処理の繰り返し」の記述方法を解説する。
ここで修得して欲しい内容は次の通りである。
1.forループの基本的な制御構造がわかりプログラムを追跡できる。
2.forループにおけるカウンタ変数の役割が理解できる。(ループを抜け出したときのカウンタ変数の値もわかる)
3.2重のforループを追跡できる。
4.forループを用いた連続加算プログラムが書ける。
5.whileループを追跡できる。
6.do-whileループを追跡できる
8.ループ中の合計計算,変数順送り操作が追跡できる。
9.ループのプログラムが書ける。
10.定回数二重ル?ププログラムが書ける。
11.内側ループ回数が外側ループ回に応じて変わる二重ループプログラムが書ける
このページは以下の3つの項目で構成されている。
2.1 forループ
2.2 二重forループ
2.3 forループを用いた連続加算
2.4 whileループ
2.5 do-whileループ
2.1 forループ
同じような処理を何度も繰り返す場合には繰り返しの記述が使われる。特にプログラミング時に何回繰り返すのかわかっている場合にはforループで記述されることが多い。
List 2.1.1 forループ |
/*For0.java by Kosaka*/ |
実行結果 |
A child says, "The king is naked." A child says, "The king is naked." A child says, "The king is naked." A child says, "The king is naked." A child says, "The king is naked." |
補足 |
for (i=0; i<5
;i++) このプログラムはつぎのプログラムと同等の動作をしている。 For0() { |
同じ作業をするなら,for文を使うと,読みやすいプログラムになる。
通常の日本語の言い回しとの変換は次のように考えられる。
日本語での表現の例 | Java言語風表現の例 | Java言語のキーワードを用いた表現の例 |
運動場を5周廻りなさい。 |
次のことを5回行ないなさい{ |
int i; |
「王様は裸だ」と5回表示しなさい。 |
次のことを5回行ないなさい{ |
int i; |
練習2.1 |
次の「List 2.1.2」は繰り返し処理中で繰り返しを制御する変数「i」の値を表示させたものである。
List 2.1.2 forループ |
/*For1.java by Kosaka*/ |
実行結果 |
(0) A child says, "The king is naked." (1) A child says, "The king is naked." (2) A child says, "The king is naked." (3) A child says, "The king is naked." (4) A child says, "The king is naked." |
補足 |
1.「i++」の意味 2.繰り返し処理の仕組み
3.繰り返し処理のイメージ 4.記述上の注意
|
for文を導入する考え方(この考え方は,自分でプログラムを書く際に大事)
ループ回数の指定の仕方 どのような指示方法でも困らないようにしよう。
練習2.2 |
次のプログラムの実行結果を予想しなさい。
List 2.1.3 forループのプログラム | ||
/*For11.java by Kosaka*/ | ||
実行結果の予想1 | 実行結果の予想2 | 実行結果の予想3 |
(0) A child says, "The king is
naked." (1) A child says, "The king is naked." (2) A child says, "The king is naked." (3) A child says, "The king is naked." (4) A child says, "The king is naked." |
(0) A child says, "The king is
naked." (1) A child says, "The king is naked." (2) A child says, "The king is naked." (3) A child says, "The king is naked." (4) A child says, "The king is naked." (5) A child says, "The king is naked." |
0 A child says, "The king
is naked." 1 A child says, "The king is naked." 2 A child says, "The king is naked." 3 A child says, "The king is naked." 4 A child says, "The king is naked." 5 A child says, "The king is naked." |
追加説明 「i<=5」は数学では「i≦5」である。「i=<5」の表現は許されない。(不等号,等号の順) |
練習2.3 |
List 2.1.4 forループのプログラム | ||
/*For12.java by Kosaka*/ | ||
実行結果の予想1 | 実行結果の予想2 | 実行結果の予想3 |
(0) A child says, "The king is
naked." (1) A child says, "The king is naked." (2) A child says, "The king is naked." (3) A child says, "The king is naked." (4) A child says, "The king is naked." just after the loop i=4 |
(0) A child says, "The king is
naked." (1) A child says, "The king is naked." (2) A child says, "The king is naked." (3) A child says, "The king is naked." (4) A child says, "The king is naked." just after the loop i=5 |
(0) A child says, "The king is
naked." (1) A child says, "The king is naked." (2) A child says, "The king is naked." (3) A child says, "The king is naked." (4) A child says, "The king is naked." just after the loop i=0 |
課題2 その1 |
---|
(1)x,x2,x3の表を1≦x≦100で出力するプログラムを作りなさい。 (p02ex01.java)
変数xをカウンタとするforを使ったプログラムとし,変数はx,x2(x2の格納用),x3(x3の格納用)の3つだけを用いなさい。x2,x3はxをもとにして作りなさい。
またprintf文はforループの前に1つ,forループの中に1つだけ使いなさい。
forループ中のprintf文は「printf("%3d
%5d %7d\n",x,x2,x3);」にすること。
x x^2 x^3 |
(2)x,y(y= 5x),y2,y3,y4の表を1≦x≦100で出力するプログラムを作りなさい。(p02ex02.java)
変数xをカウンタとするforを使ったプログラムとし,変数はx,y,y2(y2の格納用),y3(y3の格納用),y4(y4の格納用)の5つだけを用いなさい。yはxから算出し,y2,y3,y4はyをもとにして算出しなさい。
またprintf文はforループの前に1つ,forループの中に1つだけ使いなさい。
forループ中のprintf文は「printf("%3d
%3d %6d %9d
%12d\n",x,y,y2,y3,y4);」にすること。
実行結果をよく見ると変なことに気づくかもしれない。
どうして変になるのか友人と話し合い考察しなさい。
(ヒント int型整数で扱うことのできる値には限りがある)
x
y y^2 y^3 y^4 |
(3)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中でxをもとにして,y1,y2,y3,y4を計算し次の
表を作りなさい。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。forループ中のprintf文は
「printf("%4d
%4d %4d %4d
%6d\n",x,y1,y2,y3,y4);」にすること。
(p02ex03.java)
ただし,xの範囲は1≦x≦100としなさい。
ヒント y4の計算ではxの値を1,2,3,4・・・と変化させると5*x*xの値はどのように変化するか考えなさい。
x
y1 y2 y3 y4 |
(4)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中でxをもとにして,y1,y2,y3を計算し次の表を作りなさい。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。(p02ex04.java)
ただし,xの範囲は0≦x≦100としなさい。
ヒント xの値を1,2,3,4・・・と変化させると「x%3」と「x%4」の値はどのように変化するか考えなさい。
x y1 y2 y3
0 0 0 0
1 1 1 1
2 0 2 2
3 1 0 3
4 0 1 0
5 1 2 1
6 0 0 2
7 1 1 3
8 0 2 0
9 1 0 1
:
(5)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中にy1,y2,y3を作り次の表を作りなさい。y1は2回,y2
は3回,y3は4回同じ値を繰り返している。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。(p02ex05.java)
ただし,xの範囲は0≦x≦100としなさい。
ヒント xの値を1,2,3,4・・・と変化させると「x/3」と「x/4」の値はどのように変化するか考えなさい。
x y1 y2 y3
0 0 0 0
1 0 0 0
2 1 0 0
3 1 1 0
4 2 1 1
5 2 1 1
6 3 2 1
7 3 2 1
8 4 2 2
9 4 3 2
:
2.2 二重forループ
「List
2.2.1」はループ中にもう1つループがある例である。
List 2.2.1 「10この「*」を書いて改行する」という作業を5回行うプログラム | |
/*Multiloop.java by Kosaka*/ | |
実行結果 | |
********** ********** ********** ********** ********** | |
カッコの対応を確認しよう。 各行の先頭がどこから始まっているのか,その規則をみつけなさい。 「字下げ,インデント」の規則 | |
/*Multiloop.java by Kosaka*/
} |
二重ループの通常の日本語の言い回しとの変換は次のように考えられる。
日本語での表現の例 | Java言語風表現の例 | Java言語のキーワードを用いた表現の例 |
運動場を5周廻りなさい。 その際,運動場を1周廻るたびに 「私は無敵だ」と3回唱えなさい。 (結局「私は無敵だ」は15回唱え ることになる) |
次のことを5回行ないなさい{ |
int i,j; |
『「*」を10個書き,改行する』 という作業を5回行ないなさい |
次のことを5回行ないなさい{ |
int i,j; |
練習2.4 |
List 2.2.2 | ||
/*Multiloop2.java by Kosaka*/ | ||
実行結果の予想1 | 実行結果の予想2 | 実行結果の予想3 |
* ** *** **** ***** |
** *** **** ***** ****** |
********** ********** ********** ********** ********** |
練習2.5 |
List 2.2.3 | ||
/*Multiloop3.java by Kosaka*/ | ||
実行結果の予想1 | 実行結果の予想2 | 実行結果の予想3 |
/**** //*** ///** ////* ///// |
***** / **** // *** /// ** //// * |
***** /**** //*** ///** ////* |
上の2つのプログラムはどのようにして出来たのか考えてみよう。自分でこれらのプログラムを考える時,あるいは課題の作業中に行き詰まった時は ここ を見なさい。 26May2003追加
Javaのプログラミングスタイル プログラム中に中カッコ始まり「{」があると,字下げ位置が1段深まる。 二重ループの場合 public class XXXXX {
中カッコ終わり「}」により,字下げ位置が元に戻る。
public static void main(String[] args) {
XXXXX mainprg = new XXXXX();
}
XXXXX() {
}
プログラム本体を書く位置は,行頭をこれに揃える
:
for ( i=0; i<10;
i++) {
}
:
繰り返し作業を書く位置は,行頭をこれに揃える
4文字分右にずれる
:
繰り返し作業を抜け出したら,元の位置に戻る
:
:
}
public static void main(String[] args) {
XXXXX mainprg = new XXXXX();
}
XXXXX() {
}
プログラム本体を書く位置は,行頭をこれに揃える
:
for ( i=0; i<10;
i++) {
}
:
繰り返し作業を書く位置は,行頭をこれに揃える
4文字分右にずれる
:
for
( j=0; j<10; j++) {
}
:
繰り返し作業を書く位置は,行頭をこれに揃える
さらに4文字分右にずれる
:
繰り返し作業を抜け出したら,元の位置に戻る
:
繰り返し作業を抜け出したら,元の位置に戻る
:
:
}
課題2 その2 |
---|
(6)正整数nをキーボードから入力し,nに応じて「*」で以下の模様を描くプログラムを作成せよ。nは79まで対応しなさい。(p02ex06.java)
検証はn=1,2,3,4,5,79で行ないなさい。
n=1
n=2
n=3
n=4
n=5
*
**
*****
***
*******
****
****
*********
*****
*****
*****
*****
(7)正整数nを入力し,nに応じて「*」で以下の模様を描くプログラムを作成せよ。nは79まで対応しなさい。(p02ex07.java)
検証はn=1,2,3,4,5,79で行ないなさい。 ヒント
n=1
n=2
n=3
n=4
n=5
*
**
****
**
*****
***
**
******
****
***
**
*
(8)2つの正整数rowとcolumnをキーボードから読み込み,「*」を用いて縦row個,横column個の長方形を描くプログラムを作りなさい。(p02ex08.java)
検証は以下の2例を行ないなさい。
<<実行例1>>
row = 3
column= 5
*****
*****
*****<<実行例2>>
row = 6
column= 7
*******
*******
*******
*******
*******
*******
(9)奇数(正整数で2で割ったあまりが1のもの)nを入力し,nに応じて「*」「-」で以下の模様を描くプログラムを作りなさい。
nは79まで対応しなさい。(p02ex09.java)
検証はn=1,3,5,7,9,79で行ないなさい。
ヒント
n=1 |
n=3 |
n=5 |
n=7 |
n=9 |
* |
-*- |
--*-- |
---*--- |
----*---- |
(10)奇数(正整数で2で割ったあまりが1のもの)nを入力し,nに応じて「*」「-」で以下の模様を描くプログラムを作りなさい。nは79まで対応しなさい。
(p02ex10.java)
検証はn=1,3,5,7,9,79で行ないなさい。
n=1 |
n=3 |
n=5 |
n=7 |
n=9 |
* |
-*- |
--*-- |
---*--- |
----*---- |
(11)九九の表を作りなさい。適当に空白を入れて乱れがないようにして見やすくしなさい。(p02ex11.java)
1 2 3 4 ..
1 1 2 3 4 ..
2
2 4 6 8 ..
3 3 6 9 12 ..
4
4 8 12 16 ..
: : : : :
(12)英国には12進数の影響で九・九ではなく十二・十二までの掛算表がある。これを作りなさい。適当に空白を入れて乱れがないようにして見やすくしなさい。(p02ex12.java)
2.3 forループを用いた連続加算 |
---|
「List
2.3.1」は1+2+3+...+100と12+22+32+...+1002を求める計算である。
List 2.3.1 |
/*1から100までの単純和と1から100までの平方和*/ |
実行結果 |
i,sum,sum2=1 1 1 |
変数の初期化を忘れた失敗の例 27June2003追加
forループに関する補足(疑問点と誤りの例) 14May2003追加
課題2 その3 |
---|
(13)キーボードから10この正整数値を読み込み,合計値を表示するプログラムを作りなさい。ただ
し,キーボードから読み込んだ値はint型変数xにしまわれるものとし,変数はこのxと回数を数えるint型変数countと合計値をしまうint型変数
sumのみを用いることとする。(p02ex13.java)
1,2,3,4,..
..8,9,10を入力してプログラム動作を検証しなさい。
また,11,12,13,14,..
..18,19,20を入力してプログラム動作を検証しなさい。
レポートの実行結果には2つの例を示しなさい。
(14)キーボードから10この正整数値を読み込み,合計値と平均値(小数第1位まで)を表示するプログラムを作りなさい。(p02ex14.java)
1,2,3,4,..
..,8,9,10を入力して5.5になるかどうか検証しなさい。
また11,12,13,14,..
..,18,19,20を入力して15.5になるかどうか検証しなさい。
レポートの実行結果には2つの例を示しなさい。
2.4 whileループ
キーボードから読み込んだ正整数値を2で繰り返し割ることを考える。割り切れる回数を求めるプログラムを考えよう。
例えば正整数値12は(12→6→3)2回,2で割り切ることが出来る。16は(16→8→4→2→1)4回,9は0回である。
2で割る動作は繰り返されるが,何回繰り返されるかは,プログラミング時には決めることが出来ないため,for文では
書くことができない。
ある条件が満たされている間,特定の処理を繰り返すという表現は,while文になる。
人間なら,2通りのやり方があるだろう。
(1)1つは2での割り算を紙に書いていき,割り切れなくなったときに,それまで何回割り算を行なったかを数えればよい。
(2)もう1つは割り算を行ないながら,現在何回目の割り算かを数え,覚えておく。割り切れなくなった時,覚えていた回数が答えである。
コンピュータでこの作業を行なうときは,(2)のやり方が適している。人間が割り算回数を覚えておくことに対応させて,現在何回目の割り算かを覚えておく変数を導入し,最初に0を与え,割り算が可能だった時に1を加えればよい。
回数を数える用途に使われる変数はカウンタと呼ばれ,プログラミングでは大変重要な役割を果たす。
割り切れたかどうかは,割り算のあまりを出す演算を用いて,あまりが0であるかどうかを確かめるとよい。
むずかしいと感じた時は自分がコンピュータになったつもりで1行1行実行し,
各変数がどうなったか,継続条件判断は真か偽かを絶えず,判断しながら読み
進むこと。
List 2.4.1 numberは2で割ることが何回出来るか | ||||||
/*numberは2で割ることが何回出来るか*/ | ||||||
実行結果 (実行例を3つ示している) | ||||||
正整数を入力してください 120 | ||||||
説明 | ||||||
1.「(n%2==0)」はnを2で割ったあまりが0だったらの意味 2.繰り返し処理の仕組み この部分の制御の流れは次の順番で行なわれる。
|
このプログラムはどのようにして出来たのか考えてみよう。自分でこのプログラムを考える時,あるいは課題の作業中に行き詰まった時は ここ を見なさい。 26May2003追加
練習2.6 |
List 2.4.2 | ||
/*1000以下のフィボナッチ数列*/ | ||
実行結果の予想1 | 実行結果の予想2 | 実行結果の予想3 |
1:1 2:1 3:2 4:3 5:5 6:8 7:13 8:21 9:34 10:55 11:89 12:144 13:233 14:377 15:610 16:987 |
1:1 |
1:1 2:1 3:2 4:3 5:5 6:8 7:13 8:21 9:34 10:55 11:89 12:144 13:233 14:377 15:610 16:987 17:1597 |
フィボナッチ数列とは次のような数列のことです
第1項と第2項の値が1で,第3項以降の項がそれ以前の2つの項の和である数列
a1 = 1, a2 = 1, an = an-1 + an-2
2.5 do-whileループ
「2.4.1」の例で,「正整数を入力してください」としているが,人間が誤って負の整数を入力しても,再入力を強制するような仕組みを考えよう。人間は再入力を強制されても,何回も負の整数を入力するかもしれないので,粘り強く再入力を強制する仕組みにしよう。
このように,何か作業があって,その結果もう一回繰り返すかどうか判断する形式の繰り返し構造ではdo-while文を使う。
List 2.5.1 |
/*numberは何回2で割ることが出来るか*/ |
実行結果 |
正整数を入力してください -120 |
説明 |
繰り返し処理の仕組み 注意 while(?)の直後に「;」が必要 |
************* 余談 ************* お酒の飲み方とdo-whileループ
お酒を飲む時はwhileループで飲みましょう。(成人に達してからです。) |
練習2.7 |
List 2.5.2 | ||
/*Dowhile1.java by Kosaka*/ | ||
実行結果の予想1 | 実行結果の予想2 | 実行結果の予想3 |
x=6 y=15 | x=5 y=14 | x=15 y=24 |
2.6 「処理の繰り返し」のまとめ |
---|
各ループの記述の特徴は次のとおりである。
ループの記述の種類 | ループ回数 | 1回目の処理 |
forループ | プログラミングあるいはループ起動の時点で既知 | 1度も処理を行なわないこともある |
whileループ | プログラミングあるいはループ起動の時点では未定 | 1度も処理を行なわないこともある |
do-whileループ | プログラミングあるいはループ起動の時点では未定 | 少なくとも1回は処理を行なう |
特に,whileループとdo-whileループの違いを次の2つの例で示す。
例 List 2.5.1 より
do { number=getInt("正整数を入力してください "); } while (number<=0); |
この例では,必ず1回は処理を行なうはずなのでdo-whileループが使われる |
例 List 2.4.1 より
while (n%2==0) { n=n/2; counter++; System.out.printf("n=%d counter=%d\n",n,counter); } |
この例では,1回も処理が行なわれない可能性があるのでwhileループが使われる (対象が奇数だと1度も2で割リきることが出来ない) |
繰返し処理記述の時の考え方 ここを読んでください
2.7 追加説明 |
---|
ループに関する内容で説明してなかった内容を追加説明する
内容 | |
1.forループ |
次のようなfor文がある |
2.forループとwhileループ |
次の2つのループは同じ意味となるが,この場合は繰り返し回数指定ループなので
|
3.whileループとforループ |
次の2つのループは同じ意味となるがこの場合は条件ループなので
|
4.do-whileループとwhileループ |
次の2つのループは同じ意味となるがこの場合は後ろ判断ループなので
|
5.無限ループ |
条件記述の部分で,Java言語の文法では,
次の例も無限ループになるが,while利用の記述の方が明確と思われる
|
6.ループと緊急脱出 嫌われ者の「break」による脱出 |
繰り返し処理中に,ある条件が生じたら緊急に繰り返しから抜け出さなければならないことがある。
のように書くが,これは
と同じである。繰り返し処理の出口はループの先頭か最後であるスタイルが読みやすい。 前者の表現の場合,コメントをつけて次のように目立たせるのがよい。
なお
ならば,ループに入った直後の脱出なので
と書くべきであるし,また
ならば,ループの終端における脱出なので
と書くべきである。 |
課題2 |
---|
(1)x,x2,x3の表を1≦x≦100で出力するプログラムを作りなさい。 (p02ex01.java) (再掲)
変数xをカウンタとするforを使ったプログラムとし,変数はx,x2(x2の格納用),x3(x3の格納用)の3つだけを用いなさい。x2,x3はxをもとにして作りなさい。
またprintf文はforループの前に1つ,forループの中に1つだけ使いなさい。
forループ中のprintf文は「printf("%3d
%5d %7d\n",x,x2,x3);」にすること。
x x^2 x^3 |
(2)x,y(y= 5x),y2,y3,y4の表を1≦x≦100で出力するプログラムを作りなさい。(p02ex02.java) (再掲)
変数xをカウンタとするforを使ったプログラムとし,変数はx,y,y2(y2の格納用),y3(y3の格納用),y4(y4の格納用)の5つだけを用いなさい。yはxから算出し,y2,y3,y4はyをもとにして算出しなさい。
またprintf文はforループの前に1つ,forループの中に1つだけ使いなさい。
forループ中のprintf文は「printf("%3d
%3d %6d %9d
%12d\n",x,y,y2,y3,y4);」にすること。
実行結果をよく見ると変なことに気づくかもしれない。
どうして変になるのか友人と話し合い考察しなさい。
(ヒント int型整数で扱うことのできる値には限りがある)
x
y y^2 y^3 y^4 |
(3)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中でxをも
とにして,y1,y2,y3,y4を計算し次の表を作りなさい。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。for
ループ中のprintf文は「printf("%4d
%4d %4d %4d
%6d\n",x,y1,y2,y3,y4);」にすること。
(p02ex03.java) (再掲)
ただし,xの範囲は1≦x≦100としなさい。
ヒント y5の計算ではxの値を1,2,3,4・・・と変化させると15*x*xの値はどのように変化するか考えなさい。
x
y1 y2 y3 y4 |
(4)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中でxをもとにして,y1,y2,y3を計算し次の表を作りなさい。printf文はforループの前に1つ,forループの中に1つだけ使いなさい。(p02ex04.java) (再掲)
ただし,xの範囲は0≦x≦100としなさい。
ヒント xの値を1,2,3,4・・・と変化させると「x%3」と「x%4」の値はどのように変化するか考えなさい。
x y1 y2 y3
0 0 0 0
1 1 1 1
2 0 2 2
3 1 0 3
4 0 1 0
5 1 2 1
6 0 0 2
7 1 1 3
8 0 2 0
9 1 0 1
:
(5)int型変数xをループカウンタとしてforを使ったプログラムで,ループ中に
y1,y2,y3を作り次の表を作りなさい。y1は2回,y2は3回,y3は4回同じ値を繰り返している。printf文はforループの前に1
つ,forループの中に1つだけ使いなさい。(p02ex05.java) (再掲)
ただし,xの範囲は0≦x≦100としなさい。
ヒント xの値を1,2,3,4・・・と変化させると「x/3」と「x/4」の値はどのように変化するか考えなさい。
x y1 y2 y3
0 0 0 0
1 0 0 0
2 1 0 0
3 1 1 0
4 2 1 1
5 2 1 1
6 3 2 1
7 3 2 1
8 4 2 2
9 4 3 2
:
(6)正整数nをキーボードから入力し,nに応じて「*」で以下の模様を描くプログラムを作成せよ。nは79まで対応しなさい。(p02ex06.java)(再掲)
検証はn=1,2,3,4,5,79で行ないなさい。
n=1
n=2
n=3
n=4
n=5
*
**
*****
***
*******
****
****
*********
*****
*****
*****
*****
(7)正整数nを入力し,nに応じて「*」で以下の模様を描くプログラムを作成せよ。nは79まで対応しなさい。(p02ex07.java)(再掲)
検証はn=1,2,3,4,5,79で行ないなさい。 ヒント
n=1
n=2
n=3
n=4
n=5
*
**
****
**
*****
***
**
******
****
***
**
*
(8)2つの正整数rowとcolumnをキーボードから読み込み,「*」を用いて縦row個,横column個の長方形を描くプログラムを作りなさい。(p02ex08.java)(再掲)
検証は以下の2例を行ないなさい。
<<実行例1>>
row = 3
column = 5
*****
*****
*****<<実行例2>>
row = 6
column = 7
*******
*******
*******
*******
*******
*******
(9)奇数(正整数で2で割ったあまりが1のもの)nを入力し,nに応じて「*」「-」で以下の模様を描くプログラムを作りなさい。
nは79まで対応しなさい。(p02ex09.java)(再掲)
検証はn=1,3,5,7,9,79で行ないなさい。
ヒント
n=1 |
n=3 |
n=5 |
n=7 |
n=9 |
* |
-*- |
--*-- |
---*--- |
----*---- |
(10)奇数(正整数で2で割ったあまりが1のもの)nを入力し,nに応じて「*」「-」で以下の模様を描くプログラムを作りなさい。nは79まで対応しなさい。
(p02ex10.java)(再掲)
検証はn=1,3,5,7,9,79で行ないなさい。
n=1 |
n=3 |
n=5 |
n=7 |
n=9 |
* |
-*- |
--*-- |
---*--- |
----*---- |
(11)九九の表を作りなさい。適当に空白を入れて乱れがないようにして見やすくしなさい。(p02ex11.java) (再掲)
1 2 3 4 ..
1 1 2 3 4 ..
2
2 4 6 8 ..
3 3 6 9 12 ..
4
4 8 12 16 ..
: : : : :
(12)英国には12進数の影響で九・九ではなく十二・十二までの掛算表がある。これを作りなさい。適当に空白を入れて乱れがないようにして見やすくしなさい。(p02ex12.java) (再掲)
(13)キーボードから10この正整数値を読み込み,合計値を表示するプログラムを作りなさい。ただ
し,キーボードから読み込んだ値はint型変数xにしまわれるものとし,変数はこのxと回数を数えるint型変数countと合計値をしまうint型変数
sumのみを用いることとする。(p02ex13.java)
1,2,3,4,..
..8,9,10を入力してプログラム動作を検証しなさい。
また,11,12,13,14,..
..18,19,20を入力してプログラム動作を検証しなさい。
レポートの実行結果には2つの例を示しなさい。
(14)キーボードから10この正整数値を読み込み,合計値と平均値(小数第1位まで)を表示するプログラムを作りなさい。(p02ex14.java)
1,2,3,4,..
..,8,9,10を入力して5.5になるかどうか検証しなさい。
また,11,12,13,14,..
..,18,19,20を入力して15.5になるかどうか検証しなさい。
レポートの実行結果には2つの例を示しなさい。
ヒント
(15)キーボードから複数個の正整数値を読み込み,合計値と平均値
(小数第1位まで)を表示するプログラムを作りなさい。ただし入力数値の個数はプログラミング時には決定していない。負整数が入力されたら入力値はもうな
くなったと判断することとし,負の数は計算には使用しないこととする。またデータは少なくとも1つは入力されるものとする。(p02ex15.java)
検証は1から10までの数字すべてを与え,合計値55,平均値5.5が表示されることを確かめること。
(「1,2,3,4,5,6,7,8,9,10,-1」(-1はデータ終わりの合図)を入力して確かめなさい。)
また,1から5までの数字すべてを与え,合計値15,平均値3が表示されることを確かめること。
(「1,2,3,4,5,-1」(-1はデータ終わりの合図)を入力して確かめなさい。)
レポートの実行結果には上記2つの例を示しなさい。
ヒント
(16)正整数を入力して,その正整数が何桁か求めるプログラムを作りなさい。ただし正整数は10億以下とする。また,プログラム1回の起動でこの
作業を何回も繰返し行なえるようにし,負の値が入力されたら直ちにプログラムが止まるようにしなさい。負の値入力後は直ちに繰り返し作業から抜け出すこと
(p02ex16.java)
(ヒント10で何回割れるか考える)
検証は,1桁の数,2桁の数,..,8桁の数で行ないなさい。
(17)2つの正整数の最大公約数を求める算法(アルゴリズム)として有名なユークリッドの互除法により,最大公約数を求めるプログラムを作りなさい。プログラムでは2つの正整数はキーボードから入力するものとする。(p02ex17.java)
検証は以下の例についてすべて行ないなさい。
ユークリッドの互除法は次のアルゴリズムとなる。
例えば2つの正整数が72と42の場合
72%42=30 → 42%30=12 → 30%12=6 →
12%6=0.....0になった時の割る数6が最大公約数である。
最初の置き方が逆でもOKである。すなわち
42%72=42 → 72%42=30 → 42%30=12 → 30%12=6 →
12%6=0.....0になった時の割る数6が最大公約数である。
例えば2つの正整数が256と72の場合
256%72=40 → 72%40=32 → 40%32=8 →
32%8=0....0になった時の割る数8が最大公約数である。
最初の置き方が逆でもOKである。すなわち
72%256=72 → 256%72=40 → 72%40=32 → 40%32=8 →
32%8=0....0になった時の割る数8が最大公約数である。
一般に2つの正整数がaとbの場合
a%b=c → b%c=d → c%d=e → ・・・ →
x%y=0になった時の割る数yが最大公約数である。
このアルゴリズムの表現方法はフィボナッチ数列に似ており,不要になった変数の使いまわしをする。
ヒント p,qに元の2数を入れて,このループに入り,このループから抜け出したとき,qが最大公約数となる
r=p%q; |