最終更新日:

演習問題の解答例と解説

解答に掲載されているプログラムは、解答の一例です。これでなければならないという問題はほとんどありません。自分で作ったプログラムで、同じ結果になるのであれば、それはそれで「正解」です。

Chapter 4

練習問題4-3

この演習では、とにかく変数を作って代入をすることをやってもらいたいというところですが、微妙に難しいでしょう。1つは、dやeはlong型でないとエラーが出るということ。そして、最後の3459÷789を少数で結果を出すための記述でしょう。ちなみに、h = f / g; にすると、整数の割り算を行い、hは4.0になります。h = (float)f / g; にすると変数fをfloat型に変換して計算するので、floatとintの計算なので、結果はfloatとなり正しい結果になります。gのfloatへのキャストは不要と思うかもしれませんが、これについてはないといけないとも言えないところで、必要か不要かはケースバイケースです。この問題だと、どちらでもいいでしょう。なお、h = (float)(f / g); にすると結果は4.0になりますが、これは割り算結果を単にfloatにしただけなので、正しくありません。

    int num = 789;
    System.out.println( num );
    long digit = 3450;
    System.out.println( digit );
    long d = digit / num;
    System.out.println( d );
    long e = digit % num;
    System.out.println( e );
    num = num * 2;
    System.out.println( num );
    System.out.println( d );
    d = digit / num;
    System.out.println( d );
    int f = 3459, g = 789;
    double h = (double)f / (double)g;
    System.out.println( h );

練習問題4-4

プログラム変数num変数digit変数d変数e
int num = 789;789
System.out.println( num );
long digit = 3450;3450
System.out.println( digit );
long d = digit / num;4
System.out.println( d );
long e = digit % num;294
System.out.println( e );
num = num * 2;1578
System.out.println( num );
System.out.println( d );
d = digit / num;2
System.out.println( d );;

Chapter 5

練習問題5-1

「ハイ」という文字列を変数aから作ります。このように直接表示してもいいですが、一度変数に代入してから表示してもいいでしょう。

String a = "チューハイ", b = "梅", c = "レモン";
System.out.println( b + a );
System.out.println( c + a );
System.out.println( c + a.substring(3,5) );

練習問題5-2

このようなプログラムは一般には作りませんが、練習問題ということでお許しを。こうした処理は次の章の「繰り返し」を使って行うのが普通です。

String a = "情報処理技術";
String s1,s2,s3,s4,s5,s6;
s1 = a.substring(0,1);
s2 = a.substring(1,2);
s3 = a.substring(2,3);
s4 = a.substring(3,4);
s5 = a.substring(4,5);
s6 = a.substring(5,6);
System.out.println( s1 + "-" + s2 + "-" + s3 + "-" + s4 + "-" + s5 + "-" + s6);

練習問題5-3

StringBufferのsbの文字列を処理します。途中に文字を入れるのはinsertですが、それを2回適用しています。もちろん、2つ目の引数の「8」は「11」でもかまいません。

StringBuffer sb = new StringBuffer( "プログラミングはむずかしい" );
String s = "もっと";
sb.insert( 8, s );
sb.insert( 8, s );
System.out.println( sb.toString() );

Chapter 6

練習問題6-1

int number = 31;
if ( number % 2 == 1 )
	System.out.println( number + "は奇数です" );
else
	System.out.println( number + "は偶数です" );

練習問題6-2

String s = "冬は寒いのは当たり前";
for ( int i = 0 ; i < s.length() ; i++ )
	System.out.println( s.substring( i, i+1 ) );

練習問題6-3

int data[] = { 3,56,34, 9 };
int sum = 0;
for ( int i = 0 ; i < data.length ; i++ )
	sum += data[i];
System.out.println( "合計=" + sum + " 平均=" + ((float)sum/data.length));

Chapter 7

練習問題7-1

int upperLimit = 100;
int counter = 0;
for ( int i = 1 ; i <= upperLimit ; i++ )
	if ( ( i % 3 == 0) || ( i % 5 == 0 ) )
		counter ++;
System.out.println( counter + "個あります。" );

練習問題7-2

int upperLimit = 100;
int counter = 0;
for ( int i = 1 ; i <= upperLimit ; i++ )
	if ( ( i % 3 == 0) && ( i % 5 == 0 ) )
		counter ++;
System.out.println( counter + "個あります。" );

練習問題7-3

1〜9のかけ算は、81通りありますが、3×4と4×3を重複して数えないというのをどうすればいいかです。かけられる数iとかける数jを、それぞれforで1〜9と変化させ、入れ子のループにすれば、すべてのiとjのパターンは作れます。ここで、i >= jのものの個数を数えればいいということがポイントになります。

int counter = 0;
for ( int i = 1 ; i <=9 ; i++ )
	for ( int j = 1 ; j <= 9 ; j++ )
		if ( i >= j )
			counter++;
System.out.println( counter + "個覚えればいい。" );

練習問題7-4

この問題の回答はいろいろ可能です。ここでは少し発展させて、3から100までの数値が素数かどうかを判断させてみました。ここでは、2の倍数なら明らかに素数ではないので、その判断を入れ、2の倍数ではないのなら、3〜その数の半分までの数で割り切れる数字があるかどうかを調べることにしましたが、+= 2で、変数iは3,5,7,…のように奇数を順番にチェックするようになります。これも1つの効率化のやり方ですが、ここまでしなくても、まずは2から順番にチェックするとうことでもかまいません。boolean型変数のisPrimeの使い方をよく考えてください。ある数numberの判断で、まずは最初にtrueにしますが、割り切れる数があったときにfalseにすることで、素数かどうかの判断が可能になるというわけです。なお、素数の厳密な定義では、1は素数かどうかなどの話があります。この判断プログラムだと、2は素数と判断しないので、その意味では完全ではありません。ソフトウエアは常に完全でなくてもいいとも言えます。言い換えれば完全を目指すとかなり大変なことになったり実現不可能だったりします。それをバグというか仕様と言うかはケースバイケースですが、自分の作ったプログラムの限界について把握しておくことが大切です。

int number = 67;		//67という数字に意味はないです
for ( number = 3 ; 100 > number ; number++){	//numberを3以上順番に調べる
	boolean isPrime = true;
	if ( number % 2 == 0 )
		isPrime = false;
	else{
		for ( int i = 3 ; i < (number / 2) ; i += 2 ){
			if ( number % i == 0 ){
				isPrime = false;
				break;
			}
		}
	}
	if ( isPrime )
		System.out.println( number + "は素数です。" );
	else
		System.out.println( number + "は素数ではありません。" );
}

練習問題7-1〜4

public class Answers {
	public static void main(String[] args) {
        // Check for Ex.8-1
		System.out.println(threeTopCharacters("Donna", "Namaeni", "Shitennen"));

        // Check for Ex.8-2
		System.out.println(round(123.6789, 2));
		System.out.println(round(123.6712, 2));
		System.out.println(round(123.6712, 0));
		System.out.println(round(123.1712, 0));
		System.out.println(round(163.1712, -2));
		System.out.println(round(-123.6789, 2));
		System.out.println(round(-123.6712, 2));
		System.out.println(round(-123.6712, 0));
		System.out.println(round(-123.1712, 0));
		System.out.println(round(-163.1712, -2));

        // Check for Ex.8-3,4
		int a[] = { 6,2,9,34,66,12,7};
		printArray(sorting(a,true));
		printArray(sorting(a,false));
		int b[] = { 6,2,9,34,66,12,7,11,14,4,34,67};
		printArray(sorting(b,true));
		printArray(sorting(b,false));
	}

    // Ex.8-1
	static String threeTopCharacters(String a, String b, String c) {
		String result = a.substring(0, 1) + b.substring(0, 1)
				+ c.substring(0, 1);
		return result;
	}

    // Ex.8-2
	static double round(double number, int digit) {
		double absNumber = (number > 0) ? number : -number;
		double sign = (number > 0) ? 1 : -1;
		long power = 1;
		int absDigit = (digit > 0) ? digit : -digit;
		for (int i = 0; i < absDigit; i++) {
			power *= 10;
		}
		double shifted = (digit > 0) ? absNumber * power : absNumber / power;
		long integerPart = (long) (shifted + 0.5);
		if (digit > 0) {
			return (double) (sign * integerPart / power);
		} else {
			return (double) (sign * integerPart * power);
		}
	}

    // Ex.8-3,4
	static int[] sorting(int[] array, boolean ascend) {
		for (int i = 0; i < array.length - 1; i++) {
			int candidate = i;
			for (int j = i + 1; j < array.length; j++) {
				if ((!ascend && array[candidate] < array[j])
						|| (ascend && array[candidate] > array[j])) {
					candidate = j;
				}
			}
			int temp = array[candidate];
			array[candidate] = array[i];
			array[i] = temp;
		}
		return array;
	}

	static void printArray(int[] array) {
		for (int i = 0; i < array.length; i++) {
			if (i != 0) {
				System.out.print(" ,");
			}
			System.out.print(array[i]);
		}
		System.out.println();
	}
}