Jak mogę zliczyć literki, które mam w tablicy tak żeby później wyświetlić po kolej ich liczbę wystąpień?
No to masz te literki w tablicy, czy w pliku? Zdecyduj się w końcu.
z czytałem z pliku do tablicy i jak je teraz zliczyć każdą literę osobno?
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
#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ć.
tab
lub &tab[0]
Ale równie dobrze możesz podczas wczytywania z pliku zliczać, bez zapisywania treści do jakiejś tablicy.
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?
Potrzebujesz tablicę do zliczania wystąpień, gdzie indeksem będzie właśnie wczytana litera.
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'?
Innych znaków nie masz zliczać? W takim razie faktycznie możesz tylko dla isalpha
, ale nie widzę tutaj specjalnego sensu.
tylko małe literki mam zliczyć więc ta tablica jest zła?
Jeśli założysz ASCII to możesz zmniejszyć tablicę, ale najpierw policz dla wszystkich znaków, potem się zastanów nad optymalizacją.
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.
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.
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.?
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]);
}
{
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ć?
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.
{
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 ?
}
}
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;
}
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
#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 :)
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?
#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;
}