Skocz do zawartości
tomek3232

Liczenie Znaków W Pliku

Rekomendowane odpowiedzi

Witam próbuje napisać programik który będzie liczył małe litery w pliku (znaczy ile dana litera będzie występowała razy w pliku)

 

Napisałem taki programik ale niestety wartości pochodzą z kosmosu i niestety niepotrafie znaleźć błędu

 

#include <stdio.h>main(){char znak;char litera;int j = 0;int k = 0;int tab[25];//Otwieranie plikuFILE *plik;plik = fopen("c:\\praca\\text.txt", "r");if (plik==NULL) {		printf("Nie udalo sie otworzyc pliku");	}	printf("Plik otwarty pomyslnie!\n");//główny programwhile (!feof(plik)){  fscanf(plik, "%c", &znak); //  for (j=0; j<25; j++)    {	 k=j+97; 	 litera = k;	 if (znak == litera)	 {	   tab[j]++;	 }   } }//wyświetlanie zawartości tablicy  for (j=0; j<25; j++)  {   printf("%d\n", tab[j]);  } fclose(plik); return 0;}

 

w pętli for chciałem wygenerować kod ascii danej litery i w każdym przejściu tej pętli zliczać dany znak.

W tablicy tab mają być zliczane poszczególne litery

Czy mógłby mi ktoś powiedzieć gdzie robie błąd ?

Edytowane przez tomek3232

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Powiedz czemu mamy analizować kod za kogoś? Odpal debuger i krok po korczku, sprawdzasz wartości zmiennych, oraz czy wartość w if'e jest true, czy tam false. Na tej podstawie powinieneś znaleźć błąd.

 

 

edit

Wcięcia też ktoś wymyślił, aby ułatwić innym życie.....

Edytowane przez KrOOliK89

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie bardzo kumam ten twój algorytm...

Po co Ci ta pętla?

Wczytujesz kolejne znaki z pliku, ok. masz teraz wczytany znak, sprawdzasz czy jest to mała litera, np porównując czy mieści się w zakresie małych znaków w ascii. Jeśli tak, to odejmujesz od tego znaku kod ascii równy literze a - wtedy dla

a - otrzymasz 0

b - 1

c - 2

itd..

a tą liczbę uzywasz bezpośrednio do inkrementacji odpowiedniej wartości w tablicy. To wszystko cały kod mieści się w 2 linijkach.

 

Kosmiczne wartości masz natomiast stąd...

int j = 0;int k = 0;int tab[25];
j i k mają przypisane wartości 0 przy tworzeniu, a co z tablicą? Zadeklarowałeś tablicę na 25 intów, ale nie zadbałeś o to żeby znalazły się tam same zera, a kompilator nie zeruje sam pamięci dla zmiennych.

 

spróbuj int tab[25] = {0};

jeśli to nie przejdzie to użyj funkcji setmem() np...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tak ma śmieci bo nic tam nie zapisuje !

 

jak zrobisz dobrze algorytm i bedzie zapisywać do tablicy to bedzie ok!

spróbuj int tab[25] = {0};

jeśli to nie przejdzie to użyj funkcji setmem() np...

to nie zadziała! nie trzeba zerować tablicy podczas inicjalizacji!

 

znaki z pliku wczytuj np zn=getc(plik);

i poptem reszta nie chce mi sie pisać bo to nie jest takie trudne poradzisz sobie !

powodzenia pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziękuje za odpowiedz i już prawie sobie poradziłem z tym programem ale niestety ostatni znak w pliku zlicza mi za dużo razy (dokładnie o 1 więcej)

 

tu jest obecny kod programiku

 

#include <stdio.h>main(){char znak, litera;int i, j, k = 0;int tab[25];FILE *plik;plik = fopen("c:\\praca\\text.txt", "r");if (plik==NULL) {	  printf("Nie udalo sie otworzyc pliku");     }   printf("Plik otwarty pomyslnie!\n");//zerowaie zawartosci tablicy   for (j=0; j<26; j++) {  tab[j]=0;  } //zliczanie liter i zapisywanie wyników do tablicy while (!feof(plik)){    fscanf(plik, "%c", &znak); for (i=0; i<26; i++)  {     litera = i+97;   k=0;   if (znak == litera) tab[i]++;  }  }//wyswietlanie ilosci liter for (j=0; j<26; j++) {  printf("%c = %d\n", j+97, tab[j]); }fclose(plik);return 0;}

czy potrafił by mi ktoś czemu ostatnią literę zlicza mi za dużo razy ?

najprawdopodobniej błąd znajduje się w tym kawałku kodu

//zliczanie liter i zapisywanie wyników do tablicy while (!feof(plik)){    fscanf(plik, "%c", &znak); for (i=0; i<26; i++)  {     litera = i+97;   k=0;   if (znak == litera) tab[i]++;  }  }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

bo ten kawałek mówiłem Ci że jest bez sensu.. niepotrzebnie przy każdym znaku przelatujesz tą pętlę, bo przecież kody ascii można wprost przeliczać na kolejne indeksy liter.

 

Zresztą odpal debuger i wczytaj sobie plik 3 literowy i zobacz dlaczego za dużo razy zlicza...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie ma co się tak pętlić - zrób tak jak napisał PelzaK - każdy znak ma kod ascii, więc wyzeruj tablicę, a potem zliczaj przy wczytywaniu:

 

//zliczanie liter i zapisywanie wyników do tablicy {    fscanf(plik, "%c", &znak); if (znak>96) znak-=97; else znak-=65; if (znak<25) tab[znak]++;} while (!feof(plik))

(przesunięcie "while" na koniec pętli powinno zapobiec dwukrotnemu zliczaniu ostatniego znaku, ale mogę się mylić w tej kwestii.)

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ę...