Jak zliczyć małe literki z pliku i wypisać po kolei ich wartości w języku C?

0

Jak mogę zliczyć literki, które mam w tablicy tak żeby później wyświetlić po kolej ich liczbę wystąpień?

1

No to masz te literki w tablicy, czy w pliku? Zdecyduj się w końcu.

0

z czytałem z pliku do tablicy i jak je teraz zliczyć każdą literę osobno?

0

Tablica zawierająca wszystkie możliwe wartości znaku, inkrementuj odpowiednie pole po odczytaniu danego znaku. W C++ byś sobie mógł uprościć używając std::map

0

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
FILE *plik;
char litera;
char tab[i];

plik=fopen("nazwa_pliku","r");

do
{
litera=getc(plik);
tab[i]=litera;
printf("%c\n",tab[i]);
}
while(litera!=EOF);

fclose(plik);
return 0;
};

W ten sposób z czytałem do tablicy i nie wiem jaki jest wskaźnik do pierwszej komórki tablicy, żeby ją przeszukać.

0

tab lub &tab[0]

Ale równie dobrze możesz podczas wczytywania z pliku zliczać, bez zapisywania treści do jakiejś tablicy.

0

plik=fopen("nazwa_pliku","r");
litera=getc(plik);

tab[i];
for(i='a'; i<='z'; i++);

if (litera == i......

W ten sposób? Jak to napisać w pętli?

0

Potrzebujesz tablicę do zliczania wystąpień, gdzie indeksem będzie właśnie wczytana litera.

0

Więc tak jak napisałem wcześniej i dalej:

 if(litera == i); tab[i++];  ?

Tylko, że ta tablica składa się z liter i jak zwiększę indeks to np.: zamiast 'a' będzie 'b'?

0

Innych znaków nie masz zliczać? W takim razie faktycznie możesz tylko dla isalpha, ale nie widzę tutaj specjalnego sensu.

0

tylko małe literki mam zliczyć więc ta tablica jest zła?

0

Jeśli założysz ASCII to możesz zmniejszyć tablicę, ale najpierw policz dla wszystkich znaków, potem się zastanów nad optymalizacją.

0

tab[i];
for(i='a'-26; i<='z'-26; i++);

teraz chyba tab[0]='a'-26. Ale nie wiem jak zliczyć każdą literkę osobno. W pliku mam tylko małe literki bez białych znaków poza EOF.

0

Nie mam pojęcia co ty tam próbujesz osiągnąć. Wcześniej wkleiłeś działające wczytywanie z pliku do tablicy. Teraz zamiast wczytywać do tablicy, inkrementuj w tablicy wystąpień liczbę o indeksie wczytanej literki.

0

No tak tylko w jaki sposób gdy mam tablicę (od a do z) zwiększyć licznik danej litery jeśli wczytana litera jest równa tej w tablicy.
Ta tablica musi być chyba (od 0 do 26) ale w tędy nie będzie można przyrównać do wczytywanej litery.?

0

np. tak (na przykładzie liczb z zakresu 40-45)

	int arr[] = {41, 43, 42, 40, 41, 41, 41, 44, 44};
	int arr_size = sizeof(arr) / sizeof(*arr);
	int counts[5] = {};
	
	for(int i = 0; i < arr_size; ++i){
		int number = arr[i];
		counts[number - 40]++;
	}
	
	printf("liczba wystapien:\n");
	for(int i = 0; i < 5; ++i){
		printf("%d -> %d\n", i+40, counts[i]);
	}

http://melpon.org/wandbox/permlink/mXHCF3Zysgv6kEez

0
{
 char tab[]={b,d,c,a,b,b,b,e,e};                      //to samo dla liter tylko tu musi być typ char
 char tab_size = sizeof(tab) / sizeof(*tab);        
 wystapienia[6];                                            //tablica która zlicza wystąpienia
 
 for(int i=0; i< tab_size; ++i);                          //tu nie wiem jaki typ ma mieć i ?
 {
   int number = tab[i];
   wystąpienia[number-26]++;                          //bo w kodzie ASCII a=26. ?
 }
  printf("liczba wystąpień:\n");                        
  for(int i = 0; i< 6; ++i);
 {
  printf("%d -> %d\n", " i+26, counnts[i]");             //to w " " się nie da napisać jak przy liczbach bo to nie będzie to samo ?
 }
}

W ten sposób to przekształciłem ale nie wiem czy tak może być?

0

Literały znakowe w C musisz zawszeć w '', np. 'a'. Samo a to nazwa zmiennej/typu.

wystapienia nie mają typu, nie skompiluje się.

a w ASCII zdecydowanie nie ma wartości 26 - google ascii chart

%c wyświetla znak w formatowaniu funkcji z rodziny printf

Użyj jakiegoś kompilatora, nie mam zamiaru rozwiązywać problemów które są trywialne po odczytaniu pierwszego zgłoszonego błędu.

0
{
 char tab[]={'b','d','c','a','b','b','b','e','e'};                    
 char tab_size = sizeof(tab) / sizeof(*tab);        
 int wyst[6];                                           
 
 for(int i=0; i< tab_size; ++i);                          //tu nie wiem jaki typ ma mieć i ?
 {
   int number = tab[i];
   int wyst[number-97]++;                          //bo w kodzie ASCII a=97 ?
 }
  printf("liczba wystąpień:\n");                        
  for(int i = 0; i< 6; ++i);
 {
  printf("%c -> %c\n",  i+97, wyst[i]);             //i+97 to nie będzie to samo co np.: 'a'+97 ?
 }
}
0

Gotowe:

 
#include<stdio.h>

int main(){
 
char tab[]={'b','d','c','a','b','b','b','e','e'};  //a - e
int size =  sizeof(tab)/sizeof(tab[0]);
    
 int wyst[5] = {};                                          
 int i = 0;
   for(i = 0; i < size; i++ ){
     int number = tab[i];
     wyst[number - 97]++ ;    
   }
   
   printf("liczba wystapien:\n");                        
   for(i = 0; i < 5; i++ ){
     printf("%c -> %d\n", i+97, wyst[i]);
   }
	
	return 0;
}
0

kod bedzie dzialal tylko z literami a - z
tablica wyst nie jest tworzona dynamicznie ( za kazdym razem musisz zdefiniowac ilosc liter, np w twoim przykladzie a - e, 5 liter)
porownaj moje rozwiazane do twojego i zobacz gdzie miales bledy

do tego typy zadan najlepszym rozwiazanie byloby uzycie Data structure typu Dictionary. Nie wiem czy w C jest to dostepne :)

co do i++ albo ++i w typ przypadku nie robi to roznicy

0
#include<stdio.h>
 
int main()
{
    char a, i, tab[i];                                   //  a - wczytany znak,    i - (od a do z)
    FILE *p;                                             //  p - plik
    p = fopen("nazwa_p","r");

  do                                                       // odczytaj znak z pliku i wczytaj go do tablicy tab[i] a nast. wypisz na ekran 
  {
   a = getc(p);                               
   tab[i] = a;
   printf("%c\n",tab[i]);
  }
  while(a!=EOF);

   int size =  sizeof(tab[i])/sizeof(tab[0]);
 
   int wyst[26] = {};                                  // tablica ma rozmiar 26 bo jest 25 liter i jeden znak EOF                                          
   int j = 0;
   for(j = 0; j < size; j++ ){
     int number = tab[j];
     wyst[number - 97]++ ;    
   }
 
   printf("liczba wystapien:\n");                        
   for(j = 0; j < 26; j++ )
   {
     printf("%c -> %d\n", j+97, wyst[j]);
   }
    
    fclose(p); 
    return 0;
}

Po skompilowaniu wypisuje elementy tablicy: tab[i] , wyświetla litery od 'a' do 'z' ale każda ma liczbę wystąpień zero.
Co powinienem poprawić w powyższym kodzie?
Dziękuję bardzo wszystkim za dotychczasową pomoc :)

0
11Andrzej11 napisał(a):
#include<stdio.h>
 
int main()
{
    char a, i, tab[i];                                   //  a - wczytany znak,    i - (od a do z)
    FILE *p;                                             //  p - plik
    p = fopen("nazwa_p","r");

  do                                                       // odczytaj znak z pliku i wczytaj go do tablicy tab[i] a nast. wypisz na ekran 
  {
   a = getc(p);                               
   tab[i] = a;
   printf("%c\n",tab[i]);
  }
  while(a!=EOF);

   int size =  sizeof(tab[i])/sizeof(tab[0]);
 
   int wyst[26] = {};                                  // tablica ma rozmiar 26 bo jest 25 liter i jeden znak EOF                                          
   int j = 0;
   for(j = 0; j < size; j++ ){
     int number = tab[j];
     wyst[number - 97]++ ;    
   }
 
   printf("liczba wystapien:\n");                        
   for(j = 0; j < 26; j++ )
   {
     printf("%c -> %d\n", j+97, wyst[j]);
   }
    
    fclose(p); 
    return 0;
}

Po skompilowaniu wypisuje elementy tablicy: tab[i] , wyświetla litery od 'a' do 'z' ale każda ma liczbę wystąpień zero.
Co powinienem poprawić w powyższym kodzie?
Dziękuję bardzo wszystkim za dotychczasową pomoc :)

Kto pomoże?

0
 
#include<stdio.h>
 
int main()
{
	FILE *p; 
    p = fopen("nazwa_p.txt","r");
    int c, wyst[26] = {};
	
	while ((c = fgetc(p)) != EOF)
        wyst[c - 97]++; 
	
    printf("liczba wystapien:\n");                        
   for( int j = 0; j < 26; j++ )
        printf("%c -> %d\n", j+97, wyst[j]);
   
   fclose(p); 
    return 0;
}

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