PROBLEMA Stringhe!

Pasquale1989

Nuovo Utente
4
0
Salve a tutti sono pasquale e sono nuovo in questo forum, da circa un paio di giorni mi sto cimentando in questo esercizio in programmazione c, banale ma con esito negativo:
.Data una parola ricercare nel dizionario tutte le parole che hanno almeno tre lettere consecutive in comune con la parola data.
Praticamente per il dizionario ho creato una struct in questo modo perche mi serviva anche per il 1 punto del esercizio
C:
struct dizionario
{  char *parola;
  char *significato;
  char *sinonimi;
}Dizionario[50];
 
Ultima modifica da un moderatore:

rodhellas

Utente Èlite
1,521
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Si ma in cosa sbagli? Perchè ti dà esito negativo?
 

Pasquale1989

Nuovo Utente
4
0
Non riesco a capire come fare la funzione ne ho creata una che mi permette di vedere se esiste la sottostring e mi ritorna 0 e 1 per il resto non riesco a farmi stampare le parole che hanno 3 lettere consecutive con la parola data
 

DispatchCode

Utente Attivo
1,085
678
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
HDD
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
GPU
Nvidia Geforce GTX 960M, 4GB
Audio
Realtek
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Così ne sappiamo quanto prima però. Il fatto che non riesci a farti stampare 3 lettere può essere dovuto a molteplici fattori: non stampa i caratteri che ti aspetti? Stampa caratteri "casuali"? Crasha?
Senza codice o almeno spiegazioni su che cosa accade non ti si può rispondere nel merito; le cause possono essere molte.

L'unica osservazione che posso portare risiede nel come hai impostato la struttura: la parola è 1, il significato è fondamentalmente 1, ma i sinonimi saranno molti; ti servirebbe un array di puntatori a char per memorizzare N stringhe.
 

Pasquale1989

Nuovo Utente
4
0
mio dizionario:
C:
void inizializza_dizionario(struct dizionario Dizionario[])
{
    Dizionario[0].lettera='a';
    Dizionario[0].parola="Abito";
    Dizionario[0].significato="Indumento che si porta sopra la biancheria";
    Dizionario[0].sinonimi="Capo,indumento";
    Dizionario[1].lettera='b';
    Dizionario[1].parola="Bontà";
    Dizionario[1].significato="Carattere di chi è d’animo buono e gentile";
    Dizionario[1].sinonimi="Calma,ranquillità,finezza";
    Dizionario[2].lettera='c';
    Dizionario[2].parola="Coccio",
    Dizionario[2].significato="Frammento di vaso o di altro oggetto di terracotta";
    Dizionario[2].sinonimi="Frammento,terraglia";
    Dizionario[3].lettera='d';
    Dizionario[3].parola="Dado";
    Dizionario[3].significato="Cubetto che reca sulle sei facce i punti,da uno a sei";
    Dizionario[3].sinonimi="Cubo,cubetto,piedistallo";
    Dizionario[4].lettera='e';
    Dizionario[4].parola="Ente";
    Dizionario[4].significato="Istituzione provvista di personalità giuridica";
    Dizionario[4].sinonimi="Istituzione, organismo, istituto";
    Dizionario[5].lettera='f';
    Dizionario[5].parola="Futile";
    Dizionario[5].significato="Di scarso interesse,di poca importanza e senza profondità";
    Dizionario[5].sinonimi="frivolo";
    Dizionario[6].lettera='g';
    Dizionario[6].parola="ghiaccio";
    Dizionario[6].significato="Stato solido dell'acqua che, alla pressione di un'atmosfera, viene raggiunto a zero gradi Celsius";
    Dizionario[6].sinonimi="ghiacciato,freddo,gelato";
    Dizionario[7].lettera='h';
    Dizionario[7].parola="hotel";
    Dizionario[7].significato="Edificio predisposto per alloggiare persone a pagamento";
    Dizionario[7].sinonimi="albergo";
    Dizionario[8].lettera='i';
    Dizionario[8].parola="igloo";
    Dizionario[8].significato="è un rifugio con blocchi di neve";
    Dizionario[8].sinonimi="ghiacciata";
    Dizionario[9].lettera='l';
    Dizionario[9].parola="lampo";
    Dizionario[9].significato="fenomeno luminoso che accompagna le scariche elettriche nell'atmosfera";
    Dizionario[9].sinonimi="freccia,fulmine,saetta";
    Dizionario[10].lettera='m';
    Dizionario[10].parola="mano";
    Dizionario[10].significato="Organo prensile e tattile dell'uomo posto all'estremità degli arti superiori e formato dalle cinque dita, dal dorso, dalla palma (o palmo) e dal polso";
    Dizionario[10].sinonimi="organo prensile,organo tattile";
    Dizionario[11].lettera='n';
    Dizionario[11].parola="nano";
    Dizionario[11].significato="Riferito a persona, animale o vegetale, che presenta sviluppo limitato e proporzioni ridotte rispetto alle normali";
    Dizionario[11].sinonimi="bassotto,piccoletto,lillipuziano";
    Dizionario[12].lettera='o';
    Dizionario[12].parola="ozio";
    Dizionario[12].significato="Il non far nulla per pigrizia, per abitudine, per malattia o per altri impedimenti";
    Dizionario[12].sinonimi=" inattività, inoperosità, inerzia, inazione";
    Dizionario[13].lettera='p';
    Dizionario[13].parola="Prete";
    Dizionario[13].significato="Nel cattolicesimo, ministro del culto appartenente al clero secolare";
    Dizionario[13].sinonimi="sacerdote, padre, ministro del culto, celebrante, officiante";
    Dizionario[14].lettera='q';
    Dizionario[14].parola="Quadro";
    Dizionario[14].significato="Dipinto su tela o altro, di forma perlopiù quadrangolare";
    Dizionario[14].sinonimi="spazio quadrato, riquadro";
    Dizionario[15].lettera='r';
    Dizionario[15].parola="roccia";
    Dizionario[15].significato="Formazione costituita da uno o più minerali aggregati";
    Dizionario[15].sinonimi="pietra,sasso";
    Dizionario[16].lettera='s';
    Dizionario[16].parola="Sedia";
    Dizionario[16].significato="Sedile formato da un piano poggiante su quattro gambe e da una spalliera per poggiare la schiena";
    Dizionario[16].sinonimi="seggiola";
    Dizionario[17].lettera='t';
    Dizionario[17].parola="testa";
    Dizionario[17].significato="Parte del corpo, anteriore negli animali e superiore nell'uomo, che contiene il cervello";
    Dizionario[17].sinonimi="capo,cranio,capoccia,zucca,cocuzza";
    Dizionario[18].lettera='u';
    Dizionario[18].parola="uovo";
    Dizionario[18].significato="Gamete femminile dal quale, una volta giunto a maturazione e fecondato dal gamete maschile, si sviluppa, all'interno o all'esterno del corpo materno,l embrione di un nuovo individuo, che si nutre per tutto il periodo della gestazione, delle sostanze di riserva contenute nell' uovo stesso";
    Dizionario[18].sinonimi="ovulo";
    Dizionario[19].lettera='v';
    Dizionario[19].parola="Vuoto";
    Dizionario[19].significato="Che non contiene nulla; in cui non c'è nessuno";
    Dizionario[19].sinonimi="svuotato, sgombrato, evacuato";
    Dizionario[20].lettera='z';
    Dizionario[20].parola="zanzara";
    Dizionario[20].significato="Piccolo insetto dal corpo filiforme e dalle lunghe zampe, diffuso nei luoghi umidi in prossimità dell'acqua";
    Dizionario[20].sinonimi="Scocciatore, seccatore, disturbatore, rompiscatole";
}
 funzione per vedere se il match esiste
int esito_match(char chiave[],char *parola)
{ 
    int n=strlen(chiave),i;
    for(i=0;i<n-3;i++)
    {
       if( strncmp(parola+i,chiave+i,3))
          return 1;
       else
        return 0;
      }
}
il mio problema che non riesco a far stampare la parola che abbia 3 lettere uguali a chiave ,forse ci vuole un altra funzione cmq sto utilizzando 3 file uno main uno funzioni e uno header
nel main secondo me dovrei far un ciclo for per tutte le parole del dizionario ed entrare nel campo del dizionario ma manca qualcosa
 
Ultima modifica da un moderatore:

maxnaldo

Nuovo Utente
13
2
credo che tu abbia invertito il boolean di ritorno.

la strncmp, così come la strcmp o la memcmp, ti restituisce 0 se i due valori comparati sono uguali, e 0 come valore significa "false".

quindi o aggiungi alla if: "if( strncmp(parola+i,chiave+i,3)==0)"

oppure inverti i valori delle return.
 

maxnaldo

Nuovo Utente
13
2
bisognerebbe anche vedere i parametri che passi alla funzione,

comunque stai controllando passo passo i tre caratteri sia della stringa1 che della stringa2, il che significa che il match avviene solo se i 3 caratteri si trovano anche nella stessa posizione all'interno delle due stringhe.

ps. secondo me dovresti fare due cicli, uno dentro l'altro, quello esterno si sposta di un carattere alla volta nella stringa1, quello interno fa il match dell'attuale posizione della stringa1 spostandosi di un carattere per volta nella stringa2. In pratica cerchi tutte le triplette della 1 all'interno di tutte le posizioni della 2.

ah dimenticavo, stai anche interrompendo il ciclo al primo match

prova così, non è il massimo come implementazione ma dovrebbe funzionare:
C:
int esito_match(char chiave[],char *parola)
{
    int n1=strlen(chiave);
    int n2=strlen(parola);
    int i,j;
    for(i=0;i<n2-3;i++)
    {
        for(j=0;j<n1-3;j++)
        {
            if(strncmp(parola+i,chiave+j,3)==0)
                return 1;
        }
    }
    return 0;
}
 
Ultima modifica da un moderatore:

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 13 15.5%
  • Gearbox

    Voti: 1 1.2%
  • Xbox & Bethesda

    Voti: 59 70.2%
  • Square Enix

    Voti: 3 3.6%
  • Capcom

    Voti: 5 6.0%
  • Nintendo

    Voti: 13 15.5%
  • Altro (Specificare)

    Voti: 6 7.1%

Discussioni Simili