Skocz do zawartości
Gość

Sortowanie Wyrazow W C

Rekomendowane odpowiedzi

mam takie zadanie domowe ;) program ma wczytac jakies zdanie z pliku i poukladac wyrazy od najkrotszego do najdluzszego.

 

sa na to jakies sprytne gotowe algorytmy? chce rozbic zdanie na wyrazy, kazdy wyraz jako oddzielna tablica(string) porwnac je ze soba i wyswietlic wynik. dobrze kombinuje?

 

zeby nie bylo ze lamie regulamin i chce gotowca. nie oczekuje od was gotowego kodu wystarcza jakies podpowiedzi, kodowanie sam zalatwie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pobierz wyrazy z pliku, wczytaj je do jakiejś tablicy wielowymiarowej.

 

Następnie: google=>sortowanie bąbelkowe C=>zamień w ściągniętym kodzie nazwy tablic i znaki "==", ">", "<" na strcmp(), a znak "=" na strcpy() :)

(opisu w/w funkcji szukaj też w googlach)

 

Pozdrawiam.

Edytowane przez ziolek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dobra dzis o 16 musze oddac program

 

problem jest przy szukaniu najdluzszego wyrazu(co by tablice zadeklarowac odpowiednia)

w ogole to robi dziwne zeczy :/

np taki plik posortuje

 

jakies zdanie co ma duzo wyrazow wiecej wyrazow tenwyrazjestcholerniedlugi

a jak dodam kropke na koniec to juz nie :/

 

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <windows.h>#include <string.h>char **AllocateMemoryFor2DArray( int sizem, int sizen );void DestroyMemoryFrom2DArray(char **tab, int sizem, int sizen);int porownanie(char *tab, char *tab2);int main( void ){// deklaracja podwójnego wskaźnikachar **array,*tekst;char *tmp;int m, n,zmiana;int i, j; int k,l; //liczy slowa i wyrazyfpos_t d;//////////////////////////////FILE* f;					// deklaracja wskaźnika na plikf = fopen( "input.txt", "rt" );		// otwarcie pliku 						// w	- zapis do pliku						// r	- odczyt z pliku						// a	- dopisywanie do pliku						// t	- tryb tekstowy						// b	- tryb binarnyif( f == NULL ) 			{	printf( "error :(\n" );	exit(-1);					}  fseek(f, 0, SEEK_END);   fgetpos(f, &d);  tekst=(char*) malloc(d*sizeof(char));  fseek(f, 0, 0); for(i=0;i<d;i++){ (tekst[i] = fgetc(f)) != EOF;}fclose(f);for(i=0;i<d;i++){printf("%c",tekst[i]);}k=0;for(i=0;i<d;i++){	if(tekst[i]==0x20 || tekst[i]==0x2e || tekst[i]==0x00)   {				k=k+1;			     }}//printf(" %d ",k);///////////////////////////////m = k; //liczba wyrazówl=0;k=0;for(i=0;i<d;i++){	   	if(tekst[i]==0x20 || tekst[i]==0x2e || tekst[i]==0x00)   {	if(l<k || l==k)l=k;	k=0;	   }k++;   }//--------------------------tu blad-----------------------------------------------n = l+2;// najwiekszy wyraz //nie wiem co robie zle, w kazdym razie musze dodac 2 do n zeby nie wyskoczyl blad systemowy przy uruchamianiu inaczej nie startuje w ogole.//---------------------koniec-----------------------------------------------------tmp=(char *) malloc(n*sizeof(char));//tablica do przechowywania porownywanego wyrazuif ( !tmp ) {printf("lipa\n");exit(0);}// wywołanie własnej funkcji alokującej pamięćarray = AllocateMemoryFor2DArray( m, n );for( i=0; i<m; i++ ){ for( j=0; j<n; j++ ){array[i][j] =0;}}system("pause");k=0;for( i=0; i<m; i++ ){ for( j=0; j<n; j++ ){ if(tekst[k]==0x20 || tekst[k]==0x2e || tekst[k]==0x00) j=n; else array[i][j] = tekst[k];  k++;}}//sortowaniedo	{zmiana=0;	i=m-1;   	do	  {	  i--;	  if (porownanie(array[i+1],array[i])==1)		  {for( j=0; j<n; j++ ) //kopiowanie{tmp[j]=array[i][j];array[i][j]=array[i+1][j];array[i+1][j]=tmp[j];}		 zmiana=1;		 }	  }	  while (i!=0);   }   while (zmiana!=0);for( i=0; i<m; i++ ){   printf("%d ",i); for( j=0; j<n; j++ ){printf("%c ",array[i][j]);}}f = fopen( "output.txt", "wt" );		// otwarcie pliku 						// w	- zapis do pliku						// r	- odczyt z pliku						// a	- dopisywanie do pliku						// t	- tryb tekstowy						// b	- tryb binarnyif( f == NULL ) 			{	printf( "error :(\n" );	exit(-1);					}for( i=0; i<m; i++ ){for( j=0; j<n; j++ ){fprintf(f,"%c",array[i][j]);}fprintf(f,"\n");}fclose(f);DestroyMemoryFrom2DArray( array, m, n);free(tekst);free(tmp);system("pause");return 0;}int porownanie(char *tab, char *tab2){  if(strlen(tab)<strlen(tab2)) return -1;  if(strlen(tab)==strlen(tab2)) return 0;   if(strlen(tab)>strlen(tab2)) return 1;  }char **AllocateMemoryFor2DArray( int sizem, int sizen ) //ta funkcje dostalem od prowadzacego{char **tab;int i;tab = (char **) malloc( sizem * sizeof(char) );if ( !tab ) {printf("unable to allocate memory\n");exit(0);}else{ // alokacja drugiego wymiarufor( i=0; i<sizem; i++ ){*(tab+i) = (char *) malloc(sizen*sizeof(char));if ( !*(tab+i) ){printf("unable to allocate memory\n");exit(0);}}}return tab;}voidDestroyMemoryFrom2DArray(char **tab, int sizem, int sizen) //ta tez dostalem{int i;for(i=0;i<sizem;i++) free( *(tab+i));free(tab);}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

pare sugestii:

1) do sprawdzania czy slowo sie skonczylo uzywaj isalpha() lub jej mutacji http://www.cplusplus.com/reference/clibrar...pe/isalpha.html

2) pokaz, ze masz gest i uzyj zmiennych o nazwach dluzszych niz jedna litera, bo jak sie nie nauczysz poprawnie nazywac zmienne i/lub dodawac komentarze to kiepsko moze byc w przyszlosci

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

z praktyki wynika, że najlepszy jest kod samokomentujący się :) a komentarzy tekstowych należy się wystrzegać jak ognia i dawać tylko tam gdzie coś wnoszą i są potrzebne. To taka sugestia, żeby nie popaść w komentalizm... :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

koles w wymaganiach do zadania napisal ze duzo komentow powinno byc :P niby chodzi o to zeby pokazac ze umie sie je wstawiac ;)

 

ale z tym isalpha(); to dobry pomysl, thx :) dobrze ze zmienil termin oddania to moge jeszcze poprawic :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...