Tablice SPOJ

1

Link do treści zadania >> https://pl.spoj.com/problems/PP0502B/

Mój kod:

#include <iostream>

using namespace std;


void wpisywanie(int size)
{
	int* tablica = new int[size];
	for (int i = 0; i < size; i++)
	{
		cout << "wpisz " << i + 1 << "element: ";
		cin >> tablica[i];
	}
	for (int j = size; j > 0; j--)
	{
		cout << tablica[j];
	}
}






int main() {
	int ilosctestow;
	int sizex = 0;


	cout << "ile testow? (<100)" << endl;
	cin >> ilosctestow;
	for (int i = 0; i < ilosctestow; i++) {
		cout << "Ile liczb?: ";
		cin >> sizex;
		cout << wpisywanie(sizex);
	}

}

niestety, nawet nie chce się kompilować, nie potrafię znaleźć błędu.. w funkcji main, pytam użytkownika ile chce mieć testów, aktywuje się pętla trwająca tyle ile jest testów, pyta o ilość liczb w danym teście, nastepnie wywołuje funkcje wpisywanie, która umożliwia wpisywanie liczb do tablicy, a następnie odwraca je
w czym problem?

1

Ale wiesz, że ten kod ma się nijak do zadania w SPOJ'u? Twój program ma nic nie pytać o nic. Po prostu ma wczytywać wejście w określonej postaci i wypisywać wynik. Dodatkowe pytania typu "ile testów" są zupełnie zbędne. Nawet jak wypisze poprawne rozwiązanie, to przez te dodatki SPOJ tego nie przyjmie.

Nie wiesz gdzie jest błąd, a kompilator co wskazuje? Wypisuje jakiś komunikat? Zatem jaki on jest. Nikt tu za Ciebie nie będzie przeklejał kodu do IDE tylko po to aby sprawdzić jaki błąd wypluwa kompilator ;) A błąd masz w linii 28. Zastanów się co tam jest nie tak.

No i jeszcze mała uwaga, masz wyciek pamięci w funkcji wpisywanie.

0

Po prostu wywołaj funkcje wypisywanie()

cout << wypisywanie(sizex); // to jest błędne
wypisywanie(sizex); // to jest poprawne

każesz komputerowi wypisać to co zwraca funkcja wypisywanie(), a że ona nie zwraca nic to nie kompiluje się

0

pytania są poglądowe dla mnie, bym się nie pogubił, jak wklejam na SPOJ, usuwam je.
co do błędów:
C2679 dwuargumentowy "<<": nie znaleziono żadnego operatora, który przyjmuje prawostronny operand typu "void" (lub nie istnieje akceptowalna konwersja)
E0349 żaden operator "<<" nie pasuje do tych argumentów operacji

1
crypton napisał(a):

pytania są poglądowe dla mnie, bym się nie pogubił, jak wklejam na SPOJ, usuwam je.

Ok, ale i tak lepiej od razu pisać bez takich sztuczek. Ja osobiście piszą na SPOJ'u przekierowywałem sobie standardowe wyjście/wejście do plików in.txt oraz out.txt i po kłopocie ;)

crypton napisał(a):

co do błędów:
C2679 dwuargumentowy "<<": nie znaleziono żadnego operatora, który przyjmuje prawostronny operand typu "void" (lub nie istnieje akceptowalna konwersja)
E0349 żaden operator "<<" nie pasuje do tych argumentów operacji

Kolejna rada, ustaw sobie język komunikatów na angielski. Będzie Ci łatwiej znaleźć cokolwiek w google. Ale widzę, że kolega wyżej podał Ci rozwiązanie problemu.

1

Wypisuje ci śmieciowe dane bo odnosisz się do komórki w tablicy która nie istnieje

0

myślę i myślę i wydaje mi się że chodzi o tą drugą pętlę, odpowiedzialną za odwrócenie? czy o brak usunięcia dynamicznej tablicy na końcu?

4

Brak usunięcia tablicy na końcu to problem, ale nie rozwala tego zadania (swoją drogą: użyj std::vector! albo jednej tablicy na 100 elementów, skoro z góry wiesz, że będzie taka mała).

Rzecz w tym, że pierwszy element ma indeks 0. W tablicy n-elementowej, n-ty element ma indeks n-1, a nie n.

3

int* tablica = new int[size];
tablica ma indeksy od tablica[0] do tablica[size-1]

Ba to już było kilka tygodni temu na tym forum i było nawet zaproponowano kilka wersji bez żadnej tablicy.
https://4programmers.net/Forum/C_i_C++/344788-liczby_naturalne_w_jezyku_c

0
#include <iostream>

using namespace std;


void wpisywanie(int size)
{
	int* tablica = new int[size];
	for(int i = 0; i < size; i++)
	{
		
		cin >> tablica[i];
	}
	int m;
	m = size - 1;
	for (int j=m; j >= 0; j--)
	{
		cout << tablica[j];
	}
	delete[] tablica;

}






int main() {
	int ilosctestow;


	int sizex = 0;
	cin >> ilosctestow;
	for (int i = 0; i < ilosctestow; i++) {
	
		cin >> sizex;
		wpisywanie(sizex);
	}

}

poprawilem, ale na SPOJ nadal zle

0

A jest źle, bo nawet dla przykładowych danych wejściowych z treści zadania masz złe wyjście:

76543211123

Zamiast takiego:

7 6 5 4 3 2 1
11 2 3

Zastanów się czego brakuje w kodzie aby było ok :)

0

cout << tablica[j];
z liczb: 1 2 3
zrobi ci jedną liczbę: 321

    for(int j=size-1;j>=0;--j) cout<<tablica[j]<<(j>0?" ":"\n");
0
#include <iostream>


using namespace std;


void wpisywanie(int size)
{
	int* tablica = new int[size];
	for(int i = 0; i < size; i++)
	{
		
		cin >> tablica[i];
	}
	int m;
	m = size - 1;
	for (int j=m; j >= 0; j--)
	{
		cout << tablica[j] << " ";
	}
	delete[] tablica;

}






int main() {
	int ilosctestow;


	int sizex = 0;
	cin >> ilosctestow;
	for (int i = 0; i < ilosctestow; i++) {
	
		cin >> sizex;
		wpisywanie(sizex);
	}

}

sluszna uwaga, za duzo na dzis i takich detali juz nie zauwazam!
mega dzieki

1

Nadal za mało, testy ci się zleją w jeden wiersz.

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