質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    14073questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

動的2次元配列とインポートしたデータの計算

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 710

Ueno711

score 2

前提・実現したいこと

かなり長いコードになると思いますよろしくお願いします。
湖の上にかかった雲の面積のデータを集計するプログラムです

まずインポートしたデータの高さに合わせる2次元配列を作りたいと思っています。
インポートするデータの幅はすべて同じですが、高さは変わります。
以下がデータの一部です。

CloudCover1.dat 
2009 66.06 68.89 56.16 57.53 50.87 55.17 57.74 53.13 44.27 77.45 66.37 78.61 
2010 70.58 63.21 45.45 46.40 49.61 64.50 47.65 49.35 62.07 49.35 70.03 78.35 
2011 78.52 65.07 60.16 57.90 59.16 54.70 45.32 41.65 53.77 56.39 68.00 77.52

一列目はデータの年で、となりの数字は1月のデータ(%)、その隣が2月のデータ、、、12月分まで続きます。
データファイルはもう一種類あって、2000年から2010年までの分のものがあります。

また、別のjavaファイルで、データの集計をするプログラムがあります。
集計プログラムの太文字の部分は与えられているので間違いはありません。

2次元配列のプログラムは
    private void grow( int row )
    public Object get( int row, int column )
    public void put( int row, int column, Object value )
    public int getWidth( ) 
    public int getHeight( )
    public String toString( ) 
    public Dynamic2dArray( int numRows, int numColumns )
上記のメソッドを使用することのみ制限されています。

動的2次元配列のソースコード

import java.util.Arrays;

public class Dynamic2dArray {
    private Object[][] array = null;

    /**
     * 高さを+10追加するメソッドです
     */

    private void grow( int row ) {

        Object[][]temp = new Object [array.length + 10][];
        for (int i=0; i < array.length; i++){
            temp[i] = array[i];
        }
    }

    /**
     *  array[row][column]の値を返すコードです
     *もし行が、配列の長さを超える場合はgrowメソッドで、縦の配列を増やします
     * @param row : 行
     * @param column : 列
     * @return : array[row][column]の値を返す。
     */
    public Object get( int row, int column ) {

        Object[][] temparray = new Object[array.length][array[0].length];
        for (int i = 0; i < array.length; i++){
            for( int j = 0 ; j < array[0].length ; j++){
                 temparray[i][j] =  array[i][j];
            } 
        }
        return array;
    }

    public void put( int row, int column, Object value ) {

        if( row > array.length){
            grow(row);
        }
    }

    public int getWidth( ) {
        return width;
    }

    public int getHeight( ) {
        return height;
    }

    /**
     * 配列を表示します
     */

    public String toString( ) {
        String result = null;
        for (Object[] v: array){
            result = "[ " + v +" ]";
        }
        return result;
    }

    public Dynamic2dArray( int numRows, int numColumns ) {

        }

    }

}


集計プログラム

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

//先ほど作った動的2次元配列を使ってでーたの集計をします。

public class CloudCover {
private enum Month {
      JANUARY, FEBRUARY, MARCH, APRIL,
      MAY, JUNE, JULY, AUGUST,
      SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;}

   /**
    * 湖の面積です
    */
   private final double SURFACE_AREA = 81925.0; //km^2  

   /**
    * 先ほど作った2次元配列のプログラムを使用します。
    */

   private Dynamic2dArray array = new Dynamic2dArray( 1, 13 );

   /**
    * datファイルを引用します
    */

   public void loadData( String filename ) {

       Scanner scan = null;
       try {
           scan = new Scanner( new File(filename) );

           while (scan.hasNext()){     
           double value  = scan.nextDouble( );
           array.put(row, column, value);

           }

            } catch ( FileNotFoundException e ) {
                e.printStackTrace( );
                } finally {
                if ( scan != null ) {
                   scan.close();
                 }}
   }

   /**
    * それぞれの月の平均
    */
   public double getAve( Month month ) {
       int sum = 0;
          for (int i = 0; i < 12 ; i++){
              sum += Month;
              }
          double Month = sum/12;
          return Month; 

   }

   /**
    *すべてのデータの平均を出します。
    */
   public double getAve( int year ) {
      int sum = 0;
      for (int i = 0; i < 12 ; i++){
          sum += 12;
          }
      year =  sum/12;      
      return year;

   }

   /**
    * それぞれの月の一番大きい数値を出します。例えば5年分のデータがあった場合、5年間分の1月のデータで一番大きい数値を返します。
    */

   public double getMax( Month month ) {
       double[] month;
    double max = month;

       for (int i = 1; i < 12; i++){
           if(max < month[i]){
               max = month[i];
           }
       }

    return month = -1;

   }

   /**
    * その年の一番多きい数値を返します
    */
   public double getMax( int year ) {
    int max = year;

       for (int i = 1; i < 12; i++){
           if(max < 3){
               max = year;
           }
       }

    return max =-1;
   }

   /**
    * 全体で一番大きい数値
    */

   public double getMax( ) {
    return max;

   }

   /**
    * それぞれの月の一番小さい数値
    */

   public double getMin( Month month ) {
       Month min = month;

       for (int i = 1; i < 12; i++){
           if(min > 12){
               min = month;
           }

   }
       return month= -1;
       }

   /**
    *その年の一番小さい数値
    */

   public double getMin( int year ) {
       int min = year;

       for (int i = 1; i < 12; i++){
           if(min > 12){
               min = year;
           }

   }
       return year= -1;
       }

   /**
    * すべてのデータの一番小さい数値
    */
**
   public double getMin( ) {**
    return min;

   }

   /**
    * 湖の上に雲がかかっていたパーセンテージを面積に変換
    */

   public double coverageToArea ( double coverage ) {
coverage = 82,100 * %;    
return coverage;
   }

   /**
    * データファイルに書かれている最初の年
    */
   public int beginYear( ) {
    return 0;

   }

   /**
    * 最後の年
    */

   public int endYear( ) {
    return 0;

   }

   public static void main ( String [ ] args ) {
      CloudCover self = new CloudCover( );
      // 表示させたい月を選びます
      Month month = Month.MARCH;
      //表示させたい年を選びます.
      int year = 2010;

     ** // データのロード
      self.loadData( "CloudCover1.dat" );

      System.out.printf( "平均 %s 値:\t%.2f\n", month, self.getAve( month ) );
      System.out.printf( "最大値 %s 値:\t%.2f\n", month, self.getMax( month ) );
      System.out.printf( "最小値 %s 値:\t%.2f\n", month, self.getMin( month ) );
      System.out.println( );

      System.out.printf( "平均 %d 値:\t%.2f\n", year, self.getAve( year ) );
      System.out.printf( "最大値 %d 値:\t%.2f\n", year, self.getMax( year ) );
      System.out.printf( "最小値 %d 値:\t%.2f\n", year, self.getMin( year ) );
      System.out.println(   );
     

      System.out.printf( "全体平均:\t%.2f\n", self.getAve( ) );
      System.out.printf( "全体最大値:\t%.2f\n", self.getMax( ) );
      System.out.printf( "全体最小値:\t%.2f\n", self.getMin( ) );
      System.out.println(   );

      System.out.printf( "平均面積:\t%,.2f\n", self.coverageToArea(  self.getAve( ) ) );
      System.out.println(   );;

      System.out.printf( "開始年\t%d\n", self.beginYear( ) );
      System.out.printf( "終了年\t%d\n", self.endYear( ) );
      System.out.println(   );

   }

}

お恥ずかしい話ですがかなりの初心者でセンスもないため授業にもついていけず、先生に質問したのですが見放されてしまいました。
ショックと恥ずかしさででほかの人にも聞けなくなってしまったので、こちらで質問させていただきます。
ほぼゼロに近いコードなのは招致しておりますが、お力添えをいただけるととてもうれしいです…。

 せめて2次元配列でも動かしたいのですが、配列の表示ができていないので、思っているように動いているかどうかもわかりません。 似たようなサンプルコードや、ウェブサイトなど、わずかでもヒントになるような情報があれば十分ありがたいです。

補足情報(言語/FW/ツール等のバージョンなど)

java, Eclipse

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Odacchi

    2016/04/07 11:39

    質問は何でしょうか? 具体的にどんな現象が起きていて、どう修正したいのですか?

    キャンセル

  • Ueno711

    2016/04/07 11:48

    申し訳ありません、自分が今後どのようにこの課題にアプローチすればいいのかもわからないんです。 せめて2次元配列でも動かしたいのですが、配列の表示ができていないので、思っているように動いているかどうかもわかりません。 似たようなサンプルコードや、ウェブサイトなど、わずかでもヒントになるような情報があれば十分ありがたいです。

    キャンセル

  • abs123

    2016/04/07 12:59

    Dynamic2dArrayクラスについて、設計書や、制限事項等があったら追記してください。

    キャンセル

  • Ueno711

    2016/04/07 13:11

    編集させていただきました。 設計書とまでかはわかりませんが 2次元配列のプログラムは private void grow( int row ) public Object get( int row, int column ) public void put( int row, int column, Object value ) public int getWidth( ) public int getHeight( ) public String toString( ) public Dynamic2dArray( int numRows, int numColumns ) 上記のメソッドを使用することのみ決められています。

    キャンセル

回答 1

0

動的2次元配列を管理する機能(クラス)を作り、湖上にかかる雲の面積データを
集計するプログラムを作成せよ。
雲の面積データは、入力ファイルとして与えるものとする。

という課題に対して、プログラムを書いてはみたが動かない。
これは一体何がおかしいのだろうか?

というご質問であるという前提で、ざっと見ておかしいと感じる部分を
指摘させていただきます。
完全な回答ではないですが、ご参考になれば。

Dynamic2dArray.grow()
  tmpにarrayをコピーしたあと、arrayを置換えていない。
  (せっかく育てたtmpが捨てられている)

Dynamic2dArray.get()
  array[raw][column]を返すはずが、arrayを返している。

Dynamic2dArray.put()
  データを追加していない。
  (growだけで終わっている)

Dynamic2dArray.Dynamic2dArray()
  arrayを初期化していない。
  (最低限、与えられたサイズに対応するArrayが生成されるはず)

CloudCover.getAve(Month month)
  求められているのはおそらく
  「指定された月における、全ての年の湖上における雲の面積データの平均値」
  であるが、何を計算しているのだろうか。

CloudCover.getAve(int year)
  求められているのはおそらく
  「指定された年における、全ての月の湖上における雲の面積データの平均値」
  であるが、何を計算しているのだろうか。

CloudCover.getMax(Month month)
CloudCover.getMax(int year)
CloudCover.getMax()
CloudCover.getMin(Month month)
CloudCover.getMin(int year)
CloudCover.getMax()
CloudCover.coverageToArea(double coverage)
CloudCover.beginYear()
CloudCover.endYear()
  上に同じ。
  この関数(メソッド)に求められている内容と、プログラムがアンマッチしている。

今後の課題へのアプローチの手順ですが、まずは課題の意図を正確に理解する
ことが必要かと思います。
「仕様の不明点を確認する」のような言い回しをしますが、つまるところ、
プログラムを書く前に、作るべきものを正しく理解してください。

課題の中でご自身が「意味がわからん」と思っている箇所があるかと思います。
この箇所を明確にできるよう、先生に質問をしてみるのが良いかとおもいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/07 14:07

    早急なお返事ありがとうございます。
    もう1度課題の確認だけでもしたいと思います。忙しい先生なので会える時間も限られていますが、頂いたアドバイスを見て、自分でも少し向上できる糸口が見えてきました。多少なりとも良くなったコードを提出したら喜んでいただけると思います。

    何分今でも焦ってしまっていて、とてもアドバイスのしにくい質問をしてしまったなと反省しております。
    ご丁寧なアドバイスを頂きとても感謝しています。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14073questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。