|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[C] Esercizio su stringhe III parte
questo dovrebbe essere il piu semplice infatti penso di essere riuscito a farlo da solo, vorrei che lo controllaste
si scriva una funziona int strch2(const char *s, int c) che restituisce il numero massimo di occorrenze consecutive del carattere c. esempio: arttoptttwe c=2 output=3 perchè il massimo numero di volte che la t si ripete è 3 esempio2: arttoptttwe c=p output=1 e cosi via ecco quello che sono riuscito a fare Codice HTML:
int strch2(const char *s, int c){
int max=0;
int i; /*contatore*/
int a[30]; /*vettore di 30 interi per immagazzinare il numero di occorrenze*/
int j=0; /*indice del vettore a*/
int k; /*indice per inizializzare a 0 tutti gli elementi del vettore a*/
int lungstringa; /*variabile per memorizzare la lunghezza della stringa*/
int cont=0; /*contatore*/
lungstringa=strlen(s); /*calcolo la lunghezza della stringa*/
for(k=0;k<30;k++){ /*azzero tutti gli elementi del vettore a*/
a[k]=0;}
for(i=0;i<lungstringa;i++){ /*scorro la stringa e se un elemento è uguale a c incremento il contatore*/
if(s[i]==c){/*altrimenti memorizzo il contatore attuale in un elemento del vettore a*/
cont += 1;
}
else a[j]=cont; j++;}
/*ora nel vettore a mi trovo memorizzate tutte le occorrenze in ogni elemento, quindi
scorro il vettore per trovare quella più grande*/
max=a[0];
for(i=1;i<30;i++){
if(a[i]>max){
max=a[i];}}
return max;}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ecco il programma completo
Codice HTML:
#include <stdio.h> #include <string.h> int strch2(const char *s, int c); int main(){ char stringa[40]; int c; printf("Inserisci una stringa:\n"); scanf("%s", stringa); printf("Inserisci un carattere:\n"); scanf("%c", &c); printf("%d", strch2(stringa, c));} int strch2(const char *s, int c){ int max=0; int i; /*contatore*/ int a[30]; /*vettore di 30 interi per immagazzinare il numero di occorrenze*/ int j=0; /*indice del vettore a*/ int k; /*indice per inizializzare a 0 tutti gli elementi del vettore a*/ int lungstringa; /*variabile per memorizzare la lunghezza della stringa*/ int cont=0; /*contatore*/ lungstringa=strlen(s); /*calcolo la lunghezza della stringa*/ for(k=0;k<30;k++){ /*azzero tutti gli elementi del vettore a*/ a[k]=0;} for(i=0;i<lungstringa;i++){ /*scorro la stringa e se un elemento è uguale a c incremento il contatore*/ if(s[i]==c){/*altrimenti memorizzo il contatore attuale in un elemento del vettore a*/ cont += 1; } else a[j]=cont; j++;} /*ora nel vettore a mi trovo memorizzate tutte le occorrenze in ogni elemento, quindi scorro il vettore per trovare quella più grande*/ max=a[0]; for(i=1;i<30;i++){ if(a[i]>max){ max=a[i];}} return max;} |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
mamma mia ti piace complicarti la vita ?
bastavano 3 righe Codice:
#include <stdio.h>
#include <string.h>
int strch2(const char *s, int c);
int main()
{
char stringa[40];
int c;
printf("Inserisci una stringa:\n");
fgets( stringa, 40, stdin );
printf("Inserisci un carattere:\n");
c = getchar();
printf("%d\n", strch2(stringa, c));
}
int strch2(const char *s, int c)
{
int Count = 0;
while( (s = strchr(s, c)) )
s++, Count++;
return Count;
}
E comunque la tua scanf era errata "%c" non va bene
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
mica hai controllato se la funzione mia era giusta piu o meno?
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
scusa, non avevo visto il "consecutive"
![]() adesso ricontrollo
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
poi non ho capito una cosetta.
perchè la funzione come argomento prende un intero c e io devo inserire il carattere? non dovebbe esserci char c nella funzione? |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
La funzione accetta un intero perche´ penso che sia una questione di allineamento dati. Un char e´ a 8 bit un int 16 o (ormai ovunque) 32. Ti consiglio vivamente fgets e getchar per input dati. La tua scanf non funziona con i singoli char. Codice:
for(k=0;k<30;k++)
{ /*azzero tutti gli elementi del vettore a*/
a[k]=0;
}[
te l´ho scritto com si azzera un vettorehai uno strano modo di indentare pero´ eh cerco un modo ottimale per fare la stessa funzione
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
un po piu´ semplice:
Codice:
int strch2(const char *s, int c)
{
int Count = 0, Max = 0;
while( *s++ )
{
if (*s == c) // trovato carattere
{
Count++;
if (Count > Max)
Max = Count; // aggiorna max a nuovo valore
}
else
Count = 0; // reset contatore
}
return Max;
}
per i char e int il C ragiona sempre a numeri quindi un char per lui e´ un intero. Per esempio la lettera ´A´ e´ 65, quindi anche se usi interi va bene. per esempio Codice:
printf("%i %c \n", 65, 65 )
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
non lo so perchè mi vengono cosi complicate, sarà perchè non sono bravo.
mi serve pratica... comq l'importante è che funziona, ora cambio le scanf, vabbè questo pure è fatto, se puoi dare un occhiata all'altro esercizio, II parte, quando hai tempo mi faresti un piacere sto cominciando a capirci qualcosa |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Per esempio avrei potuto fare quel while cosi´: Codice:
while( *s++ )
{
Count = (*s == c) ? Count+1 : 0;
if (Count > Max) Max = Count;
}
Ma dichiarare 7 variabili intere di cui una vettore di 30 elementi per fare quelloc he dovevi fare mi pare un po troppo Ho tempo in questi giorni ma di solito non tanto. Ci do un occhio
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:20.













te l´ho scritto com si azzera un vettore







