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

Proste dodawanie SPOJ

Object Storage Arubacloud
0 głosów
878 wizyt
pytanie zadane 26 sierpnia 2016 w C i C++ przez prownnie Początkujący (280 p.)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

int main(int argc, char** argv)
{
	int i,j;
	int ile, ile2;
	int *tab2;
	vector <int> tab;
	string s;
	cin>>ile;
	tab2 = new int [ile];
	for (i=0; i<ile; i++)		//petla do wczytywania danych
	{
		cin>>ile2;
		tab2[i]=ile2;
		cin.clear();
		cin.sync();
		getline (cin, s);
		istringstream isstream(s);
		for (j=0; j<ile2;j++)
		{
			int *tablica;
			tablica = new int [ile2];
			isstream >> tablica[j];
			tab.push_back(tablica[j]);
			delete [] tablica;
		}
	}
	int x=0;
	for (i=0; i<ile;i++)		//petla do wyswielania danych
	{
		int suma=0;
		for (j=0; j<tab2[i];j++)
		{
			suma=suma+tab[x];
			x++;
		}
		cout<<suma<<endl;
	}
	delete [] tab2;
	return 0;
}

___________________________________________________

 

Mam 2 pytania. Po pierwsze żeby ktoś ocenił mój styl i dał parę wskazówek. Po 2 program nie działa na stronie, a w moim kompilatorze (devcpp) chyba tak. Przykładowo jak go odpalam na spoju, to mam stdin:
2

5

1 2 3 4 5

2

-100 100

stdout:

0

2

A u mnie, jest tak jak powinno być, czyli 15 i 0. I czego tutaj dotyczy problem? Już nie wiem co mam robić.

komentarz 26 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
Zanim napiszę co masz nie tak, przerób trochę swój kod.. Dam ci "małą" wskazówkę.. SPOJ rozróżnia wejście i wyjście tak więc od razu po wprowadzeniu wejścia możesz wypisać wyjście dla kolejnych testów. W konsoli by to wyglądało tak:
2
5
1 2 3 4 5
15
2
-100 100
0
komentarz 26 sierpnia 2016 przez prownnie Początkujący (280 p.)
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main(int argc, char** argv) 
{
	int ile,ile2,*tablica;
	string s;
	cin>>ile;
	for (int i=0;i<ile;i++)
	{
		int suma=0;
		cin>>ile2;
		cin.clear();
		cin.sync();
		getline (cin, s);
		istringstream isstream(s);
		for (int j=0;j<ile2;j++)
		{
			tablica=new int[ile2];
			isstream >> tablica[j];
			suma+=tablica[j];
			delete [] tablica;
		}
		cout<<suma<<endl;
	}
	
	return 0;
}

Przerobiłem tak jak powiedziałeś, ale nadal błędna odpowiedź ;/

komentarz 26 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

Dlaczego używasz konwersji string->int?!
Przecież to zadanie jest tak banalne, że można je rozwiązać przy użyciu siedmiu średników.
Możliwe, że (sądząc po używaniu getline) nie wiesz jednej prostej rzeczy.. std::cin wszytuje wszystkie wartości (wpisane po spacji), aż zostanie naciśnięty [Enter].
Inaczej mówiąc.. prostą sumę można zapisać tak:
int n=5, val, sum=0;
while(n--){std::cin>>val; sum+=val;}

komentarz 26 sierpnia 2016 przez prownnie Początkujący (280 p.)
#include <iostream>

using namespace std;

int main(int argc, char** argv) 
{
	int ile,ile2,val;
	cin>>ile;
	for (int i=0;i<ile;i++)
	{
		int suma=0;
		cin>>ile2;
		for (int j=0;j<ile2;j++)
		{
			cin>>val;
			suma+=val;
		}
		cout<<suma<<endl;
	}
	return 0;
}

Ok dzięki, teraz działa, tylko nie rozumiem jeszcze tej linijki z pętlą j. Czemu nie karze mi wpisywać 5 razy tej wartości val tylko "wie", że tam jest 5 cyfr i ignoruje tego cina?

komentarz 26 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

To działa na "mniej więcej" takiej zasadzie..
Kiedy program napotka std::cin uaktywnia się możliwość wprowadzania danych, aż do momentu kiedy zostanie naciśnięty enter.. jeżeli w konsoli napiszemy np. coś takiego:
1 2 3 6 5 [Enter]
To dokładnie takie wartości zostaną wprowadzone do standardowego strumienia wejścia.
Teraz program sprawdza, czy "wskaźniki" w strumieniu znajduje się na końcu strumienia, jeżeli nie to wyprowadza jedną z wartości, a następnie przesuwa "wskaźnik" na kolejną wartość.. potem gdy znów napotka cin'a, a w strumieniu znajdują się jeszcze jakieś wartości ("wskaźnik" nie jest na końcu strumienia), to zamiast umożliwić nam wprowadzanie nowych wartości korzysta z tych, które znajdują się przed "wskaźnikiem".

komentarz 26 sierpnia 2016 przez prownnie Początkujący (280 p.)
Dzięki wielkie jeszcze raz, teraz rozumiem :D

2 odpowiedzi

+1 głos
odpowiedź 26 sierpnia 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)
Kolega już powiedział, że możesz wprowadzać dane i na żywioł wypisywać wyniki( to się nazywa wprowadzaniem danych online ).  Dwa jak robisz SPOJ to nie baw się wskaźnikami, dynamicznymi tablicamy i takimi bajerami. SPOJ nie jest do tego. Robisz tablicę globalną na maksymalne wejścię czy coś i z niej korzystasz prosto i bezpiecznie. Co do ludzi którzy będą hejtami cisnąć za zmienne globalne. Zadam wam pytanie czy kiedy kolwiek braliście udział w OI, OIG, Potyczki algorytmiczne czy coś innego?
0 głosów
odpowiedź 26 sierpnia 2016 przez prownnie Początkujący (280 p.)
aa dzięki, tego nie wiedziałem i myślałem, że ma być idealnie po kolei, co nieco skomplikowało sprawę już nie raz :D

Podobne pytania

0 głosów
1 odpowiedź 785 wizyt
pytanie zadane 4 czerwca 2017 w C i C++ przez Michał Biernacki Użytkownik (670 p.)
0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez chucksqll Stary wyjadacz (12,930 p.)
0 głosów
4 odpowiedzi 638 wizyt
pytanie zadane 22 lipca 2016 w C i C++ przez hakiros54 Obywatel (1,160 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...