• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите доработать программу на Паскале

Severina

Вечная ученица
Регистрация
27 Июн 2011
Сообщения
29
Реакции
0
Баллы
0
Помогите доработать программу на Паскале

Добрый вечер,
не могу доработать программу.

В начале напишу задание, код программки, а потом, что у меня не вышло.

Задание:
Разработать программу, которая в зависимости от введенного пользователем значения варианты должна:
1. вводить переменные целого типа и выполнять над ними все возможные арифметические операции;
2. вводить переменные вещественного типа и выполнять над ними все возможные арифметические операции;
3. формировать переменные логического типа и выполнять над ними все возможные логические операции;
4. вычислять логическое выражение в соответствии с вариантом;
5. вводить строковые переменные и выполнять над ними операцию конкатенации;
6. выполнять операции отношения над переменными различных типов;
7. выполнять определение машинного представления значений целого типа с использованием операции сдвига в соответствии со своим вариантом.

Примечания.
• Результаты работы по каждому пункту задания должны быть выведены на экран.
• Для выбора пункта задания использовать оператор CASE.

Вариант п.7 задания : первое значение – 19, следующие 9 – предыдущее, увеличенное на тот же №.

Код:
program lab3;
Uses CRT;
const   {Zadaem logicheskie konstanti:}
log1=false;log2=false;
log3=false;log4=true;
                           {Zadaem strokovie konstanti: }
slovo1='Par'; slovo3='Voz';
slovo2='i';
var                        {Zadaem tip dannix}
B1:char;                                  {simvolnii}
a,b,c,l,m,v,j,i:integer;                  {celii}
x,y,D,k,Z,p,n:real;                       {vecestvennii}
log5, log6,log7,log8,log9,log10,F:boolean;{logicheskii}
fraza: string[40];                        {strokovii}
pervaya_strochka: string[50];
vtoraya_strochka: string[50];
name:string;
otvet:string[3];
label                      {Zadaem metki}
m1,m2,m3,m4;
                           {Nachinaem telo programmi}
begin
Clrscr;                    {Znakomstvo s polzovatelem}
writeln('Salut! What is you name?');
 readln(name);
Clrscr;
writeln('Priyatno poznakomitsya ', name);
Readkey;
m2: writeln;               {Perechislenie vozmognix deistvii}
writeln('Segodnya na vibor:');
writeln('1)Rabota s peremennimi celogo tipa.');
writeln('2)Rabota s peremennimi vecestvennogo tipa.');
writeln('3)Rabota s peremennimi logicheskogo tipa.');
writeln('4)Vichislenie logicheskogo virageniya.');
writeln('5)Rabota so strokovimi peremennimi. Konkotenaciya.');
writeln('6)Rabota s operaciyami otnosheniya.');
writeln('7)Opredelenie mashinnogo predstavleniya chisla.');
writeln('8)Nichego ne delat. Vixod.');
 readln(B1);               {Vibor deistviya}
  if B1 in ['1','2','3','4','5','6','7','8'] then
   case B1 of
    '1': begin
Clrscr;                    {Pri vibore 1 vipolnyaetsya:}
writeln('Rabota s peremennimi celogo tipa.');
writeln('Vvedite tri celix cisla cherez probel.');
 readln(a,b,c);
writeln('Schitaem primer:');
writeln('Z=k+l-m');
writeln('gde  k=a*a/b');
writeln('l=c div a');
writeln('m=k mod l');
writeln(' i a,b,c - vvedenie chisla.');
writeln;
 k:=a*a/b;
 l:=c div a;
 m:=b mod l;
 Z:=k+l+m;
writeln;
writeln('Pechataem rezultat:');
writeln('k= ',k:13);
writeln('l= ',l:13);
writeln('m= ',m:13);
writeln('Z= ',Z:13);
  goto m4 ;
         end;
    '2': begin
Clrscr;               {Pri vibore 2 vipolnyaetsya:}
writeln('Rabota s peremennimi vecestvennogo tipa.');
writeln('Vvedite dva chisla cherez probel/enter. Zatem nagmite Enter.');
 readln(y,x);
writeln('Rechaem primer: ');
writeln('D=(y*y*y-x)/2.16E3-4.3+(exp(3*ln(y+x))))+(exp(2*(sin(x-y)/cos(x-y))))');
writeln('gde  d,f,g - vvedennie chisla.');
 D:=(y*y*y-x)/2.16E3-4.3+(exp(3*ln(y+x)))+(exp(2*(sin(x-y)/cos(x-y))));
writeln('Rezultat: D= ',D);
  goto m4 ;
         end;

    '3': begin
Clrscr;              {Pri vibore 3 vipolnyaetsya}
writeln('Rabota s peremennimi logicheskogo tipa.');
writeln('Dani isxodnie dannie:');
writeln('log1= ',log1);
writeln('log2= ',log2);
writeln('log3= ',log3);
writeln('log4= ',log4);
 log5:=log1 or log2;
 log6:= not log3;
 log7:=log4 xor log1;
 log8:=log2 and log3;
writeln('Logicheskoe slogenie (log1 и log2)= ',log5);
writeln('Logicheskoe otricanie (log3)= ',log6);
writeln('Slogenie po modulu  2 (log4 и log1)= ',log7);
writeln('Logicheskoe umnogenie (log12 и log3)= ',log8);
  goto m4 ;
         end;
    '4': begin         {Pri vibore 4 vipolnyaetsya:}
Clrscr;
writeln('Vichislenie logicheskogo virageniya.');
writeln('Isxodnie dannie:');
writeln('log1= ',log1);
writeln('log2= ',log2);
writeln('log3= ',log3);
writeln('log4= ',log4);
writeln('Dano viragenie:');
writeln('F=(log1 xor log2)or (log2 or (not log3)) and log4 and (log1 or (not log3))');
writeln('Proizvodim vichislenie.');
 F:=(log1 xor log2)or (log2 or (not log3)) and log4 and (log1 or (not log3));
writeln('Rezultat virageniya: F= ', F);
  goto m4;
         end;

    '5':  begin     {Pri vibore 5 vipolnyaetsya:}
Clrscr;
writeln('Rabota so strokovimi peremennimi. Konkotenaciya.');
writeln('Isxodnie dannie:');
writeln  ( 'slovo1= ',slovo1);
writeln  ( 'slovo2= ',slovo2);
writeln   ('slovo3= ',slovo3);
 fraza:= slovo1 + ' '+ slovo2 + ' '+ slovo3 + ' = '+ 'Parovoz';
writeln('Rezultat: ',  'fraza= ', fraza);
  goto m4 ;
         end;
    '6': begin          {Pri vibore 6 vipolnyaetsya:}
Clrscr;
writeln('Rabota s operaciyami otnosheniya');
writeln('Vvedite dva celix chisla cherez probel/enter.');
 readln(p,n);
writeln('p= ',p);
writeln('n= ',n);
 log9:=p>n;
writeln('Rezultat p>n: log9= ',log9);
writeln;
writeln('Sravnim dve stroki.');
writeln('Vvedite dve stroki cherez enter.');
readln(pervaya_strochka);
readln(vtoraya_strochka);
writeln('pervaya strochka= ',pervaya_strochka);
writeln('vtoraya strochka= ',vtoraya_strochka);
 log10:=pervaya_strochka = vtoraya_strochka;
writeln(' log10: pervaya strochka ravna vtoroi?',log10);
  goto m4 ;
         end;
    '7': begin          {Pri vibore 7 vipolnyaetsya:}
Clrscr;
writeln('Opredelenie mashinnogo predstavleniya chisla');
 v:=1;
m1:if v<181 then begin
 v:=v+18;
 j:=256;
write('v= ',v:2, ' =');
for i:=8 downto 0 do begin
 if v and j=j then write('1')
              else write ('0');
 j:=j shr 1;
                     end;
writeln;

goto m1;
                 end;
  goto m4 ;
         end;
    '8': {Pri vibore 1 vipolnyaetsya:}goto m3;
else goto m2;
end;
m4 : repeat until keypressed;
writeln('Xotite prodolgit? (da/net)');
readln(otvet);
if otvet='da' then goto m2
                                             else goto m3;
m3: writeln('Udachnogo dnya!');
repeat until keypressed;
end.


Суть вопроса:
На 8 строчке снизу стоит метка m4 ( я перехожу на нее после каждой части), но вот дальше программа работать не хочет. При вводе ответа (da или net) она переходит только на m3 и выбивается.
На паре разобраться с этим не смогла, и преподаватель тоже пожала плечами.
Помогите пожалуйста!
 
Для начала советую избавиться от меток и оформить каждый пункт в виде отдельной процедуры, это позволит вам избежать выполнения "лишних" операций и структурирует код.

Метки - позапрошлый век, их использование в вашей программе неоправданно. Например, эту часть кода:
m1:if v<181 then begin
v:=v+18;
j:=256;
write('v= ',v:2, ' =');
for i:=8 downto 0 do begin
if v and j=j then write('1')
else write ('0');
j:=j shr 1;
end;
writeln;
goto m1;
можно оформить так, даже не сильно вчитываясь в смысл операций:
while v<181 do begin
v:=v+18;
j:=256;
write('v= ',v:2, ' =');
for i:=8 downto 0 do begin
if v and j=j then write('1')
else write ('0');
j:=j shr 1;
end;
writeln;
end;
Каждый раз выходить по метке из структуры выбора не имеет смысла, так как для каждого значения операнда выполняется только своя группа операторов, другие игнорируются. Поэтому использование метки m4 бессмысленно.
Далее, поместите всю структуру выбора в тело цикла Repeat_until и вам не нужна будет ваша метка m2 :))

Поведению вашего преподавателя я не удивляюсь, в настолько плохо структурированной программе с обилием меток никто копаться не станет, время - деньги и достаточно дорого.
 
Поведению вашего преподавателя я не удивляюсь, в настолько плохо структурированной программе с обилием меток никто копаться не станет, время - деньги и достаточно дорого.
Да ладно, кое-кто сегодня добрый, так что станет.
К вышесказанному ПОЛНОСТЬЮ присоединяюсь - настоятельно рекомендую о метках забыть. Переходы по меткам - это крайне дурной стиль программирования, и применять их нужно только в каких-то самых экзотических конструкциях.
Кроме того:
1. Ошибка работы программы связана с некорректным использованием CRT-шного оператора Keypressed; после него обязательно нужно обнулить буфер символа командой Readkey. Впрочем, можно обойтись только ею, причем допускается использование ее не только как функции, но и как процедуры. То есть не обязательно
Chrrr:=Readkey;
можно просто
Readkey;
2. Ну зачем, скажите на милость, в качестве параметра оператора Case брать символы '1', '2' и т.д., в операторе if использовать множество, если можно обойтись числами 1, 2, ...? Абсолютно неоправданное усложнение.
В общем, посмотрите мой вариант с учетом вышесказанного. По-моему, лучше так:
Код:
Uses CRT;
const   {Zadaem logicheskie konstanti:}
 log1=false;
 log2=false;
 log3=false;
 log4=true;
                           {Zadaem strokovie konstanti: }
 slovo1='Par';
 slovo3='Voz';
 slovo2='i';
var                        {Zadaem tip dannix}
 Otvet:char;                               {simvolnii}
 B1:Byte;                                  {0..255}
 a,b,c,l,m,v,j,i:integer;                  {celii}
 x,y,D,k,Z,p,n:real;                       {vecestvennii}
 log5,log6,log7,log8,log9,log10,
 F,bul:boolean;                            {logicheskii}
 fraza: string[40];                        {strokovii}
 pervaya_strochka: string[50];
 vtoraya_strochka: string[50];
 name:string;
                           {Nachinaem telo programmi}
begin
 Clrscr;                    {Znakomstvo s polzovatelem}
 writeln('Salut! What is you name?');
 readln(name);
 writeln('Priyatno poznakomitsya, ', name);
 Readkey;
 {Perechislenie vozmognix deistvii}
 REPEAT
  Clrscr;
  bul:=true;
  writeln;
  writeln('Segodnya na vibor:');
  writeln('1)Rabota s peremennimi celogo tipa.');
  writeln('2)Rabota s peremennimi vecestvennogo tipa.');
  writeln('3)Rabota s peremennimi logicheskogo tipa.');
  writeln('4)Vichislenie logicheskogo virageniya.');
  writeln('5)Rabota so strokovimi peremennimi. Konkotenaciya.');
  writeln('6)Rabota s operaciyami otnosheniya.');
  writeln('7)Opredelenie mashinnogo predstavleniya chisla.');
  writeln('8)Nichego ne delat. Vixod.');
  readln(B1);               {Vibor deistviya}

 if B1<9  then
   case B1 of
     1: begin
          Clrscr;       {Pri vibore 1 vipolnyaetsya:}
          writeln('Rabota s peremennimi celogo tipa.');
          writeln('Vvedite tri celix cisla cherez probel.');
          readln(a,b,c);
          writeln('Schitaem primer:');
          writeln('Z=k+l-m');
          writeln('gde  k=a*a/b');
          writeln('l=c div a');
          writeln('m=k mod l');
          writeln(' i a,b,c - vvedenie chisla.');
          writeln;
          k:=a*a/b;
          l:=c div a;
          m:=b mod l;
          Z:=k+l+m;
          writeln;
          writeln('Pechataem rezultat:');
          writeln('k= ',k:13);
          writeln('l= ',l:13);
          writeln('m= ',m:13);
          writeln('Z= ',Z:13);
        end;
     2: begin
          Clrscr;        {Pri vibore 2 vipolnyaetsya:}
          writeln('Rabota s peremennimi vecestvennogo tipa.');
          writeln('Vvedite dva chisla cherez probel/enter. Zatem nagmite Enter.');
          readln(y,x);
          writeln('Rechaem primer: ');
          writeln('D=(y*y*y-x)/2.16E3-4.3+(exp(3*ln(y+x))))+(exp(2*(sin(x-y)/cos(x-y))))');
          writeln('gde  d,f,g - vvedennie chisla.');
          D:=(y*y*y-x)/2.16E3-4.3+(exp(3*ln(y+x)))+(exp(2*(sin(x-y)/cos(x-y))));
          writeln('Rezultat: D= ',D);
        end;
     3: begin
          Clrscr;              {Pri vibore 3 vipolnyaetsya}
          writeln('Rabota s peremennimi logicheskogo tipa.');
          writeln('Dani isxodnie dannie:');
          writeln('log1= ',log1);
          writeln('log2= ',log2);
          writeln('log3= ',log3);
          writeln('log4= ',log4);
          log5:=log1 or log2;
          log6:= not log3;
          log7:=log4 xor log1;
          log8:=log2 and log3;
          writeln('Logicheskoe slogenie (log1 и log2)= ',log5);
          writeln('Logicheskoe otricanie (log3)= ',log6);
          writeln('Slogenie po modulu  2 (log4 и log1)= ',log7);
          writeln('Logicheskoe umnogenie (log12 и log3)= ',log8);
        end;
     4: begin         {Pri vibore 4 vipolnyaetsya:}
          Clrscr;
          writeln('Vichislenie logicheskogo virageniya.');
          writeln('Isxodnie dannie:');
          writeln('log1= ',log1);
          writeln('log2= ',log2);
          writeln('log3= ',log3);
          writeln('log4= ',log4);
          writeln('Dano viragenie:');
          writeln('F=(log1 xor log2) or (log2 or (not log3)) and log4 and (log1 or (not log3))');
          writeln('Proizvodim vichislenie.');
          F:=(log1 xor log2) or (log2 or (not log3)) and log4 and (log1 or (not log3));
          writeln('Rezultat virageniya: F= ', F);
        end;
     5:  begin     {Pri vibore 5 vipolnyaetsya:}
           Clrscr;
           writeln('Rabota so strokovimi peremennimi. Konkotenaciya.');
           writeln('Isxodnie dannie:');
           writeln  ( 'slovo1= ',slovo1);
           writeln  ( 'slovo2= ',slovo2);
           writeln   ('slovo3= ',slovo3);
           fraza:= slovo1 + ' '+ slovo2 + ' '+ slovo3 + ' = '+ 'Parovoz';
           writeln('Rezultat: ',  'fraza= ', fraza);
         end;
     6: begin          {Pri vibore 6 vipolnyaetsya:}
          Clrscr;
          writeln('Rabota s operaciyami otnosheniya');
          writeln('Vvedite dva celix chisla cherez probel/enter.');
          readln(p,n);
          writeln('p= ',p);
          writeln('n= ',n);
          log9:=p>n;
          writeln('Rezultat p>n: log9= ',log9);
          writeln;
          writeln('Sravnim dve stroki.');
          writeln('Vvedite dve stroki cherez enter.');
          readln(pervaya_strochka);
          readln(vtoraya_strochka);
          writeln('pervaya strochka= ',pervaya_strochka);
          writeln('vtoraya strochka= ',vtoraya_strochka);
          log10:=pervaya_strochka = vtoraya_strochka;
          writeln(' log10: pervaya strochka ravna vtoroi?',log10);
        end;
     7: begin          {Pri vibore 7 vipolnyaetsya:}
          Clrscr;
          writeln('Opredelenie mashinnogo predstavleniya chisla');
          v:=1;
          while v<181 do
           begin
            v:=v+18;
            j:=256;
            write('v= ',v:2, ' =');
            for i:=8 downto 0 do
             begin
              if v and j=j then write('1')
              else write ('0');
              j:=j shr 1;
             end;
            writeln;
           end;
        end;
     8: {Pri vibore 8 vipolnyaetsya:}
         bul:=false;
   end;
  If bul then
   begin
    writeln;
    write('Xotite prodolgit? (Y/N) ');
    readln(otvet);
   end;
 UNTIL (Not(bul)) or (Otvet='N') or (Otvet='n');
 writeln('Udachnogo dnya!');
 Readkey;
end.
 
Метки - позапрошлый век, их использование в вашей программе неоправданно. Например, эту часть кода
...
можно оформить так, даже не сильно вчитываясь в смысл операций
...
Далее, поместите всю структуру выбора в тело цикла Repeat_until и вам не нужна будет ваша метка m2
Не, ну до чего синхронно мыслим - это же кошмар! :D:D:D
 
Не, ну до чего синхронно мыслим - это же кошмар! :D:D:D

Не поверите, тоже метки недолюбливаю! )))
А ваш вариант Владимир мог бы быть красивее, если сделать его как сказал Алекс.
Именно его идея пришла мне на ум, ещё до того как я дочитала задание ))
*ну или я полюбила процедуры и функция, я даж не знаю* :tehnari_ru_102:
 
Не поверите, тоже метки недолюбливаю! )))
А ваш вариант Владимир мог бы быть красивее, если сделать его как сказал Алекс.
Именно его идея пришла мне на ум, ещё до того как я дочитала задание ))
*ну или я полюбила процедуры и функция, я даж не знаю* :tehnari_ru_102:
Ну, видите ли, Лена - если бы я решал эту задачку, то тоже, скорее всего, упихнул бы варианты в процедуры, но когда речь идет о помощи и консультации, я всё-таки стараюсь максимально сохранить авторский подход. Одно дело исправить ошибки и убрать эти идиотские метки, другое - кардинально менять стиль. :D
 
Спасибо всем большое за потраченное время, комментарии и исправленную программку. Премного Вам благодарна!

А теперь можно я немного по оправдываюсь?

Для начала советую избавиться от меток и оформить каждый пункт в виде отдельной процедуры, это позволит вам избежать выполнения "лишних" операций и структурирует код.

Метки - позапрошлый век, их использование в вашей программе неоправданно. Например, эту часть кода:

На тот период времени, к сожалению, не имела ни малейшего представления ни о процедурах ни о функциях. Нам даны были только начальные сведения о метках с настоятельной рекомендацией их использовать.
Про Repeat, Until признаюсь, сделала ляп. После одной лекции совершенно не поняла, и побоялась использовать. И как оказалось - зря....
Это уже теперь пытаюсь разобраться=)

1. Ошибка работы программы связана с некорректным использованием CRT-шного оператора Keypressed; после него обязательно нужно обнулить буфер символа командой Readkey. Впрочем, можно обойтись только ею, причем допускается использование ее не только как функции, но и как процедуры. То есть не обязательно
Chrrr:=Readkey;
можно просто
Readkey;

Не знала про этот нюанс. Получается, что Keypressed можно вообще не использовать, а заменить его Readkey?

2. Ну зачем, скажите на милость, в качестве параметра оператора Case брать символы '1', '2' и т.д., в операторе if использовать множество, если можно обойтись числами 1, 2, ...?

Наверное, у меня будет самый глупый ответ: так в примере было сделано. А так по другому не знала как делать, брала оттуда, добросовестно переделав.
 
Нам даны были только начальные сведения о метках с настоятельной рекомендацией их использовать.
Такого "преподавателя" - расстрелять! Без замены штрафом. Сразу видно, что всю жизнь на ФОРТРАНе сидел(а).
Не знала про этот нюанс. Получается, что Keypressed можно вообще не использовать, а заменить его Readkey?
Ага. И даже более того - чтобы приостановить выполнение программы, можно воспользоваться простой командой
Readln;
вот так, без параметров. Правда, в этом случае пуск будет не по любой клавише, а только по Enter.
Ничего, если будете дальше писать программы, все эти тонкости и нюансы освоите без особого труда.
Удачи!
 
Такого "преподавателя" - расстрелять! Без замены штрафом. Сразу видно, что всю жизнь на ФОРТРАНе сидел(а).

Ага. И даже более того - чтобы приостановить выполнение программы, можно воспользоваться простой командой
Readln;
вот так, без параметров. Правда, в этом случае пуск будет не по любой клавише, а только по Enter.
Ничего, если будете дальше писать программы, все эти тонкости и нюансы освоите без особого труда.
Удачи!


Спасибо! Буду писать и учиться=)
 
Назад
Сверху