2009-11-08 4 views
1

ive было назначено задание для моего курса программирования java, и я достиг точки, в которой я действительно не могу выполнить следующий шаг. Мне интересно, может ли кто-нибудь помочь мне с этим кодом, пожалуйста. Назначение выглядит следующим образом:Помощь с java-кодированием?

Файл существует, который содержит общее количество осадков за каждый месяц в году, по одному двойному значению в каждой строке. Напишите программу, которая:

  • Попросит пользователя ввести имя файла.
  • Считывает данные из этого файла, сохраняя каждое значение в массиве.
  • Итерации через массив и распечатывают общее количество осадков за год.
  • Итерации через массив и распечатывают среднемесячные осадки.
  • Итерации через массив и распечатывают месяц с минимальным количеством осадков и насколько это было. (Печать названия месяца заработает дополнительные отметки).
  • Итерации через массив и распечатывают месяц с наибольшим количеством осадков и насколько это было. (Снова преобразование номера месяца в строку приведет к дополнительным знакам).

До сих пор я сделал первые два шага, и у меня почти есть код для третьего шага.

Файл данных им с помощью выглядит примерно так:

 
    1.80 

    2.70 

    3.75 

    4.40 

    5.20 

    6.15 

    7.30 

    8.45 

    9.60 

    10.90 

    11.85 

    12.100 

Что я сделал здесь написано:

1,80

2,70 и т.д. означает, что «1» будет январь, «2» будет февраль и т. д.

Таким образом, после полной остановки количество осадков. Поэтому мне нужно рассчитать общее количество всех номеров с правой стороны каждой полной остановки.

Тогда мой код до сих пор это:

import java.util.*; 
import java.io.*; 

class Assignment5{ 
public static void main(String[] args)throws Exception{ 
    String data; 

    ArrayList<Double> store = new ArrayList<Double>(); 
    Scanner scanner = new Scanner(System.in); 

    System.out.println(" "); 
    System.out.println("Please enter the name of a file with .txt at the end."); 
    System.out.println(" "); 
    data = scanner.nextLine(); 

    File inputFile = new File(data); 
    Scanner reader = new Scanner(inputFile); 

    while(reader.hasNext()){ 
    store.add(reader.nextDouble()); 
    } 

    calculateSum(store); 
    store.clear(); 

} 

private static void calculateSum(ArrayList<Double> ArrayList){ 
    double sum = 0; 
    double avg = 0; 
    double total = 0; 
    double totalrainfall = 0; 

    Iterator<Double> iterator = ArrayList.iterator(); 

    while(iterator.hasNext()){ 
    sum += iterator.next(); 
    } 

    total = ArrayList.size(); 
    avg = (sum/total); 

    System.out.println(" "); 
    System.out.println("The total rainfall is " + totalrainfall); 

} 

Часть им застрял на вычисляет общее количество осадков. Данные являются двойным значением, поэтому мне нужно рассчитать все целые числа после полной остановки в файле данных. Я не могу разобраться, как это сделать в моем коде. Спасибо, что помогли заранее!

+0

Можете ли вы использовать вкладки перед кодом - это практически нечитаемым в этом состоянии – hjhill

+0

Вы кодирования неоднозначен, если читать их в качестве двойников. Например, вы не можете определить разницу между 1 и 10 дюймами дождя, так как 2.1 и 2.10 анализируют как одно и то же двойное значение. Вам действительно нужно прочитать месяц # и значение дождя как две отдельные вещи. –

+0

Я сделал предположение, что количество осадков всегда 2 цифры. Может быть, cal скажет нам, действительно ли это предположение. Мы не знаем, является ли предпочтительное решение улучшением ввода или сосредоточением на остальной части алгоритма. –

ответ

0

Каждый другой элемент в списке массивов - это количество осадков в течение месяца, поэтому используйте логическое значение для переключения true false, чтобы суммировать все эти значения.

double sum = 0; 
boolean toggle = false; 
for(Object d: arrayList) { 
    [...] 
    if(toggle) { 
    sum += (Double)d; 
    toggle = !toggle; 
    } 
} 
0

Это немного неприятно, что ваши данные в этом формате. Сканер приятный и легкий в использовании, но трудно вернуть ваши номера из двойного формата.

OK ... если все данные имеют 2 цифры после десятичного знака, вы можете вывести месяц как целое число, выполнив Math.round (Math.floor (x)), где x - ваш номер 1.80.

Затем вы можете вычесть месяц из своего номера и умножить на 100 и снова применить Math.round(), чтобы получить ливень.

2

У меня возникло бы желание прочитать каждую строку файла как строку, разделив ее на.'и проанализировать полученные подстроки как целые числа, чтобы получить номер месяца и количество осадков за этот месяц.

Мой Java является немного ржавым, но я хотел бы использовать:

import java.util.; 
import java.io.; 

class Assignment5 
{ 

    public static void main(String[] args) throws Exception 
    { 
     String data; 
     int[] store = new int[12]; 
     Scanner scanner = new Scanner(System.in); 

     System.out.println(" "); 
     System.out.println("Please enter the name of a file with .txt at the end."); 
     System.out.println(" "); 
     data = scanner.nextLine(); 

     File inputFile = new File(data); 
     Scanner reader = new Scanner(inputFile); 

     while(reader.hasNext()) 
     { 
      String currentLine = scanner.nextLine(); 
      String[] currentMonthDetails = currentLine.split("."); 
      int currentMonth = Integer.parseInt(currentMonthDetails[0]); 
      int currentRainfall = Integer.parseInt(currentMonthDetails[1]); 
      store[currentMonth] = currentRainfall; 
     } 

     calculateSum(store); 
     store = null; 
    } 

    private static void calculateSum(int[] aRainfallData) 
    { 
     int avgRainfall = 0; 
     int numberOfMonths = 0; 
     int totalRainfall = 0; 

     numberOfMonths = aRainfallData.length; 

     for (int index=0; index < numberOfMonths ; index++) 
     { 
      totalRainfall += aRainfallData[index]; 
     } 

     avgRainfall = (totalRainfall/numberOfMonths); 

     System.out.println(" "); 
     System.out.println("The total rainfall is " + totalRainfall); 
    } 
} 

Это предполагает, что файл содержит только данные, в течение двенадцати месяцев, что не может быть допустимым предположением.

+0

«Сбросить все до« null »после того, как вызов' calculateSum' не работает - и не нужно – hjhill

+0

Привет, спасибо за вашу помощь. По какой-то причине в этой строке есть ошибка, и я не уверен, в чем проблема: String [] currentMonthDetails = currentLine.split (".") – cal

+0

hjhill - Я действительно говорил, что я ржавый! Удалены строки нарушения. – MagicAndi

2

Поскольку это назначение, позвольте мне некоторые мысли о вашей интерпретации этого (если ваши наставники так строго, как у меня было, каждое изменение приведет к субтрагированных знаков):

Формат текстового файла Безразлично» т (на мой взгляд) соответствует текстовое описание, я бы интерпретировать как описание

80.0 
70.0 
75.0 
// ... 

с 80,0, 70,0, 75,0 ... как количество осадков в течение нескольких месяцев.

Кроме того, в нем говорится, что вы должны использовать «массив» - я думаю, что это означает double[], вы используете ArrayList.

0

Я предлагаю следующее:

//Don't use * imports it is bad practice 
import java.util.*; 
import java.io.*; 

class Assignment5{ 
public static void main(String[] args)throws Exception{ 
    String data; 

    ArrayList<Double> store = new ArrayList<Double>(); 
    Scanner scanner = new Scanner(System.in); 

    System.out.println(" "); 
    //Files can end in things other than .txt, so if you make it say that you need 
    // to do validation that data.endsWith(".txt") == true 
    System.out.println("Please enter the name of a file with .txt at the end."); 
    System.out.println(" "); 
    //Do you use data anywhere else? Or is this just an arbitrary string holder 
    data = scanner.nextLine(); 

    File inputFile = new File(data); 
    Scanner reader = new Scanner(inputFile); 

    while(reader.hasNext()){ 
    store.add(reader.nextDouble()); 
    } 

    calculateSum(store); 
    store.clear(); 

} 

//Call it arrayList or something that isn't ArrayList I'm stunned that compiles. 
private static void calculateSum(ArrayList<Double> ArrayList){ 
    //if you are declaring it a double sum = 0.0 <--- don't be lazy 
    double sum = 0; 
    double avg = 0; 
    double total = 0; 
    //Camel case me: totalRainfall or totalRainFall 
    double totalrainfall = 0; 

    //Are you still on java 1.4? If not use a foreach loop, while less efficient at higher 
    // data sets it will not be noticeable with the smaller data set 
    Iterator<Double> iterator = ArrayList.iterator(); 

    while(iterator.hasNext()){ 
    sum += iterator.next(); 
    } 

    total = ArrayList.size(); 
    //Need to do a conditional check so you dont divide by 0 
    avg = (sum/total); 

    System.out.println(" "); 
    System.out.println("The total rainfall is " + totalrainfall); 

} 
0
package multiples; 
import java.util.Scanner; 
public class MulTiples{ 
    public static void main(String []args) 
    { 
     int i =0; 
     while(i<100) 
     { 
     if (i%3==0) 
     { 
      System.out.println("hutt");    
     } 
     if (i%7==0)   
     { 
      System.out.println("hike");  
     } 
     System.out.println(i); 
     i = i+1; 
     } 
    } 
} 
+0

Добавить объяснение вашего ответа – HaveNoDisplayName