• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ błąd w kodzie/program rozwiązujący równanie kwadratowe z pliku

VPS Starter Arubacloud
0 głosów
1,038 wizyt
pytanie zadane 16 grudnia 2020 w C i C++ przez matios309 Początkujący (310 p.)
#include <iostream>
#include <fstream>
#include <math.h>
#include <iomanip>

using namespace std;

int main()
{
	fstream plik;
	plik.open("dane.txt", ios::in);
	if(plik.good()==false)
	{
		cout<<"Plik nie istnieje!";
		return 0;
	}
	
	float a,b,c,delta,x1,x2;
	delta=b*b-(4*a*c);
	delta=sqrt(delta);
	x1=(-b+delta)/2*a;
	x2=(-b-delta)/2*a;
	
	plik >> a >> b >> c;
	if(a==0)
	{
		cout<<"Dla a=0 to rownanie nie jest kwadratowe"<<endl;
		plik<<"Dla a=0 to rownanie nie jest kwadratowe"<<endl;
		return 0;
	}
	if(delta<0)
	{
		cout<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie nie ma rozwiazan"<<endl;
		plik<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie nie ma rozwiazan"<<endl;
		return 0;
	}
	else if(delta==0)
	{
		cout<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma jedno rozwiazanie"<<endl;
		cout<<"x1= "<<x1<<endl;
		plik<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma jedno rozwiazanie"<<endl;
		plik<<"x1= "<<x1<<endl;
		return 0;
	}
	else
	{
		cout<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma dwa rozwiazania"<<endl;
		cout<<"x1= "<<x1<<"x2= "<<x2<<endl;
		plik<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma dwa rozwiazania"<<endl;
		plik<<"x1= "<<x1<<"x2= "<<x2<<endl;
		return 0;
	}
	plik.close();
	return 0;
	
}

Hej, dopiero zaczynam z C++ więc prosze nie zjedzcie mnie :D Jak w tytule, mam za zadanie napisać program rozwiązujący równania kwadratowe. dane wczytane z pliku a wyniki mają być zapisane w pliku i wyświetlone na ekranie. jeszcze nie wszystko gotowe, ale przy próbie kompilacji nie wiem z jakiego powodu wciąż wyskakuje mi: dla a,b,c rownego iles tam rownanie ma jedno rozwiazanie x1=0 co nie jest prawidłowe dla wczytanych danych. Szukałem błędu ale nigdzie nie zlalazłem :/

2 odpowiedzi

+1 głos
odpowiedź 17 grudnia 2020 przez Eriss69 Gaduła (4,470 p.)
wybrane 18 grudnia 2020 przez matios309
 
Najlepsza
Spróbuj może napisac program, który liczy równanie  kwadratowe? a potem przerób je na odczytywanie z pliku.  Jest to łatwiejjsze rozwiązanie
komentarz 17 grudnia 2020 przez Eriss69 Gaduła (4,470 p.)
Zobacz: https://cpp0x.pl/forum/temat/?id=18753

Przerób ten  kod  na odczytywanie z pliku i gotowe :D
komentarz 17 grudnia 2020 przez Eriss69 Gaduła (4,470 p.)
Jak sobie nie dajesz rady:

https://pastebin.com/3tYrtnMR

podejrzyjj ale dopiero jak nie dasz  sobie radyy! Spróbuj samemu!
komentarz 18 grudnia 2020 przez matios309 Początkujący (310 p.)

@Eriss69, Hej, dziękuje za odpowiedz, udało mi się jakoś z tym uporać :D Może nie jest to jakieś piękne, ale działa, teraz pozostało mi tylko zrobić aby program liczył tyle równań ile danych w pliku, a nie tylko jedno :) Jak masz jakieś poprawki chętnie posłucham

#include <iostream>
#include <fstream>
#include <math.h>
 
using namespace std;
 
int main()
{
    fstream plik;
    plik.open("dane.txt");
    if(plik.good()==true)
    {
    	
    float a,b,c,delta,x1,x2;
    plik >> a >> b >> c;
    delta = b * b - ( 4 * a * c );
     
    if (a == 0)
    {
        cout<<"Dla a=0 to rownanie nie jest kwadratowe"<<endl;
        ofstream plik;
        plik.open("dane.txt", ios::app);
        plik<<endl<<"Dla a=0 to rownanie nie jest kwadratowe";
        plik.close();
        return 0;
    }
    if ( delta < 0 )
    {
        cout<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie nie ma rozwiazan"<<endl;
        ofstream plik;
        plik.open("dane.txt", ios::app);
        plik<<endl<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie nie ma rozwiazan";
        plik.close();
        return 0;
    }
    else if(delta==0)
    {
    	x1 = -b / ( 2 * a );
        cout<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma jedno rozwiazanie"<<endl;
        cout<<"x1= "<<x1<<endl;
        ofstream plik;
        plik.open("dane.txt", ios::app);
        plik<<endl<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma jedno rozwiazanie";
        plik<<endl<<"x1= "<<x1<<endl;
        plik.close();
        return 0;
    }
    else
    {
    	delta = sqrt( delta );
		x1 = ( - b - delta ) / ( 2 * a );
    	x2 = ( - b + delta ) / ( 2 * a );
    	ofstream plik;
        plik.open("dane.txt", ios::app);
        cout<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma dwa rozwiazania"<<endl;
        cout<<"x1= "<< x1 <<" x2= "<< x2 <<endl;
        plik<<endl<<"Dla a= "<<a<<" b= "<<b<<" i c= "<<c<<" to rownanie ma dwa rozwiazania";
        plik<<endl<<"x1= "<< x1 <<" x2= "<< x2 <<endl;
        plik.close();
        return 0;
    }
}
    plik.close();

}

 

komentarz 18 grudnia 2020 przez Eriss69 Gaduła (4,470 p.)

Własnie pisze program PasswordManager i robie wyszukiwarke, i z tego co widze polecam ci do zapisu/odczytu itp ogarnac:

std::ios::in | std::ios::app
std::ios::out | std::ios::app

Poczytaj troche o tym :D Przeszukuje plik do ostatnich danych, bez tego raczej nie zrobisz tego :P

łap : https://cpp0x.pl/kursy/Kurs-C++/Dodatkowe-materialy/Obsluga-plikow/305

Spróbuj dopisac to co ci napisałem zobacz co sie stanie :D

komentarz 23 grudnia 2020 przez matios309 Początkujący (310 p.)
Próbowałem wrzucić do pętli while( !plik.eof() ) żeby czytało do ostatnich danych w pliku ale coś nie chce mi zadziałac, wciąż tylko jedno rozwiązuje :/
–1 głos
odpowiedź 16 grudnia 2020 przez kacper1445 Gaduła (4,880 p.)

Po pierwsze, jeżeli działasz na pliku .txt to musisz wyciągnąć dane z tegoż pliku ale pamiętaj że będą one stringiem, osobno każda linia dokumentu. Jeżeli chcesz wyciągnąć wszystkie linie najlepiej to zrobić tak:

#include <vector>

string row;
vector <string> document;

while(getline(plik, row)) {
     document.push_back(linia);
}

Później oczywiście musisz znaleźć w stringach te wartości które Cię interesują, zależy od tego jak masz podane je w pliku .txt, następnie je przekonwertować na liczby, a dopiero później tworzyć zmienne tak jak Ty robisz czyli od razu licząc wartości delty oraz pierwiastków równania.

Po drugie pamiętaj że jak masz zapis plik << zmienna to wartości z tego otworzonego pliku będą się nadpisywać.

komentarz 17 grudnia 2020 przez Eriss69 Gaduła (4,470 p.)
słabe rozwiązanie skoro   napisał, że jest nowy w programowaniu w  C++. Więc rzuciłeś mu vector'y no średnio..
komentarz 17 grudnia 2020 przez tkz Nałogowiec (42,000 p.)
std::vector jest czymś, czego powinno uczyć się na początku, jeszcze przed wskaźnikami i new. W mojej i nie tylko opinii vector jest dużo prostszy koncepcjonalnie niż wskaźniki i cała zabawa z nimi związana.
komentarz 17 grudnia 2020 przez Eriss69 Gaduła (4,470 p.)
no vectory sa proste ale napisal ze je umie?

Podobne pytania

+1 głos
2 odpowiedzi 483 wizyt
pytanie zadane 7 listopada 2017 w C i C++ przez davido Nowicjusz (130 p.)
0 głosów
1 odpowiedź 1,033 wizyt
pytanie zadane 9 października 2020 w C i C++ przez Beginner555 Obywatel (1,760 p.)
0 głosów
1 odpowiedź 597 wizyt

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...