Tablice SPOJ

CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
1

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

Mój kod:

Kopiuj
#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?

MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 2 godziny
  • Postów:1083
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.

S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
0

Po prostu wywołaj funkcje wypisywanie()

Kopiuj
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ę


Competitive Google searcher
edytowany 2x, ostatnio: Suchy702
Zobacz pozostałe 2 komentarze
CR
no tak, nie proszę o to. Zrozumialem dobrze za pierwszym razem, ale wolałem się dopytać. Poprawiłem błąd wskazany przez ciebie, teraz na wyjściu, gdy ma pojawić się "odwrócona tablica" pojawiają się jakieś śmieciowe dane
S7
No i jeszcze mała uwaga, masz wyciek pamięci w funkcji wpisywanie. Pan wyżej ci już to napisał
enedil
@Suchy702: ale przecież śmieciowe dane nie wynikają z tego, że jest wyciek pamięci
S7
@enedil a z czego wynikają ? przecież chciał dostać się do komórki [size] która nie istniała, chyba że ja coś tutaj mylę :D
S7
@enedil okej zapomniałem co to znaczy wyciek pamięci :D, zawsze używam vectorów, i pisałem w Pythonie więc nie miałem nigdy takich problemów
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
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

MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 2 godziny
  • Postów:1083
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.

S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
1

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


Competitive Google searcher
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
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?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
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.


_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0
Kopiuj
#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

_13th_Dragon
poczytaj o przekierowywaniu danych z pliku na stdin
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 2 godziny
  • Postów:1083
0

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

Kopiuj
76543211123

Zamiast takiego:

Kopiuj
7 6 5 4 3 2 1
11 2 3

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

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
0

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

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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
CR
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:64
0
Kopiuj
#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

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:12 dni
1

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.