Помощь - Поиск - Пользователи - Календарь
Полная версия: Решение квадратных уровнений.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
lFOXl
Вот собственно в школе дали задачку по информатике. написать програмку, с использованием уже полученных знаний.
Ну думаю - напишу ка я решалку квадратных уровнений, штука полезная всетаки.
взялся писать. Все отлично шло, первая версия тупо щитала дискриминант и два корня. Ни проверки на дискриминант меньше, или равно нулю, ничего больше небыло.
Потом добавил проверку на дискриминант меньше нуля. Все ещ программа работала нормально.
Ну решил впихнуть запрос на выход (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.

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

Поправил кодировку.
Айра
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)

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



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

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


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

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



p.s. как самому декодировать эту кодировку? чтобы больше никого не парить.
Айра
Не знаю) Без меток получается цикл, пока y1 не равно "y" решаем разные уравнения, а с ними несколько раз прыгать туда-сюда.. не рационально как-то)) (и думаю, если будешь показывать преподавателю, не воспримет sad.gif )
lFOXl
да тут не преподаватель важен. Я действительно хочу научиться, да и не успокоюсь пока не сделаю, чтобы паскаль делал то, что я от него хочу.
Айра
Это хорошее стремление smile.gif только еще важно, чтобы программа не просто работала, а делала это хорошо и, эх повторяюсь, рационально))
lFOXl
дак вот чтобы рационально делала нужно млин знать, как сделать чтобы рациональность была. Мы вообще очень мало по паскалю прошли. Буквально до циклов и дошли. В остальном сам разбирался... вот и тут разобраться хочу, но блин, не выходит wacko.gif
Айра
Ой, чего ж ты не сказал, что новый код выложил.. только сейчас случайно заметила.. *пошла разбирать*

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

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

Добавлено через 2 мин.
Цитата
read и readln это две одинаковые функции, только readln выводит "поле для ввода" с новой строки... почему оно не работало?
Потому что тот самый read не читает символ перевода строки, полученный при нажатии Enter-а. А тебе надо его читать. Для этого используется Readln. А не для того, чтоб что-то выводить с новой строки. Readln ничего не выводит, он только вводит...
lFOXl
Заработало) Всем огромное спасибо!
volvo понял про реад и ридлн.. но я н имел ввиду что readln что-то выводит, это просто выражаюсь я так, не понятно) хех)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.