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

Zapisanie liczb odwrotnie niż w tablicy.

Object Storage Arubacloud
0 głosów
1,930 wizyt
pytanie zadane 10 lutego 2017 w C i C++ przez niezalogowany

Witam wszystkich,

Nie mam zielonego pojęcia jak odwrócić liczby w tablicy i je wyświetlić. Na wprowadzenie danych napisałem prostą pętle. Co prawda zadanie jest niby proste, ale z odwróceniem liczb pojawił się problem. Prosiłbym o podpowiedź jak rozwiązać powyższy problem.

Zadanie: http://pl.spoj.com/problems/PP0502B/


int testy, tablica[10];

int main()
{
    cin>>testy;
    //wprowadzenie liczb to tablicy
    for(int i=0; i<testy; i++)
    {
        cin>>tablica[i];
    }

    return 0;
}

 

komentarz 10 lutego 2017 przez niezalogowany
Brakuje jeszcze uwzględnienia liczby n - czyli jeszcze jednej pętli. Liczba testów 2, liczba n 7 i przykładowe liczby 1 2 3 4 5 6 7.

3 odpowiedzi

0 głosów
odpowiedź 10 lutego 2017 przez Aisekai Nałogowiec (42,190 p.)
1. Pętla for(i=0; i<tablica.length/2; i++)

2. Zmienna pomocnicza, która by przechowywała jedną z wartości (żeby jej nie utracić)

3. Zamieniasz wartość tablica[i]=tablica[tablica.length-1-i], wykorzystując tą zmienną pomocniczą, żeby nie utracić jednej z wartości (w tym przypadku utraciłbyś wartość dla tablica[i])
0 głosów
odpowiedź 10 lutego 2017 przez Patrycjerz Mędrzec (192,320 p.)

Jeśli chodzi o sam algorytm, to tworzysz nową tablicę i umieszczasz w niej dane ze starej tablicy, ale w odwrotnej kolejności. Jeślibyś robił to w jednej, to jedne dane by zakrywały drugie, więc musisz posiadać inne miejsce w pamięci, aby wykonać tę operację.

Jeśli chodzi o gotowe rozwiązania, możesz użyć biblioteki standardowej i funkcji std::reverse.

komentarz 10 lutego 2017 przez niezalogowany
edycja 10 lutego 2017

Usunąłem z programu int testy, zmieniłem wielkość tablicy do 5 elementów i dopisałem coś takiego:

reverse(tablica, tablica+5);

for(int i=0; i<5; i++)
{
    cout<<tablica[i]<<" ";
}

Dostałem komunikat o złej odpowiedzi, mimo, że wynik w kompilatorze jest dobry. Co mogłem w tym miejscu skopać?

0 głosów
odpowiedź 10 lutego 2017 przez mtk3d Nałogowiec (46,690 p.)
Masz dwa rozwiązania, tymczasowa zmienna, albo tymczasowa tablica.

Przy zmiennej, musisz pobrać wielkość tablicy, podzielić na pół i zaokrąglić w dół. Wtedy lecisz po kolei pętlą i bierzesz pierwszą i ostatnią pozycję tablicy, pierwszą wrzucasz do tymczasowej zmiennej, i przypisujesz dla tej pierwszej wartość ostatniej, a potem wartość z tymczasowej zmiennej wrzucasz na ostatnią pozycję. I tak kolejne iteracje pętli za każdym razem bierzesz kolejne liczby drugą i przed ostatnią, trzecią od początku i trzecią od końca itd. Potem to wyświetlasz.

Drugi sposób, pętla o ilości iteracji odpowiadającej wielkości tablicy i przepisujesz dane z jednej tablicy do drugiej, z tym, że w pierwszej tablicy wybierasz od początku, a w drugiej od końca, czyli wielkość tablicy-numer_iteracji. Potem możesz ew. przepisać tą drugą tablicę do pierwszej i wyświetlasz.
komentarz 10 lutego 2017 przez mokrowski Mędrzec (155,460 p.)
edycja 11 lutego 2017 przez mokrowski
1. Można nawet uniknąć tymczasowej zmiennej stosując sztuczkę z XOR. Ale to technika wyłącznie "ciekawostkowa" i teraz w kompilatorach nieopłacalna.

2. Nie trzeba wyniku dzielenia zaokrąglać w dół. Wystarczy dzielenie całkowitoliczbowe. A i to będzie zbędne jeśli doda się obsługę indeksu elementów w 2 połowie tablicy.
komentarz 10 lutego 2017 przez ofnero Użytkownik (830 p.)

Mam pytanie dotyczące również tego zadania. Czy dobrze zastosowałem dynamiczne alokowanie pamięci w tym przykładzie?

        std::cin >> ile;
        int *tablica;
        tablica = new int [ile];

        for(int i=0; i<ile; i++)
        {
            std::cin >> tablica[i];
        }

        for(int j=ile-1; j>=0; j--)
        {
            std::cout << tablica[j] << " ";
        }
        std::cout << std::endl;

        delete [] tablica;

 

Podobne pytania

0 głosów
1 odpowiedź 286 wizyt
0 głosów
2 odpowiedzi 221 wizyt
pytanie zadane 12 kwietnia 2022 w C i C++ przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 542 wizyt
pytanie zadane 22 marca 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)

92,568 zapytań

141,422 odpowiedzi

319,635 komentarzy

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

...