Równanie kwadratowe, dziwny błąd spoj.

0

http://pl.spoj.com/problems/ROWNANIE/

Ma ktoś pomysł co ten błąd może oznaczać?

#include <iostream>
using namespace std;
int main()
{
  float a,b,c;
  int i=1;
  float *delta;
  while(1)
  {
         delta =new float[i];
         cin>>a>>b>>c;
         delta[i]=b*b-4*a*c;
         if(delta[i]==0) cout<<"1"<<endl;
         else if(delta[i]<0) cout<<"0"<<endl;
         else cout<<"2"<<endl;
         i++;
  }
  return 0;
}


2
delta =new float[i];
Wychodzisz poza zakres tablicy. Alokujesz pamięć na tablicę jednoelementową. I od razu Zonk -
delta[i]=b*b-4*a*c;
- `i = 1`, a tablica ma tylko jeden element o indeksie 0.

W każdej pętli, alokujesz tablicę, a nigdzie nie zwalniasz pożyczonej pamięci.

Opis błędu powinien być dostępny na spoju.

Skorzystaj może std::vector i nie martw się o pożyczoną pamięć.

0

Fakt :) czyli teraz powinno byc dobrze?
Ale nowy smieszny blad wyskakuje.

#include <iostream>
using namespace std;
int main()
{
  float a,b,c;
  int i=2;
  float *delta;
  while(1)
  {
         delta =new float[i];
         cin>>a>>b>>c;
         delta[i]=b*b-4*a*c;
         if(delta[i]==0) cout<<"1"<<endl;
         else if(delta[i]<0) cout<<"0"<<endl;
         else cout<<"2"<<endl;
         i++;
  }
  return 0;
}
 
1

Nie wiele się zmieniło.

  int i=2;
  float *delta;
  while(1)
  {
         delta =new float[i]; // alokacja na dwa elementy, indeksy 0 i 1
         cin>>a>>b>>c;
         delta[i]=b*b-4*a*c; // odwołanie się do elementu o indeksie 2 (nie istniejącego)

Nadal nie zwalniasz pamięci.

0

Teraz powróciłem do pierwszego błędu, a może coś z while'em jest nie tak?

 i++;
         delete[] delta;
  }
  return 0;
}
0

Wrzuć aktualny kod.

0
#include <iostream>
using namespace std;
int main()
{
  float a,b,c;
  int i=2;
  float *delta;
  while(1)
  {
         delta =new float[i];
         cin>>a>>b>>c;
         delta[i-1]=b*b-4*a*c;
         if(delta[i-1]==0) cout<<"1"<<endl;
         else if(delta[i-1]<0) cout<<"0"<<endl;
         else cout<<"2"<<endl;
         delete[] delta;
  }
  return 0;
}
1

Tak właściwie to dlaczego masz tam nieskończoną pętlę i po co z delty robisz tablicę?

1

Jeżeli masz

delta =new float[i]

to odwołanie się do elementu delta[i] jest zabronione, bo taki element nie istnieje.

Poza tym po co tworzysz za każdym razem tablicę jak potrzebujesz tylko jednego elementu? Zamień każde wystąpienie delta[i] na delta i masz to samo, a mniej błędów (oczywiście definicja musi być float delta).

0

Mam nieokreśloną pętlę while ponieważ w zadaniu nie jest określona ilość danych które zostaną przyjęte.
Z tą tablicą to prawda, nie wiem dlaczego nie dałem po prostu delta :)

 #include <iostream>
using namespace std;
int main()
{
  float a,b,c;
  int i=2;
  float delta;
  while(1)
  {
         cin>>a>>b>>c;
         delta=b*b-4*a*c;
         if(delta==0) cout<<"1"<<endl;
         else if(delta<0) cout<<"0"<<endl;
         else cout<<"2"<<endl;
  }
  return 0;
}

2

Wskutek tego Twój program działa w nieskończoność, przez co jest właśnie terminowany na SPOJu.
Zamień to na while (cin >> a >> b >> c) {.

PS nie porównuj liczb zmiennoprzecinkowych za pomocą operatora ==.

0

Ja bym to zrobił tak :)

int main();
      float a,b,c,D,E,T;

         {

        do  {

          cout << "Kalkulator dla funkcji kwadratowej!" << endl;

          cout << "Podaj wspolczynnik a: ";
          cin >> a;

          cout << "Podaj wspoczynnik b: ";
          cin >> b;

          cout << "Podaj wspoczynnik c: ";
          cin >> c;

          if (a==0)
    {
                cout << "To nie jest funkcja kwadratowa ";
    }

           D=b*b-4*a*c;

           if (D<0)
    {
               cout << D << endl;
               cout << "Delta nie ma pierwiastkow" << endl;
    }

           if (D==0)
    {
               cout << "Delta wynosi: " << D << endl;
               cout << "Delta ma jedno miejsce zerowe i jest nim X1: " << -b/2*a << endl;
    }

            if (D>0)
    {
               cout << "Delta wynosi: " << D << endl;
               cout << endl;
               cout << "Pierwiastek z delty wynosi: "<< sqrt(D) << endl;
               cout << "X1 rowna sie: " << -b+D/2*a << endl;
               cout << "X2 rowna sie: " << b+D/2*a << endl;
    }

               cout << endl;
               cout << endl;
               cout << "Wcisnij dowolny klawisz aby uruchomic program na nowo." << endl;
               cout << endl;

      } while (getch() != 0);


    return 0;

0

@Patryk27 Dziękuje za opinie :) Jestem mocno początkujący, mógłbyś powiedzieć co byś tym kodzie zmienił?

.

0

Anonimie twój kod już w poczatkowych wierszach wykraczylby sie na spoju. Poczytaj jak na spoju wprowadzac i wyprowadzac dane. Poza tym to zadanie mozna zrobic w kilku linijkach

0
#include <iostream>
#include <limits>
#include <cmath>

using namespace std;

int main()
{
	double a,b,c;
	while(cin >> a >> b >>c) {
		double delta = b*b - 4*a*c;
		if (numeric_limits<double>::epsilon() * (2*fabs(b) + 4*fabs(a) + 4*fabs(c)) + 10 * numeric_limits<double>::min() >= delta) {
			cout << '1' << end; 
		} else if (delta < 0) {
			cout << '0' << end; 
		} else {
			cout << '2' << end; 
		}
	}
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1