/* 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;
}

Podobne dokumenty