sortowanie shella

0

Hej mam problem z programem bo wyskakuje mi blad w funkcji shell sort nie wiem co jest zle Prosze o pomoc nie wiece rowniez jak policzyc wyrazy w pliku ?
http://4programmers.net/Pastebin/3506

0

Zacznij od sformatowania kodu i podania treści zadania.

0
 int result = 0,          /* wynik funkcji we/wy */
         i = 0,              /* indeks wyrazu (licznik pętli) */
         n = 0,              /* liczba wczytanych wyrazów */
         len = 0;

za i oraz n nie powinno być średników ?

0

Tresc zadania polega na tym aby tekst z pliku zrodlowego posortowac metoda shella i zapisac go w pliku docelowym.
wychodzi mi taki blad przy kompilacji
ja.c: In function 'shellsort':
ja.c:97:8: warning: assignment makes integer from pointer without a cast [enabled by default]

0

Ok teraz wklej sformatowany kod i zobaczymy co da się zrobić.

0
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
                         /* zmienne globalne */
char srcfname[512],      /* nazwa pliku zrodlowego */
      dstfname[512];     /* nazwa pliku docelowego */
FILE *srcf=NULL, *dstf=NULL;         /* uchwyty plikow (tekstowych) */
#define MAX 65536        /* maksymalna liczba wyrazow w pliku */
char *tab[MAX];          /* tablica wskaznikow do wczytanych wyrazow */
void shellsort();
int main(int argc, char *argv[])
{                            /* zmienne lokalne funkcji main */

    int result = 0,          /* wynik funkcji we/wy */
         i = 0,              /* indeks wyrazu (licznik pętli) */
         n = 0,              /* liczba wczytanych wyrazów */
         len = 0;
    char buf[1024];          /* tymczasowy bufor na lancuch znakow - wyraz */
    sscanf(argv[1], "%s", srcfname);
    printf("\nPorzadkowanie wyrazow.");
    srcf = fopen(srcfname,"rt");
    if (fopen(srcfname,"rt")==0)
    {
    printf("\nWprowadz prawidlowe dane");
    goto exit;
    }
    if (sscanf==0)
    {    printf ("\nNie moge otworzyc pliku: %s", srcfname);
         goto exit;
    }

    sscanf(argv[2], "%s", dstfname);

    dstf = fopen(dstfname,"wt");
    if (dstf==NULL)
    {    printf ("\nNie moge utworzyc pliku: %s", dstfname);
         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++)
   
    {    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);
    }
    
    printf("\nSortuję wyrazy");
    shellsort( tab, n);
    /* 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 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);
    if (dstf) fclose (dstf);
    return 0;
}

void shellsort(char **t, int n) 
{
int gap;       /* odstep pomiedzy porownywanymi elementami */
int i, j, tmp;
n=28;    

for (gap= n/2; gap > 0; gap/= 2)
	{
		for (i= gap; i < n; ++i) /* wzdluz elementow tablicy */		{
/* porownywanie pary elementow oddalonych od siebie o "gap" */
		for (j= i-gap; j >= 0; j-= gap)
			{
				if (strcmp(t[j],t[j+1]) < 0)
				{
				tmp= t[j];
				t[j]= t[j+gap];
				t[j+gap]= tmp;
	}	}	}
			}	}
0

Poczytaj jeszcze raz na czym polega formatowanie kodu i powiedz czy to:

michalukwerka napisał(a):
	}	}	}
			}	}

ma cokolwiek wspólnego z formatowaniem?

0

No tak przepraszam :)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* zmienne globalne */
char srcfname[512],      /* nazwa pliku zrodlowego */
dstfname[512];     /* nazwa pliku docelowego */
FILE *srcf=NULL, *dstf=NULL;         /* uchwyty plikow (tekstowych) */
#define MAX 65536        /* maksymalna liczba wyrazow w pliku */
char *tab[MAX];          /* tablica wskaznikow do wczytanych wyrazow */
void shellsort();
int main(int argc, char *argv[])
{                            /* zmienne lokalne funkcji main */
    
    int result = 0,          /* wynik funkcji we/wy */
    i = 0,              /* indeks wyrazu (licznik petli) */
    n = 0,             /* liczba wczytanych wyrazow */
    len = 0;
    char buf[1024];          /* tymczasowy bufor na lancuch znakow - wyraz */
    sscanf(argv[1], "%s", srcfname);
    printf("\nPorzadkowanie wyrazow.");
    srcf = fopen(srcfname,"rt");
    if (fopen(srcfname,"rt")==0)
    {
        printf("\nWprowadz prawidlowe dane");
        goto exit;
    }
    if (sscanf==0)
    {    printf ("\nNie moge otworzyc pliku: %s", srcfname);
        goto exit;
    }
    
    sscanf(argv[2], "%s", dstfname);
    
    dstf = fopen(dstfname,"wt");
    if (dstf==NULL)
    {    printf ("\nNie moge utworzyc pliku: %s", dstfname);
        goto exit;
    }
    
    /* czytaj wyrazy, alokuj pamiec, zapisz adres wyrazu w tablicy tab */
    for (n=0; n<MAX; 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) goto exit;
        strcpy(tab[n], buf);
    }
    
 shellsort(buf,  n); 
       /* 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 */
exit:
    /* zwolnij pamiec, do ktorej wczytywales wyrazy; zamknij pliki */
    for (i=0; i<n; i++) free(tab[i]);
    if (srcf) fclose (srcf);
    if (dstf) fclose (dstf);
    return 0;
}
void shellsort(char *tab, int n) 
{
int gap;       /* odstep pomiedzy porownywanymi elementami */
int i, j, tmp;
n=28;    

for (gap= n/2; gap > 0; gap/= 2)
	{
		for (i= gap; i < n; ++i) /* wzdluz elementow tablicy */		
		{
/* porownywanie pary elementow oddalonych od siebie o "gap" */
		for (j= i-gap; j >= 0; j-= gap)
			{
				if (tab[j] > tab[j+gap]) 
				{
				tmp= tab[j];
				tab[j]= tab[j+gap];
				tab[j+gap]= tmp;
}	
	}	
		}
			}	
				}
0

Jeszcze raz poczytaj o formatowaniu - bo nie zrozumiałeś.
Zapoznaj się z funkcją exit()
Zapoznaj się z koncepcją: - prototyp funkcji - jak zrozumiesz na czym polega to znajdziesz błąd.

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