Newsgroup: it.comp.lang.c
Titolo: se a qualcuno interessa...

... ho fatto una sorta di parser, se cosi' si puo' chiamare. Controlla molto
grossolanamente se la parola inserita e' accettabile secondo la sintassi
italiana. Con qualche modifica, si potrebbe usare come correttore
ortografico.
#include <stdio.h>
#include <string.h>
#define esci { err=1; \
      break; }
#define cerca(x,y) { \
 *p=x;            \
 *(p+1)=y;   \
 *(p+2)='\0';  \
 if (strstr(s,p)!=NULL) return 1; }
#define cerca2(x) \
 if (strstr(s,x)!=NULL) return 1;
int is_vowel(int);
int equal_voc(char *s, int i);
int conson2(char *s);
int conson3(char *s, int i);
int main()
{
 char parola[20];
 int n,i,err=0;
 printf("\nInserisci una parola: ");
 gets(parola);
 n=strlen(parola);
 for(i=1; i<n; i++)
  if (equal_voc(parola,i-1)) esci;
 if (!err)
  if (conson3(parola,n)) err=1;
 if (!err)
  if (conson2(parola)) err=1;
 if (err) printf("\n%s non e una parola esatta",parola);
 else printf("\nOk! %s e una parola esatta",parola);
 getchar();
 return 0;
}
int is_vowel(int c)
{
 return (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='j'
  || c=='w' || c=='y') ? 1 : 0;
}
int equal_voc(char *s, int i)
{
 if (is_vowel(*(s+i)) && is_vowel(*(s+i+1)))
  if (*(s+i)==*(s+i+1)) return 1;
 return 0;
}
int conson2(char *s)
{
 char p[3],l='a';
 int i;
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='b' && (l+i)!='l' && (l+i)!='r'
   && (l+i)!='s')
    cerca('b',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='c' && (l+i)!='h' && (l+i)!='k'
   && (l+i)!='l' && (l+i)!='m' && (l+i)!='n' && (l+i)!='q'
   && (l+i)!='r' && (l+i)!='s' && (l+i)!='t' && (l+i)!='z')
    cerca('c',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='d' && (l+i)!='l' && (l+i)!='r'
   && (l+i)!='s' && (l+i)!='v')
    cerca('d',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='f' && (l+i)!='g' && (l+i)!='l'
   && (l+i)!='n' && (l+i)!='r' && (l+i)!='t')
    cerca('f',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='g' && (l+i)!='h' && (l+i)!='l'
   && (l+i)!='m' && (l+i)!='n' && (l+i)!='r')
    cerca('g',l+i);
 for (i=0; i<26; i++)
  if ((l+i)!='e' && (l+i)!='i')
    cerca('h',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='c' && (l+i)!='d' && (l+i)!='f'
   && (l+i)!='g' && (l+i)!='l' && (l+i)!='m' && (l+i)!='p'
   && (l+i)!='s' && (l+i)!='t' && (l+i)!='v' && (l+i)!='z')
    cerca('l',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='b' && (l+i)!='m' && (l+i)!='n'
   && (l+i)!='p')
    cerca('m',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='c' && (l+i)!='d' && (l+i)!='f'
   && (l+i)!='g' && (l+i)!='n' && (l+i)!='s' && (l+i)!='t'
   && (l+i)!='v' && (l+i)!='z')
    cerca('n',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='l' && (l+i)!='n' && (l+i)!='p'
   && (l+i)!='r' && (l+i)!='s')
    cerca('p',l+i);
 for (i=0; i<26; i++)
  if ((l+i)!='u')
   cerca('q',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='b' && (l+i)!='c' && (l+i)!='d'
   && (l+i)!='f' && (l+i)!='g' && (l+i)!='l' && (l+i)!='m'
   && (l+i)!='n' && (l+i)!='p' && (l+i)!='r' && (l+i)!='s'
   && (l+i)!='t' && (l+i)!='v' && (l+i)!='z')
    cerca('r',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='b' && (l+i)!='c' && (l+i)!='d'
   && (l+i)!='f' && (l+i)!='g' && (l+i)!='l' && (l+i)!='m'
   && (l+i)!='n' && (l+i)!='p' && (l+i)!='s' && (l+i)!='t'
   && (l+i)!='v')
    cerca('s',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='l' && (l+i)!='r' && (l+i)!='t')
    cerca('t',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='v')
    cerca('v',l+i);
 for (i=0; i<26; i++)
  if (!is_vowel(l+i) && (l+i)!='z')
    cerca('z',l+i);
 return 0;
}
int conson3(char *s, int n)
{
 int i,j,cnt;
 char *terne[]={"str","scr","spr","sbr","sdr","sfr","sgr","scl","spl",
       "sch","sgh"};
 char p[4];
 for (i=0; i<n-2; i++)
 if (cnt!=11 && !is_vowel(*(s+i)) && !is_vowel(*(s+i+1)) &&
!is_vowel(*(s+i+2))) {
  *p=*(s+i);
  *(p+1)=*(s+i+1);
  *(p+2)=*(s+i+2);
  *(p+3)='\0';
  cnt=0;
  for(j=0; j<11; j++)
   if (strcmp(p,terne[j])!=0) cnt++;
  if (cnt==11) break;
 }
 if (cnt==11) return 1;
 return 0;
}
--
---------------------------------------------------
There are 10 kinds of people in the world:
those who understand binary, and those who don't
---------------------------------------------------

 ortografico.
[snipped]
leggibilissimo :)
ARGH!!!!
Sbirish

 wrote
[CUT]
Allora nell'ultima funzione: conson3, usi cnt senza inizializzarlo prima.
Magari controlla..... visto che poi fai un test:
if (cnt!=11 && .....
Inoltre molto prima hai quasi 20 for loops uno dopo l'altro..... Guarda se
riesci a mettere insieme le cose comuni e ..... evitare di averne cosi'
tanti.
Inoltre se non tocchi questo programma per 6 mesi, in seguito nemmeno tu
sarai piu' in grado di metterci mano.... non e' per nulla leggibile e non e'
commentato.
Dai un occhio a parole come: soqquadro, applaudire e tante altre parole
corrette che vengono indicate come NON corrette.
Ad ogni modo e' interessante.
Tommy

 Tommy
tnx,
davser

Ciao ho visto il tuo programma ed e' carino volevo sapere se puoi darmi
quello commentato.
Scusa ho provato con il tuo indirizzo  
davserto...@libero.it
  pero',
non riesco a spedirlo mi dice indirizzo non accettato dal srver.
GRAZIE e CIAO

 GRAZIE e CIAO
Prego