Sortowanie bąbelkowe – gdzie jest błąd?

0

Witajcie

Próbuje napisać kod do sortowania bąbelkowego.
Wydaje mi się, że powinien wyglądać znośnie ale nie idzie :/ Nie umiem znaleźć swojego błędu. Proszę o pomoc

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i,temp,j;
    printf("Podaj wielkosc tablicy\n");
    scanf("%d",&n);
    int tab[n];
    printf("Wypelnij tablice\n");
    for (i=0;i<n;i++)
    {
        scanf("%d",&tab[i]);
    }
    for (i=0;i<n;i++)
    {
    for (j=0;j<n-1;j++)
    {
        if (tab[i]>tab[i+1])
        {
            temp=tab[i];
            tab[i]=tab[i+1];
            tab[i+1]=temp;
        }
    }
   printf("Wysortowana tablica %d\n",tab[i]);
    }
    return 0;
}
3
  1. Nie kompiluje się, ponieważ nie masz } kończącego main()
  2. Sprawdzasz indeksy i i i+1, które są indeksami zewnętrznej pętli.
  3. Z niewiadomych przyczyn deklarujesz wszystkie zmienne na początku funkcji, a nie w miejscu użycia
  4. Stosujesz nieczytelną indentację
1

Do tego co napisał @kq dodałbym, że wewnętrzna pętla nie powinna zaczynać się od 0...

0
kq napisał(a):
  1. Z niewiadomych przyczyn deklarujesz wszystkie zmienne na początku funkcji, a nie w miejscu użycia

Wolę zadeklarować na początku ponieważ programy są względnie krótkie i wtedy widzę od razu wszystkie zmienne. Po drugie na uczelni może być różnie z tym. Na zajęciach deklarowaliśmy na początku nie w miejscu użycia więc trzymam się schematu

kq napisał(a):
  1. Nie kompiluje się, ponieważ nie masz } kończącego main()

Program się kompiluje ale nie sortuje tablicy. Przepisuje mi ją tak jak była wprowadzona. Ostatni } zamyka main. Nie wydaje mi się, żeby czegoś tutaj brakowało
edit. Edytując kolor kodu musiałam skasować ostatni } tutaj w kodzie. Przepraszam

  1. Sprawdzasz indeksy i i i+1, które są indeksami zewnętrznej pętli.

Mogłabym prosić o wyjaśnienie? :)

0
  1. musisz kompilować inny program niż ten z pierwszego posta, bo w poście po return 0; nie ma }

  2. dodaj sobie printa pokazującego co z czym porównujesz, zobaczysz co jest nie tak.

  3. imo to zła praktyka, ale meh.

0

No cóż w każdym razie nadal nie wiem jak to zrobić żeby działało. Wyświetla mi albo tą samą tablicę albo cały czas największą liczbę tyle razy ile miejsc ma zadeklarowana tablica

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,i,temp,j;
    printf("Podaj wielkosc tablicy\n");
    scanf("%d",&n);
    int tab[n];
    printf("Wypelnij tablice\n");
    for (i=0;i<n;i++)
    {
        scanf("%d",&tab[i]);
    }
    for (i=0;i<n;i++)
    {
        printf("%d\n",tab[i]);
    }
    for (j=0;j<n;j++)
    {
    for (i=1;i<n-1;i++)
    {
        if (tab[i]>tab[i+1])
        {
            temp=tab[i];
            tab[i]=tab[i+1];
            tab[i+1]=temp;
        }
    }
   printf("Wysortowana tablica %d\n",tab[i]);
    }
    return 0;
}
```c
1

I nic Ci nie pomaga wypisanie tego, co z czym porównujesz?

0

Masz takie formatowanie tego kodu, że masakra:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int tab[] = { 4,9,6,1,36,1,23,5 };
	size_t size = sizeof(tab) / sizeof(tab[0]);

	int i = 0, j = 0;
	for (; i < size; i++)
	{
		printf("%d\n", tab[i]);
	}

	int temp = 0;
	for (i = 0; i < size; i++)
	{
		for (j = i; j < size; j++)
		{
			if (tab[i] > tab[j])
			{
				temp = tab[i];
				tab[i] = tab[j];
				tab[j] = temp;
			}
		}
		printf("Wysortowana tablica %d\n", tab[i]);
	}
	return 0;
}
0

title
Dostaje takie wyniki w konsoli ale nie wiem czemu :/ po prostu nie wiem gdzie jest błąd w kodzie nie umiem go znaleźć bo dopiero uczę się programować. Nic nie poradzę

0

Ile razy trzeba Ci pisać żebyś sobie wypisał co z czym porównujesz?

0

Porównujesz bezsensowne wartości. Porównujesz i-ty element z następnym czyli i+1 zamiast z j-otym.

1

Eh...

    /* Sortowanie */
    for (size_t i = 0; i < n; ++i)
    {
        for (size_t j = 0; j < n - 1 - i; ++j)
        {
            if (tab[j] > tab[j + 1])
            {
                int temp = tab[j];
                tab[j] = tab[j + 1];
                tab[j + 1] = temp;
            }
        }
    }
0

Ok.
Może ja po prostu nie wiem gdzie chcecie żebym sobie wypisała, albo nie umiem wam wyjaśnić, że widzę, że jest źle, ale nie wiem jak przerobić kod. Po prostu nie wiem po ludzku.

Sprawdzam co jest po uzupełnieniu tablicy. Ok jest dobrze. Idę dalej.
Sprawdzam co jest po pierwszej pętli - to samo. Czy już zaczyna się psuć.
Sprawdzam co jest w drugiej - idzie już tylko jedna liczba ciągle. Czyli wiadomo, że jest źle.

Widzę, że jest źle, ale niestety "wypisz sobie i się dowiesz" mi nie pomaga. Dlatego przyszłam tu. Dział raczej odpowiedni - jestem laikiem, zadaje głupie pytania, które ludzi obeznanych z kodem naście lat drażnią ale od tego ten dział jest. Za 10 lat może ja też będę obcykana i będę w stanie komuś w tym dziale udzielić pomocy. Póki co takie pisanie mi "źle to źle tamto sprawdź sobie to i to to zobaczysz czemu" nic mi nie pomaga. To tak jakbym miała użyć translatora do napisania pracy z obcego języka. Co z tego że zobaczę jakie słówka muszę użyć skoro nadal będą to w większości zdania w bezokolicznikach bo nie będę umiała odmieniać... :/

0

No ale masz tutaj dwa gotowce i starczy kod tych podwójnych pętli, gdzie porównujesz wartości, sprawdzić, nawet linijka po linijce.

0
Mokrowski napisał(a):

Eh...

    /* Sortowanie */
    for (size_t i = 0; i < n; ++i)
    {
        for (size_t j = 0; j < n - 1 - i; ++j)
        {
            if (tab[j] > tab[j + 1])
            {
                int temp = tab[j];
                tab[j] = tab[j + 1];
                tab[j + 1] = temp;
            }
        }
    }

Bardzo dziękuję poszło bez problemu. I już rozumiem czemu

0

Tutaj sobie porównujesz: tab[j] > tab[j + 1]
Wypisanie wartości porównywanych: printf("Porownuje %d z %d\n", tab[i], tab[i + 1]);
https://wandbox.org/permlink/xYvIlYGOZO16DLCW

To nie jest problem z umiejętnością programowania, tylko elementarnym czytaniem ze zrozumieniem.

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