Podprogram kasujący wybrany element z tablicy

0

Napisałem kod i nie mam pojęcia jak napisać warunek na usunięcie elementu z tablicy, pomoże ktoś?
Oto mój kod:

#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>

using namespace std;

void utworz(int*& t, const unsigned n){
  t=new int [n];
  for(unsigned i=0; i<n; i++)
    t[i]=0;
}

void wypisz(const int* t, const unsigned n)
{
    for(unsigned i=0; i<n; i++)
    cout<<t[i]<<" ";

  }
void usun(int* t, unsigned n)
{
  if(t){
    delete []t;
    t=0;
    n=0;}
}
void wypelnij(int*t, const unsigned n, const int min, const int max){
    for(unsigned i=0; i< n; i++)
      t [i]=min+ rand() % abs(max-min);
  }
  int*kasuj_element(const int* tab, const unsigned rozmiar, const unsigned ktory){
    int *t=0;
    utworz(t,rozmiar);
****TUTAJ NIE WIEM JAK TO ZROBIĆ
        return t;
    }




  int main (){
    srand(time(NULL));
    int* t =0, min, max, ktory;
    unsigned n;
    do{
      cout<<"podaj rozmian tab>0 oraz granice przedz oraz element ktory chcesz skasowac"<<endl;
      cin>>n>>min>>max>>ktory;
	}
    while(n<1);
    utworz(t,n);
    wypelnij(t,n,min, max);
    wypisz(t,n);
    t= kasuj_element(t,n,ktory);
    wypisz(t,n);
    usun(t,n);

  }
1

Gościu, użyj formatowania kodu, bo aż oczy krwawią...
Co do samego usuwania, to tutaj musisz jeszcze określić, czy rozmiar tablicy ma się zmieniać po usunięciu elementu, czy nie.
A także, czy możesz stosować klasy, czy ma być podejście strukturalne.

1

Jeżeli działasz na zwykłych tablicach, to usunięcie elementu możesz zrealizować poprzez przekopiowanie do nowej tablicy wszystkich elementów oprócz usuniętego.
Już nawet zacząłeś, ale pozostało Ci utworzenie pętli (o rozmiarze o jeden element mniejszym) i iterowanie po niej.
W każdej iteracji kopiuj element ze starej do nowej, przy czym pamiętaj by wyłapać element, który nie powinien być przekopiowany.
Potem usuń (zwolnij) starą tablicę.
Zwracanie nowej tablicy już masz.

Błędów w obecnym kodzie czepiał się nie będę, bo to by była masakra :P

0

Poprawiłem kod tak jak ja bym to napisał, oraz dodałem działającą funkcję.
Ma ktoś jeszcze porady co mógłbym lepiej zrobić?

#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>

using namespace std;
int n;

void utworz(int* &tab, int n)
{
    tab=new int [n];
    for(int i=0; i<n; i++)
        tab[i]=0;
}

void wypisz(int* tab, int n)
{
    for(int i=0; i<n; i++)
        cout<<tab[i]<<" ";
    cout<<endl;
}

void usun(int* tab, int n)
{
    if(tab)
    {
        delete []tab;
        tab=0;
        n=0;
    }
}

void wypelnij(int*tab, int n, int min, int max)
{
    srand(time(NULL));
    for(int i=0; i< n; i++)
        tab [i]=min+ rand() % abs(max-min);
}

int*kasuj_element(int* tab,int rozmiar,int ktory)
{
    int *t=0;
    utworz(t,rozmiar);
    for(int i=0;i<rozmiar; i++)
        if(i!=ktory-1)
            t[i]=tab[i];
    return t;
}

int main ()
{
    int* t =0, min, max, ktory;
    cout<<"Podaj ile liczb losowych chcesz wpisac do tablicy: "; cin>>n;
    cout<<"Podaj liczbe od ktorej ma zaczynac sie zakres losowych liczb: "; cin>>min;
    cout<<"Podaj liczbe od ktorej ma konczyc sie zakres losowych liczb: "; cin>>max;
    cout<<"Podaj ktory element chcesz usunac: "; cin>>ktory;
    utworz(t,n);
    wypelnij(t,n,min, max);
    wypisz(t,n);
    t= kasuj_element(t,n,ktory);
    wypisz(t,n);
    usun(t,n);
}
2

Cóż Bracie, mógłbyś napisać z tego klasę która by:

  • w konstruktorze przyjmowała rozmiar jaki ma mieć wewnętrznie tablica
  • w destruktorze robiła kasowanie
  • miała metody fillByRandoms, deleteElementAt, size(), valueAt()
  • dla wypasu przeciążony operator[] aby działał jak dla tablic
  • dla jeszcze większego wypasu była szablonem aby mogła przechowywać nie tylko int-y
    ale, tym sposobem dobrnąłbyś do std::vector :] No i nie wiadomo, czy podejścia obiektowego możesz użyć.

Natomiast można usuwanie zrealizować sposobem mniej kosztownym - nie tworzysz nowej tablicy, ale wszystkie elementy od pozycji i przeznaczonej do usunięcia przesuwasz o 1 naprzód, i modyfikujesz n, albo lepiej masz 2 zmienne maxSize i currentSize. Ale, to raczej do zastosowania jak opakowałbyś je w klasę, aby z zewnątrz nie dało się do nich dobrać i popsuć.

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