Czy ktoś mógłby rzucić okiem na wytwór mojej wyobraźni i stwierdzić czemu działa poprawnie dopiero po przekroczeniu pierwszej połowy tablicy. Chciałem ogarnąć to na wskaźnikach.
#include
//dynamiczne alokowanie
using namespace std;
int n;
int main()
{ cout<<"podaj ilosc danych ";
cin>> n;
int *wskaznik;
wskaznik= new int [n];
int *wskaznik2;
wskaznik2= new int [n];
for (int i=0; i<n; i++)
{cin>>wskaznik[i];}
for (int i=0; i<n; i++)
{cout<<wskaznik[i]<<" ";}
cout<<endl;
for (int i=0; i<n; i++)
{wskaznik2[(n-1)-i]=wskaznik[i];
cout<<wskaznik2[i]<<" "; }
delete [] wskaznik, wskaznik2;
return 0;
}
dziękuję
Ty poprawisz formatowanie swojego kodu (patrz kilka postów wyżej jak ładnie to zrobił @hartez) lub ewentualnie prześlij go przez ideone, a ja wtedy Ci powiem co zepsułeś.
Czyli chcę żeby Twój kod nie wyglądał tak:
#include
//dynamiczne alokowanie
using namespace std;
int n;
int main()
{ cout<<"podaj ilosc danych ";
a tak:
#include <iostream>
//dynamiczne alokowanie
using namespace std;
int n;
int main()
{
cout<<"podaj ilosc danych ";
Spójrz na ten kod. Na prawdę masz tam
#include
bez niczego?
Bez wcięć programujesz?
Odpiszę za jakieś dwie godziny, a Ty popraw.
Edit
Więc tak:
-
Co to jest
cout<<"podaj ilosc danych ";
? Twój program ma wyświetlać tylko i wyłącznie to co jest podane w zadaniu. Twój output ma być identyczny z podanym w zadaniu. Każda literka ma się zgadzać. Nie możesz wypisywać takich rzeczy jak “podaj ilosc danych” bo zostanie to przecież uznane za część odpowiedzi czyli za błędną odpowiedź. -
Dlaczego definiujesz
n
przedint main
? W jakim celu? Jeżeli jesteś kolejnym słuchaczem kursu Pana Zelenta (który bardzo upodobał sobie zmienne globalne) to natychmiast zmień kurs. Jeśli mam rację to jest to dla Ciebie najważniejszy punkt i zrób to jak wspomniałem: natychmiast. -
Treść zadania:
Najpierw liczba testów t (t ≤ 100). Następnie dla każdego testu liczba n (n ≤ 100) i n liczb oddzielonych spacjami.
Jeszcze raz:
Najpierw liczba testów t (t ≤ 100).
gdzie jest Twój kod obsługujący tę zmienną?
-
To co wskazała @yula. Podpowiedź: przypisujesz coś do jakiegoś elementu tablicy, a wyświetlasz inny.
-
Co to robi i po co:
for (int i=0; i<n; i++)
{cin>>wskaznik[i];}
for (int i=0; i<n; i++)
{cout<<wskaznik[i]<<" ";}
cout<<endl;
przecież masz wyświetlić liczby z tablicy w odwrotnej kolejności, a Ty je tutaj wyświetlasz tuż po wpisaniu tak jak zostały podane. W ogóle tego nie powinieneś robić.
- Kod ma być ładny, a nie tylko działać. Nie rób takiego czegoś:
for (int i=0; i<n; i++)
{cout<<wskaznik[i]<<" ";}
cout<<endl;
bo to boli innych wokół i ich rodziny. Yuli dzieci płaczą, narbej chodzi zdenerwowany, tarpauwatratar ma depresję, a jaroo gubi się przy dodawaniu.
ten fragment (gdyby w ogóle do czegoś był potrzebny) mógłby wyglądać przejrzyście:
for (int i = 0; i < n; i++)
{
cout << wskaznik[i] << " ";
}
cout << endl;
są zadania na jak najmniejszą liczbę znaków (challenge), ale to nie jest jedno z nich.
Poprawisz to wszystko i będzie przez chwilę zielono w zakładce status
mam zaliczone to zadanie na spoju juz dawno
zrobilem petle odwrotna ktora wypisuje mi wartosci z orginalnej tablicy
wiem ze mozna je zrobic na jednej tylko tablicy
chcialem sie dowiedziec jak przepisac wartosci z jednej tablicy do drugiej na wskaznikach bo ucze sie sam z neta (Zelenta ogladalem tez btw i troche zamula ale daje niezle przyklady)
Mozecie mi polecic jakis dobry pdf albo forum o wskaznikach i ogolnie dzialaniach na tablicach takich jak zliczanie elementow, scalanie kopiowanie wycinanie porownywanie wartosci na dwoch tablicach z alokowana pamiecia?
Bo używanie tablic i używanie do kopiowania wskaźników w C++ jest już dawno nie w “modzie” ;-). W C++ używa się zamiast tablic np vectorów.
AALe skoro tak chcesz, to, piszę z pamięci, więc powinieneś to sprawdzić:
int n{10}, tab1[n], tab2[n], *wsk1 = &tab1[n-1], *wsk2 = tab2;
......
for (int i = 0, i < n; ++i)
*wsk2++ = *wsk1--;
PS
Może nie jest to dokładnie to o co pytałeś, ale każdą rzecz można zrobić na wiele sposobów.
ta pętla działa bez zarzutów:
for (int i=0; i<n; i++)
{wskaznik2[i]=wskaznik[n-1-i];
cout<<wskaznik2[i]<<" "; }
np:
3 5 6 7 8 (wskaznik[4] ; n=4)
8 7 6 5 3 (wskaznik2[4])
natomiast ta tylko od połowy:
for (int i=0; i<n; i++)
{wskaznik2[(n-1)-i]=wskaznik[i];
cout<<wskaznik2[i]<<" "; }
np:
3 5 6 7 8 (wskaznik[4] ; n=4)
11889696 11867144 6 5 3 (wskaznik2[4])
dodatkowo te niepasujące liczby z pierwszej połowy są przypadkowe,
więc to chyba adres komórki, ale czemu tak jest?
Dla mnie początkującego te dwie pętle są właściwie tym samym.
Czemu jedynie pierwsza działa jak należy?
Bo drugą tablicę zaczynasz zapisywać od tyłu, nadpisując śmieci. Musisz sobie zdawać sprawę, że początkowo w tablicy mogą i często pojawiają się śmieci i właśnie zaczynasz na początku wypisywać te śmieci.
Gduy dojedziesz do połowy jest już ok. Jak napisała Julia, po prostu sobie to narysuj i przeanalizuj krok po kroku lub dodaj do programu wydruki kontrolne, krok po kroku - takie pseudo debugowanie.
Przecież na to pytanie już dawno dostałeś odpowiedź od Yuli i ode mnie podpowiedź podpunkt 4. Czytałeś to wszystko czy stwierdziłeś, że za dużo tekstu? Zacytuję:
- To co wskazała @yula. Podpowiedź: przypisujesz coś do jakiegoś elementu tablicy, a wyświetlasz inny.
Przeczytałem pobieżnie. Nie obraź się, ale za dużo tam zbędnych uwag.
Fatkycznie punkt 4. jest wartościowy.
Wyświeltlanie musi być wykonane po przypisaniu wartości. Banalny błąd, ale jakoś to przeoczyłem. Teraz rozumiem naturę problemu, skąd te dziwne watrości w pierwszej połowie. Dziękuję za pomoc.
@majormarino
Nie obrażę się, ale z chęcią dowiem się która uwaga jest zbędna. Chyba, że chodzi Ci tylko by zaliczyć zadanie, a gówniany kod Ci nie przeszkadza, wtedy faktycznie cenna była tylko czwórka.
Panowie, pomożecie czemu sędzia on-line mi to odrzuca? u mnie w code::blocks to chodzi bez problemu
#include
using namespace std;
int n,t;
int tab[100];
int main ()
{
cout<<"Podaj liczbe testow: ";
cin>>t;
if (t<=100)
{
for (int i=0; i<t; i++)
{
//cout<<"Podaj ilosc elementow "<<i+1<<" tablicy: ";
cin>>n;
for (int i=0; i<n; i++)
{
//cout<<"Podaj "<<i+1<<" element tablicy: ";
cin>>tab[i];
}
cout<<"Tablica odwrocona znajduje sie ponizej"<<endl;
for (int i=n-1; i>=0; i--)
{
cout<<tab[i]<<" ";
}
cout<<endl;
}
}
return 0;
}