schumijr_87
25-11-2007, 14:18
Per chi è tanto paziente da elaborare un'alternativa a questo esercizio:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
char* inputStr()
{
unsigned long long i = 0;
char c;
char* str = (char*)malloc(2);
do
{
c = getchar();
str[i++] = c;
str = (char*)realloc(str, i+3);
if (c == '\n') {str[--i] = ' '; str[i+1] = '\0';}
}
while(c != '\n');
return str;
}
void str_assign(char** s1, unsigned long r, char* s2)
{
unsigned long i;
for(i = 0; s2[i] != '\0'; i++);
char* s3 = (char*)malloc(i+1);
for(i = 0; s2[i] != '\0'; i++) s3[i] = s2[i]; s3[i] = '\0';
s1[r] = s3;
}
void print(char** a, unsigned long end)
{
unsigned long i;
for(i = 0; i <= end; i++) printf("%lu) %s\n", i, a[i]);
}
void print2(unsigned long* a, unsigned long end)
{
unsigned long i;
for(i = 0; i <= end; i++) printf("%lu) %lu\n", i, a[i]);
}
unsigned long conta_parole(char* testo, char** parole, unsigned long* occorrenze)
{
unsigned long l, j, i = 0, tot_parole = 0;
int isparola = 0, gia_inserita = 0;
char* parola = (char*)malloc(2);
for(l = 0; testo[l] != '\0'; l++)
{
if ( !(isspace(testo[l])) && !(ispunct(testo[l])) )
{
parola[i++] = testo[l];
parola = (char*)realloc(parola, i+2);
isparola = 1;
}
else if (isparola == 1)
{
isparola = 0;
parola[i] = '\0';
if (tot_parole >= 1)
{
for(j = 0; j < tot_parole; j++)
{
if(strcmp(parole[j], parola)==0) {occorrenze[j]++; gia_inserita = 1;}
}
if (!gia_inserita)
{
str_assign(parole, tot_parole, parola);
occorrenze[tot_parole]++;
tot_parole++;
parole = (char**)realloc(parole, (tot_parole+1)*sizeof(char*));
occorrenze = (unsigned long*)realloc(occorrenze, (tot_parole+1)*sizeof(unsigned long));
occorrenze[tot_parole] = 0;
} else gia_inserita = 0;
}
else
{
str_assign(parole, 0, parola);
occorrenze[0]++; tot_parole++;
}
i = 0;
}
}
return tot_parole-1;
}
void ordina_parole(char** parole, unsigned long* occorrenze, unsigned long tot)
{
//bubble sort
unsigned long i, scambi = 0;
do
{
for(i = 0, scambi = 0; i < tot-1; i++)
{
if (occorrenze[i] < occorrenze[i+1])
{
unsigned long appoggio1 = occorrenze[i];
occorrenze[i] = occorrenze[i+1];
occorrenze[i+1] = appoggio1;
char* appoggio2 = parole[i];
parole[i] = parole[i+1];
parole[i+1] = appoggio2;
scambi = 1;
}
}
}
while(scambi);
for(i = 0; i < tot; i++)
{
printf("%s %lu\n", parole[i], occorrenze[i]);
}
}
int main()
{
char* testo = inputStr();
char** parole = (char**)malloc(sizeof(char*));
unsigned long* occorrenze = (unsigned long*)malloc(sizeof(unsigned long)*50); occorrenze[0] = 0;
unsigned long tot = conta_parole(testo, parole, occorrenze);
//print2(occorrenze, tot);printf("\n");
//print(parole, tot);printf("\n");
ordina_parole(parole, occorrenze, tot);
}
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
char* inputStr()
{
unsigned long long i = 0;
char c;
char* str = (char*)malloc(2);
do
{
c = getchar();
str[i++] = c;
str = (char*)realloc(str, i+3);
if (c == '\n') {str[--i] = ' '; str[i+1] = '\0';}
}
while(c != '\n');
return str;
}
void str_assign(char** s1, unsigned long r, char* s2)
{
unsigned long i;
for(i = 0; s2[i] != '\0'; i++);
char* s3 = (char*)malloc(i+1);
for(i = 0; s2[i] != '\0'; i++) s3[i] = s2[i]; s3[i] = '\0';
s1[r] = s3;
}
void print(char** a, unsigned long end)
{
unsigned long i;
for(i = 0; i <= end; i++) printf("%lu) %s\n", i, a[i]);
}
void print2(unsigned long* a, unsigned long end)
{
unsigned long i;
for(i = 0; i <= end; i++) printf("%lu) %lu\n", i, a[i]);
}
unsigned long conta_parole(char* testo, char** parole, unsigned long* occorrenze)
{
unsigned long l, j, i = 0, tot_parole = 0;
int isparola = 0, gia_inserita = 0;
char* parola = (char*)malloc(2);
for(l = 0; testo[l] != '\0'; l++)
{
if ( !(isspace(testo[l])) && !(ispunct(testo[l])) )
{
parola[i++] = testo[l];
parola = (char*)realloc(parola, i+2);
isparola = 1;
}
else if (isparola == 1)
{
isparola = 0;
parola[i] = '\0';
if (tot_parole >= 1)
{
for(j = 0; j < tot_parole; j++)
{
if(strcmp(parole[j], parola)==0) {occorrenze[j]++; gia_inserita = 1;}
}
if (!gia_inserita)
{
str_assign(parole, tot_parole, parola);
occorrenze[tot_parole]++;
tot_parole++;
parole = (char**)realloc(parole, (tot_parole+1)*sizeof(char*));
occorrenze = (unsigned long*)realloc(occorrenze, (tot_parole+1)*sizeof(unsigned long));
occorrenze[tot_parole] = 0;
} else gia_inserita = 0;
}
else
{
str_assign(parole, 0, parola);
occorrenze[0]++; tot_parole++;
}
i = 0;
}
}
return tot_parole-1;
}
void ordina_parole(char** parole, unsigned long* occorrenze, unsigned long tot)
{
//bubble sort
unsigned long i, scambi = 0;
do
{
for(i = 0, scambi = 0; i < tot-1; i++)
{
if (occorrenze[i] < occorrenze[i+1])
{
unsigned long appoggio1 = occorrenze[i];
occorrenze[i] = occorrenze[i+1];
occorrenze[i+1] = appoggio1;
char* appoggio2 = parole[i];
parole[i] = parole[i+1];
parole[i+1] = appoggio2;
scambi = 1;
}
}
}
while(scambi);
for(i = 0; i < tot; i++)
{
printf("%s %lu\n", parole[i], occorrenze[i]);
}
}
int main()
{
char* testo = inputStr();
char** parole = (char**)malloc(sizeof(char*));
unsigned long* occorrenze = (unsigned long*)malloc(sizeof(unsigned long)*50); occorrenze[0] = 0;
unsigned long tot = conta_parole(testo, parole, occorrenze);
//print2(occorrenze, tot);printf("\n");
//print(parole, tot);printf("\n");
ordina_parole(parole, occorrenze, tot);
}