Calcolo dei caratteri numeri in una stringa

di il
14 risposte

Calcolo dei caratteri numeri in una stringa

Buongiorno a tutti, come dal titolo devo creare un programma che calcoli il numero di caratteri numeri in un testo.
Vi lascio il mio codice e vi spiego il problema
#include <iostream>
#include <cstring>
using namespace std;

void lettura(char stringa[100])
{
	cout << "Inserisci un testo qualsiasi: ";
	cin.getline(stringa,100);
	
}

void conteggio(char stringa[100])
{	
	int conteggio_numeri = 0;
	for (int i = 0; i < 100; i++)
	{
		if (isdigit(stringa[i]) == true)
			conteggio_numeri++;
	}
	cout << "Ci sono " << conteggio_numeri << " numeri.";
}

int main()
{
	char* stringa;
	lettura(stringa);
	conteggio(stringa);
l'espressione
if (isdigit(stringa[i]) == true)
non dovrebbe confrontare ogni singolo carattere e dare true nel caso trova un numero? Non capisco perché non funzioni

14 Risposte

  • Re: Calcolo dei caratteri numeri in una stringa

    Correzioni:

    -- nel main
    char stringa[100];
    e non
    char *stringa;
    -- nel ciclo di conteggio
    
    	for (int i = 0; i < strlen(stringa); i++)
    	{
    		if (isdigit(stringa[i]))
    			conteggio_numeri++;
    	}
    
    P.S. Devi parlare di CIFRE non NUMERI
  • Re: Calcolo dei caratteri numeri in una stringa

    oregon ha scritto:


    Correzioni:

    -- nel main
    char stringa[100];
    e non
    char *stringa;
    -- nel ciclo di conteggio
    
    	for (int i = 0; i < strlen(stringa); i++)
    	{
    		if (isdigit(stringa[i]))
    			conteggio_numeri++;
    	}
    
    P.S. Devi parlare di CIFRE non NUMERI
    Perfetto grazie mille, volevo solamente chiederti, nel ciclo
    
    	for (int i = 0; i < strlen(stringa); i++)
    	{
    		if (isdigit(stringa[i]))
    			conteggio_numeri++;
    	}
    
    non c'è bisogno di mettere "== true" perché l'if parte quando (isdigit(stringa)) trova una cifra, giusto?
  • Re: Calcolo dei caratteri numeri in una stringa

    Non solo non è necessario ma è anche sbagliato. La isdigit restituisce un int non un bool. Restituisce 0 se l'argomento non è una cifra oppure un valore diverso da 0 se è una cifra. Dato che 0 e diverso da 0 sono interpretati a runtime come falso e vero, la if lavora correttamente.

    Dovresti soffermarti sugli altri due errori (gravi) .... uso sbagliato di un puntatore e mancato uso della strlen ... che indicano carenze nell'apprendimento della gestione degli array di char.
  • Re: Calcolo dei caratteri numeri in una stringa

    Grazie mille! Sei sempre sul pezzo
  • Re: Calcolo dei caratteri numeri in una stringa

    Scusatemi se parlo, da ultimo arrivato e da "programmatore giocattolo"
    ma io avrei fatto così:
    
    int contacifre(char * stringa)
    {
    int conteggio=0;
    int indice=0;
    while (stringa[indice])
    	{
    	conteggio+=isdigit(stringa[indice++])
    	}
    return conteggio;
    }
    
    cioè usato una funzione, dentro la quale creare due variabili locali
    non avei calcolato tutte le volte nel corpo della for la lunghezza della stringa, e avrei sfruttato invece la particolarità che la stringa è terminata da \0
    peraltro la strlen() mi sa che fa così; però con una while evito di ricalcolare di continuo un valore conosciuto
    ecco la mia domanda:
    avrei sbagliato?
  • Re: Calcolo dei caratteri numeri in una stringa

    Hai fatto benissimo ad impostare così il ciclo (in realtà la strlen andava utilizzata prima della for una sola volta per ricavare la lunghezza in una variabile).

    La questione è che alcuni studenti devono arrivare per gradi alla scrittura di codice sempre migliore...

    Ma attenzione a cosa sommi nella variabile conteggio. Cosa restituisce isdigit? Che risultato ottieni?
  • Re: Calcolo dei caratteri numeri in una stringa

    Conteggio += (0 != isdigit(stringa[indice++]));

    (le parentesi "extra" solo per essere più espliciti a livello "umano")
  • Re: Calcolo dei caratteri numeri in una stringa

    @StandardOil, sei ziovine, per cui ti sfuggono certe sottigliezze.

    MAI e poi mai mettersi a risparmiare linee di codice PENSANDO che cosi' l'algoritmo sia piu' efficiente.
    MAI sfruttare 'trucchetti', come quello di sfruttare il fatto che in C falso==0, true==1 (che non e' sempre detto).

    I motivi sono molti:

    1) chi progetta i compilatori sa molto meglio di chiunque come sfruttare questi trucchetti. Ed e' in grado di applicare strategie di ottimizzazione MOOOOLTO piu' sofisticate, oltre al fatto di essere in grado di sfruttare meglio l'hardware sottostante
    2) riduci la comprensibilita' del codice, e rischi di introdurre errori difficilmente identificabili
    3) il miglioramento di performance di un algoritmo lo ottieni convertendo un algoritmo di complessita' n^2 in uno n*log(n), NON risparmiando qualche micro/nano secondo su un'unica linea di codice.

    Quindi, per questo, 10 per l'idea, ma 3 per l'implementazione, perche' compito FONDAMENTALE del programmatore NON E' scrivere codice compatto, ma CODICE MANTENIBILE.

    Quindi, ad esempio:
    a) mai usare i puntatori per scandire un array, ma usare sempre 'array[indice]'
    b) mai incrementare un contatore al di fuori del for o, come ha fatto @AldoBaldo, all'interno di un'espressione.
    c) mai sfruttare conversioni 'implicite' (boolean -> intero). In questo caso, ad esempio, usare l'operatore '?:'
    d) ecc

    Il codice e' piu' chiaro, e non si perde nulla perche' sara' il compilatore a fare le opportune ottimizzazioni.
  • Re: Calcolo dei caratteri numeri in una stringa

    AldoBaldo ha scritto:


    conteggio += (0 != isdigit(stringa[indice++]));
    Se proprio vuoi giocare con il C Aldo, puoi scrivere


    conteggio += !!isdigit(stringa[indice++]);
  • Re: Calcolo dei caratteri numeri in una stringa

    Migliorabile, mi son limitato a copiare quel che aveva già scritto StandardOil, adattandolo al commento propostoci da Oregon (quando ha evidenziato che isdigit() non restituisce un bool).
  • Re: Calcolo dei caratteri numeri in una stringa

    Oregon, cosa cambia?
  • Re: Calcolo dei caratteri numeri in una stringa

    StandardOil se il tuo scopo è ottimizzare non usare nemmeno isdigit: è una funzione di una riga, pure in GCC dopo i tremila passaggi del preprocessore. A che serve chiamarla, fai l'if direttamente..
  • Re: Calcolo dei caratteri numeri in una stringa

    AldoBaldo ha scritto:


    Oregon, cosa cambia?
    Il risultato non cambia ovviamente.
  • Re: Calcolo dei caratteri numeri in una stringa

    Grazie gente
    Molto gentili
Devi accedere o registrarti per scrivere nel forum
14 risposte