Подскажите, как упростить код - PascalABC.NET
Формулировка задачи:
Доброго времени суток! Собственно кодить только начинаю, родные по такому случаю попросили сделать программу по работе. Программу написал, работает, все довольны. Однако хотелось бы как-то сократить или упростить, довести до вида, чтоб глаза радовала. Слишком уж нагромождено. Только не смейтесь, я только учусь и не знаю, как можно написать по другому, но очень стараюсь
Листинг программы
- program tub;
- uses crt;
- var a,b,c,d,e,f,g,h:integer;
- d1,d2,d3,d4,d5,d6,d7,d8,f1,f2:real;
- begin
- writeln('Укажите:');
- writeln('Пол пациента 1 - мужской, 2 - женский');
- readln (a);
- writeln ('Форма туберкулеза 1 - Очаговый, 2 - Инфильтративный, 3 - Фиброзно-кавернозный, 4 Диссеминированный, Другие формы - 5');
- readln (b);
- writeln ('1 или 2х сторонняя локализация процесса 1 - Односторонняя, 2 - Двухсторонняя');
- readln (c);
- writeln ('Наличие полостей распада в легочной ткани; 1 - да, 2 - нет');
- readln (d);
- writeln ('Лекарственная устойчивость к изониазиду; 1 - да, 2 - нет');
- readln (e);
- writeln ('Лекарственная устойчивость к рифампицину; 1 - да, 2 - нет');
- readln (f);
- writeln ('Сопутствующая патология в виде хронических неспецифических заболеваний легких; 1 - да, 2 - нет');
- readln (g);
- writeln ('Вредные привычки 1 - Алкоголизм, 2 - Алкоголизм и курение, 3 - курение, 4 - наркомания, 5 - нет');
- readln (h);
- writeln ('Спасибо, дождитесь результатов, на слабом пк это может занять несколько часов, нажмите клавишу Enter, сли не хотите ждать');
- readln;
- if a=1 then d1:=-0.611923;
- if a=2 then d1:=1.6297755;
- if b=1 then d2:=-1.677071948;
- if b=2 then d2:=-0.472185306;
- if b=3 then d2:=0.732701337;
- if b=4 then d2:=1.937587979;
- if b=5 then d2:=3.1424747621;
- if c=1 then d3:=-0.838548467;
- if c=2 then d3:=1.189313839;
- if d=1 then d4:=-0.461019271;
- if d=2 then d4:=2.163244272;
- if e=1 then d5:=-2.067397222;
- if e=2 then d5:=0.482392685;
- if f=1 then d6:=-2.364738552;
- if f=2 then d6:=0.482392685;
- if g=1 then d7:=-2.718283712;
- if g=2 then d7:=0.366884918;
- if h=1 then d8:=-1.512227025;
- if h=2 then d8:=-0.895331767;
- if h=3 then d8:=-0.278436509;
- if h=4 then d8:=0.33845875;
- if h=5 then d8:=0.955354008;
- f1:=d1*-0.17956+d2*0.40778+d3*0.42102+d4*-0.50549+d5*-0.41049+d6*-0.18112+d7*0.24397+d8*-1.1129+-1.4663;
- f2:=d1*-0.17140+d2*-0.30474+d3*-0.38007+d4*0.35164+d5*0.34494+d6*0.14447+d7*-0.25519+d8*0.95194+-1.07281;
- if f1>f2 then writeln ('Пациент с высокой степенью вероятности имеет риск хронического течения туберкулезного процесса.');
- if f1>f2 then writeln ('Рекомендовано:');
- if f1>f2 then writeln ('I. Интенсивная фаза химиотерапии:');
- if f1>f2 then writeln ('1) Лечение в условиях стационара.');
- if f1>f2 then writeln ('2) Обязательная консультация хирурга с решением вопроса о раннем оперативном лечении.');
- if f1>f2 then writeln ('II. Фаза продолжения:');
- if f1>f2 then writeln ('1) В условиях дневного стационара или амбулаторно контролируемая.');
- if f1>f2 then writeln ('2) Социальная поддержка в виде продовольственных пайков.');
- if f2>f1 then writeln ('Пациент с высокой степенью вероятности не имеет риска хронизации туберкулезного процесса.');
- if f2>f1 then writeln ('Рекомендовано:');
- if f2>f1 then writeln ('I. Интенсивная фаза химиотерапии:');
- if f2>f1 then writeln ('1) Лечение в условиях стационара или дневного стационара.');
- if f2>f1 then writeln ('2) Консультация хирурга по показаниям.');
- if f2>f1 then writeln ('II. Фаза продолжения:');
- if f2>f1 then writeln ('1) Контролируемая химиотерация в амбулаторных условиях.');
- writeln ('Нажмите любую клавишу для закрытия программы');
- readln;
- end.
Решение задачи: «Подскажите, как упростить код»
textual
Листинг программы
- function Otvet(Vopros : String; VariantOtveta : array of String; Znachen : array of Real) : Real;
- begin
- WriteLn('-'*50);
- WriteLn(Vopros);
- var Sel := 0;
- foreach var Variant in VariantOtveta do
- begin
- Sel += 1;
- WriteLn(' ' + Sel + ' - ' + Variant);
- end;
- var Vibor := 0;
- repeat
- Vibor := ReadLnInteger('Выберите от 1 до ' + Sel + ' :');
- until Vibor in [1..Sel];
- Result := Znachen[Vibor-1];
- end;
- function F1(d1, d2, d3, d4, d5, d6, d7, d8 : Real) : Real := d1*-0.17956+d2*0.40778+d3*0.42102+d4*-0.50549+d5*-0.41049+d6*-0.18112+d7*0.24397+d8*-1.1129+-1.4663;
- function F2(d1, d2, d3, d4, d5, d6, d7, d8 : Real) : Real := d1*-0.17140+d2*-0.30474+d3*-0.38007+d4*0.35164+d5*0.34494+d6*0.14447+d7*-0.25519+d8*0.95194+-1.07281;
- procedure Diagnostic;
- begin
- var d1 := Otvet('Пол пациента', arr('мужской', 'женский'), arr(-0.611923, 1.6297755));
- var d2 := Otvet('Форма туберкулеза', arr('Очаговый', 'Инфильтративный', 'Фиброзно-кавернозный', 'Диссеминированный', 'Другие формы'), arr(-1.677071948, -0.472185306, 0.732701337, 1.937587979, 3.1424747621));
- var d3 := Otvet('1 или 2х сторонняя локализация процесса', arr('Односторонняя', 'Двухсторонняя'), arr(-0.838548467, 1.189313839));
- var d4 := Otvet('Наличие полостей распада в легочной ткани', arr('да', 'нет'), arr(-0.461019271, 2.163244272));
- var d5 := Otvet('Лекарственная устойчивость к изониазиду', arr('да', 'нет'), arr(-2.067397222, 0.482392685));
- var d6 := Otvet('Лекарственная устойчивость к рифампицину', arr('да', 'нет'), arr(-2.364738552, 0.482392685));
- var d7 := Otvet('Сопутствующая патология в виде хронических неспецифических заболеваний легких', arr('да', 'нет'), arr(-2.718283712, 0.366884918));
- var d8 := Otvet('Вредные привычки', arr('Алкоголизм', 'Алкоголизм и курение', 'курение', 'наркомания', 'нет'), arr(-1.512227025, -0.895331767, -0.278436509, 0.33845875, 0.955354008));
- WriteLn('~'*50, NewLine, '~'*50);
- if F1(d1, d2, d3, d4, d5, d6, d7, d8) > F2(d1, d2, d3, d4, d5, d6, d7, d8) then
- WriteLn('Пациент с высокой степенью вероятности имеет риск хронического течения туберкулезного процесса.', NewLine,
- NewLine,
- 'Рекомендовано:', NewLine,
- 'I. Интенсивная фаза химиотерапии:', NewLine,
- '1) Лечение в условиях стационара.', NewLine,
- '2) Обязательная консультация хирурга с решением вопроса о раннем оперативном лечении.', NewLine,
- 'II. Фаза продолжения:', NewLine,
- '1) В условиях дневного стационара или амбулаторно контролируемая.', NewLine,
- '2) Социальная поддержка в виде продовольственных пайков.')
- else
- WriteLn('Пациент с высокой степенью вероятности не имеет риска хронизации туберкулезного процесса.', NewLine,
- NewLine,
- 'Рекомендовано:', NewLine,
- 'I. Интенсивная фаза химиотерапии:', NewLine,
- '1) Лечение в условиях стационара или дневного стационара.', NewLine,
- '2) Консультация хирурга по показаниям.', NewLine,
- 'II. Фаза продолжения:', NewLine,
- '1) Контролируемая химиотерация в амбулаторных условиях.');
- end;
- begin
- repeat
- Diagnostic;
- until Otvet('Желаете повторить диагностику?', arr('ДА', 'НЕТ'), arr(+1.0, -1.0)) < 0;
- WriteLn('='*50, NewLine, 'Программа завершила свою работу.');
- end.
Объяснение кода листинга программы
- В функции Otvet происходит выбор варианта ответа из предложенных.
- Переменная Sel используется для подсчета количества вариантов ответа.
- Пользователю предлагается выбрать вариант ответа с помощью функции ReadLnInteger.
- Если выбранный вариант ответа находится в допустимом диапазоне, то значение переменной Vibor изменяется в соответствии с выбранным вариантом ответа.
- Значение переменной Vibor затем используется для получения соответствующего значения из массива Znachen.
- Функции F1 и F2 представляют собой формулы для вычисления значений, основанные на входных данных.
- В процедуре Diagnostic используются эти функции для вычисления значений и сравнения результатов.
- Если результат функции F1 больше, чем результат функции F2, то выводится сообщение о высоком риске хронического течения туберкулезного процесса и рекомендации по лечению.
- В противном случае выводится сообщение о низком риске хронизации туберкулезного процесса и рекомендации по лечению.
- Пользователю предлагается повторить диагностику, пока он не введет
НЕТ
. - В конце программы выводится сообщение об окончании работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д