Глава 4
Задача 4.14 "Эксперименты."
Эксперименты.
Сотрудники лаборатории снимают показания, а требуемый результат - это частное от деления первого показания на второе. Все показания хранятся в файле. Напишите программу, которая обрабатывает файл и отслеживает исключительные ситуации, возникающие от деления на ноль. В этом случае программа должна запросить замену обоих значений для получения точных данных и продолжить обработку результатов, пока не будет достигнут конец файла.
Решение
Входной файл может быть например такого содержания:
Нам надо, чтобы программа считывала этот файл и определяла частное от деления первого числа на второе. При этом мы должны отслеживать ситуацию, чтобы в случае деления на ноль программа запрашивала новые значения для обеих переменных. Результаты выведем в новый файл.
Код программы:
import java.io.*;
import javagently.*;
import java.lang.*;
class TableIndex {
TableIndex() throws IOException {
Stream in = new Stream(System.in);
// default the file to the keyboard
Stream fin = new Stream(System.in);
Stream fout= new Stream ("data.out",Stream.WRITE);
try {
fin = Filer.open("data.txt");
}
catch (FileNotFoundException e) {
System.out.println("Five tries up");
System.out.println("Connecting to keyboard by default");
}
try {
for (;;) {
for(int i=0;i < 2; i++){
int n = fin.readInt();
int m = fin.readInt();
try{
double f = (double)(n/m);
fout.print(n + " / " + m + " = " + Stream.format((f), 4, 2) + " " );
}
catch (ArithmeticException e){
System.out.println(" Sorry! Divisi to zero! Enter new value to \"n\" ");
double n1 = in.readDouble();
System.out.println("Now enter new value to \"m\" ");
double m1 = in.readDouble();
fout.print(n1 + " / " + m1 + " = " + Stream.format((n1/m1), 4, 2) + " " );
fout.print(" ");
}
}//end for
fout.print("\n");
}//end for
}
catch (EOFException e) {
System.out.println(" All data is reading ");
}
}
public static void main (String[] args) throws IOException {
new TableIndex ();
}
}
Результат :
Мы видим, что при считывании программой значения 0, программа выдает сообщение с просьбой ввести новые значения для делимого и делителя:
Sorry! Divisi to zero! Enter new value to "n"
234
Now enter new value to "m"
123
Sorry! Divisi to zero! Enter new value to "n"
456
Now enter new value to "m"
23
All data is reading
Выходной файл будет таким:
Мы видим, что программа среагировала при делении на ноль и вызвала исключение. С этой стороны все хорошо. Но деление целого числа на целое, дает не такие результаты, которые нам необходимы. Проверка показала, что если в программе объявить переменные m и n как переменные типа double, то частное будет более точным, но при этом перестанет вызываться исключение при делении на нуль. Налицо проблема!
Результат, в случае если в программе объявить переменные m и n как переменные типа double будет следующим:
При этом исключение ArithmeticException не срабатывает.
Назад |
Начало урока |
Вверх |
Вперед
Содержание