В Камаев - Технологии программирования
- Название:Технологии программирования
- Автор:
- Жанр:
- Издательство:Издательство «Высшая школа»
- Год:2006
- Город:Москва
- ISBN:5-06-004870-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
В Камаев - Технологии программирования краткое содержание
Второе издание (1-е — 2005 г.) дополнено главами по структуре данных и основам инженерии создания программ.
Для студентов вузов, обучающихся по направлению «Информатика».
Технологии программирования - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
WriteLn ("Нет решения ')
end;
if
then
begin
{ Вывод сообщения: бесчисленное множество решений уравнения }
Write ('бесчисленное множество решений уравне');
WriteLn ('ния (корни — любые числа)');
end;
В последней альтернативе одна строка выводится одним оператором.
Далее в соответствии с действиями запишем логические условия выполнения действий. При этом простым сравнением проверять на равенство значения двух вещественных переменных нельзя. Например, при сравнении f = g, считающихся равными 5, даже если g = 5,00000, в силу округлений при вычислениях значение f может оказаться равным либо 4,99999, либо 5,00000, либо 5,00001. Согласно данному примеру путем простой проверки на равенство факт равенства будет установлен в одном случае из трех.
Для надежного сравнения двух вещественных чисел используют прием использования неравенства |f — g| ≤ ε, где ε — заведомо малое число. На языке программирования это неравенство имеет вид
Abs (f — g) <= 1е — 6
Продолжаем кодирование структуры. Глядя на действия, записываем логические условия выполнения действий. Входная информация: a, b, c.
{ Само решение квадратного уравнения }
if (Abs(а) > 1e — 6)
then
begin
{ Продолжение решения с вычислением дискриминанта }
end;
if ((Abs (a) <= 1e — 6) and (Abs (b) > 1e — 6))
then
begin
{ Решение линейного уравнения }
end;
if ((Abs(a) <= 1e — 6) and (Abs(b) <= 1e — 6 and (Abs(c) >
1e — 6))
then
begin
{ Вывод сообщения: линейное уравнение не имеет решения }
WriteLn ('Нет решения');
end;
if ((Abs(a) <= 1e — 6) and (Abs(b) <= 1e — 6 and
(Abs(c) <= 1e — 6))
then
begin
{ Вывод сообщения: бесчисленное множество решений уравнения }
Write ('бесчисленное множество решений уравне');
WriteLn ('ния (корни — любые числа)');
end;
Осуществим сборку получившейся программы. При сборке удалим избыточные комментарии и избыточные операторные скобки begin — end, охватывающие лишь один оператор. Испытаем полученную программу на тестах a = 0, b = 0, c = 0 a = 0, b = 0, c = 2. Собранный вариант программы:
Program Kvadrat;
{ Программа решения квадратного уравнения
вида a*x*x + b*x + c = 0 с произвольными значениями
коэффициентов a, b, c типа вещественный }
Uses
Crt, Dos;
Var
a, b, c: Real; {Коэффициенты квадратного уравнения}
xl, x2: Real; {Корни квадратного уравнения}
begin
ClrScr; { Очистка экрана }
{Вывод информации о назначении программы}
WriteLn ('Программа решения квадратного уравнения');
Write (
'вида a*x*x + b*x + c = 0 с произвольными');
Write ('значениями');
WriteLn ('коэффициентов a, b, c типа вещественный');
WriteLn;
{Ввод значений коэффициентов а, b, с};
Write ('Укажите значение коэффициента а = ');
ReadLn(a); { Ввод а}
Write ('Укажите значение коэффициента b = ');
ReadLn(b); { Ввод b}
Write ('Укажите значение коэффициента с = ');
ReadLn(c); { Ввод с}
{ Вывод проверочно-протокольной информации
о введенных значениях коэффициентов a, b, c }
WriteLn;
WriteLn ('Решается квадратное уравнение');
Write (a:10:4, '*x*x + ', b:10:4, '*x + ');
WriteLn(с:10:4, ' = 0:');
{ Само решение квадратного уравнения }
if (Abs (a) > 1e — 6)
then
begin
{ Продолжение решения с вычислением дискриминанта }
end;
if ((Abs(a) <= 1e — 6) and (Abs(b) > 1e — 6))
then
begin
{ Решение линейного уравнения }
end;
if ((Abs(a) <= 1e — 6) and (Abs(b) <= 1e — 6) and
(Abs(c) > 1e — 6))
then
WriteLn ('Нет решения');
if ((Abs(a) <= 1e — 6) and (Abs(b) <= 1e — 6 and
(Abs(c) <= 1e — 6))
then
begin
Write ('бесчисленное множество решений уравне');
WriteLn ('ния (корни — любые числа)');
end;
WriteLn;
Write ('Для завершения программы нажмите');
WriteLn ('любую клавишу…');
repeat until KeyPressed; { Цикл ожидания нажатия
любой клавиши }
end.
Декомпозируем действие "Решение линейного уравнения". Это действие представляет цепочку из двух элементарных операторов. Выполним проверку информационной согласованности действий:
Входная информация: b, с.
{ Решение линейного уравнения }
x1:= — c/b;
WriteLn ('уравнение линейное x = ', x1: 10: 4);
Декомпозируем действие "Продолжение решения с вычислением дискриминанта". Данное действие представляет ЦЕПОЧКУ СЛЕДОВАНИЙ из двух СЛЕДОВАНИЙ.
Входная информация: а, Ь, с
{ Продолжение решения с вычислением дискриминанта }
{ Вычисление дискриминанта квадратного уравнения }
d:= Sqr (b) — 4.0*а*с; { Решение уравнения }
Переменная d у нас не описана, поэтому в секцию Var необходимо добавить строку описания:
d: Real; { Значение дискриминанта }
Декомпозируем действие "Решение уравнения". Согласно табл. 5.3 данное действие представляет ЦЕПОЧКУ АЛЬТЕРНАТИВ из трех альтернатив в цепочке. Осуществив детализацию этих альтернатив в установленном порядке, получим:
Входная информация: a, b, c, d.
{ Решение уравнения }
if d > 1e-6
then
begin
{ Расчет двух различных корней }
end;
if ((d >= -1e-6) and (d <= 1e-6))
then
begin
{ Расчет двух равных корней }
WriteLn ('два равных корня x = ', (-b)/(2.0 * а):10:4);
end;
if d < -1e-6 then begin
{ Вывод надписи: уравнение не имеет решения }
WriteLn ('уравнение не имеет решения');
end;
Декомпозируем действие "Расчет двух различных корней". Это действие представляет цепочку из трех элементарных операторов. Выполним проверку информационной согласованности действий:
Входная информация: a, b, c, d
{ Расчет двух различных корней }
x1:= ((-b) — Sqrt (d))/(2.0*a);
x2:= ((-b) + Sqrt (d))/(2.0*а);
Write ('два различных корня x1 = ', x1:10:4);
WriteLn (' x2 = ', х2:10:4);
Здесь вывод одной строки осуществлен двумя операторами. Осуществим сборку всей программы, удалив избыточные комментарии и избыточные операторные скобки begin — end, охватывающие лишь один оператор. Испытаем полученную программу на всех заранее подготовленных тестах. Собранный вариант программы:
Program Kvadrat;
{ Программа решения квадратного уравнения
вида a*x*x + b*x + c = 0 с произвольными значениями
коэффициентов a, b, c типа вещественный }
Uses
Crt, Dos;
Var
a, b, c: Real; {Коэффициенты квадратного уравнения}
xl, x2: Real; {Корни квадратного уравнения}
Интервал:
Закладка: