#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <sys/time.h>
#define DT 3050000
#define DL_ACSII 10000
#define DL_PL 381
int pobierz( wchar_t tab[])
{
FILE *fp;
fp=fopen("tekst.txt","r");
int i=0;
while(1)
{
if(i==DT)
return (-1);
tab[i]=fgetwc(fp);
if(tab[i]==WEOF)
return (i);
++i;
}
}
void drukuj(wchar_t tab[],int dn)
{
int i=0;
while(i<dn)
{
//printf("\n");
freopen(NULL, "w", stdout);
putwchar(tab[i]);
freopen(NULL, "w", stdout);
++i;
}
printf("\n");
freopen(NULL, "w", stdout);
}
int licz_znaki(wchar_t tab[],int ile[],int dn)
{
int wewl=0;
for(int k=0;k<DL_ACSII;++k)
{
ile[k]=0;
}
for(int k=0;k<dn;++k)
{
++ile[tab[k]];
++wewl;
}
return wewl;
}
void drukuj_znaki(int ile[],double frek[])
{
printf("\n*********\n");
int i=0;
int max=0;
int k=0;
while(i<DL_PL)
{
if(ile[i]>max)
max=ile[i];
++i;
}
i=max;
while(i>0)
{
while(k<DL_PL)
{
if(ile[k]==i)
{
switch(k)
{
case 10:
printf("LF-Uni:%d",k);
break;
case 32:
printf("spacja-Uni:%d",k);
break;
case 9:
printf("tab-Uni:%d",k);
break;
default:
freopen(NULL, "w", stdout);
putwchar(k);
freopen(NULL, "w", stdout);
printf("-Uni:%3d",k);
freopen(NULL, "w", stdout);
break;
}
//printf("%d,",k);
printf(" ile:%3d frek:%.8f\n",ile[k],frek[k]);
}
++k;
}
k=0;
--i;
}
}
int usun_nieprawidlowe(int ile[])
{
int NZ=0;
for(int k=0;k<DL_ACSII;++k)
{
if(ile[k]>0 && k>127 && !(k==260||k==262||k==280||k==321||k==323||k==211||k==346||k==377||k==379||k==261||k==263||k==281||k==322||k==324||k==243||k==347||k==378||k==380))
{
NZ+=ile[k];
ile[k]=0;
}
}
return NZ;
}
void licz_frek( double frek[],int ile[], double dn)
{
int i=0;
while(i<DL_ACSII)
{
frek[i]=((100*ile[i])/dn);
++i;
}
}
int formatuj_PWN(int ile[], int dn)
{
int wyf=0;
int i=0;
while(i<97)
{
wyf+=ile[i];
ile[i]=0;
++i;
}
i=123;
while(i<128)
{
wyf+=ile[i];
ile[i]=0;
++i;
}
i=97;
int k=65;
while(i<122)
{
ile[i]+=ile[k];
ile[k]=0;
++k;
++i;
}
ile[261]+=ile[260];
ile[260]=0;
ile[263]+=ile[262];
ile[262]=0;
ile[281]+=ile[280];
ile[280]=0;
ile[322]+=ile[321];
ile[321]=0;
ile[324]+=ile[323];
ile[323]=0;
ile[243]+=ile[211];
ile[211]=0;
ile[347]+=ile[346];
ile[346]=0;
ile[378]+=ile[377];
ile[377]=0;
ile[380]+=ile[379];
ile[379]=0;
ile[32]=0;
return wyf;
}
int main()
{
struct timeval stop, start;
gettimeofday(&start, NULL);
setlocale(LC_ALL,"");
int dn=0;
int NZ=0;
int wyf=0;
wchar_t tab[DT];
if(tab==NULL)
{
printf("brak pamieci\n");
}
int ile[DL_ACSII];
double frek[DL_ACSII];
dn=pobierz(tab);
if(dn<0)
printf("tl;dr\n");
else
{
licz_znaki(tab,ile,dn);
//drukuj(tab,dn);
NZ=usun_nieprawidlowe(ile);
wyf=formatuj_PWN(ile,dn);
licz_frek(frek,ile,dn-NZ-wyf);
drukuj_znaki(ile,frek);
}
printf("\nLiczba wszystkich znaków:%d\nLiczba znaków nieprawidłowych:%d\nLiczba znaków prawidłowych:%d\nLiczba znaków usuniętych(format):%d\nLiczba prawidłowych znaków po formatowaniu:%d\n",dn,NZ,dn-NZ,wyf,dn-NZ-wyf);
gettimeofday(&stop, NULL);
printf("took %lu\n", (stop.tv_usec - start.tv_usec));
return 0;
}
Program ma analizować liczbę wystąpień poszczególnych znaków, wiem że, marnie napisany ale dopiero się uczę.
Moim IDE jest xed i konsola basha a debuggerem getchar() i printf(), nie wiem czy to dobre rozwiązanie.