28.09.2011, 23:01 | #1 (permalink) |
Вечная ученица
Регистрация: 27.06.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите доработать программу на Паскале
не могу доработать программу. В начале напишу задание, код программки, а потом, что у меня не вышло. Задание: Разработать программу, которая в зависимости от введенного пользователем значения варианты должна: 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 и выбивается. На паре разобраться с этим не смогла, и преподаватель тоже пожала плечами. Помогите пожалуйста! |
28.09.2011, 23:01 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Не отчаивайтесь, если ответа так и не нашлось, вы можете просмотреть схожие темы Помогите составить программу на Паскале Помогите создать программу на турбо Паскале Помогите написать программу в Паскале Помогите составить программу на борланд паскале |
29.09.2011, 13:22 | #2 (permalink) | ||
support
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
|
Для начала советую избавиться от меток и оформить каждый пункт в виде отдельной процедуры, это позволит вам избежать выполнения "лишних" операций и структурирует код.
Метки - позапрошлый век, их использование в вашей программе неоправданно. Например, эту часть кода: Цитата:
Цитата:
Далее, поместите всю структуру выбора в тело цикла Repeat_until и вам не нужна будет ваша метка m2 Поведению вашего преподавателя я не удивляюсь, в настолько плохо структурированной программе с обилием меток никто копаться не станет, время - деньги и достаточно дорого.
__________________
Убить всех человеков! |
||
29.09.2011, 15:30 | #3 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
К вышесказанному ПОЛНОСТЬЮ присоединяюсь - настоятельно рекомендую о метках забыть. Переходы по меткам - это крайне дурной стиль программирования, и применять их нужно только в каких-то самых экзотических конструкциях. Кроме того: 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. |
|
30.09.2011, 11:33 | #5 (permalink) |
Sparkling
Регистрация: 29.09.2010
Сообщений: 98
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 93
|
Не поверите, тоже метки недолюбливаю! )))
А ваш вариант Владимир мог бы быть красивее, если сделать его как сказал Алекс. Именно его идея пришла мне на ум, ещё до того как я дочитала задание )) *ну или я полюбила процедуры и функция, я даж не знаю* |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
30.09.2011, 13:07 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну, видите ли, Лена - если бы я решал эту задачку, то тоже, скорее всего, упихнул бы варианты в процедуры, но когда речь идет о помощи и консультации, я всё-таки стараюсь максимально сохранить авторский подход. Одно дело исправить ошибки и убрать эти идиотские метки, другое - кардинально менять стиль.
|
30.09.2011, 22:03 | #7 (permalink) | |||
Вечная ученица
Регистрация: 27.06.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо всем большое за потраченное время, комментарии и исправленную программку. Премного Вам благодарна!
А теперь можно я немного по оправдываюсь? Цитата:
Про Repeat, Until признаюсь, сделала ляп. После одной лекции совершенно не поняла, и побоялась использовать. И как оказалось - зря.... Это уже теперь пытаюсь разобраться=) Цитата:
Цитата:
|
|||
01.10.2011, 09:35 | #8 (permalink) | ||
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Цитата:
Readln; вот так, без параметров. Правда, в этом случае пуск будет не по любой клавише, а только по Enter. Ничего, если будете дальше писать программы, все эти тонкости и нюансы освоите без особого труда. Удачи! |
||
02.10.2011, 20:35 | #9 (permalink) | |
Вечная ученица
Регистрация: 27.06.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
Спасибо! Буду писать и учиться=) |
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|