Erinevus lehekülje "ITI0011RUS:task 06" redaktsioonide vahel
(Uus lehekülg: 'Срок сдачи упражнения '''9-е занятие (4-е марта)'''. Общая информация об упражнениях: ITI0011RUS_Practice.<br/> ...') |
|||
5. rida: | 5. rida: | ||
=== Описание === | === Описание === | ||
+ | |||
+ | Напишите программу, которая сохраняет вес людей в файл и может прочесть эти данные из файла. В файле сохраняется имя человека и его вес. Например, файл может быть таким: | ||
+ | <pre> | ||
+ | mati 100 | ||
+ | kati 70 | ||
+ | </pre> | ||
+ | |||
+ | Это значит, что mati весит 100 (кг) и kati весит 70 (кг). | ||
+ | |||
+ | При запуске программа спрашивает у человека имя. Если запись о человеке с таким именем есть в файле, программа выводит на экран вес этого человека (предполагается, что в файле не может быть две записи об одном и том же человеке). Если такого человека в файле нет, программа просит ввести вес этого человека и сохраняет данные в какой-либо коллекции. При завершении программы, все новые данные дописываются в конец файла. | ||
+ | |||
+ | Например, если в случае приведенного в качестве примера файла пользователь введет "mati", программа выведет значение 100 (поскольку запись об этом человее есть в программе). Если пользователь введет "toomas", программа попросит ввести его вес (поскольку в файле отсутствует запись об этом человеке). Позже (например, при выходе из программы) информация записывается в файл. После этого файл мог бы выглядеть следующим образом: | ||
+ | |||
+ | <pre> | ||
+ | mati 100 | ||
+ | kati 70 | ||
+ | toomas 90 | ||
+ | </pre> | ||
+ | |||
+ | Та часть программы, которая просит ввести пользователя имя и вес, уже за вас сделана в методе <code>main</code>. При желании можете изменить эту часть, однако непосредственной необходимости в этом нет. Автоматические тесты не тестируют метод <code>main</code>. | ||
+ | |||
+ | Вам следует реализовать все остальные методы. | ||
+ | |||
+ | == Примеры == | ||
+ | |||
+ | Проще всего сделать так, что при закрытии программы перезаписывается весь файл. Для этого все содержимое файла хранится в какой-либо коллекции в классе. В методе <code>writeWeights</code> следует пройтись по всей коллекции и записать в файл всю информацию, хранящуюся в коллекции. | ||
+ | |||
+ | == Формат файла == | ||
+ | |||
+ | Более подробно о формате файла. Как в предыдущем примере, файл может быть в формате: | ||
+ | <pre> | ||
+ | имя1 вес1 | ||
+ | имя2 вес2 | ||
+ | </pre> | ||
+ | |||
+ | Если у нескольких людей один и тот же вес, их имена все следует написать в одну строку: | ||
+ | <pre> | ||
+ | имя1 [имя2] [имя3] вес1 | ||
+ | имя4 [имя5] [имя6] вес2 | ||
+ | </pre> | ||
+ | |||
+ | Например: | ||
+ | <pre> | ||
+ | mati kalle peeter 100 | ||
+ | kadri kati 70 | ||
+ | </pre> | ||
+ | |||
+ | Записи в этом файле обозначают то, что и 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: | ||
+ | * <pre> | ||
+ | * mati 100 | ||
+ | * kati 70 | ||
+ | * </pre> | ||
+ | * | ||
+ | * 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: | ||
+ | * <pre> | ||
+ | * mati juri 100 | ||
+ | * kati kerli 70 | ||
+ | * </pre> | ||
+ | * | ||
+ | * The general format of the file is: | ||
+ | * <pre> | ||
+ | * name1 [name2] [name3] weight1 | ||
+ | * name4 [name5] [name6] weight2 | ||
+ | * </pre> | ||
+ | * | ||
+ | * 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). | ||
+ | * <p> | ||
+ | * This method should not read anything from the file. | ||
+ | * All the information needed for this method is provided | ||
+ | * as a String argument. | ||
+ | * <p> | ||
+ | * 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> |
Redaktsioon: 10. märts 2015, kell 18:03
Срок сдачи упражнения 9-е занятие (4-е марта).
Общая информация об упражнениях: 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>