IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Решение квадратных уровнений., Задачку дали...
lFOXl
сообщение 16.04.2009 16:47
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


Вот собственно в школе дали задачку по информатике. написать програмку, с использованием уже полученных знаний.
Ну думаю - напишу ка я решалку квадратных уровнений, штука полезная всетаки.
взялся писать. Все отлично шло, первая версия тупо щитала дискриминант и два корня. Ни проверки на дискриминант меньше, или равно нулю, ничего больше небыло.
Потом добавил проверку на дискриминант меньше нуля. Все ещ программа работала нормально.
Ну решил впихнуть запрос на выход (Y/N). Все работало.
НО! После добавления проверки на дискриминант равен нулю ( тогда вычисления идут по другой формуле), и вводом label'ов все перестало работать. проблемма собственно вот в чем:
Когда вычисления идут по стандартной форме, или вообще не идут по причине дискр. меньше нуля, то запрос работает хорошо, сбоев нет, по вводу "y" программа завершаеться. НО, если все идет по новой формуле - программа вообще ввода значения не производит. тоесть после вопроса "ВЫход (Y/N)" программа сразу начинает свое выполнение заного.


Program sqr_ur;
label 1,io;
var
y1: char;
a,b,c: integer;
d: real;
x,y: real;
begin


writeln('_______ _____ _ _ _____ ______ _____ ______');
writeln('|______ | | \___/ |_____] |_____/ | | | ____');
writeln('| |_____| _/ \_ | | \_ |_____| |_____|');
writeln('Добро пожаловать в программу решения квадратных уровнений!');

writeln('Для продолжения нажмите любую кнопку.');
readln;
while y1<>'y' do
begin
1:writeln('Введите а, b и с через пробел и нажмите кнопку Enter.');
read(a,b,c);
d:= (b*b)-(4*a*c);
if (d=0) then
begin
Writeln('Дискриминант равен нулю а значит вычисления пойдут по другой формуле.');
x:=((-1)*(b/2*a));

Writeln('X=', X:6:2);

goto io;

end;
if (d<0) then
begin
writeln('Дискриминант меньше нуля. Уровнение не имеет решений. Нажмите любую кнопку, чтобы начать сначала.');
readln;
readln;
goto 1;
end;
Writeln('Дискриминант равер', d:6:2,'Нажмите куда-нить, чтобы продолжить.');
readln;
x:= (b*(-1)+sqrt(d))/(a*2);
y:= (b*(-1)-sqrt(d))/(a*2);
Writeln('X1=', x:6:2);
writeln('X2=', y:6:2);
io:writeln('Уравнение решено! Выход? (Y/N)'); read (y1);

end;
end.

помогите кто-то разобраться... вроде правильно все. приму любую критику, т\к учусь только =)
П.С. все слова писал на русском, а кодировку винда не понимает паскалевскую. так что либо скопируйте текст в оболочку паскаль, либо вот вам исходник прикрепленный.

Поправил кодировку.

Сообщение отредактировано: volvo - 16.04.2009 17:10


Прикрепленные файлы
Прикрепленный файл  KV_UROV.PAS ( 1.29 килобайт ) Кол-во скачиваний: 175
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 16.04.2009 17:19
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


lFOXl, намудрил ты с этими метками, зачем они тебе вообще нужны? И вместо whileИ, думаю, лучше использовать repeat, потому что первый сразу проверяется y1, которое у тебя еще не известно, как-то это не корректно..
В общем получится такая структура:
repeat
if d=0 then
begin
<считаешь по "новой формуле", выводишь>
end
esle if d<0 then // обрати внимание на наличие els'ов
begin
<говоришь, что решений нет>
end
else
begin
<считаешь и выводишь по основной формуле>
end;
<запрос на продолжение>
until y1='y';


и никаких go to и меток, выполнению нужных действий обеспечивает условный оператор (на то он и нужен smile.gif)

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

Сообщение отредактировано: Айра - 16.04.2009 17:44
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lFOXl
сообщение 16.04.2009 17:47
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


Спасибо, попробую так все сделать.. с метками разберусь, просто так как-то задача проще встает в моск, чем без меток =)



Добавлено позже:
И все равно программа "заккругляеться".
Причем, когда по совету убрал множественные подтверждения "любой кнопкой", то оно начало стартовать заново даже по обычной формуле. Оно аповторяет все, что находиться после repeat без запроса Y/N.... у кого какие мысли? буду сам думать тоже, но от помощи не откажусь.

вот код программы на данный момент.
Program sqr_ur;
var
y1: char;
a,b,c: integer;
d: real;
x,y: real;
begin


writeln('_______ _____ _ _ _____ ______ _____ ______');
writeln('|______ | | \___/ |_____] |_____/ | | | ____');
writeln('| |_____| _/ \_ | | \_ |_____| |_____|');
writeln('Д®бр® п®жал®вать в пр®грамму решения квадратных ур®внени©!');

writeln('Для пр®д®лжения нажмите любую кн®пку.');
readln;
repeat
writeln('Введите а, b и с через пр®бел и нажмите кн®пку Enter.');
read(a,b,c);
d:= (b*b)-(4*a*c);
if (d=0) then
begin
Writeln('Дискриминант равен нулю а значит вычисления п®©дут п® друг®© ф®рмуле.');
x:=((-1)*(b/2*a));
Writeln('X=', X:6:2);
end
else if (d<0) then
begin
writeln('Дискриминант меньше нуля. Фр®внение не имеет решени©. Нажмите любую кн®пку, чт®бы начать сначала.');
readln;
end
else
begin
Writeln('Дискриминант равер', d:6:2,'Нажмите куда-нить, чт®бы пр®д®лжить.');
readln;
x:= (b*(-1)+sqrt(d))/(a*2);
y:= (b*(-1)-sqrt(d))/(a*2);
Writeln('X1=', x:6:2);
writeln('X2=', y:6:2);
end;
writeln('Фравнение решен®! Вых®д? (Y/N)'); read (y1);
until y1='y';
end.



p.s. как самому декодировать эту кодировку? чтобы больше никого не парить.

Сообщение отредактировано: lFOXl - 16.04.2009 19:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 16.04.2009 17:52
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Не знаю) Без меток получается цикл, пока y1 не равно "y" решаем разные уравнения, а с ними несколько раз прыгать туда-сюда.. не рационально как-то)) (и думаю, если будешь показывать преподавателю, не воспримет sad.gif )

Сообщение отредактировано: Айра - 16.04.2009 17:53
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lFOXl
сообщение 16.04.2009 18:06
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


да тут не преподаватель важен. Я действительно хочу научиться, да и не успокоюсь пока не сделаю, чтобы паскаль делал то, что я от него хочу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 16.04.2009 18:10
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Это хорошее стремление smile.gif только еще важно, чтобы программа не просто работала, а делала это хорошо и, эх повторяюсь, рационально))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lFOXl
сообщение 16.04.2009 18:13
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


дак вот чтобы рационально делала нужно млин знать, как сделать чтобы рациональность была. Мы вообще очень мало по паскалю прошли. Буквально до циклов и дошли. В остальном сам разбирался... вот и тут разобраться хочу, но блин, не выходит wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 16.04.2009 18:23
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Ой, чего ж ты не сказал, что новый код выложил.. только сейчас случайно заметила.. *пошла разбирать*

Добавлено через 2 мин.
Попробуй исправить read на readln..
на счет кодировки не знаю..

Сообщение отредактировано: Айра - 16.04.2009 18:30
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lFOXl
сообщение 16.04.2009 18:40
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


теперь выход работает при нормальной формуле. при =0 запрос отображаеться, но вводи хоть n, хоть y, программа выполняет repeat. Тоесть проблемма решена только частично...
И еще я не очень понял, ведь read и readln это две одинаковые функции, только readln выводит "поле для ввода" с новой строки... почему оно не работало?

Сообщение отредактировано: lFOXl - 16.04.2009 18:41
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 16.04.2009 18:44
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Тогда попробуй исправить на readln и во вводе a,b,c..
Цитата
И еще я не очень понял, ведь read и readln это две одинаковые функции, только readln выводит "поле для ввода" с новой строки... почему оно не работало?

unsure.gif я точно не знаю, но уже сталкивалась с подобным.. может кто-нибудь другой объяснит..

Сообщение отредактировано: Айра - 16.04.2009 18:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.04.2009 18:47
Сообщение #11


Гость






Цитата
как самому декодировать эту кодировку?
Ты когда сюда выкладываешь, у тебя кракозябры в программе получаются... Смени кодировку странички в браузере на Cyrillic DOS 866, получится что все в кракозябрах, твоя программа - как положено. Копируешь ее в буфер обмена, и еще раз правишь текст сообщения... Вот и все smile.gif Попробуй сделать это сейчас...

Добавлено через 2 мин.
Цитата
read и readln это две одинаковые функции, только readln выводит "поле для ввода" с новой строки... почему оно не работало?
Потому что тот самый read не читает символ перевода строки, полученный при нажатии Enter-а. А тебе надо его читать. Для этого используется Readln. А не для того, чтоб что-то выводить с новой строки. Readln ничего не выводит, он только вводит...
 К началу страницы 
+ Ответить 
lFOXl
сообщение 16.04.2009 19:12
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Денис

Репутация: -  0  +


Заработало) Всем огромное спасибо!
volvo понял про реад и ридлн.. но я н имел ввиду что readln что-то выводит, это просто выражаюсь я так, не понятно) хех)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 23:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"