Dodawanie liczb do tablicy

0

Jak poprawić ten kod, aby program poprawnie dodawał liczby do kolejnych miejsc w tablicy, bo w tej chwili wypisuje same zera? Jak później sprawdzić ile liczb wpisaliśmy do tej tablicy? Lepiej gdyby istniała na to gotowa metoda niż gdybyśmy mieli sprawdzać ile razy wykonała się pętla while.

#include <iostream>

using namespace std;

int main(){
  int *tab;
  int j=0, i;
  while(1){
    cin >> i;
    tab=new int[j+1];
    tab[j]=i;
    if(i==10)break;
    j+=1;
  }
  cout << tab[0] << " " << *(tab+1) << " " << tab[2];
  return 0;
}

1

w kazdym obiektu petli tworzysz nowa tablice (nie usuwasz starej wiec masz wyciek pamieci) a pozniej przypisujesz ostatni element w tej tablicy

czemu nie uzyjesz po prostu std::vector?

0

Bo jeszcze nie znam tej biblioteki. Da się to zrobić nie korzystając z std::vector czy raczej nie ma co tracić na to czasu?

0

Da się.
Tworzysz nową tablicę (o 1 większą).
Kopiujesz tam zawartość starej tablicy, po czym ją[starą tablicę] usuwasz.
Dodajesz nowy element na końcu.

Jak sprawdzić ile liczb wpisaliśmy? Może zamiast tablicy utworzyć strukturę i przechowywać w niej licznik? Albo nie tworzyć struktury i przechowywać licznik?
Jeżeli chodzi o sprawdzenie wielkości tablicy, to może zainteresować się operatorem sizeof
np:

int arr_len = sizeof(array)/sizeof(<typ array>))
0

Oj, bo @fasadin to taki nowoczesny chce być, jakby nie wiedział, że na studiach wciąż uczą wskaźników :)

#include<iostream>
using namespace std;

int main(){
    unsigned count = 0;
    cout << "How many? "; cin >> count;

    int *array = new int[count];
    for(unsigned i = 0; i < count; ++ i)
    {
        cout << "Enter number please: ";
        cin >> array[i];
    }

    for(unsigned i = 0; i < count; ++ i)
    {
        cout << array[i] << "\n";
    }

    delete[] array;
    return 0;
}

PS: Abstrahując od studiów: on ma rację. Staraj się przedkładać STL nad gołe wskaźniki, a jeśli jeszcze nie znasz to jest wręcz wysoce zalecane zapoznanie się.

0

Czemu sizeof(tab) zawsze wypisuje 8?

0

Jeżeli to jest tablica intów z dwoma elementami to będzie wypisywał 8 jako dwa elementy po 4 bajty. Niemniej jednak popraw najpierw te misz-masze, które masz w kodzie, o których pisali Ci przedmówcy.

0

@grzesiek51114: Ok dzięki chociaż nie do końca to miałem na myśli. Próbowałem jeszcze w takim stylu (bo dopiero zaczynam) zrobić program, który mi będzie do tablicy dodawał kolejne liczby aż do podania liczby 10, czyli ilość liczb, które wprowadzimy nie jest znana. W C była funkcja realloc, a jak zrobić to tutaj już nie wiem.

Co do sizeof(tab): Jeśli mam program: i wpiszę do niego liczby 7,5,1,6,10 to i tak sizeof(tab) = 8. Jak to działa?

#include <iostream>

using namespace std;

int main(){
  int *tab;
  int j=0, i;
  tab=new int[25];
  
  while(1){
    cin >> i;
    tab[j]=i;
    if(i==10)break;
    j+=1;
  }

  cout << tab[0] << " " << *(tab+1) << " " << tab[2] << endl <<sizeof(tab);
  return 0;
}
1

Próbować można, tylko po co na forum? Może trochę samodzielności spróbuj, komunikaty błędów kompilacji nie bolą a program można przerwać przez Ctrl+C.
sizeof(tab) daje Ci rozmiar wskaźnika (64 bity). W C/C++ nie masz rozmiaru dynamicznej tablicy od kompilatora, możesz co najwyżej użyć std::vector który ma metodę std::size().

Dowiedziałbyś się tego sam gdybyś wyszukał hasła "sizeof dynamic array c++".

1

Musisz sobie napisać własnego realloc'a.:

#include<iostream>
using namespace std;

int *realloc(int* array, unsigned& count, unsigned increase_size = 5)
{
    unsigned new_size = count + increase_size;
    int *realloced = new int[new_size];

    copy(array,array+count,realloced);
    count = new_size;

    delete[] array;
    array = nullptr;

    return realloced;
}

int main(){
    unsigned count = 2;
    int *array = new int[count];

    unsigned howMany = 10;
    for(unsigned i = 0; i < howMany; ++i)
    {
        if(count < howMany)
        {
            array = realloc(array,count);
        }
        array[i] = i;
    }

    for(unsigned i = 0; i < howMany; ++i)
    {
        cout << array[i] << "\n";
    }

    delete[] array;
    return 0;
}

Oczywiście trzeba byłoby jeszcze sprawdzić czy pamięć została prawidłowo przydzielona etc...
Dlatego tutaj aż się prosi o std::vector!

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