/* word_sort.c : sortowanie wyrazow we: plik tekstowy wy: plik
Transkrypt
/* word_sort.c : sortowanie wyrazow we: plik tekstowy wy: plik
/* word_sort.c : sortowanie wyrazow we: plik tekstowy wy: plik tekstowy z posortowanymi wyrazami Uwaga: funkcja fscanf czyta wyrazy tak jak umie, nasze oczekiwania są większe */ #include <stdlib.h> #include <stdio.h> #include <string.h> char srcfname[512], dstfname[512]; /* zmienne globalne */ /* nazwa pliku zrodlowego */ /* nazwa pliku docelowego */ FILE *srcf, *dstf; /* uchwyty plikow (tekstowych) */ #define MAX 65536 char *tab[MAX]; /* maksymalna liczba wyrazow w pliku */ /* tablica wskaznikow do wczytanych wyrazow */ int strsort(char **tab, int n); int main() { int result = 0, i = 0, n = 0, len = 0; char buf[1024]; /* /* /* /* zmienne lokalne funkcji main */ wynik funkcji we/wy */ indeks wyrazu (licznik pętli) */ liczba wczytanych wyrazów */ /* tymczasowy bufor na lancuch znakow - wyraz */ printf("\nPorzadkowanie wyrazow."); printf("\nPodaj nazwe pliku zrodlowego: "); scanf("%511s", srcfname); printf("\nPodaj nazwe pliku docelowego: "); scanf("%511s", dstfname); /* otworz plik zrodlowy */ srcf = fopen(srcfname,"rt"); if (srcf==NULL) { printf ("\nNie moge otworzyc pliku: %s", srcfname); goto exit; } printf("\nCzytam dane z pliku: %s", srcfname); /* czytaj wyrazy, alokuj pamiec, zapisz adres wyrazu w tablicy tab */ for (n=0; n<MAX; n++) /* An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. */ { 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) 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("\nSortuję wyrazy"); strsort( tab, n); /* otworz plik docelowy */ dstf = fopen(dstfname,"wt"); if (dstf==NULL) { printf ("\nNie moge utworzyc pliku: %s", dstfname); goto exit; } /* 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); fclose(dstf); goto exit; } } fclose(dstf); /* powiadom uzytkownika, że skonczyles */ printf("\nWynik porzadkowania wyrazow w pliku: %s\n", dstfname); exit: /* zwolnij pamiec, do ktorej wczytywales wyrazy */ for (i=0; i<n; i++) free(tab[i]); return 0; } /* funkcja sortująca wyrazy */ int strsort(char **t, int n) { int i,j,min; char *tmp; /* przetwarzaj dane od pierwszego do przedostatniego */ for (i=0; i<n-1; i++) { min = i; /* znajdz minimum w pozostalym podciagu */ for (j=i+1; j<n; j++) { if (strcmp(t[j],t[min]) < 0) { min = j; } } /* zamiana miejscami tab[i] tab[min] */ tmp = t[i]; t[i] = t[min]; t[min] = tmp; } return 0; }