ITI0011RUS:task 06

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

Срок сдачи упражнения 12-е занятие (12 марта).

Общая информация об упражнениях: ITI0011RUS_Practice.
Обратно на страницу предмета.

Описание

Напишите программу, которая сохраняет вес людей в файл и может прочесть эти данные из файла. В файле сохраняется имя человека и его вес. Например, файл может быть таким:

mati 100
kati 70

Это значит, что mati весит 100 (кг) и kati весит 70 (кг).

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

Например, если в случае приведенного в качестве примера файла пользователь введет "mati", программа выведет значение 100 (поскольку запись об этом человее есть в программе). Если пользователь введет "toomas", программа попросит ввести его вес (поскольку в файле отсутствует запись об этом человеке). Позже (например, при выходе из программы) информация записывается в файл. После этого файл мог бы выглядеть следующим образом:

mati 100
kati 70
toomas 90

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

Вам следует реализовать все остальные методы.

Примеры

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

Формат файла

Более подробно о формате файла. Как в предыдущем примере, файл может быть в формате:

имя1 вес1
имя2 вес2

Если у нескольких людей один и тот же вес, их имена все следует написать в одну строку:

имя1 [имя2] [имя3] вес1
имя4 [имя5] [имя6] вес2

Например:

mati kalle peeter 100
kadri kati 70

Записи в этом файле обозначают то, что и mati и kalle и peeter весят 100 (кг). И kadri и kati обе весят 70 (кг).

Таким образом:

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

Ваша программа должна уметь читать и писать данные в такой файл.

Шаблон

<source lang="java"> import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

/**

* Caching to file.
* You have a file of weights. Every person has a weight
* in kilograms.
* All the names are unique (there are no duplicate names).
* A name is connected to the weight. Example of file:

*

 * mati 100
 * kati 70
 * 
* 
* This means that mati has a weight of 100 and 
* kati has a weight of 70. If there are names which
* have the same weight, those should be grouped together
* in one line:

*

 * mati juri 100
 * kati kerli 70
 * 
* 
* The general format of the file is:

*

 * name1 [name2] [name3] weight1
 * name4 [name5] [name6] weight2
 * 
* 
* Every line has at least one name and weight.
* A line can consist of additional names
* (all names come before weight). Names consist
* only of characters (not numbers, spaces, commas etc.).
* 
* @author Ago
*
*/

public class EX06 {

/** * The main part. * In this exercise, the main code is provided. * You can modify this code as this method is not tested. * * @param args Command line arguments * @throws IOException Exception which can happen during input reading */ public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader( new InputStreamReader(System.in));

String filename = "weights.txt"; // the program should also work with non-existing file. // in that case there are no name-weight pairs readWeights(filename); while (true) { System.out.println("Name:"); String name = reader.readLine(); if (name == null || name.equals("")) { writeWeights(filename); System.out.println("exiting"); break; } if (name.contains(" ")) { System.out.println("no spaces allowed!"); continue; } Integer weight = getWeight(name); if (weight == null) { System.out.println("Person does not exist in DB."); while (true) { System.out.println("Weight:"); String weightLine = reader.readLine(); if (weightLine != null) { try { weight = Integer.parseInt(weightLine); if (weight > 10 && weight < 200) { setWeight(name, weight); break; } // note that this is not the requirement for other methods // it's just here to add some filtering example

// note2: there is no "else" sentence here. // but as within if-block, "break" breaks out from while, // we get here only if if-block is not executed. // so, we could have this part also in "else" part. System.out.println("weight should be > 10 and < 200"); } catch (NumberFormatException e) { System.out.println("not a number"); } }

} // end of while (true) - asking the weight

} else { System.out.println(name + " weighs " + weight); } } // end of while (true) - asking names reader.close(); }

/** * Sets the weight of the person with the given name. * The weight should be stored in a class variable. * This method should not try write anything to the file. * @param name The name of the person * @param weight The weight of the person */ public static void setWeight(String name, Integer weight) { // TODO: you should store name and weight somehow // tip: HashMap is probably a good idea }

/** * Opens a file with the given name and reads all * the data from it. If the file does not exist, * the method should just catch that error and * no name-weight pairs will be stored. * @param filename */ public static void readWeights(String filename) { String fileContents = ""; // TODO: read file contents


parseWeights(fileContents); }

/** * Parses names and weights from the given string. * This method is usually called by readWeights(String).

*

* This method should not read anything from the file. * All the information needed for this method is provided * as a String argument. *

* The information should be stored in a class variable, * which might be for example HashMap. * * @param contents File contents to parse */ public static void parseWeights(String contents) { // TODO: implement // here you have to split the contents into // names and weights and store them in a // class variable for later use. } /** * Writes weight information from a class variable * into file. * @param filename The filename to be written. * Notice! the file will be overwriten. */ public static void writeWeights(String filename) { // TODO: implement // open the file // write information into file // close the file } /** * Given the person name, the method should return the person's weight. * If the weight does not exist (in a class variable, which also means * that it does not exist in file), NULL is returned. * @param name Person name * @return Weight if the person name exists in the cache (file), * NULL otherwise. */ public static Integer getWeight(String name) { // name exists? // if yes, return the weight // if no, return null return null; } } </source>