sortowanie przez scalanie. język C. konfikt oznaczeń

0

Hej, napisałam program sortowanie przez scalanie, ale coś mi poszło nie tak i nie wiem co powinnam zmienić, pomożecie? :)
Załączam kod :) Z góry dziękuję za pomoc.
Ps. Jestem blondynką :D

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void sortowanie_przez_scalanie(char, int, int);
void scal(char, int, int, int);
#define MAXWORD 65536
char* tab[MAXWORD];
int* pom; // tablica pomocnicza, potrzebna przy scalaniu

int main()
{
    char srcfname[512], dstfname[512];
    FILE *srcf = NULL, *dstf = NULL;
    int result = 0, i = 0, n = 0, len = 0;
#define MAXCHAR 1024
    char buf[MAXCHAR];

    printf("\nSortowanie wyrazow.");
    printf("\nPodaj nazwe pliku zrodlowego: ");
    scanf("%511s", srcfname);

    /* otworz plik zrodlowy */
    srcf = fopen(srcfname, "rt");
    if (srcf == NULL)
    {
        printf("\nNie moge otworzyc pliku: %s", srcfname);
        goto exit;
    }

    printf("\nPodaj nazwe pliku docelowego: ");
    scanf("%511s", dstfname);

    /* otworz plik docelowy */
    dstf = fopen(dstfname, "wt");
    if (dstf == NULL)
    {
        printf("\nNie moge utworzyc pliku: %s", dstfname);
        goto exit;
    }

    printf("\nCzytam dane z pliku: %s", srcfname);
    for (n = 0; n < MAXWORD; n++)
    {
        result = fscanf(srcf, "%1023s", buf);
        if (result == 0)
        {
            printf("\nNieoczekiwany blad przy czytaniu z pliku: %s", dstfname);
            goto exit;
        }
        if (result == EOF)
            break;

        len = strlen(buf);
        tab[n] = (char*)malloc(len + 1);
        if (tab[n] == 0)
        {
            printf("\nBrak pamieci");
            goto exit;
        }
        strcpy(tab[n], buf);
    }
    /* algorytm sortujacy - sortowanie przez selekcjê
    na pierwsze miejsce wstaw najmniejszy z pozostalych (zamien miejscami)
    zrob to samo z reszta listy bez wybranych ju¿ elementow */
    printf("\nSortuje wyrazy");
    sortowanie_przez_scalanie(tab, 0, n - 1);

    /* zapisz wynik w pliku docelowym */
    for (i = 0; i < n; i++)
    {
        result = fprintf(dstf, "%s\n", tab[i]);
        if (result < 0)
        {
            printf("\nBlad przy zapisie do pliku : %s", dstfname);
            goto exit;
        }
    }
    /* powiadom uzytkownika, ¿e skonczyles */
    printf("\nWynik porzadkowania wyrazow zapisano w pliku: %s\n", dstfname);
exit: /* zwolnij pamiec, do ktorej wczytywales wyrazy; zamknij pliki */
    for (i = 0; i < n; i++)
        free(tab[i]);
    if (srcf)
    {
        fclose(srcf);
        srcf = 0;
    }
    if (dstf)
    {
        fclose(dstf);
        dstf = 0;
    }
    return 0;
}
void scal(char tab[], int lewy, int srodek, int prawy)
{
    int i = lewy, j = srodek + 1; // kopiujemy lewą i prawą część tablicy do tablicy pomocniczej
    for (int i = lewy; i <= prawy; i++)
        pom[i]
            = tab[i]; // scalenie dwóch podtablic pomocniczych i zapisanie ich we własciwej tablicy
    for (int k = lewy; k <= prawy; k++)
        if (i <= srodek)
            if (j <= prawy)
                if (pom[j] < pom[i])
                    tab[k] = pom[j++];
                else
                    tab[k] = pom[i++];
            else
                tab[k] = pom[i++];
        else
            tab[k] = pom[j++];
}
void sortowanie_przez_scalanie(char tab[], int lewy, int prawy)
{
    // gdy mamy jeden element, to jest on już posortowany
    if (prawy <= lewy)
        return; // znajdujemy srodek podtablicy
    int srodek = (prawy + lewy) / 2; // dzielimy tablice na częsć lewą i prawa
    sortowanie_przez_scalanie(tab, lewy, srodek);
    sortowanie_przez_scalanie(tab, srodek + 1, prawy); // scalamy dwie już posortowane tablice
    scal(tab, lewy, srodek, prawy);
}
0

A co dokładnie nie działa?
Proponuje na początek napisać coś prostszego, bez całego tego wczytywania plików itp, po prostu jakąś tablicę intów na stałe w programie i ją posortować, sprawdzić jak ten algorytm sortowania działa.
Tutaj próbujesz chyba wczytać tablicę znaków z pliku i ją posortować, ale już pierwszy błąd jest taki że deklaracja funkcji nie pokrywa się z definicją, w deklaracji funkcja oczekuje znaku, tymczasem w definicji już tablicy znaków,
zamiast:

void sortowanie_przez_scalanie(char, int, int);

powinno być:

void sortowanie_przez_scalanie(char tab[], int, int);

ewentualnie przekazać tablicę jako wskaźnik.
No i te paskudne goto zamienić np na funkcję.
Napisz coś prostszego, potem dodawaj wczytywanie z plików i inne bajery, bo ten kod jest.... do wyrzucenia.

Na początek powinno to wyglądać tak:

#include <stdio.h>

void sortowanie_przez_scalanie(int tab[], int lewy, int prawy);
void scal(int tab[], int lewy, int srodek, int prawy);

int pom[6];

int main()
{
    int i;
    int tab[6] = {1, 9, 6, 2, 5, 4};

    printf("tablica nieposortowana: \n");
    for (i = 0; i < 6; i++)
        printf("%d wartosc: %d \n", i + 1, tab[i]);

    sortowanie_przez_scalanie(tab, 0, 5);

    printf("tablica posortowana: \n");
    for (i = 0; i < 6; i++)
        printf("%d wartosc: %d \n", i + 1, tab[i]);

    return 0;
}

void scal(int tab[], int lewy, int srodek, int prawy)
{
    int i, j, k;

    for(i = lewy; i <= prawy; i++) pom[i] = tab[i];

    i = lewy;
    j = srodek + 1;

    for(k = lewy; k <= prawy; k++)
    {
        if(i <= srodek)
        {
            if (j <= prawy)
            {
                if (pom[j] < pom[i]) tab[k] = pom[j++];
                else tab[k] = pom[i++];
            }
            else tab[k] = pom[i++];
        }
        else tab[k] = pom[j++];
    }
}

void sortowanie_przez_scalanie(int tab[], int lewy, int prawy)
{
    if(prawy <= lewy) return;
    int srodek = (prawy + lewy)/2;
    sortowanie_przez_scalanie(tab, lewy, srodek);
    sortowanie_przez_scalanie(tab, srodek+1, prawy);
    scal(tab, lewy, srodek, prawy);
}

Teraz przynajmniej sortowanie działa, więc jest punkt wyjścia do kolejnych modyfikacji.

0

Niestety nie mogę tego tak uprościć Bo to mam taki konkretny projekt który musi zawierać te wszystkie elementy :)

0

Oj, jak chcesz żeby działało to chyba musisz, bo tam błąd na błędzie błędem poganiał. Z takiego kodu ciężko wyczytać co tam nie bangla, dlatego trzeba rozbijać na mniejsze elementy, dopracować je a potem składać w całość. Dopracowałem sortowanie tak że działa, teraz możesz dobudowywać resztę: wczytywanie danych z pliku, przerobienie funkcji sortującej tak by sortowała znaki itd itp.

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