PDA

View Full Version : [C] Esercizio su stringhe III parte


xbubbax
25-07-2007, 10:22
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;}

xbubbax
25-07-2007, 10:30
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

xbubbax
25-07-2007, 11:26
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

xbubbax
25-07-2007, 11:29
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`

xbubbax
25-07-2007, 11:53
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