Tablica dynamiczna i jej usuwanie

Tablica dynamiczna i jej usuwanie
0

Witam problem jest nastepujacy, po nacisnieciu "b" pamiec sie czysci z tablicy, ale gdy wcisnę ten klawisz na początku programu, tzn na jeszcze nie stworzonej tablicy to program się wywala. Próbowałem wszelakie if'y, else'y i nic. Nie mam bladego pojęcia jak to zrobić tak, żeby usuwało tablice gdy jest stworzona ale nie wywalało programu gdy jest niestworzona.

Kopiuj
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void wpisywanie_elementow(int *tab,int n);
void losowanie_elementow(int *tab,int n);
void posortowanie(int *tab,int n);
void odwrotnie_posortowanie(int *tab, int n);

int main()
{
	char wybor=getchar();
	int n;
	int *tab=NULL;
	
	do
	{
    cout << "1. Tworzenie dynamicznej tablicy" << endl;
    cout << "2. Podawanie recznie elementow tablicy"<< endl;
    cout << "3. Generowanie danych losowych"<< endl;
    cout << "4. Generowanie danych posortowanych"<< endl;
    cout << "5. Generowanie danych odwrotnie posortowanych"<< endl;
    cout << "6. Sortowanie babelkowe "<< endl;
    cout << "7. Sortowanie babelkowe z flaga"<< endl;
    cout << "8. Selectionsort"<< endl;
    cout << "9. Sortowanie przez wstawianie"<< endl;
    cout << "a. wypisanie tablicy"<< endl;
    cout << "b. czyszczenie tablicy"<< endl;
    cout << "0. Koniec "<< endl;
    cin >> wybor;
    
    system("cls");
    
    switch( wybor )
	{
    case '1':
        cout << "Podaj ile elementow ma miec tablica" << endl;
        cin >> n;
    	tab = new int[n];
    break;
    
    
    case '2':
    		wpisywanie_elementow(tab, n);
    break;
    
    case '3':
    		losowanie_elementow(tab,n);
    break;
    
    case '4':
    		posortowanie(tab,n);
    break;
    
    case '5':
    		odwrotnie_posortowanie(tab,n);
    break;
    
    
    case 'a':
    	for(int i=1; i<=n; i++)
    	{
    		cout << tab[i] << endl;
		}	
    break;
    
    case 'b':

	
		delete [] tab;
	
    break;
    
}
    }while(wybor!='0');
    
return 0;
}
edytowany 1x, ostatnio: flowCRANE
PrezesiQ
Nie wystarczy zwyczajny if(!tab==NULL) delete tab[]?
Azarien
chyba raczej if (tab == NULL) albo if (!tab)
PrezesiQ
dlaczego? Jeśli tablica będzie czymś wypełniona to nie będzie można jej usunąć
NU
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Postów:43
1

Z perspektywy użytkownika programu, nie powinna być dopuszczalna sytuacja zarządzania pamięcią dynamiczną.
Usuń pierwszy punkt i połącz go z wypełnianiem tablicy.
Następnie powinieneś przy każdym działaniu, wymagającym uzupełnionej tablicy zaimplementować sprawdzenie, czy wskaźnik na tablice nie jest pusty (komentarz pod Twoim postem).

Powinieneś też zadbać o kasowanie tablicy jeśli uzytkownik tego nie zrobił.

edytowany 1x, ostatnio: Nunn
YooSy
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 5 lat
  • Postów:472
1

Nie pisz na priv. Zadaj dobre pytanie na forum.
PanRiK
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Szczecin
  • Postów:104
0

Polecam używać vector`a , jeśli piszesz w c++ to korzystaj z jego dobrodziejstw :). Wtedy zamiast delete możesz zrobić to za pomocą clear. Program nie wywali Ci się nawet jak vector nie będzie miała żadnych elementów. Twoje funkcje pozbędą się jednego parametru 'n' , który prawdopodobnie oznacza wielkość wprowadzanej tablicy, bo osiągniesz to samo za pomocą: size.


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
0

Okej wszystko już ogarnąłem à propos tego, ale pojawia się kolejny problem z moim programem. Za każdym razem gdy ustawię wielkośc tablicy na 10 a następnie ją wyświetlam to program wywala. Dzieje się to niezależnie czy wprowadze to ręczenie, losowo czy posortowanie. Tylko przy wartości n=10 każda inna wartość działa poprawnie. Jakieś pomysły?

PanRiK
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Szczecin
  • Postów:104
0
Kopiuj
        for(int i=0; i<n; i++)
        {
            cout << tab[i] << endl;
        } 

Nie powinno być przypadkiem tak?


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
0

chce aby moja tablica zaczynala sie od indeksu 1 na potrzeby pozniejszego sortowania z wykorzystaniem indeksu 0

PanRiK
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Szczecin
  • Postów:104
0

Nie rozumiem, a co z indeksem 0, przecież nie możesz tak o sobie go usunąć, on tam dalej jest i zawsze będzie jeśli mamy indeks 1 , to przed nim jest indeks 0, zawsze.

A ostatnim indeksem w przypadku n=10 jest idenks 9 a nie 10, tak jak masz napisane w tej pętli:

Kopiuj
        for(int i=1; i<=10; i++)
        {
            cout << tab[i] << endl;
        } 

To program przy i = 10 się wywali , bo nie ma takiego indeksu.


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 1x, ostatnio: PanRiK
0

Rozwiązałem już ten problem z tablicą i wszystko działa poprawnie, ale odwołam się do początkowego problemu ponieważ pomimo zastosowania tych if'ów które w komentarzu ktoś mi dopisał nadal to nie działa. Jak ma wyglądać taki warunek if w każdym case? Bo tutaj logiczne że nie da się nic wpisać do nieutworzonej tablicy. Dla przykładu:

Kopiuj
case '1':
        cout << "Podaj ile elementow ma miec tablica \n";
        cin >> n;
        
        if (n>1)
        {
        	tab = new int[n+1];		
		}
		
		if(n<1)
		{
			cout << "tablica nie moze byc pusta \n";
		}
    break;
    
    
    case '2':
    	wpisywanie_elementow(tab, n);
    break;
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)