ITI0011RUS:task 06
Срок сдачи упражнения 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>