Altro programmino in C

di il
2 risposte

Altro programmino in C

Implementare la funzione int conta(char* str) che stampa a video la frequenza di ogni carattere alfabetico
contenuto nella stringa e restituisce la lunghezza della stringa stessa str.
Per esempio, nel caso str = ``Amaca'' la funzione dovrebbe ritornare il valore 5 e stampare a video ``3A1M1C''.
Note
La funzione deve essere case-insensitive, ovvero non deve fare distinzione tra caratteri maiuscoli e minuscoli.
Non e' possibile utilizzare la funzione int strlen(char* s);
E' possibile utilizzare le funzioni char toupper(char x) e int isalpha(char x) (ctype.h);
Non implementare funzioni non necessarie o non esplicitamente richieste.
Esempi:
conta("1") non stampa nulla e ritorna ) 1
conta("a") stampa "1A" e ritorna ) 1
conta("1a") stampa "1A" e ritorna ) 2
conta("AMA") stampa "2A1M" e ritorna ) 3
conta("Mamma") stampa "3M2A" e ritorna ) 5
Implementare una funzione main che legga la stringa str (scanf). La funzione stampa a video la stringa letta,
quindi stampa il risultato di conta(str).
io ho provato a ragionarci su.. ne è uscito un programma che funziona, benché il suo funzionamento sia da suicidio (non so cosa mi sono fumato).. volevo sapere se avevate consigli o trucchi per "snellire" la corposità del codice..
#include<stdio.h>
#include<ctype.h>
#define MAX 300

int len(char *s)
{
    int i=0;
    while (s[i]!='\0')
        i++;

    return i;
}

main()
{
    char str[MAX];

    printf("inserisci stringa:\n");
    scanf("%s", str);

    printf("la funzione ritorna %d\n", conta(str));
    return 0;
}

void speciali(char *s)
{
int i=0, j=0;

for(i=0;i<len(s);i++)
	{
	if (isalpha(s[i])==0) //non è una lettera
		{
		for(j=i;j<len(s)-1;j++)
			{
			s[j]=s[j+1];
			}
		s[j]='\0';
		i=0;
		}
	}
}

int conta(char* str)
{
    int j,k,cont;
    cont=1;

    int i=0;
    while (str[i]!='\0')
        i++;

    for (j=0;j<len(str);j++)
        {
            if (isalpha(str[j])) //eseguo solo se è una lettera!!!!
                {
                    cont=1;

                    for (k=j+1;k<len(str);k++)
                        {
                           if (str[j] == str[k])
                            {
                                cont++;
                                str[k]='0';
                            }
                        }
                    printf("\n%d%c\n", cont, str[j]);
                }
        }
return i;
}
la funzione void speciali è lì perché pensavo di usarla ma alla fine non è servita.. ignoratela!!

grazie a tutti e buona giornata!!!

2 Risposte

  • Re: Altro programmino in C

    Secondo me scrivere una funzione len(char* a) è barare, se non puoi usare la strlen non puoi farne una copia. E poi il testo ti dice pure di non scrivere funzioni non richieste. Non credo che il prof te la accetti.

    Prova a fare buttare giù qualcosa che ne fa a meno.

    Comunque giusto per dati uno spunto, potresti fare un ciclo (uno solo) sulla stringa fermandoti alla fine, senza usare la sua lunghezza ma testando se sei arrivato allo zero (come fai nella len(char*) ). All' interno di questo ciclo conti i vari caratteri. Ti tieni un array di 255 elementi (uno per carattere), lo azzeri all' inizio e poi ad ogni carattere incontrato incrementi l' elemento corrispondente, usando come indice il codice del carattere. Poi c' è la questione del maiuscolo da tenere presente. Comunque inizia a ragionarci.
  • Re: Altro programmino in C

    Nella funzione salti una conversione in maiuscolo. Altra particolarità: la stringa viene distrutta con str[k]='0';
    Io utilizzerei un'array di strutture...
Devi accedere o registrarti per scrivere nel forum
2 risposte