Wyświetlanie liczb na parzystych i nieparzystych miejscach

0

Program ma za zadanie z podanych przez użytkownika liczb wypisać te występujące na miejscach parzystych i te na nieparzystych.

Dopiero poznałam kontener tablicy vector i obawiam się, że może błędy, które mi wyskakują są między innymi z jakiegoś niewłaściwego użycia.

Generalnie chciałam to zrobić tak, żeby z tablicy ogólnej zapisać do nowego kontenera liczby na pozycjach i+2 (parzyste) i do drugiego kontenera liczby z pozycji i+1 (nieparzyste). Trochę ucieka mi w ten sposób zero, więc może trzeba by parzystą tablicę iterować w dół? Tylko, że nie zawsze użytkownik poda taką ilość liczb żeby iteracja o 2 w dół dawała parzyste. Nie wiem czy rozumowanie jest dobre.

Dotąd kod wygląda tak

#include <iostream>
#include <vector>

using namespace std;

int n,i,j;
int main()
{
    cout << "Podaj ilosc liczb" << endl;
    cin >> n;
    int T[n];
    cout << "Podaj ciag liczb" << endl;
    for (i=0;i<n;i++)
    {
        cin >> T[i];

    }
        vector <int> T2;
        vector <int> T3;
    for (i=0;i<=n;i++)
    {
        T2.push_back(T[i+1]);
    }
    for (j=0;j<=n;j++)
    {
        T3.push_back(T[j+2]);
    }
cout << "Liczby, ktore wystapily na miejscach parzystych " << endl;
    for (size_t i =0;i<T2.size();i++)
    {
       std::cout << T2[i] << std::endl;
    }
    cout << "Liczby, ktore wystapily na miejscach nieparzystych " << endl;
    for (size_t j =0;j<T3.size();j++)
    {
         std::cout<< T3[j] << std::endl;

    }
    return 0;
}
1

Pierwsza sprawa - pozbądź się zmiennych globalnych.

Druga:

for (i = 0; i <= n; i++)
{
	T2.push_back(T[i + 1]);
}
for (j = 0; j <= n; j++)
{
	T3.push_back(T[j + 2]);
}

W obu pętlach wychodzisz poza tablicę n o 2 albo nawet 3 miejsca.
Przy tablicach indeks nie może być równy rozmiarowi (n) a Ty na takie coś zezwalasz (i <= n), w środku pętli wychodzisz jeszcze dalej bo robisz i + 1 albo i + 2.

Zamiast dwóch pętli użyj jednej i niech reszta z dzielenia przez 2 decyduje do którego zbioru trafi i-ta liczba z T.

1
cin >> n;
    int T[n];

Jeszcze warto wspomnieć, że C++ nie wspiera VLA i rozmiar tablicy musi być stały i znany w czasie kompilacji.

1

@YooSy ale jeśli nie znam początkowo rozmiaru tablicy tylko właśnie chce to uzależnić od podanych przez użytkownika danych to jak to zrobić w takim razie? Coś innego niż standardowa tablica?

Własnie po to wymyślono std::vector.

size_t size;
cin >> size;
vector<int> v(size);
0
YooSy napisał(a):

@YooSy ale jeśli nie znam początkowo rozmiaru tablicy tylko właśnie chce to uzależnić od podanych przez użytkownika danych to jak to zrobić w takim razie? Coś innego niż standardowa tablica?

Własnie po to wymyślono std::vector.

size_t size;
cin >> size;
vector<int> v(size);

Ok dzięki istotna dla mnie informacja

0
#include <iostream>
#include <vector>

using namespace std;


int main()
{
    size_t n;
    int i,j;
            cout << "Podaj ilosc liczb" << endl;
            cin >> n; //ilosc liczb czyli wielkosc tablicy

    vector <int> v(n);
            cout << "Podaj ciag liczb" << endl;
                                                    for (i=0;i<n;i++)
                                                    {
                                                    cin >> v[i];

                                                    }

    vector <int> Tp;
    vector <int> Tnp;
                                                    for (i=0;i<n;i++)
                                                    {
                                                                if (i%2==0)
                                                                {
                                                                    Tp.push_back(v[i]);
                                                                }
                                                                else
                                                                    Tnp.push_back(v[i]);
                                                    }


        cout << "Liczby, ktore wystapily na miejscach parzystych " << endl;
                                                    for (size_t i = 0;i<Tp.size();i++)
                                                    {
                                                    std::cout << Tp[i] << std::endl;
                                                    }
        cout << "Liczby, ktore wystapily na miejscach nieparzystych " << endl;
                                                    for (size_t j =0;j<Tnp.size();j++)
                                                    {
                                                    std::cout<< Tnp[j] << std::endl;

                                                    }
    return 0;
}


Działa :)

Jeśli chodzi o przejrzystość kodu itp to jest w miarę ok? Co można poprawić? Zapewne przydałoby się bardziej precyzyjne nazywanie zmiennych ale poza tym?

2

Podzielić kod na funkcję, np. wypisywanie tablic. Jedna funkcja i dwa wywołania, zamiast dwóch identycznych kodów,
dla dwóch tego samego typu tablic.

2

Jeśli chodzi o przejrzystość kodu itp to jest w miarę ok?

Jeżeli masz takie same wcięcia jak wyżej to nie.

Nie twórz zmiennych poza pętlami a w środku nich, czyli zamiast:

int i;
for (i = 0; i < 5; i++) { ... }

pisz:

for (int i = 0; i < 5; i++) { ... }

Oczywiście bywają sytuacje wyjątkowe gdzie będziesz potrzebować i poza pętlą - wtedy deklarujesz i wcześniej.

Tak jak napisałaś - staraj się nazywać zmienne tak aby było wiadomo co w nich jest (a jeszcze lepiej jeżeli możesz używać j. angielskiego).
Tp powinno się nazywać parzyste albo even
TNp - nieparzyste / odd
v - numbers czy coś w tym stylu.

No i trochę spacji w tych if. Zamiast:

for (i=0;i<n;i++)

powinno być:

for (int i = 0; i < n; i++)
0

Dziękuję za pomoc :)

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