tomek3232 Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 (edytowane) 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 25 Stycznia 2008 przez tomek3232 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KrOOliK89 Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 (edytowane) 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 25 Stycznia 2008 przez KrOOliK89 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 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... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KRISTERS Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
tomek3232 Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 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]++; } } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 26 Stycznia 2008 Zgłoś Opublikowano 26 Stycznia 2008 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... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mister_p Opublikowano 26 Stycznia 2008 Zgłoś Opublikowano 26 Stycznia 2008 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.) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...