View Full Version : [C] - Problema String Matching
ciao a tutti, all'uni sto imparando C e sono ancora agli inizi.
Uno dei problemi da risolvere che ci ha dato il prof. è quello dello String Matching(cioè che conta il numero di occorenze di chiave(array di char) in testo(array di char))!
Solo che il prof. corre un po troppo è sto rimanendo indietro.
Ecco detto questo, il mio prob. è: Come ca*** si fa sto confronto tra due array??? :confused:
il programma che ho scritto è questo, ma mi sa che è tutto sbagliato:
#include <stdio.h>
#define sizearray 4
#define sizearray2 10
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(int a[], int b[], int n);
void main()
{
int i, numchiavi;
char chiave[sizearray], testo[sizearray2];
int n=sizearray;
int m=sizearray2;
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
printf("Inserisci una chiave di %d caratteri: ", sizearray);
for(i=0; i<sizearray; i++)
{ scanf("%s", chiave);}
printf("Inserisci un testo di %d caratteri: ", sizearray2);
for(i=0; i<sizearray2; i++)
{ scanf("%s", testo);}
for (i=0; i<sizearray; i++)
numchiavi=conta_chiave(chiave, n, testo, m);
printf("Nel testo la chiave compare %d volte\n", numchiavi);
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=1; i<n; i++)
if(uguale(chiave, &testo[i],n))
contachiave++;
return contachiave;
}
Vi prego aiutatemi...come si fa???
Grazie a tutti
Ho dimenticato la function per determinare se due array sono uguali:
int uguale(char a[], char b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
Ciao, ci sono diverse cose che non sono chiare nel tuo sorgente. Per cominciare sarebbe bene che mettessi le costanti definite con #define scritte in maiuscolo (è uno "standard").
Poi, se ho capito bene, tu devi trovare quante occorrenze di una stringa ci sono dentro un'altra stringa, giusto?
Tu definisci la lunghezza delle 2 stringhe (4 e 10 caratteri) ma attento che una stringa ha il carattere nullo alla fine! Quindi vuoi 4 e 10 caratteri più il nullo o compreso il nullo? E perchè hai fatto il ciclo for per fare la scanf della chiave? La scanf con %s prende già la stringa intera!
Ciao, ci sono diverse cose che non sono chiare nel tuo sorgente. Per cominciare sarebbe bene che mettessi le costanti definite con #define scritte in maiuscolo (è uno "standard").
Si, su questo sono d'accordo!
Poi, se ho capito bene, tu devi trovare quante occorrenze di una stringa ci sono dentro un'altra stringa, giusto?
Giustissimo!!!
Tu definisci la lunghezza delle 2 stringhe (4 e 10 caratteri) ma attento che una stringa ha il carattere nullo alla fine! Quindi vuoi 4 e 10 caratteri più il nullo o compreso il nullo?
Bhooo??, credo nullo compreso!
E perchè hai fatto il ciclo for per fare la scanf della chiave? La scanf con %s prende già la stringa intera!
Non lo sapevo, perchè il prof non ci ha spiegato un ca**o
Bhooo??, credo nullo compreso!
Ad ogni modo un buon sistema per dichiarare una stringa (come array di char) è:
#define LUNGHEZZA 10
char stringa[LUNGHEZZA+1];
Non lo sapevo, perchè il prof non ci ha spiegato un ca**o
Tipico ... dei professori intendo ;)
Proverò a fare come dici tu?? poi ti farò sapere. :muro:
Ma kmq per il resto come ti sembra?? ho sbagliato qualcosa??
A me non è molto chiaro questo passaggio:
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=1; i<n; i++)
if(uguale(chiave, &testo[i],n))
contachiave++;
return contachiave;
}
Cioè che significa??? Forse: Se uguale(chiave, &testo[i],n)=1(true)--> contachiave++??
Riscrivo il programme per intero, un po corretto(spero) :stordita:
#include <stdio.h>
#define SIZEARRAY 5
#define SIZEARRAY2 11
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(char [], char [], int);
void main()
{
int i, numchiavi;
char chiave[SIZEARRAY], testo[SIZEARRAY2];
int n=SIZEARRAY;
int m=SIZEARRAY2;
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
printf("Inserisci una chiave di %d caratteri: ", SIZEARRAY);
scanf("%s", chiave);
printf("Inserisci un testo di %d caratteri: ", SIZEARRAY2);
scanf("%s", testo);
for (i=0; i<SIZEARRAY; i++)
numchiavi=conta_chiave(chiave, n, testo, m);
printf("Nel testo la chiave compare %d volte\n", numchiavi);
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=1; i<n; i++)
if(uguale(chiave, &testo[i],n))
contachiave++;
return contachiave;
}
int uguale(char a[], char b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
Compilando il Debbug mi da i seguenti errori(Warning):
--------------------Configuration: contachiave - Win32 Debug--------------------
Compiling...
main.c
C:\Documents and Settings\Peppe\Desktop\Array1D\contachiave\main.c(30) : warning C4133: 'function' : incompatible types - from 'char *' to 'int *'
C:\Documents and Settings\Peppe\Desktop\Array1D\contachiave\main.c(30) : warning C4133: 'function' : incompatible types - from 'char *' to 'int *'
C:\Documents and Settings\Peppe\Desktop\Array1D\contachiave\main.c(38) : warning C4028: formal parameter 1 different from declaration
C:\Documents and Settings\Peppe\Desktop\Array1D\contachiave\main.c(38) : warning C4028: formal parameter 2 different from declaration
main.obj - 0 error(s), 4 warning(s)
----------------------------------------------------------------------------
Avviando il programma mi da sempre 0 chiavi trovate. :muro: :muro:
Riscrivo il programme per intero, un po corretto(spero) :stordita:
Ci sono ancora degli errori. Intanto adesso hai definito le costanti 5 e 11 (intendendo le lunghezze delle stringhe comprese di carattere nullo) ma poi richiedi 5 e 11 caratteri.
Hai tenuto ancora un "for (i=0; i<SIZEARRAY; i++)" che non capisco a cosa ti serve, visto che conta_chiave() la devi chiamare 1 volta sola.
Inoltre in conta_chiave() il for inizia con indice 1, questo vuol dire che non tiene in considerazione il primo carattere (indice 0) di testo.
Ah, il main dichiaralo in modo che ritorni un int e metti alla fine del main un "return 0;". Il main deve sempre ritornare qualcosa.
Ci sono ancora degli errori. Intanto adesso hai definito le costanti 5 e 11 (intendendo le lunghezze delle stringhe comprese di carattere nullo) ma poi richiedi 5 e 11 caratteri.
Aiutooo...e quindi come devo fare?? :muro:
Hai tenuto ancora un "for (i=0; i<SIZEARRAY; i++)" che non capisco a cosa ti serve, visto che conta_chiave() la devi chiamare 1 volta sola.
Inoltre in conta_chiave() il for inizia con indice 1, questo vuol dire che non tiene in considerazione il primo carattere (indice 0) di testo.
il conta_chiave() con indice 1 me l'ha detto il prof. kmq ho Modificato...vedi un pò:
#include <stdio.h>
#define SIZEARRAY 5
#define SIZEARRAY2 11
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(char [], char [], int);
void main()
{
int numchiavi;
char chiave[SIZEARRAY], testo[SIZEARRAY2];
int n=SIZEARRAY;
int m=SIZEARRAY2;
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
printf("Inserisci una chiave di %d caratteri: ", SIZEARRAY);
scanf("%s", chiave);
printf("Inserisci un testo di %d caratteri: ", SIZEARRAY2);
scanf("%s", testo);
numchiavi=conta_chiave(chiave, n, testo, m);
printf("Nel testo la chiave compare %d volte\n", numchiavi);
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=0; i<n; i++)
if(uguale(chiave, testo, n))
contachiave++;
return contachiave;
}
int uguale(char a[], char b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
P.S. Kmq ti ringrazio molto per l'aiuto che mi stai dando :ave: :)
Ora mi da 0 errori in compilazione e linking...avviando il programma ed inserendo una chiave ed un testo(con all'interno ripetuta la chiave una sola volta) mi da 5 occorrenze trovate! :doh:
Ti inserisco la function data dal prof. in P-Like(linguaggio con il quale spiega il prof. e che non fa capire un ca**o a nessuno :D ):
function conta_chiave(chiave,n,testo,m):integer
var n,m:integer
var a:array(1..n)of character
var testo:array(1..m)of character
var uguale:logical function
begin
conta_chiave := 0
for i=1,m-n+1 do
if uguale(chiave,testo(i..i+n-1),n)
then
conta_chiave := conta_chiave + 1
endif
endfor
end
Ti inserisco la function data dal prof. in P-Like(linguaggio con il quale spiega il prof. e che non fa capire un ca**o a nessuno :D ):
Ma allora 'sto professore vuole e si vuole fare proprio del male :D
Ci sono una serie di punti da tenere bene in considerazione.
1) Per quanto riguarda il carattere nullo, è sufficiente fare così:
#define SIZEARRAY 4
#define SIZEARRAY2 10
char chiave[SIZEARRAY+1], testo[SIZEARRAY2+1];
Tieni presente che nelle tue funzioni (conta_chiave e uguale) viene completamente ignorato il nullo finale. Questo perché le funzioni operano usando i valori esatti delle lunghezze (a conta_chiave() passi i valori "n" e "m" che sono le lunghezze degli array, esclusi i nulli). Le funzioni, in pratica, non sanno che quelle sono delle stringhe terminate dal nullo ma degli array di char di lunghezza fissa a "tot".
2) Nella funzione conta_chiave il ciclo deve essere così:
for (i=0; i<n; i++)
if(uguale(chiave, &testo[i], n))
Ma non è ancora proprio giusto. Il concetto dovrebbe essere quello di andare a cercare la chiave nelle varie posizioni del testo. Questo vuol dire che l'indice "i" deve andare da 0 a <x>. Quest'ultimo <x> deve essere tale per cui la funzione uguale() non vada "fuori" dall'array del testo. Pensa un po' allora cosa mettere dopo "i<".
3) La funzione uguale() secondo me si potrebbe riscrivere in modo molto più semplice. Fai un semplice ciclo for da 0 a n, il primo carattere diverso tra a e b che trovi ritorni uno 0, altrimenti alla fine ritorni 1.
Ahhhhhhhhhhhhhhhhrg :muro: :muro: :muro:
L'esercizio lo semplifico eliminando scanf:
#include <stdio.h>
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(char [], char [], int);
void main()
{
int numchiavi;
char chiave[]="peppe";
char testo[]="ciaopeppecomestai";
int n=6;//Qui devo aggiungere \0. no???
int m=18;//Ed anche qui. no???
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
numchiavi=conta_chiave(chiave, 5, testo, 17);
printf("Nel testo la chiave compare %d volte\n", numchiavi);
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=1; i<n; i++)//Quindi cosa va?? i<m-n+1???
if(uguale(chiave, &testo[i],n))
contachiave++;
return contachiave;
}
// La function uguale fatta cosi con while ce l'ha fatta fare il prof.quindi preferirei lasciarla cosi :(
int uguale(char a[], char b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
L'esercizio lo semplifico eliminando scanf:
Va bene, comunque con le scanf andava pure bene (a parte la questione del carattere nullo che ti ho spiegato).
char chiave[]="peppe";
char testo[]="ciaopeppecomestai";
int n=6;//Qui devo aggiungere \0. no???
int m=18;//Ed anche qui. no???
E no! "n" ed "m" devono essere le lunghezze senza contare il nullo, cioè quindi proprio solo il conteggio dei caratteri su cui operare.
Quindi cosa va?? i<m-n+1???
Esatto!!!!
// La function uguale fatta cosi con while ce l'ha fatta fare il prof.quindi preferirei lasciarla cosi :(
int uguale(char a[], char b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
Comunque non mi sembra giusta. Tu hai due array, a[] e b[] con "n" che vale la lunghezza della chiave. Tu devi comparare a[0] con b[0], a[1] con b[1], ecc... Se nel do-while la prima cosa che fai è incrementare "j", mi sembra che salti qualcosa, no?
Ok, credo di aver capito :) ...ora sistemo un po le cose...e poi ti dico...speriamo che ho capito sul serio :cry: ...vorrei finirla di scocciarti con sto programmino del caiser :p
sto andando nel pallone... :cry: :cry:
Non so fare + neanche le scemenze...
Come lo devo fareeeeeee sigh...gulp!!
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
a[j]!=b[j];
return 0;
}
Non va bene ma perchè???
ecco, forse cosi dovrebbe andare meglio:
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
if (a[j]!=b[j])
return 0;
} :fagiano: :fagiano:
Aiuto......non funziona!!!
è corretto, ma manca un pezzettino.
restituisci 0 (falso) se un carattere è diverso, ma devi restituire 1 se tutti i caratteri sono uguali, cioè se arrivi in fondo al for senza uscire.
ciao
è corretto, ma manca un pezzettino.
restituisci 0 (falso) se un carattere è diverso, ma devi restituire 1 se tutti i caratteri sono uguali, cioè se arrivi in fondo al for senza uscire.
ciao
Fatto, ma non funziona lo stesso!!! Vabbè, mi sa che mi meterò d'impegno domani
Fatto, ma non funziona lo stesso!!! Vabbè, mi sa che mi meterò d'impegno domani
Posta di nuovo il sorgente completo che vediamo.
Ecco, cosi dovrebbe essere giusto:
#include <stdio.h>
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(char [], char [], int);
void main()
{
int numchiavi;
char chiave[]="peppe";
char testo[]="peppepeppe";
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
numchiavi=conta_chiave(chiave, 5, testo, 10);
printf("Nel testo la chiave compare %d volte\n", numchiavi);
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=1; i<m-n+1; i++)
if(uguale(chiave, &testo[i],n))
contachiave++;
return contachiave;
}
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
if (a[j]!=b[j])
return 0;
else
return 1;
}
--------------------Configuration: contachiave - Win32 Debug--------------------
Compiling...
main.c
C:\Documents and Settings\Peppe\Desktop\Array1D\contachiave\main.c(36) : warning C4715: 'uguale' : not all control paths return a value
main.obj - 0 error(s), 1 warning(s)
------------------------------------------------------------
Solo che quando lo avvio mi dice di aver trovato 3 volte la chiave...ma perche?? :muro: :muro: :confused:
no, uguale non funziona.
ecco cosa fa il tuo programma con queste due stringhe:
ciao
cacciatore
entra nel for e controlla se la prima lettera è diversa dalla seconda.
essendo uguali non entra nel corpo dell'if ma finisce nel corpo dell'else e restituisce 1.
le stringhe però non sono uguali ;)
devi lasciare che finisca il for, dopo di che se è arrivato in fondo sai per certo che sono uguali (altrimenti avrebbe restituito 0 prima).
a quel punto quindi puoi restituire 1, ma in fondo al for, non nel corpo dell'else.
ciao!
il resto ad occhio dovrebbe andare, ma non vorrei sbagliarmi.
comunque un consiglio:
non so che prevedesse il testo dell'esercizio, ma nel momento in cui cambi stringa devi anche cambiare la lunghezza dela stringa a mano.
c'è una funzione in string.h (strlen(char *)) che restituisce la lunghezza della stringa che gli passi come parametro, ma supongo che tu (giustamente) non voglia usare funzioni di libreria.
in questo caso puoi sempre provare a reimplementarla, intanto non è difficile.
ti eviti di passare due parametri (che non è una casttiva cosa), ma sopratutto a quel punto puoi prendere le stringhe in input e usarle senza mai ricompilare.
se una volta finito questo esercizio hai voglia di fare qualcosaltro (e sopratutto se sai accedere ai file) potresti cercare le occorrenze della stringa presa da standard input in un file dato.
le varianti poi sono molte. puoi scegliere di stampare il numero di occorrenze, le linee in cui le hai trovate, il "numero" della parola in cui hai trovato la stringa ecc.
te lo propongo perchè da noi è un esercizio che va molto in voga per il corso di programmazione.
ciao!
no, uguale non funziona.
ecco cosa fa il tuo programma con queste due stringhe:
ciao
cacciatore
entra nel for e controlla se la prima lettera è diversa dalla seconda.
essendo uguali non entra nel corpo dell'if ma finisce nel corpo dell'else e restituisce 1.
le stringhe però non sono uguali ;)
devi lasciare che finisca il for, dopo di che se è arrivato in fondo sai per certo che sono uguali (altrimenti avrebbe restituito 0 prima).
a quel punto quindi puoi restituire 1, ma in fondo al for, non nel corpo dell'else.
ciao!
E quindi?? cosa devo fare??? :help: :) ma la funzione uguale che ci ha fatto fare il prof cosi non va proprio bene???
int uguale(int a[], int b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
il resto ad occhio dovrebbe andare, ma non vorrei sbagliarmi.
comunque un consiglio:
non so che prevedesse il testo dell'esercizio, ma nel momento in cui cambi stringa devi anche cambiare la lunghezza dela stringa a mano.
c'è una funzione in string.h (strlen(char *)) che restituisce la lunghezza della stringa che gli passi come parametro, ma supongo che tu (giustamente) non voglia usare funzioni di libreria.
in questo caso puoi sempre provare a reimplementarla, intanto non è difficile.
ti eviti di passare due parametri (che non è una casttiva cosa), ma sopratutto a quel punto puoi prendere le stringhe in input e usarle senza mai ricompilare.
se una volta finito questo esercizio hai voglia di fare qualcosaltro (e sopratutto se sai accedere ai file) potresti cercare le occorrenze della stringa presa da standard input in un file dato.
le varianti poi sono molte. puoi scegliere di stampare il numero di occorrenze, le linee in cui le hai trovate, il "numero" della parola in cui hai trovato la stringa ecc.
te lo propongo perchè da noi è un esercizio che va molto in voga per il corso di programmazione.
ciao!
Mi piacerebbe tantissimo...ma il prof. va pianissimo...le stringhe ancora non le ha spiegate...siamo da + di una settimana su array 1D :muro: :)
E quindi?? cosa devo fare??? :help: :) ma la funzione uguale che ci ha fatto fare il prof cosi non va proprio bene???
int uguale(int a[], int b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
Ciao, rieccomi qua.
La funzione uguale() come l'hai scritta tu sopra è a "palla". Guarda cosa ho segnato in rosso.
leadergl
19-11-2005, 09:55
uhm...parto dall'ultimo codice completo che avete scritto...
ci sono alcuni errori di sintatti ed altri di funzionalità...nel senso che anche se eliminiamo quegli errori di sintatti ed il programma gira correttamente il risultato non sarà per niente quello voluto.
Stiamo programmando in C e quindi è buona norma definire la funziona main() come restituente un INT e quindi:
int main() { ... }
poi:
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=1; i<m-n+1; i++)
if(uguale(chiave, &testo[i],n))
contachiave++;
return contachiave;
}
da quello che avete scritto TESTO è di M=10 mentre CHIAVE è di N=5, giusto?!
questo FOR che senso ha?!
for (i=1; i<m-n+1; i++) ... ?!
partiamo dal fatto che il C nel gestire gli array parte da 0 e si ferma ad LUNGHEZZA-1 poichè l'ultimo carattere è un terminatore;
quindi far partire il ciclo FOR da 1 è un errore poichè perdiamo il primo carattere...quindi:
non analizzeremo "peppe" con "peppepeppe" ma "eppe" con "eppepeppe" e che quindi è sbagliato...anche se nel nostro caso restituisce sempre 2 come risultato...
Credo inoltre sia più corretto così:
for (i=1; i<m-n; i++) ... ?!
inoltre qui c'è un errore:
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
if (a[j]!=b[j])
return 0;
else
return 1;
}
poichè la procedura termina nel momento stesso in cui fa la prima iterazione....in C quando si arriva al RETURN X la funzione viene cessata e si ha un valore di ritorno.
Quindi in questo caso avremo la prima iterazione con J=0 che come risultato può darci sia VERO che FALSO al confronto di A[j] con B[j] e poi senza neanche controllare gli altri usciremo...mentre noi dobbiamo uscire prima del termine del FOR solo e solamente se A[j]!=B[j] e nell'altro caso il for deve continuare e se arriva alla fine vuol dire che le sottostringhe sono uguali e quindi deve ritornare TRUE=1, quindi diventa:
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
{
if (a[j]!=b[j]) return 0;
}
return 1;
}
in ogni caso c'è sempre un errore perchè dentro la funzione UGUALE noi facciamo partire J=0 mentre dall'esterno richiamiamo la funzione con TESTO[1] per poi incrementare quell'1...
quindi avremo, dentro la funzione uguale che:
A="peppe" mentre B="eppepeppe" e questo è un altro errore...che si risolverebbe mettendo 0 fuori ma poi bisogna controllare che la terminazione sia giusta...
Si, pero perchè in quest'altro programmino funziona perfettamente?? :confused:
#include <stdio.h>
int uguale(int [], int [], int);
void main()
{
int i, n, arrayuguali;
int a[]={2,15,1,-1,22,0,-2};
int b[]={2,15,1,-1,22,0,-2};
n=7;
printf(" PROGRAMMA CHE DETERMINA SE DUE ARRAY SONO UGUALI\n\n\n");
printf(" Gli array sono:\n\n");
for (i=0; i<7; i++)
arrayuguali=uguale(a, b, n);
if (arrayuguali==1)
printf("Gli array sono uguali!\n");
else
printf("gli array non sono uguali\n");
}
int uguale(int a[], int b[], int n)
{
int j;
j=0;
do
j++;
while (!(a[j]!=b[j] || j==n));
if(a[j]=b[j] && j==n)
return 1;
else
return 0;
}
Stiamo programmando in C e quindi è buona norma definire la funziona main() come restituente un INT e quindi:
int main() { ... }
poi:
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=1; i<m-n+1; i++)
if(uguale(chiave, &testo[i],n))
contachiave++;
return contachiave;
}
da quello che avete scritto TESTO è di M=10 mentre CHIAVE è di N=5, giusto?!
questo FOR che senso ha?!
Che ne so io, il main il prof. ce l'ha fatto scrivere sempre cosi il main, come void che non riceve dati. Invece il ciclo for ce l'ha detto lui di metterlo(infatti c'è anche nel esempio in P-like)
partiamo dal fatto che il C nel gestire gli array parte da 0 e si ferma ad LUNGHEZZA-1 poichè l'ultimo carattere è un terminatore;
quindi far partire il ciclo FOR da 1 è un errore poichè perdiamo il primo carattere...quindi:
non analizzeremo "peppe" con "peppepeppe" ma "eppe" con "eppepeppe" e che quindi è sbagliato...anche se nel nostro caso restituisce sempre 2 come risultato...
[...]
in ogni caso c'è sempre un errore perchè dentro la funzione UGUALE noi facciamo partire J=0 mentre dall'esterno richiamiamo la funzione con TESTO[1] per poi incrementare quell'1...
quindi avremo, dentro la funzione uguale che:
A="peppe" mentre B="eppepeppe" e questo è un altro errore...che si risolverebbe mettendo 0 fuori ma poi bisogna controllare che la terminazione sia giusta...
Quindi??? Basta che pongo for (i=0; i<m-n+1; i++)
Che palle sto programma!!! :D :cry:
Che palle sto programma!!! :D :cry:
No ... che palle 'sto professore! :D
No ... che palle 'sto professore! :D
Concordooooo Vivamente...e poi...ma siamo agli array...che ca**o usa a fare ancora stò P-Like che non fa capire niente??!!! :mad: :D :incazzed:
leadergl
19-11-2005, 10:15
beh nn so il tuo prof quanto ci abbia ragionato sopra...cmq può essere che si è confuso :p
so solo dirti che le correzioni che ti ho detto sono giuste...e che con questo codice il programma funziona perfettamente:
#include <stdio.h>
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(char [], char [], int);
int main()
{
int numchiavi;
char chiave[]="Gianni";
char testo[]="GianniMariaTeresaGianni";
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
numchiavi=conta_chiave(chiave, 6, testo, 23);
printf("Nel testo la chiave compare %d volte\n", numchiavi);
system("PAUSE");
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=0; i<=m-n; i++)
{
if(uguale(chiave, &testo[i],n)) contachiave++;
}
return contachiave;
}
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
if (a[j]!=b[j]) return 0;
return 1;
}
ah...da notare che:
char chiave[]="Gianni";
char testo[]="GianniMariaTeresaGianni";
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
numchiavi=conta_chiave(chiave, 6, testo, 23);
le dimensioni reali dell'array sono di 6 e di 23 ma partono da 0 quindi in realtà sono 7 e 24 elementi (da 0 a 6=7, e da 0 a 23=24)
cmq tu fai una prova :D metti in quel ciclo for:
for (i=0; i<=m-n; i++)
{
if(uguale(chiave, &testo[i],n)) contachiave++;
}
che deve partire da 1...e vedi che succede...poi vai dal prof e gli tiri la cattedra in testa :D
if (che_palle == 1)
{
while (professore_valido() == 0)
cambia_professore();
}
Non hai un sorgente di questo tipo?
:D :D Scusa ... tanto per ridere un po' ... sui professori
if (che_palle == 1)
{
while (professore_valido() == 0)
cambia_professore();
}
Non hai un sorgente di questo tipo?
:D :D Scusa ... tanto per ridere un po' ... sui professori
Bella questa...quasi quasi glie la manderei via è mail al prof. :D :D :D
leadergl
19-11-2005, 10:24
hai provato il codice che ti ho scritto?...ti funziona? ;)
Il Programma funziona bene anche cosi:
#include <stdio.h>
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(char [], char [], int);
void main() //Lasciandolo void
{
int numchiavi;
char chiave[]="peppe";
char testo[]="pepperpeppepeppe";
printf(" PROGRAMMA CHE CHE CONTA CHIAVE\n\n\n");
numchiavi=conta_chiave(chiave, 5, testo, 16);
printf("Nel testo la chiave compare %d volte\n", numchiavi);
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=0; i<m-n+1; i++){ //Lasciando i<m-n+1
if(uguale(chiave, &testo[i], n))
contachiave++;}
return contachiave;
}
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
if (a[j]!=b[j])
return 0;
return 1;
}
Ho modificato qualche graffa e finalmente sembra funzionare.
Grazie a tutti e scusate se vi ho rotto le palle con questo esercizietto...ma vi prometto che lunedì in laboratorio prendo un Bazooka e sparo il prof. :D :D
hai provato il codice che ti ho scritto?...ti funziona? ;)
system("PAUSE"); che istruzione è??? attende che sia restituito un valore al main??? Per curiosità :)
Ah, ho modificato anche quello che prende i dati da tastiera e funziona!!!
Ragazzi, siete mitici...talmente mitici...che presto vi rompeò le palle con qualche altro esercizietto del mio bravisssssimo professore hehehe :D :asd:
leadergl
19-11-2005, 10:43
Il Programma funziona bene anche cosi:
#include <stdio.h>
int conta_chiave(char chiave[], int n, char testo[], int m);
int uguale(char [], char [], int);
void main() //Lasciandolo void
{
}
int conta_chiave(char chiave[], int n, char testo[], int m)
{
int i, contachiave;
contachiave=0;
for (i=0; i<m-n+1; i++){ //Lasciando i<m-n+1
if(uguale(chiave, &testo[i], n))
contachiave++;}
return contachiave;
}
Ho modificato qualche graffa e finalmente sembra funzionare.
Grazie a tutti e scusate se vi ho rotto le palle con questo esercizietto...ma vi prometto che lunedì in laboratorio prendo un Bazooka e sparo il prof. :D :D
per il "Void main()" si funziona ma in ANSI C non è corretto
per in "i<m-n+1" ovvio che funziona (...edit...non avevo notato che hai tolto =) si funziona perchè "i<m-n+1" è uguale ad "i<=m-n" ;)
la funzione System("PAUSE") è una funzione di sistema che quindi non fa parte normalmente del C, o meglio la funzione SYSTEM è del C e serve a richiamare un comando esterno (del sistema operativo su cui stai, infatti su linux potrebbe non funzionare con il "PAUSE") ed in questo caso richiama il comando che fa attendere la pressione di un tasto per continuare ;)
OK GRAZIE DI CUORE...ora mi è tutto chiaro!!!
A presto e grazie ancora a tutti.
ciao :cincin: :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.