Вторник, 26 Ноября 2024, 04:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Дискриминант. Работает программа некорректно...
SaiteiДата: Четверг, 27 Декабря 2012, 23:19 | Сообщение # 1
старожил
Сейчас нет на сайте
Код
#include <iostream>
#include <math.h>
using namespace std;

int A,C;
double B;

int main()
{
setlocale(0,"Russian");
while(true)
{
start:
cout<<"Введите значения переменных A, B, C (можно через пробел)"<<'\n';
cout<<"(A>0)"<<'\n';
cin>>A>>B>>C;
     if(A<=0)
     {
     cout<<"Сожалею, но число A("<<A<<") меньше нуля или равно нулю"<<'\n';
     goto start;
     }
double D = pow(B,2)+4*A*C;
     if(D<0)
     {
     cout<<"Решений нет"<<'\n';
     goto start;
     }
     if(D=0)
     {
     cout<<"Один корень. x = "<<-B/2*A<<'\n';
     goto start;
     }
     if(D>0)
     {
     cout<<"Два корня. x1 = "<<(-B-sqrt(D))/2*A<<"; x2 = "<<(-B+sqrt(D))/2*A<<'\n';
     goto start;
     }
}
return 0;
}

ещё было бы круто избавиться от goto, но при этом сильно не изменяя мою программу

Добавлено (27.12.2012, 23:19)
---------------------------------------------
p.s. какие значения я не вводил бы - всё начиналось с начала...

НохчиДата: Четверг, 27 Декабря 2012, 23:53 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Цитата (Saitei)
double D = pow(B,2)+4*A*C;

формула b^2-4ac вроде


Многие вопросы по Windows отпадут, если посмотреть тут
SaiteiДата: Пятница, 28 Декабря 2012, 00:05 | Сообщение # 3
старожил
Сейчас нет на сайте
Цитата (Нохчи)
формула b^2-4ac вроде

но pow же вроде B возводит в квадрат... Всё правильно

Добавлено (28.12.2012, 00:04)
---------------------------------------------
Нохчи, ОЙ!!! НЕ ЗАМЕТИЛ, СЕЙЧАС ИСПРАВЛЮ.
Спасибо!

Добавлено (28.12.2012, 00:05)
---------------------------------------------
всё равно работает некорректно...

Lord_ZeonДата: Пятница, 28 Декабря 2012, 00:20 | Сообщение # 4
частый гость
Сейчас нет на сайте
Saitei,
if(D=0) Присваиваешь D ноль?

НохчиДата: Пятница, 28 Декабря 2012, 00:25 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Цитата (Saitei)
2*A

Плюс еще это в скобки надо взять.


Многие вопросы по Windows отпадут, если посмотреть тут
TikaraДата: Пятница, 28 Декабря 2012, 01:39 | Сообщение # 6
частый гость
Сейчас нет на сайте
Код
#include <iostream>   
#include <math.h>   
using namespace std;   

int A,C;   
double B;   

int main()   
{   
setlocale(0,"Russian");   
while(true)   
{    
cout<<"Введите значения переменных A, B, C (можно через пробел)"<<'\n';   
cout<<"(A>0)"<<'\n';   
cin>>A>>B>>C;   
       if(A<=0)   
       {   
       cout<<"Сожалею, но число A("<<A<<") меньше нуля или равно нулю"<<'\n';
       continue;
       }
     
       double D = B*B - 4*A*C; // насколько я помню в формуле -4ac

       if(!D)   
       {   
       cout<<"Один корень. x = "<<-(B/(2.0*A))<<'\n';
       continue;
       }
         
       if(D<0)   
       {   
       cout<<"Решений нет"<<'\n';   
       } else {
       D = sqrt(D);   
       cout<<"Два корня. x1 = "<<(-B-D)/(2.0*A)<<"; x2 = "<<(-B+D)/(2.0*A)<<'\n';   
       }   
}   
return 0;   
}


Работает?


Сообщение отредактировал Tikara - Пятница, 28 Декабря 2012, 01:42
TwisterДата: Воскресенье, 30 Декабря 2012, 00:02 | Сообщение # 7
был не раз
Сейчас нет на сайте
Saitei, у тебя не предусмотрен выход из вечного цикла. Программа может закрыться только по нажатию Ctrl+C. Добавь приглашение для выхода из программы.
Tikara, применение оператора continue в данной программе обосновано только при проверке переменной A, далее он не имеет смысла: если выполняется if(!D), то условие if(D<0) выполняться не будет, соответственно не будет выполнен и блок кода. Для большей выразительности кода лучше написать так:
Код

if(D > 0)
     cout << "Два корня\n";
if(D == 0)
     cout << "Один корень\n";
else
     cout << "Нет корней\n";


Сообщение отредактировал Twister - Воскресенье, 30 Декабря 2012, 19:24
xMoonGuarDxДата: Воскресенье, 30 Декабря 2012, 09:29 | Сообщение # 8
участник
Сейчас нет на сайте
Twister, только при д>0 будет два корня, при =0 будет 1 корень.
Насчёт прог, все проги не предусматривают окончание цикла. Использование гото вообще не оправдано считаю.
Берешь вариант Tikara, но при этом думаешь, как завершить его цикл. Зависит от задания:
Если надо, что бы прога выполнялась пока не будет корректный ответ, т.е. не найден корень, тогда заводишь булевскую переменную, по ней устраиваешь while, и в соответсвующих ифах меняешь этот флаг на false. Либо в тех же ифах пишешь бреак.
Второй вариант - это если просто программа должна выполняться просто какое-то время, устравиваешь тогда счетчик интовский и по нему идешь. Можешь вообще тогда фор использовать, либо до while завести переменную, приравнять к нулю и пока она скажем не будет равна 10, прибавлять на 1. Но для этого все же логичнее использовать for. Он как раз это и делает.
NazaДата: Воскресенье, 30 Декабря 2012, 15:29 | Сообщение # 9
GMUser
Сейчас нет на сайте
Код
#include <iostream>
#include <math.h>
using namespace std;

int a, c;
double b, d;

int main() {
       setlocale(0,"Russian");
       while (true) {
           do {
               cout << "Введите A, B, C: \n";
               cin >> a >> b >> c;
               if (a <= 0)
                   cout << "A (" << a << ") <= 0.";
           }
           while (a <= 0);

           d = b * b - 4 * a * c;
           if (!d)
               cout << "x = " << -b / (2 * a) << endl;
           else if (d < 0)
               cout << "Решений нет!\n";
           else {
               d = sqrt(d);
               cout << "x1 = " << (-b + d) / (2 * a) << endl;
               cout << "x2 = " << (-b - d) / (2 * a) << endl;
           }
       }
       return 0;
}


Сообщение отредактировал Naza - Воскресенье, 30 Декабря 2012, 15:31
xMoonGuarDxДата: Воскресенье, 30 Декабря 2012, 15:49 | Сообщение # 10
участник
Сейчас нет на сайте
зачем второй цикл while? Он повышает сложность до O(n^2), и вообще не совсем логично выглядит. Учитывая, что а задается один раз за вычисление всех значений во втором цикле, он(второй цикл) тут совсем не нужен.
TwisterДата: Воскресенье, 30 Декабря 2012, 19:23 | Сообщение # 11
был не раз
Сейчас нет на сайте
xMoonGuarDx, очепяталась smile
RUNGOGET2THECHOPAHДата: Воскресенье, 30 Декабря 2012, 23:05 | Сообщение # 12
участник
Сейчас нет на сайте
Чому при отрицательном A было решено не искать корни?
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг