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

Błąd w programie C++

Object Storage Arubacloud
0 głosów
710 wizyt
pytanie zadane 30 kwietnia 2017 w C i C++ przez niezalogowany

Witam, mam program:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <cstdio>

using namespace std;

int main()
{
	string nazwa = "z";
	string zadanie;
	cin>>zadanie;
	int ile_test;
	cin>>ile_test;
	float limit[ile_test];
	for(int i=0; i<ile_test; i++)
	{
		cin>>limit[i];
	}
	string komenda = "g++ -Wall -o "+nazwa+" "+nazwa+".cpp > komp.out";
	int kompilacja = system(komenda.c_str());
	string pop = "wynik"+nazwa+".txt";
	fstream wyniki(pop.c_str(), ios::out);
	if(!kompilacja)
	{
	string q;
	int punkty = 0;
	for(int i=1; i<=ile_test; i++)
	{
		ostringstream ss;
		ss << "/usr/bin/time -o time.out -f \"%U\" ./"<< nazwa << " < testy/" << zadanie << i << ".in > z.out";
		system(ss.str().c_str());
		float time_elapsed;
		ifstream czas("time.out");
		czas >> time_elapsed;
		printf("%.2f\n", time_elapsed);
		ifstream plik("z.out");
		string z;
		char c;
		while(plik.get(c))
		{
			z+=c;
		}
		string qqq;
		ostringstream ssa;
		ssa << "testy/" <<zadanie << i << ".out";
		ifstream plika(ssa.str().c_str());
		while(plika.get(c))
		{
			qqq+=c;
		}
		//cout<<qqq<<z;
		bool test = true;
		for(int i=0; i<qqq.length(); i++)
		{
			if(int(qqq[i])!=int(z[i]))
			{
				//cout<<i<<endl;
				test = false;
				break;
			}
		}
		cout<<int(qqq[qqq.length()-1])<<" "<<int(z[z.length()-1])<<endl;
		if((test) && (time_elapsed<limit[i-1]))
		{
			wyniki<<"0"<<endl;
			punkty++;
		}
		else
		{
			if((time_elapsed>limit[i-1]))
				wyniki<<"1"<<endl;
			else
				wyniki<<"2"<<endl;
		}
	}
	//cout<<punkty;
	wyniki<<punkty<<endl;
	}
	else
	{
		fstream plik;
		plik.open("komp.out", ios::in);
		char c;
		string a;
		while(plik.get(c))
		{
			a+=c;
		}
		plik.close();
		cout<<"-1";
		wyniki<<"-1"<<endl<<a;
	}
	komenda = "rm "+nazwa;
	system(komenda.c_str());
	komenda = "rm z.out";
	system(komenda.c_str());
	komenda = "rm time.out";
	system(komenda.c_str());
	komenda = "rm komp.out";
	//system(komenda.c_str());
	wyniki.close();
}

Program, jest dość duży, ale chodzi w nim aby skompilował inny, odpalił go, sprawdził czy dobrze zrobił dany test, i czy w odpowiednim czasie. Na początku, w pętli gdzie jest sprawdzanie czy dobrze zrobił, to gdy był zły znak chciałem aby wypisał na którym miejscu. Zawsze wypisywał, że na ostatnim, gdzie jest znak końca linii. Przerobiłem tak jak jest, i teraz wyświetla kod ascii tego znaku. No ale w obu, czyli w prawidłowym, i tym do sprawdzenia, zawsze wypisuje 10. Niewiem, czemu mój program nie zalicza, to znaczy wyświetla, że jest błędna odpowiedź. Pokazuje wynik dla wejścia:

szn
9
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00
1.00

Wyjście:

0.00
10 10
0.00
10 10
0.00
10 10
0.60
10 10
0.71
10 10
0.63
10 10
0.49
10 10
0.46
10 10
0.45
10 10

Wyjście do pliku wynikz.txt:

2
2
2
2
2
2
2
2
2
0

Pozdrawiam i liczę na pomoc.

komentarz 30 kwietnia 2017 przez JAKUBW Nałogowiec (33,470 p.)

Ten zapis jest niedopuszczalny w języku C++:

int ile_test;
cin>>ile_test;
float limit[ile_test];

Ilość elementów w tablicy musi być stała (nie podana przez użytkownika). Jeżeli chcesz rezerwować tylko co użytkownik chce rezerwuj dynamicznie (przez new).

komentarz 30 kwietnia 2017 przez niezalogowany
Dziękuję za poradę.
komentarz 1 maja 2017 przez jankustosz1 Nałogowiec (35,880 p.)
edycja 1 maja 2017 przez jankustosz1
Gdy wszystko się pisze w mainie często tworzą się jakieś drobne błędy które trudno wyłapać, edycja takiego kodu trwa trochę dłużej w dodatku kod jest nie trudno zrozumiały dla kogoś kto go widzi pierwszy raz, bo np. nazwy zmiennych nie mówią co robią. Rozbij to sobie na mniejsze części i twórz funkcje, a najlepiej klasy. Wtedy pewnie znajdziesz błąd. Nie patrzyłem specjalnie na ten kod ale tak na logikę, wystarczy uruchomić kompilator z odpowiednimi parametrami aby skompilował a jego wyjście przekierować do programu, albo do jakiegoś pliku, jeżeli będzie błąd to zczytasz go z pliku. A jeżeli będzie błąd w runtimie to chyba nie bardzo masz jak sprawdzić w jakiej linii bo da się tylko w debugu, po skompilowaniu do gotowego exe'ka już tego błędów w runtimie nie wychwycisz.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 293 wizyt
0 głosów
1 odpowiedź 263 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez pewien_programista Obywatel (1,070 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...