☆課題2☆

JavaアプリケーションとC言語のオリジナル問題作成と解答例{〜11/20(Mon)}。 制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(なるべく短い行数で)を作成し、模範解答例を示せ。併せて、同様な動作を行うC言語のソースコードを示せ。 課題のWebページは、必ずスタイルシートを用いて作成すること。



問題  1位~12位までの星座占いが出来るプログラムを作成せよ


模範解答例
javaアプリケーション
import java.util.Random;

public class Rep2 {
    public static void main (String[] args) {
        Random r = new Random();
        String[] seiza = {"おひつじ座", "おうし座", "ふたご座",
                          "かに座", "しし座", "おとめ座",
                          "てんびん座", "さそり座", "いて座",
                          "やぎ座", "みずがめ座", "うお座"};
        int[] rank = new int[12];
        int rando, temp;

        for(int i = 0; i < 12; i++) {
            rank[i] = i;
        }

        for(int i = 11; i >=0; i--) {
            rando = r.nextInt(i + 1);
            temp = rank[i];
            rank[i] = rank[rando];
            rank[rando] = temp;
 }
 		 System.out.println("Today's Ranking");
        for(int i = 0; i < 12; i++) {
            System.out.println(i + 1 +"位:" + seiza[rank[i]]);
        }

    }
}




c言語
#include
#include
#include

int main()
{
  char *seiza[] = { "おひつじ座", "おうし座", "ふたご座",
                    "かに座", "しし座", "おとめ座",
                    "てんびん座", "さそり座", "いて座",
                    "やぎ座", "みずがめ座", "うお座" };
  int rank[12];
  int random, lot, temp;
  int i;

  srand(time(NULL));

  for(i= 0; i < 12; i++) {
    rank[i] = i;
  }
 for(i = 11; i >=0; i--) {
    random = rand() % 12;
 temp = rank[i];
    rank[i] = rank[random];
    rank[random] = temp;
  }
  printf("Today's Ranking!\n");
  for(i = 0; i < 12; i++) {
    printf("%2d位:%s\n", i+1, seiza[rank[i]]);
  }
     return 0;
}


実行結果
Today's Ranking
1位:ふたご座
2位:おひつじ座
3位:しし座
4位:てんびん座
5位:うお座
6位:おうし座
7位:かに座
8位:やぎ座
9位:いて座
10位:みずがめ座
11位:おとめ座
12位:さそり座



〜考察〜

  • javaアプリケーション
  • importを使い、既存のパッケージjava.utilに含まれる Randomクラスを呼び出し、利用する。
    public static void main (String[] args) とは、c言語でいうmain関数みたいなものである。
    Rep2クラスの中にmain()という名前のメソッドを宣言する。
    javaアプリケーションでは、プログラムを実行する際は、main()メソッドから開始される。
    mainメソッドはargsという1つの引数(プログラム処理に使われる変数値)を受け取る。
    argsはStringオブジェクトの配列である。
    publicキーワードは、Rep2クラスの外部からこのコードを呼び出すことが
    出来ることを示すアクセス指定子である。
    staticキーワードは、このメソッドがRep2クラスのインスタンスではなく、
    Rep2クラスそのものに関連付けられていることを示している。
    voidキーワードは、このメソッドに戻り値がない、
    つまり、メソッドを実行した結果として返ってくるものが何もないことを示している。
    new演算子はオブジェクトを生成するときに使用する。
    new演算子の構文はclsName cbjRef = new clsName(args);となる。
    clsNameはインスタンス化の対象となるクラス名、
    cbjRefは変数で新しいオブジェクトへの参照を代入する。
    よって、ここでは、Randomがインスタンス化の対象となるクラス名で、
    rが変数でrに新しいオブジェクトへの参照を代入する。
    nextInt()はint型の乱数を返す。

  • c言語
  • javaアプリケーションと同様に2次元配列を用いるために、乱数srand()を用いればよい。
    time 関数は、システム時計に従って
    UTC 1970 年 1 月 1 日の 0 時 (00:00:00) 以降の経過秒数を返す。
    戻り値は、timer で指定した位置に格納される。
    パラメータ timer には NULL を指定でき、その場合戻り値は格納されない。


    〜感想〜

    先輩の血液型のソースを見て、ちょうど前課題でランダムを使ったのだから、
    それを使い、星座占いにしようと思った。
    先輩のは、1位しかランダムで出力してなかったので、
    1位〜12位をランダムで出力出来ないものかと思い、課題をやり始めた。
    先輩のソースを少しずついじってやろうとしたが、
    どうしても、各位で星座がかぶってしまうというのを直せない。
    それは、各位において毎回各星座をランダムでふりわけていたからだった。
    なので、1位の星座をランダムで出力させて、
    2位の星座は、全ての星座から1位の星座を引いたものから選ばさせる、
    といったものを12位まで行うプログラムをつくった。
    出来上がった頃には、参考にしていた先輩のソースとは全く違ったソースになっていた。
    c言語のソースもjavaアプリケーションのソースもろくに書き方が
    わかってない自分にとっては、とてもとても大変な作業でした


    〜参考文献〜

  • 独習java
  • とほほのWWW入門(http://www.tohoho-web.com/www.htm)