Report4


JavaアプリケーションとC言語のオリジナル問題作成と解答例

・課題……
     制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(なるべく短い行数で)を作成し、
     模範解答例を示せ。
     併せて、同様な動作を行うC言語のソースコードを示せ。

問題:キーボードから入力された数の、約数を出力するプログラムを作成せよ。

@ 解答プログラム

/*
* 作成日: 2004/11/20
*/

/**
* Test
*
* @author j04021
*/
import java.io.*;

public class Test {

  public static void main(String[] args) {
    System.out.print("数字を入力 => ");
     int x ;
     x = readNum() ;
      System.out.print( x + "={" ) ;
        for( int y=1; y<=x; y++ ) {
         if( x%y == 0 ) {
         System.out.print( y + "," );
         }
        }
    System.out.println( "}" );
  }
  public static int readNum() {
    byte b[] = new byte[100];
     try {
      System.in.read(b);
       return Integer.parseInt((new String(b)).trim());
     } catch(Exception e) {
      return 0;
     }
  }
}

@ 実行結果

数字を入力 => 8
8={1,2,4,8,}

数字を入力 => 20
20={1,2,4,5,10,20,}

数字を入力 => 100
100={1,2,4,5,10,20,25,50,100,}

数字を入力 => 60000
60000={1,2,3,4,5,6,8,10,12,15,16,20,24,25,30,32,40,48,50,60,75,80,96,100,
120,125,150,160,200,240,250,300,375,400,480,500,600,625,750,800,1000,1200,
1200,1250,1500,1875,2000,2400,2500,3000,3750,4000,5000,6000,7500,10000,
12000,15000,20000,30000,60000,}

数字を入力 => 10000000000
0={}

 

考察

import java.io.*;  /*入出力に関するものを提供する。import文*/

x = readNum();   /*readNum()によって読み込まれる数字xを宣言*/

System.out.print( x + "={" );   /*「xの値と"={"」を表示する*/

for( int y=1; y<=x; y++ ){    /*for文により、yの値が1からxの値になるまで、y++を繰り返す。*/

if( x%y == 0 ) {    /*今回の問題である約数を判別するには、割った余りの値が0になればいい*/

System.out.print( y + "," );   /*「yの値と","」を表示する*/

 

if,else if と switchの違い
if,else if
switch
   if(条件式1){
      文1(複数可)
     }else if(条件式2){
      文2(複数可)
     }else{
      文3(複数可)
   }
  switch(定数式){
   case 値: 文1;break;
   case 値: 文2;break;
   default: 文
  }
else ifはいくつでも記載することができ、 elseは省略可能です。 falseであれば次のelse ifの式を実行し、 式の結果がtrueであればそのelse ifブロック内の文を実行する。 if、else ifのブロックのいずれかの文が実行されるとif文全体の処理は終了します。 witch文の動作としてはまずswitchに 書かれている(式)を判別し合致するcase値の文を実行します。 もしすべてのcase値に合致しない場合は defaultに 記載されている文の実行を行います。 breakはcase文の後に置き、 そのcase文 の実行後、switch文全体の処理から抜け出すために使用します。

 

forとwhileの違い
for
while

     for(初期化式;ループ条件式;後処理の式){
           文(複数可)
     }

     while(ループ条件式){
        文
     }
まず繰り返し処理を行う前に初期化を実行し、 その後条件を判断しtrueであれば文を実行します。 条件にはブール型(true、false)の値を返す式があります。 条件を判断しtrueであれば文の実行を行い、 条件がtrueである限り繰り返し処理を行います。
まず初めに式の値を判別します。式はブール型(true、false) の値を返すものでないといけません。式の値が trueの場合、 文を実行します。文を実行した後、再び式の判別を行い、 値が trueである限り繰り返しを実行します。

 

キーボードから数字を入力するメソッド

 public static int readNum() {
  //戻り値の型がvoidのメソッドからは値を返せないのでintにしてあります。

 byte b[] = new byte[100];   //byte(整数)型の配列変数bを宣言。

 try {   //例外の対象となるコードブロックの構成。

 System.in.read(b);
  /*ユーザーがキーボードで入力した文字を読み込む。
   ここでは配列bに入力した文字を入れていっている。*/

 return Integer.parseInt((new String(b)).trim());
  /*return文 --- 返り値を計算して返す。
   new String(b) --- 指定した配列bが初期値である新規のStringを作成する。
   trim() --- Stringから先頭、末尾にある空白を削除する。
   Integer.parseInt() --- 文字列として表された整数をその値の整数に変換。*/


 }catch(Exception e) {
  /*特定の種類の例外を処理する文のブロック。
   このブロックにはException型またはそのサブクラスの型のオブジェクトを
   処理する文が含まれている。このブロックの文は名前eを使って例外オブジェクトを
   参照できる。*/

 

C言語..
 #include <stdio.h>

int main(void)

{
 int x,y;
 char a;
 a = 'y';

 while(a == 'y' || a == 'Y'){
  printf("数字を入力==> ");
  x=getchar();

  putchar(x);
  printf("={");
   for( y=1; y <= x; y++ ){
    if( x%y == 0 ) {
     printf("%d",y);
    }
   }
  printf(" }");
  printf("\n続けますか? ( Y or N )--> ");

  y=getchar();
  scanf("%c",&a);
  x=getchar();
 }
}

 

感想

   こういう課題は苦手で、何を作ればいいかわからず、結局、約数を出力する問題にした。

  入力した文字を読み取るというのは Java では初めてだったので、中々苦労した。あと、約数の式も、
 プログラム独特の物なので、これもまた苦労しました。

   というか、問題で、こういうプログラムを作れなどの問題がでてきたら、作れない自信がありますw。

 

参考文献

・独習Java第2版
        ジョセフ・オニール 著

・とほほのWWW入門