1 Востаннє редагувалося Torbins (17.10.2014 09:44:09)

Тема: TurboPascal. Різні цикли.

Треба щоб програма працювала відразу з трьома циклами.
Ось код:

uses crt;
label q,w,e,r,t;
var b,c,x,y,ymax,ymin: real;
    z: byte;
begin
clrscr;
c:=0.2;
q: writeln('Vubratu tup zadachi');
   writeln('1 - while..do..');
   writeln('2 - repeat..until..');
   writeln('3 - if..then..goto');
   writeln('4 - Buxid');
read(z);
case z of
1: goto w;
2: goto e;
3: goto r;
4: goto t;
end;


w:
begin
write('X=');
readln(x);
ymax:=100;
ymin:=-100;
while x<=b do
begin
if x<-1 then y:=pi+sqrt(sin(x)/exp(x+pi)) else
if (x>=-1) and (x<1) then y:=sqr(cos(x))+(1.2*exp(ln(10)*(-1/6))) else
y:=sqr(sin(exp(ln(x)*3)))+(x*ln(x+1));
if y>ymax then y:=ymax;
if y<ymin then y:=ymin;
end;
writeln('x=',x:15,'y=',y:15);
x:=x+c;
end;
begin
writeln('ymax=',ymax:15:5,'ymin=',ymin:15:5);
writeln;
writeln('Їа®Ја ¬  а®Ў®вг § ЄiзЁ« ');
goto q;
end;

e:
repeat
write('X=');
readln(x);
ymax:=100;
ymin:=-100;
y:=(pi+sqrt(sin(x)/exp(x+pi)));
begin
if x<-1 then y:=pi+sqrt(sin(x)/exp(x+pi)) else
if (x>=-1) and (x<1) then y:=sqr(cos(x))+(1.2*exp(ln(10)*(-1/6))) else
y:=sqr(sin(exp(ln(x)*3)))+(x*ln(x+1));
if y>ymax then y:=ymax;
if y<ymin then y:=ymin;
writeln('x=',x:15);
writeln('y=',y:15);
writeln;
x:=x+c;
end;
until (x<b);
begin



writeln('ymax=',ymax:15:5,'ymin=',ymin:15:5);
writeln;
writeln('Їа®Ја ¬  а®Ў®вг § ЄiзЁ« ');
goto q;
end;


r:
write('X=');
readln(x);
ymax:=100;
ymin:=-100;

begin
if x<-1 then y:=pi+sqrt(sin(x)/exp(x+pi));
if (x>=-1) and (x<1) then y:=sqr(cos(x))+(1.2*exp(ln(10)*(-1/6)));
if x>=1 then y:=sqr(sin(exp(ln(x)*3)))+(x*ln(x+1));
if y>ymax then y:=ymax;
if y<ymin then y:=ymin;
writeln('x=',x:15,'y=',y:15);
writeln;
x:=x+c;
end;
begin
writeln('ymax=',ymax:15:5,'ymin=',ymin:15:5);
writeln;
writeln('Їа®Ја ¬  а®Ў®вг § ЄiзЁ« ');
goto q;
end;

t:
end.

Програма працює, але якщо іксу задати початкове значення меньше ніж значення В програма не працює і видає помилку 207.

2

Re: TurboPascal. Різні цикли.

А ось це і зветься спагеті-код, і саме тому використання goto вважається поганим тоном.

3

Re: TurboPascal. Різні цикли.

case z of
1: goto w;
2: goto e;
3: goto r;
4: goto t;
end;

не думав, що побачу таке в 2014 році

Подякували: koala, Dan, Blast3

4

Re: TurboPascal. Різні цикли.

koala написав:

А ось це і зветься спагеті-код, і саме тому використання goto вважається поганим тоном.

тоді що зробити щоб програма працювала?

5

Re: TurboPascal. Різні цикли.

0xDADA11C7 написав:
case z of
1: goto w;
2: goto e;
3: goto r;
4: goto t;
end;

не думав, що побачу таке в 2014 році

А найгірше те що це входить в список того що обов'язково мають вивчати студенти-програмісти. В 2014 році.

6

Re: TurboPascal. Різні цикли.

repeat
write('X=');
readln(x);
ymax:=100;
ymin:=-100;
y:=(pi+sqrt(sin(x)/exp(x+pi)));
begin
if x<-1 then y:=pi+sqrt(sin(x)/exp(x+pi)) else
if (x>=-1) and (x<1) then y:=sqr(cos(x))+(1.2*exp(ln(10)*(-1/6))) else
y:=sqr(sin(exp(ln(x)*3)))+(x*ln(x+1));
if y>ymax then y:=ymax;
if y<ymin then y:=ymin;
writeln('x=',x:15);
writeln('y=',y:15);
writeln;
x:=x+c;
end;
until (x<b);

ви цю прогаму не писали, у вищенаведеному коді це добре видно

7

Re: TurboPascal. Різні цикли.

0xDADA11C7 написав:
repeat
write('X=');
readln(x);
ymax:=100;
ymin:=-100;
y:=(pi+sqrt(sin(x)/exp(x+pi)));
begin
if x<-1 then y:=pi+sqrt(sin(x)/exp(x+pi)) else
if (x>=-1) and (x<1) then y:=sqr(cos(x))+(1.2*exp(ln(10)*(-1/6))) else
y:=sqr(sin(exp(ln(x)*3)))+(x*ln(x+1));
if y>ymax then y:=ymax;
if y<ymin then y:=ymin;
writeln('x=',x:15);
writeln('y=',y:15);
writeln;
x:=x+c;
end;
until (x<b);

ви цю прогаму не писали, у вищенаведеному коді це добре видно

Мабуть якби її писав не я, то я б звернувся з претензіями до того хто написав, а не сюди за допомогою

8

Re: TurboPascal. Різні цикли.

Якби її писали ви, то безглуздого блоку

begin
...
end;

посеред repeat...until не було б. А взагалі раджу переписати код, додавши відступи і замінивши goto на процедури.

Подякували: pashtet1

9 Востаннє редагувалося koala (15.10.2014 21:37:54)

Re: TurboPascal. Різні цикли.

Насправді, як подумати - може, і не все так погано... можу припустити, що викладач спочатку дав учням помучитися з goto, щоб потім було зрозуміліше, чому його не радять вживати. Нехай. Але в будь-якому разі програма пишеться для якогось завдання, і можна сказати, що вона працює, тільки тоді, коли це завдання відомо. Ви ж завдання не навели, тому ми нічим вам не можемо допомогти. Ну хіба що дослівно:

var i:integer;
begin
  for i:=1 to 10 do;
  while i>0 do dec(i);
  repeat inc(i) until i>=10;
end.

Тепер програма працює з усіма трьома циклами.

Ну і бажано писати код так, щоб його можна було нормально читати. Наприклад, мітки q,w,e,r,t ні про що не кажуть; але якби t звалося quit, то було б зрозуміло, що це мітка біля виходу, і goto quit виходить з програми.

Подякували: Torbins1

10

Re: TurboPascal. Різні цикли.

0xDADA11C7 написав:
case z of
1: goto w;
2: goto e;
3: goto r;
4: goto t;
end;

не думав, що побачу таке в 2014 році

Але можна ж зробити ще лекше не використовуючи goto просто прописати цикли після ":" ....

11

Re: TurboPascal. Різні цикли.

Dan написав:
0xDADA11C7 написав:
case z of
1: goto w;
2: goto e;
3: goto r;
4: goto t;
end;

не думав, що побачу таке в 2014 році

Але можна ж зробити ще лекше не використовуючи goto просто прописати цикли після ":" ....

І отримати switch на кілька екранів, в якому потім не розібратись. Нашо так жити.

12 Востаннє редагувалося koala (16.10.2014 12:20:02)

Re: TurboPascal. Різні цикли.

quez написав:
Dan написав:

Але можна ж зробити ще лекше не використовуючи goto просто прописати цикли після ":" ....

І отримати switch на кілька екранів, в якому потім не розібратись. Нашо так жити.

Наскільки я бачу, там 90% коду в гілках повторюється, і його можна просто винести наперед і після case.

Подякували: pashtet1

13 Востаннє редагувалося Master_Sergius (16.10.2014 13:42:18)

Re: TurboPascal. Різні цикли.

Так, студентів наразі навчають алгоритмізації, але, на жаль, стилем говнокоду.
1) не лінуйтеся називати змінні змістовними словами, а не a,b,c,q,r,w
2) те, що має виконатися відповідно до меню потрібно запхати у підпрограми

Ваш код повинен бути приблизно таким опісля меню:

case answer of
    1: demo_while_do(arguments);
    2: demo_repeat_until(arguments);
    3: demo_if_then_goto(arguments);
    4: exit;
end;
Подякували: pashtet1

14

Re: TurboPascal. Різні цикли.

Якщо вони тільки цикли вивчають, то до функцій ще не дісталися.

Подякували: pashtet1

15 Востаннє редагувалося pashtet (19.10.2014 14:59:44)

Re: TurboPascal. Різні цикли.

koala написав:

Насправді, як подумати - може, і не все так погано... можу припустити, що викладач спочатку дав учням помучитися з goto, щоб потім було зрозуміліше, чому його не радять вживати. Нехай. Але в будь-якому разі програма пишеться для якогось завдання, і можна сказати, що вона працює, тільки тоді, коли це завдання відомо. Ви ж завдання не навели, тому ми нічим вам не можемо допомогти. Ну хіба що дослівно:

var i:integer;
begin
  for i:=1 to 10 do;
  while i>0 do dec(i);
  repeat inc(i) until i>=10;
end.

Тепер програма працює з усіма трьома циклами.

Ну і бажано писати код так, щоб його можна було нормально читати. Наприклад, мітки q,w,e,r,t ні про що не кажуть; але якби t звалося quit, то було б зрозуміло, що це мітка біля виходу, і goto quit виходить з програми.

Завдання:

Обчислити і вивести значення функції при зміні значення аргументу від А до В з кроком С, і визначити мінімальне та максимальне значення функції на відрізку. Використати в одній програмі три різні типи використання простих циклів (IF THEN GOTO, WHILE-DO, REPEAT-UNTIL).

Post's attachments

cats.jpg 19.25 kb, 286 downloads since 2014-10-19 

16

Re: TurboPascal. Різні цикли.

У вас скучний пост, так вам ніхто грошей не дасть не допоможе. Треба якісь напрацювання.

17

Re: TurboPascal. Різні цикли.

pashtet
Оформіть нову тему для нового запитання.
Ну і quez правий: що саме у вас не виходить? Покажіть код з помилкою.

18 Востаннє редагувалося koala (19.10.2014 15:53:36)

Re: TurboPascal. Різні цикли.

quez, Torbins - код на самому початку. І помилка там само.

19 Востаннє редагувалося koala (19.10.2014 15:58:55)

Re: TurboPascal. Різні цикли.

pashtet написав:

Завдання:

Обчислити і вивести значення функції при зміні значення аргументу від А до В з кроком С, і визначити мінімальне та максимальне значення функції на відрізку. Використати в одній програмі три різні типи використання простих циклів (IF THEN GOTO, WHILE-DO, REPEAT-UNTIL).

Це завдання взагалі не передбачає введення будь-чого: вся інформація задана в умові. X не вводиться, а набуває значень від a до b. Виправте свою програму (і, до того ж, ви ніде не виставляєте значень для a і b...)

Подякували: Torbins1