|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
[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??? il programma che ho scritto è questo, ma mi sa che è tutto sbagliato: Codice:
#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;
}
Grazie a tutti Ultima modifica di pivaino : 18-11-2005 alle 12:23. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Ho dimenticato la function per determinare se due array sono uguali:
Codice:
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;
}
Ultima modifica di pivaino : 18-11-2005 alle 12:23. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#4 | ||||
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Quote:
Quote:
Quote:
Quote:
|
||||
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#define LUNGHEZZA 10 char stringa[LUNGHEZZA+1]; Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Proverò a fare come dici tu?? poi ti farò sapere.
Ma kmq per il resto come ti sembra?? ho sbagliato qualcosa?? A me non è molto chiaro questo passaggio: Codice:
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;
}
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Riscrivo il programme per intero, un po corretto(spero)
Codice:
#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;
}
--------------------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. Ultima modifica di pivaino : 18-11-2005 alle 14:08. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 18-11-2005 alle 15:20. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#10 | ||
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Quote:
Quote:
Codice:
#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;
}
|
||
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
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!
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
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
Codice:
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 |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ci sono una serie di punti da tenere bene in considerazione. 1) Per quanto riguarda il carattere nullo, è sufficiente fare così: Codice:
#define SIZEARRAY 4 #define SIZEARRAY2 10 char chiave[SIZEARRAY+1], testo[SIZEARRAY2+1]; 2) Nella funzione conta_chiave il ciclo deve essere così: Codice:
for (i=0; i<n; i++)
if(uguale(chiave, &testo[i], n))
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Ahhhhhhhhhhhhhhhhrg
L'esercizio lo semplifico eliminando scanf: Codice:
#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;
}
|
|
|
|
|
|
#15 | ||||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
Quote:
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||||
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Ok, credo di aver capito
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
sto andando nel pallone...
Non so fare + neanche le scemenze... Come lo devo fareeeeeee sigh...gulp!! Codice:
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
a[j]!=b[j];
return 0;
}
|
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
ecco, forse cosi dovrebbe andare meglio:
Codice:
int uguale(char a[], char b[], int n)
{
int j;
for(j=0; j<n; j++)
if (a[j]!=b[j])
return 0;
}
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 51
|
Aiuto......non funziona!!!
Ultima modifica di pivaino : 18-11-2005 alle 18:37. |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
è 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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:08.



















