Sortowanie po modyfikacji innej czesci programu przestalo dzialac

0

Witam grono forumowiczów.
Ogólnie jestem świeżak w te klocki i tak dalej. Ale na laborkach (student, pierwszy rok informatyki) dostaliśmy za zadanie napisać program, który obejmie 3 rodzaje sortowań - bąbelkowe, poprzez wstawianie i wybieranie. No i wszystko było ładnie, pięknie działało, póki "menu" wyboru metody było zawarte w mainie, jednakowoż postanowiłem utrudnić sobie życie, i to zmodyfikować - by poprzez wybranie złej opcji program wyświetlał błąd i funkcja odwoływała się sama do siebie (w defaulcie). Po tej zmianie, sortowanie bąbelwe przestało mi działać poprawnie, a ja zbaraniałem próbując znaleźć błąd, zwłaszcza że w funkcji bubblesorta nic nie zmieniałem. Proszę o pomoc, na czym polega mój błąd. Oto kod:

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

void dane(int a, int tablica[]);
void druk(int a, int tablica[]);
void babelek(int a, int tablica[]);
void wstaw(int a, int tablica[]);
void wybieranie(int a, int tablica[]);
void podmiana(int* xp, int* yp);
void menu(int a, int tablica[]);

int main()
{
    int n;
    printf("Podaj ilosc elementow: \n");
    scanf("%d", &n);

    int tab[n];
    printf("Podaj dane do sortowania \n");
    dane(n, tab);
    printf("Wprowadzona tablica: \n");
    druk(n, tab);
    printf("\n\n");
    menu(n, tab);
}

dane(int a, int tablica[])
{
    for (int i = 0; i < a; i++) {
        printf("Liczba nr %d  \t", i + 1);
        scanf("%d", &tablica[i]);
    }
}
druk(int a, int tablica[])
{
    for (int i = 0; i < a; i++) {
        printf("Element tablicy nr %d to: \t", i + 1);
        printf("%d \n", tablica[i]);
    }
    printf("\n");
}
babelek(int a, int tablica[])
{
    int pom, zast;
    zast = a;
    while (a > 1) {
        for (int i = 0; i < a - 1; i++) {
            pom = tablica[i];
            tablica[i] = tablica[i + 1];
            if (tablica[i] > tablica[i + 1]) {
                tablica[i + 1] = pom;
            }
        }
        a--;
    }
    a = zast;
    printf("\n\n");
    druk(a, tablica);
}

wstaw(int a, int tablica[])
{
    int x, j, i;
    for (j = a - 2; j >= 0; j--) {
        x = tablica[j];
        i = j + 1;
        while ((i < a) && (x > tablica[i])) {
            tablica[i - 1] = tablica[i];
            i++;
        }
        tablica[i - 1] = x;
    }
    printf("\n\n");
    druk(a, tablica);
}

wybieranie(int a, int tablica[])
{
    int min;
    for (int i = 0; i < a - 1; i++) {
        min = i;
        for (int j = i + 1; j < a; j++)
            if (tablica[j] < tablica[min])
                min = j;
        podmiana(&tablica[min], &tablica[i]);
    }
    printf("\n\n");
    druk(a, tablica);
}

void podmiana(int* xp, int* yp)
{
    int pomocnicza = *xp;
    *xp = *yp;
    *yp = pomocnicza;
}

void menu(int a, int tablica[])
{
    int opcja;
    printf("Dostepne opcje: \n");
    printf("1. Sortowanie bobelkowe \n");
    printf("2. Sortowanie przez wstawianie \n");
    printf("3. Sortowanie przez wybieranie \n");
    printf("4. Zakoncz program \n");
    scanf("%d", &opcja);
    switch (opcja) {
    case 1:
        printf("Wybrano sortowanie bobelkowe \n");
        babelek(a, tablica);
        break;

    case 2:
        printf("Wybrano sortowanie przez wstawianie \n");
        wstaw(a, tablica);
        break;

    case 3:
        printf("Wybrano sortowanie przez wybieranie \n");
        wybieranie(a, tablica);
    case 4:
        printf("Program zakończony \n");
        return 0;
        break;
    default:
        printf("Wybierz poprawna opcję \n");
        menu(a, tablica);
    }
}
2
  1. tag pomocy nie jest pomocny. Nawet wiecej, masz mniejsze szanse na jakas konstryktywna odpowiedz
  2. nazwa tematu jest beznadziejna. Nie wnosi nic czego moze dotyczyc. Mogles zmienic na "Sortowanie po modyfikacji innej czesci programu przestalo dzialac"
  3. formatowanie
  4. kolorowanie, wrzuc wszystko w odpowiednie znaczniki

na ta chwile, moge jedynie zaproponowac bys uzyl debuggera

0
fasadin napisał(a):
  1. tag pomocy nie jest pomocny. Nawet wiecej, masz mniejsze szanse na jakas konstryktywna odpowiedz
  2. nazwa tematu jest beznadziejna. Nie wnosi nic czego moze dotyczyc. Mogles zmienic na "Sortowanie po modyfikacji innej czesci programu przestalo dzialac"
  3. formatowanie
  4. kolorowanie, wrzuc wszystko w odpowiednie znaczniki

na ta chwile, moge jedynie zaproponowac bys uzyl debuggera

jasne, dzięki za podpowiedzi, a drugą rzeczą jest jaki tag byś polecił?

0
Mateusz Ciotucha napisał(a):

Witam grono forumowiczów.
Ogólnie jestem świeżak w te klocki i tak dalej. Ale na laborkach (student, pierwszy rok informatyki) dostaliśmy za zadanie napisać program, który obejmie 3 rodzaje sortowań - bąbelkowe, poprzez wstawianie i wybieranie. No i wszystko było ładnie, pięknie działało, póki "menu" wyboru metody było zawarte w mainie, jednakowoż postanowiłem utrudnić sobie życie, i to zmodyfikować - by poprzez wybranie złej opcji program wyświetlał błąd i funkcja odwoływała się sama do siebie (w defaulcie).

No to odkryłeś rekurencję, też można wykorzystać w algorytmach sortujących :D

0

Ja bym się jednak przyjrzał temu sortowaniu bo wg mnie to nie jest poprawny bubblesort. Masz pewność że wcześniej działało?

tablica[i]=tablica[i+1];  //tablica[i] przyjmuje wartość tablica[i + 1]
if(tablica[i]>tablica[i+1]) //ten warunek nigdy nie będzie spełniony
0

Błąd został znaleziony
while(a>1)
{
for(int i=0;i<a-1;i++)
{

        if(tablica[i]>tablica[i+1])
        {

            pom=tablica[i];
            tablica[i]=tablica[i+1];
            tablica[i+1]=pom;
        }
    }

    a--;
}

Przy edycji poprzestawiały mi się głupio nawiasy

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