
листинг задания 2 12.12.12
.docxДибров Иван 21118
циклический алгоритм.
Формулировка задачи
Написать программу, вычисляющую частное двух выражений с проверкой области допустимых значений частного и, при необходимости, выводом соответствующих сообщений о невозможности решения с описанием ошибки(для групп значений).
где
А и В - функции двух аргументов. Выбор
конкретного вида функций А(х,р) и В(х,р).
A=
;
B=
;
Группы значений выводить в порядке убывания значений С(х,р) по абсолютной величине. Те X и Р, для которых значение С(х,р) рассчитать нельзя, расположить в нижней части таблицы
Пример таблицы:
Х |
Р |
С(x,р) |
Примечание |
3.271 |
-.0634 |
|
В знаменателе ноль |
5.039 |
1.487 |
16.832 |
|
10.664 |
-5.208 |
|
Под логарифмом отрицательное число |
Словесно-формульный алгоритм
Начало
Очистка экрана
probel:=' ';
line1:=#205#205#205#205#205#205#205;
line2:=#196#196#196#196#196#196#196;
firstline:=#201+line1+#209+line1+#209+line1+#209+line1+line1+line1+line1+line1+line1+line1+#187;
promegutocline1:=#199+line2+#197+line2+#197+line2+#197+line2+line2+line2+line2+line2+line2+line2+#182;
lastline:=#200+line1++#207+line1+#207+line1+#207+line1+line1+line1+line1+line1+line1+line1+#188;
promegutocline2:=#186+probel+#179+probel+#179+probel+#179+probel+probel+probel+probel+probel+probel+probel+#186;
Вывод: ‘Введите количество значений x и p, технические возможности не позволяют выводить массив более 20 элементов’
Ввод: n(количество значений x и p)
Если n<20 переход к пункту 9
Вывод: ‘Введите количество значений x и p, технические возможности не позволяют выводить массив более 20 элементов’
Ввод: n(количество значений x и p);
Переход к пункту 5
i:=1;
Если i > n, переход к пункту 22
Вывод: ‘Введите X и P’
Ввод: X[i] и P[i]
i:=i+1;
Переход к пункту 17
i:=1;
Если i>n, переход к пункту 40
promegutoc1:=P[i]+2*X[i];
Если promegutoc1=0, то переход к пункту 37
a:=abs((6*P[i]-X[i]*X[i]*X[i])/promegutoc1)-2.5*sin(P[i]*X[i]*3.14/180);
promegutoc2:=X[i]+1;
Если promegutoc2<0, то переход к пункту 35
b:=exp(sqrt(promegutoc2)-1)-(1/8)*P[i]*P[i];
Если b=0, то переход к пункту 33
C[i]:=a/b
Переход к пункту 38
ERROR[i]:='B=0,в знаменателе 0'
Переход к пункту 38
ERROR[i]:='sqrt(x+1)<0,под корнем отрицательное значение';
Переход к пункту 38
ERROR[i]:='p+2*x, в знаменателе 0, некорректное значение';
i:=i+1;
Переход к пункту 23
i:=1;
Если i>n-1, то переход к пункту 53
J:=i+1;
Если J>n, то переход к пункту 51
Если abs(C[j])<=abs(C[i]), то переход к пункту
tmp:=X[i]; X[i]:=X[j]; X[j]:=tmp;
tmp:=P[i]; P[i]:=P[j]; P[j]:=tmp;
tmp:=C[i]; C[i]:=C[j]; C[j]:=tmp;
ERRT:=ERROR[i]; ERROR[i]:=ERROR[j]; ERROR[j]:=ERRT;
J:=j+1;
Переход к пункту 43
I:=i+1;
Переход к пункту 41
Очистка экрана
Вывод: firstline
Вывод: promegutocline2
Использование процедуры: gotoXY(5,2);
Вывод:'X'
Использование процедуры: gotoXY(13,2);
Вывод:'P'
Использование процедуры: gotoXY(21,2);
Вывод:'C'
Использование процедуры: gotoXY(45,2);
Вывод:'Примечание'
I:=1;
Если i>n, то переход к пункту 80
Вывод: promegutocline1
Вывод: promegutocline2
Использование процедуры gotoXY(2,whereY);
Вывод: P[i]
Использование процедуры gotoXY(2,whereY);
Вывод: P[i]
Если ERROR[i]<>’’, то переход к пункту 76
Использование процедуры gotoXY(18,whereY);
Вывод: C[i]
Переход к пункту 78
Использование процедуры gotoXY(26,whereY);
Вывод: ERROR[i]
I:=i+1;
Переход к пункту 65
Вывод: lastline
Конец.
Листинг программы
uses crt;
var
X,P,C:array [1..30] of real;
ERROR:array [1..30] of string[60];
{массив хранит в текстовом операторе ошибку, при которой значение C[i] не существует}
errt:string[60];
a, b, tmp, promegutoc1, promegutoc2:real;
i, j, n:integer;
probel, line1, line2, firstline, lastline, promegutocline1, promegutocline2:string[100];
begin
clrscr; {очистка экрана}
probel:=' '; {7 пробелов}
line1:=#205#205#205#205#205#205#205; {7 '='}
line2:=#196#196#196#196#196#196#196; {7 '-'}
firstline:=#201+line1+#209+line1+#209+line1+#209+line1+line1+line1+line1+line1+line1+line1+#187; {шапка таблицы}
promegutocline1:=#199+line2+#197+line2+#197+line2+#197+line2+line2+line2+line2+line2+line2+line2+#182; {линия между строками}
lastline:=#200+line1++#207+line1+#207+line1+#207+line1+line1+line1+line1+line1+line1+line1+#188; {конец таблицы}
promegutocline2:=#186+probel+#179+probel+#179+probel+#179+probel+probel+probel+probel+probel+probel+probel+#186;
{строчка с полями для заполнения}
writeln('введите количество значений x и p, технические возможности не позволяют выводить массив более 20 элементов');
readln(n); {ввод количества значений x и p}
while n>=20 do {повторный ввод количества значений x и p}
begin
writeln('вы ввели количество значений x и p, превышающее 20,введите x и p заново');
readln(n);
end;
for i:=1 to n do {заполнение пользователем массивов x,p}
begin
writeln('введите х,p');
readln(X[i],P[i]);
end;
for i:=1 to n do {расчёт а,б,заполнение массивов С[i],ERROR[i]}
begin
promegutoc1:=P[i]+2*X[i];
if promegutoc1<>0 then {проверка знаменателя на 0}
begin
a:=abs((6*P[i]-X[i]*X[i]*X[i])/promegutoc1)-2.5*sin(P[i]*X[i]*3.14/180); {расчёт функции а}
promegutoc2:=X[i]+1;
if promegutoc2>=0 then {проверка ОДЗ в корне}
begin
b:=exp(sqrt(promegutoc2)-1)-(1/8)*P[i]*P[i]; {расчёт функции Б}
if b<>0 then {проверка Б на 0(это знаменатель)}
C[i]:=a/b {расчёт С[i]}
else
ERROR[i]:='B=0,в знаменателе 0'; {заполнение массива ERROR}
end
else
ERROR[i]:='sqrt(x+1)<0,под корнем отрицательное значение'; {заполнение массива ERROR}
end
else
ERROR[i]:='p+2*x, в знаменателе 0, некорректное значение'; {заполнение массива ERROR}
end;
for i:=1 to n-1 do {сортировка массивов X,P,C,ERROR по убыванию массива С}
for j:=i+1 to n do
if abs(C[j])>abs(C[i]) then
begin {замена значений в элементах массивов X,P,С}
tmp:=X[i]; X[i]:=X[j]; X[j]:=tmp;
tmp:=P[i]; P[i]:=P[j]; P[j]:=tmp;
tmp:=C[i]; C[i]:=C[j]; C[j]:=tmp;
ERRT:=ERROR[i]; ERROR[i]:=ERROR[j]; ERROR[j]:=ERRT;
end;
clrscr;
writeln(firstline);
writeln(promegutocline2);
gotoXY(5,2);
write('X');
gotoXY(13,2);
write('P');
gotoXY(21,2);
write('C');
gotoXY(45,2);
writeln('Примечание'); {73-83 заполнение шапки таблицы}
for i:=1 to n do {вывод таблицы}
begin
writeln(promegutocline1);
write(promegutocline2);
gotoXY(2,whereY);
write(x[i]:0:2);
gotoXY(10,whereY);
write(P[i]:0:2); {вывод X и P}
if ERROR[i]='' then
begin
gotoXY(18,whereY);
writeln(C[i]:0:2); {вывод С}
end
else
begin
gotoXY(26,whereY);
writeln(ERROR[i]); {вывод ERROR}
end;
end;
writeln(lastline); {конец таблицы}
readln;
end.
Оборудование
ПК с ОС Ms-dos; 10кб свободного места ; 640 кб оперативной памяти ; процессор архитектуры х86
Инструкция пользователя
Запуск программы zadanie2.exe
Ввести количество значений x и p (не более 20 по техническим причинам)
Ввести значения x и p; после каждого введённого значения нажимать Enter; Если вводится не целое число, то отделять дробную часть от целой точкой;
Программа выдаст таблицу значений С и ошибки в связи с чем невозможно провести расчёт С
Таблица будет отсортирована по убыванию абсолютного значения С
Значения X и P при которых нельзя рассчитать значение С будут располагаться в конце таблицы
Для выхода из меню ввода/вывода нажать клавишу Enter.
Верификационные требования
Для n=5;
X |
P |
C |
Примечания |
5 |
5 |
4.65 |
|
4 4 |
4 |
1.83 |
|
1 |
1 |
1.17 |
|
0 |
0 |
|
P+2*x, в знаменателе 0, некорректное значение |
-10 |
1 |
|
Sqrt(x+1)<0, под корнем отрицательное значение |
Программа выдаёт верный результат, при значениях входящих в область допустимых значений. При значении, которое не входит в область допустимых значений программа выводит на экран причину, не позволяющую рассчитать значение.