Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    62

    [C] Algoritmo per controllo su una stringa

    Salve a tutti!

    E' da giorni che sto impazzendo nel cercare un algoritmo che verifichi che in una parola (char parola[25]), siano contenute solo vocali ed almeno una fra 4 consonanti diverse, passate come parametro a questa funzione (char consonante[4]).
    Inoltre, queste consonanti non si devono ripetere nella parola.

    Ad esempio: consonanti SNCI
    parola corretta: ASINO
    parole errate:
    - ASSINO --> S ripetuta + volte
    - FIORE --> Nessuna consonante proposta usata
    - SONIA8! --> Utilizzo di caratteri non consentiti (8 e !)

    Da tener conto che questa funzione, deve poter trattare sia un vettore di 4 consonanti, che di 5, 6 e 7 (dipende da quela momento viene chiamata la funzione).

    Vi prego di aiutarmi.....non ce la faccio più.



    P.S. posto sotto quello che sono riuscito a fare io....

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    62
    Ecco quello che sono riuscito a fare, ma oltre al fatto che non funziona (e non capisco perché), non è un algoritmo buono, sia perché lento, sia perchè troppo incasinato.

    Note:
    - nCPT è il numero di cononanti per turno (il n° di consonanti da utilizzare, ma quelle passate sono sempre 7)
    - questa funzione restituisce in un intero della funzione chiamante, 0, se la parola è corretta, 1, se la parola è sbagliata.
    - (scusate ma gli spazi del codice vengono eliminati automaticamente quando posto)



    int controllaParola(char parola[], char consonante[], int nCPT)
    {
    // Dichiarazione delle variabili:
    int j, h, ok, controlCons[nCPT];

    // Controllo sulla parola inserita:
    for(j=0; j<nCPT; j++) controlCons[j]=0;
    for(j=0; j<strlen(parola); j++)
    {
    ok=0;
    switch(parola[j])
    {
    case 'A': ok=1; break;
    case 'E': ok=1; break;
    case 'I': ok=1; break;
    case 'O': ok=1; break;
    case 'U': ok=1; break;
    case 'consonante[0]': controlCons[0]++; ok=1; break;
    case 'consonante[1]': controlCons[1]++; ok=1; break;
    case 'consonante[2]': controlCons[2]++; ok=1; break;
    case 'consonante[3]': controlCons[3]++; ok=1; break;
    default:
    if(nCPT>4)
    {
    case 'consonante[4]': controlCons[4]++; ok=1; break;
    }
    if(nCPT>5)
    {
    case 'consonante[5]': controlCons[5]++; ok=1; break;
    }
    if(nCPT>6)
    {
    case 'consonante[6]': controlCons[6]++; ok=1; break;
    }
    }
    if(ok==0) return 1;
    }
    for(j=0; j<nCPT; j++)
    {
    for(h=0; h<nCPT; h++)
    {
    if(controlCons[j]>1) return 1;
    }
    }

    return 0;
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Per i tag codes ci penso io
    codice:
    int controllaParola(char parola[], char consonante[], int nCPT)
    {
        // Dichiarazione delle variabili:
        int j, h, ok, controlCons[nCPT];
        
        // Controllo sulla parola inserita:
        for(j=0; j<nCPT; j++) controlCons[j]=0;
        for(j=0; j<strlen(parola); j++)
        {
            ok=0;
            switch(parola[j])
            {
                case 'A': ok=1; break;
                case 'E': ok=1; break;
                case 'I': ok=1; break;
                case 'O': ok=1; break;
                case 'U': ok=1; break;
                case 'consonante[0]': controlCons[0]++; ok=1; break;
                case 'consonante[1]': controlCons[1]++; ok=1; break;
                case 'consonante[2]': controlCons[2]++; ok=1; break;
                case 'consonante[3]': controlCons[3]++; ok=1; break;
                default:
                if(nCPT>4)
                {
                        case 'consonante[4]': controlCons[4]++; ok=1; break;
                }
                if(nCPT>5)
                {
                        case 'consonante[5]': controlCons[5]++; ok=1; break;
                }
                if(nCPT>6)
                {
                        case 'consonante[6]': controlCons[6]++; ok=1; break;
                }
            }
            if(ok==0) return 1;
        }
        for(j=0; j<nCPT; j++)
        {
            for(h=0; h<nCPT; h++)
            {
                if(controlCons[j]>1) return 1;
            }
        }
        
        return 0;
    }
    La prossima volta usali per favore

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da RIACK
    Ecco quello che sono riuscito a fare, ma oltre al fatto che non funziona (e non capisco perché),
    Cosa vorresti fare con queste righe?

    Originariamente inviato da RIACK
    case 'consonante[0]': controlCons[0]++; ok=1; break;
    case 'consonante[1]': controlCons[1]++; ok=1; break;
    case 'consonante[2]': controlCons[2]++; ok=1; break;
    case 'consonante[3]': controlCons[3]++; ok=1; break;
    Non mi pare che abbiano senso (oltre ad essere errati sintatticamente).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    62
    beh.....con case: 'consonante[0]' spero di ottenere questo risultato: se in consonante[0] c'è C, il tutto verrà sostituito con case 'C'

  6. #6
    Se vuoi sviluppare l'algoritmo ti consiglio di non pensare ad una funzione che accetti come secondo parametro un
    codice:
    char word[4]
    , cioè non sviluppare l'algoritmo considerando che le consonanti che non si devono ripetere siano necessariamente 4
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Un consiglio: per facilitarti le cose dividi tutto in sottofunzioni.
    Il tuo scopo è verificare che nella stringa:
    -Ci sono solo vocali;
    -Ci sia almeno una fra 4 consonanti diverse;
    -Le consonanti non si devono ripetere nella parola.

    Qua io farei 3 funzioni,le quali ritornano 1 se la condizione è soddisfatta,e 0 se la condizione non è soddisfatta.
    Un esempio di condizione per verificare che in una stringa ci siano solo vocali è (ricorsiva):
    codice:
    int solo_vocali(char *p)
    {
        if(*p=='\0')
          return 1;
        else if(*p=='a'||*p=='e'||*p=='i'||*p=='o'||*p=='u')
          {
              p++;
              return 1*(solo_vocali(p));
          }
        else return 0;
    }
    Passando come paramentro il nome della stringa.
    Poi quando hai fatto anche le altre verifichi il tutto in un if che può essere ad esempio:
    codice:
    if(solo_vocali(nome_stringa)&&funz_2(nome_stringa)&&funz_3(nome_stringa))
      printf("ok");
    Ma facendo il tutto in un' unica funzione secondo me ti complichi la vita.
    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    62
    potresti spiegarmi in qualche modo il funzionamento di quella funzione? intendo la parte ricorsiva di quella funzione, a partire dalla restituzione di 1, moltipplicato per la restituzione del valore ottenuto da una nuova chiamata di questa funzione stessa.....1*qualsiasiCosa fa qualsiasiCosa.....

    P.S. cosa fa \0 ?
    P.P.S. qualcuno può postare anche gli altri 2 algoritmi? grazie.....

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ogni stringa termina col carattere '\0' ,il terminatore.La funzione va avanti finchè:
    -Incontra il terminatore,allora restituisce 1;
    -Incontra una consonante,allora restituisce 0.

    La stringa "ciao" ha 5 elementi:
    codice:
    s[0]='c';
    s[1]='i';
    s[2]='a';
    s[3]='o';
    s[4]='\0';
    se p punta a '\0', solo_vocali(p)==1 perchè ho specificato all' inizio:
    codice:
    if(*p=='\0')
      return 1;
    Allora se p punta al penultimo elemento della stringa, solo_vocali(p)==1*solo_vocali(p+1),ma p incrementato punta a '\0',quindi il ritorno è: 1*1.
    Il tutto partendo dal primo elemento della stringa.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    62
    WOW! E' un algoritmo straordinario
    Pensavo controllasse solo una lettera che gli viene passata per parametro e invece controlla tutta la parola.....

    Comunque mi chiedo se mi serve veramente come algoritmo....e questo perchè alla fine non mi frega se ci stanno o no, vocali, perchè come già detto, a me serve un algoritmo che controlli che una parola sia formata da vocali ed almeno una delle consonanti proposte (che si ripeta però).
    Forse avrebbe senso se quella funzione venisse usata nell'if che hai proposto, ma produrrebbe un risultato che può essere semplificato in una sola istruzione che controlla se una lettera è compresa fra il codice asci di A ed il codice asci di Z.........o no?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.