View Full Version : [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
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;}
ecco il programma completo
#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;}
trallallero
25-07-2007, 11:23
mamma mia ti piace complicarti la vita ? :D
bastavano 3 righe ;)
#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;
}
EDIT: dimenticavo ... io non sono esperto sulla scanf che anzi aborro. Se vuoi usala, io t´ho messo fgets giusto per controllare che funzioni.
E comunque la tua scanf era errata "%c" non va bene
mica hai controllato se la funzione mia era giusta piu o meno?
trallallero
25-07-2007, 11:26
scusa, non avevo visto il "consecutive" :doh:
adesso ricontrollo :D
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?
trallallero
25-07-2007, 11:41
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?
allora, la funzione funziona :D ma di certo si potrebbe ottimizzare un pochino. Ti sei complicato un po la vita.
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.
for(k=0;k<30;k++)
{ /*azzero tutti gli elementi del vettore a*/
a[k]=0;
}[
:nonsifa: te l´ho scritto com si azzera un vettore
hai uno strano modo di indentare pero´ eh ;)
cerco un modo ottimale per fare la stessa funzione
trallallero
25-07-2007, 11:51
un po piu´ semplice:
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;
}
dimenticavo (davo per scontato lo sapessi)
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
printf("%i %c \n", 65, 65 ) da 2 output diversi, 65 e ´A`
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:D
trallallero
25-07-2007, 12:08
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:D
con l´esperienza impari a ridurre il codice all´indispensabile per vari motivi, tra cui la leggibilita´. Certo che se riduci il codice al minimo per il gusto di farlo facendo diventare illeggibile allora e´ peggio.
Per esempio avrei potuto fare quel while cosi´:
while( *s++ )
{
Count = (*s == c) ? Count+1 : 0;
if (Count > Max) Max = Count;
}
ma a che pro ? per ridurre di 2 linee ? prima era leggibile e immediato adesso ci devo perdere un po di tempo per capire quel Count = ...
Ma dichiarare 7 variabili intere di cui una vettore di 30 elementi per fare quelloc he dovevi fare mi pare un po troppo :D
Ho tempo in questi giorni ma di solito non tanto. Ci do un occhio
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.