Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

листинг задания 2 12.12.12

.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
34.42 Кб
Скачать

Дибров Иван 21118

циклический алгоритм.

Формулировка задачи

Написать программу, вычисляющую частное двух выражений с проверкой области допустимых значений частного и, при необходимости, выводом соответствующих сообщений о невозможности решения с описанием ошибки(для групп значений).

где А и В - функции двух аргументов. Выбор конкретного вида функций А(х,р) и В(х,р).

A= ; B= ;

Группы значений выводить в порядке убывания значений С(х,р) по абсолютной величине. Те X и Р, для которых значение С(х,р) рассчитать нельзя, расположить в нижней части таблицы

Пример таблицы:

Х

Р

С(x,р)

Примечание

3.271

-.0634

В знаменателе ноль

5.039

1.487

16.832

10.664

-5.208

Под логарифмом отрицательное число

Словесно-формульный алгоритм

  1. Начало

  2. Очистка экрана

  3. probel:=' ';

  4. line1:=#205#205#205#205#205#205#205;

  5. line2:=#196#196#196#196#196#196#196;

  6. firstline:=#201+line1+#209+line1+#209+line1+#209+line1+line1+line1+line1+line1+line1+line1+#187;

  7. promegutocline1:=#199+line2+#197+line2+#197+line2+#197+line2+line2+line2+line2+line2+line2+line2+#182;

  8. lastline:=#200+line1++#207+line1+#207+line1+#207+line1+line1+line1+line1+line1+line1+line1+#188;

  9. promegutocline2:=#186+probel+#179+probel+#179+probel+#179+probel+probel+probel+probel+probel+probel+probel+#186;

  10. Вывод: ‘Введите количество значений x и p, технические возможности не позволяют выводить массив более 20 элементов’

  11. Ввод: n(количество значений x и p)

  12. Если n<20 переход к пункту 9

  13. Вывод: ‘Введите количество значений x и p, технические возможности не позволяют выводить массив более 20 элементов’

  14. Ввод: n(количество значений x и p);

  15. Переход к пункту 5

  16. i:=1;

  17. Если i > n, переход к пункту 22

  18. Вывод: ‘Введите X и P’

  19. Ввод: X[i] и P[i]

  20. i:=i+1;

  21. Переход к пункту 17

  22. i:=1;

  23. Если i>n, переход к пункту 40

  24. promegutoc1:=P[i]+2*X[i];

  25. Если promegutoc1=0, то переход к пункту 37

  26. a:=abs((6*P[i]-X[i]*X[i]*X[i])/promegutoc1)-2.5*sin(P[i]*X[i]*3.14/180);

  27. promegutoc2:=X[i]+1;

  28. Если promegutoc2<0, то переход к пункту 35

  29. b:=exp(sqrt(promegutoc2)-1)-(1/8)*P[i]*P[i];

  30. Если b=0, то переход к пункту 33

  31. C[i]:=a/b

  32. Переход к пункту 38

  33. ERROR[i]:='B=0,в знаменателе 0'

  34. Переход к пункту 38

  35. ERROR[i]:='sqrt(x+1)<0,под корнем отрицательное значение';

  36. Переход к пункту 38

  37. ERROR[i]:='p+2*x, в знаменателе 0, некорректное значение';

  38. i:=i+1;

  39. Переход к пункту 23

  40. i:=1;

  41. Если i>n-1, то переход к пункту 53

  42. J:=i+1;

  43. Если J>n, то переход к пункту 51

  44. Если abs(C[j])<=abs(C[i]), то переход к пункту

  45. tmp:=X[i]; X[i]:=X[j]; X[j]:=tmp;

  46. tmp:=P[i]; P[i]:=P[j]; P[j]:=tmp;

  47. tmp:=C[i]; C[i]:=C[j]; C[j]:=tmp;

  48. ERRT:=ERROR[i]; ERROR[i]:=ERROR[j]; ERROR[j]:=ERRT;

  49. J:=j+1;

  50. Переход к пункту 43

  51. I:=i+1;

  52. Переход к пункту 41

  53. Очистка экрана

  54. Вывод: firstline

  55. Вывод: promegutocline2

  56. Использование процедуры: gotoXY(5,2);

  57. Вывод:'X'

  58. Использование процедуры: gotoXY(13,2);

  59. Вывод:'P'

  60. Использование процедуры: gotoXY(21,2);

  61. Вывод:'C'

  62. Использование процедуры: gotoXY(45,2);

  63. Вывод:'Примечание'

  64. I:=1;

  65. Если i>n, то переход к пункту 80

  66. Вывод: promegutocline1

  67. Вывод: promegutocline2

  68. Использование процедуры gotoXY(2,whereY);

  69. Вывод: P[i]

  70. Использование процедуры gotoXY(2,whereY);

  71. Вывод: P[i]

  72. Если ERROR[i]<>’’, то переход к пункту 76

  73. Использование процедуры gotoXY(18,whereY);

  74. Вывод: C[i]

  75. Переход к пункту 78

  76. Использование процедуры gotoXY(26,whereY);

  77. Вывод: ERROR[i]

  78. I:=i+1;

  79. Переход к пункту 65

  80. Вывод: lastline

  81. Конец.

Листинг программы

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

Инструкция пользователя

  1. Запуск программы zadanie2.exe

  2. Ввести количество значений x и p (не более 20 по техническим причинам)

  3. Ввести значения x и p; после каждого введённого значения нажимать Enter; Если вводится не целое число, то отделять дробную часть от целой точкой;

  4. Программа выдаст таблицу значений С и ошибки в связи с чем невозможно провести расчёт С

  5. Таблица будет отсортирована по убыванию абсолютного значения С

  6. Значения X и P при которых нельзя рассчитать значение С будут располагаться в конце таблицы

  7. Для выхода из меню ввода/вывода нажать клавишу 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, под корнем отрицательное значение

Программа выдаёт верный результат, при значениях входящих в область допустимых значений. При значении, которое не входит в область допустимых значений программа выводит на экран причину, не позволяющую рассчитать значение.