Utilizzo Funzione Isdigit

di il
20 risposte

Utilizzo Funzione Isdigit

Buona sera, ho realizzato questo esercizio, che separa i numeri dalle stringhe ,mediante la funzione is digit, descrivendo la composizione delle due sottostringhe ,chiedo un parere cortesemente. Sono un Cinquantenne autodidatta,abbiate pazienza se risulto un pò tedioso

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stddef.h>
#define Dimensione 50
//Programma che suddivide una strinaga mista lettere e numeri e li separa
//Indicando la composizione delle due stringhe: lunghezza 
int
main (void) 
{
  
    //Uso della funzione Isdigit che rstituisce un valore diverso da zero !=0 se digito una cifra
  int LunghezzaStringa = 0, LunghezzaNumero = 0, Vocali = 0, Consonanti =
    0, LungNumeroStringa = 0;
  
char Stringa[Dimensione];
  
char Numero[Dimensione], NumeroStringa[Dimensione];
  
printf ("%s", "Inserire una stringa");
  
scanf (" %s", Stringa);
  
LunghezzaStringa = strlen (Stringa);
  
printf ("%s %d \n", "La lunghezza e': ", LunghezzaStringa);
  
 
    //verifico se ho inserito un numero
    for (size_t i = 0; Stringa[i] != '\0'; i++)
    
    {
      
if (isdigit (Stringa[i]) != 0)
	
	{
	  
 
Vocali++;		//Incremento il numero di vocali inserito
	  Numero[LunghezzaNumero++] = Stringa[i];	//Inserisco Nella variabile Numero La stringa iesima partendo da 0 e poi incremento
	  Numero[LunghezzaNumero] = '\0';	//Inserisco il carattere terminatore nella nuova posizione
	
}
      
      else
	
	{
	  
 
Consonanti++;	//Incremento il numero di consonati
	  NumeroStringa[LungNumeroStringa++] = Stringa[i];	//Inserisco Nella variabile Numero La stringa iesima partendo da 0 e poi incremento
	  NumeroStringa[LungNumeroStringa] = '\0';	//Inserisco il carattere terminatore nella nuova posizione
	}
    
}				//Exit for
  
//Verifico se ho inserito con un messaggio se ho inserito una o piC9 vocali
    if (Vocali == 1)
    printf ("%s \n", "Hai inserito una Cifra");
  
  else if (Vocali > 1)
    printf ("%s %d %s \n", "Hai inserito:", Vocali, "Cifre");
  
//****************************************************************************
    
 
//Verifico se ho inserito con un messaggio se ho inserito una o piC9 Consonati
    if (Consonanti == 1)
    printf ("%s \n ", "Hai inserito una Lettera");
  
  else if (Consonanti > 1)
    printf ("%s %d %s \n", "Hai inserito:", Consonanti, "Lettere");
  
//******************************************************************************
    
// Verifico come C( composto il numero nello specifico
    if (LunghezzaNumero == 1)
    printf ("%s %s %s %d %s \n", "Il Numero Inserito", Numero, "Ha",
	    LunghezzaNumero, "Cifra");
  
  else if (LunghezzaNumero > 1)
    printf ("%s %s %s %d %s \n", "Il Numero Inserito", Numero, "Ha",
	    LunghezzaNumero, "Cifre");
  
  else if (LunghezzaNumero == 0)
    printf ("%s \n", "Non Hai inserito Alcun numero");
  
 
    //Verifico come C( composta la stringa nello specifico
    if (LungNumeroStringa == 1)
    printf ("%s %s %s %d %s \n", "La stringa Inserita", NumeroStringa, "Ha",
	    LungNumeroStringa, "Lettera");
  
  else if (LungNumeroStringa > 1)
    printf ("%s %s %s %d %s \n", "La stringa Inserita", NumeroStringa, "Ha",
	    LungNumeroStringa, "Lettere");
  
  else
    printf ("%s", "Non Hai inserito Alcuna Lettera");

}


20 Risposte

  • Re: Utilizzo Funzione Isdigit

    Purtroppo il codice è contorto e non si capisce dove tu voglia arrivare. Calcoli vocali e consonanti ma usi la isdigit che trova le cifre… 

    Non importa essere cinquantenne (sei più giovane di me) ma bisogna avere un minimo di idee chiare. 

  • Re: Utilizzo Funzione Isdigit

    25/10/2023 - oregon ha scritto:


    Purtroppo il codice è contorto e non si capisce dove tu voglia arrivare. Calcoli vocali e consonanti ma usi la isdigit che trova le cifre… 

    Non importa essere cinquantenne (sei più giovane di me) ma bisogna avere un minimo di idee chiare. 

    Perché dici che è contorto, cosa non va? Il mio intento era separare numeri dalle lettere, e contare quanto è la loro lunghezza, facendo apparire un messaggio, se ne inserisco, più di una o nessuna, adoperando la funzione isdigit 

  • Re: Utilizzo Funzione Isdigit

    Ripeto, cosa c'entra un contatore di vocali e uno di consonanti?

    A cosa servono tutte quelle if? Sicuramente ne bastano meno.

    A prescindere dal codice, mostra un esempio di input e di output che vorresti realizzare.

  • Re: Utilizzo Funzione Isdigit

    25/10/2023 - oregon ha scritto:


    Ripeto, cosa c'entra un contatore di vocali e uno di consonanti?

    A cosa servono tutte quelle if? Sicuramente ne bastano meno.

    A prescindere dal codice, mostra un esempio di input e di output che vorresti realizzare.

    È solo un esercizio 

  • Re: Utilizzo Funzione Isdigit

    Anche un esercizio ha uno scopo, con un input e un output. Se, ad esempio, inserico la stringa

    V3rc1ng3torig3

    cosa vorresti visualizzare in output?

  • Re: Utilizzo Funzione Isdigit

    Ciao,

    mi provi questa se funziona ? 
    con l'uso di:
    -tolower
    -isalpha
    -isdigit

    	int lunghezza = 0;
        int numero_vocali = 0;
        int numero_consonanti = 0;
        int numero_numeri = 0;
        char* numeri_concatenati = malloc(sizeof(char) * strlen(stringa) + 1);
        char* consonanti_concatenate = malloc(sizeof(char) * strlen(stringa) + 1);
        for (int i = 0; stringa[i] != '\0'; i++) {
            lunghezza++;
            if (tolower(stringa[i]) == 'a' || tolower(stringa[i]) == 'e' || tolower(stringa[i]) == 'i' || tolower(stringa[i]) == 'o' || tolower(stringa[i]) == 'u') {
                numero_vocali++;
            }
            if (isalpha(stringa[i]) && tolower(stringa[i]) != 'a' && tolower(stringa[i]) != 'e' && tolower(stringa[i]) != 'i' && tolower(stringa[i]) != 'o' && tolower(stringa[i]) != 'u') {
                numero_consonanti++;
                consonanti_concatenate[numero_consonanti - 1] = stringa[i];
            }
            if (isdigit(stringa[i])) {
                numeri_concatenati[numero_numeri] = stringa[i];
                numero_numeri++;
            }
        }
        numeri_concatenati[numero_numeri] = '\0';
        consonanti_concatenate[numero_consonanti] = '\0';
        printf("La lunghezza è: %d", lunghezza);
        printf("Hai inserito: %d vocali", numero_vocali);
        printf("Hai inserito: %d consonanti", numero_consonanti);
        printf("Hai inserito: %d numeri", numero_numeri);
        printf("Numeri: %s", numeri_concatenati);
        printf("Consonanti: %s", consonanti_concatenate);
        free(numeri_concatenati);
        free(consonanti_concatenate);
        return 0;
  • Re: Utilizzo Funzione Isdigit

    25/10/2023 - oregon ha scritto:


    Anche un esercizio ha uno scopo, con un input e un output. Se, ad esempio, inserico la stringa

    V3rc1ng3torig3

    cosa vorresti visualizzare in output?

    La lunghezza totale della  stringa, e delle relative sottostringhe, dei numeri e.dei caratteri, verificando se ho inserito 0 caratteri /lettera, 1caratterie/lettera,più di un carattere

     /lettera

  • Re: Utilizzo Funzione Isdigit

    Scusa Franco ma come può usare la malloc/free se ha difficoltà di base?

    Antonio, comincia ad eliminare i contatori di vocali e consonanti che non servono e sono gestite anche in maniera sbagliata.

  • Re: Utilizzo Funzione Isdigit

    25/10/2023 - oregon ha scritto:


    Scusa Franco ma come può usare la malloc/free se ha difficoltà di base?

    Antonio, comincia ad eliminare i contatori di vocali e consonanti che non servono e sono gestite anche in maniera sbagliata.

    Cosa dovrei fare dunque? 

  • Re: Utilizzo Funzione Isdigit

    Antonio… stai contando cifre e lettere, a cosa servono contatori di vocali e consonanti??

  • Re: Utilizzo Funzione Isdigit

    25/10/2023 - oregon ha scritto:


    Antonio… stai contando cifre e lettere, a cosa servono contatori di vocali e consonanti??

    Ho capito cosa intendi domani correggo i contatori, 

  • Re: Utilizzo Funzione Isdigit

    25/10/2023 - By65Franco ha scritto:


    Ciao,

    mi provi questa se funziona ? 
    con l'uso di:
    -tolower
    -isalpha
    -isdigit

    	int lunghezza = 0;
        int numero_vocali = 0;
        int numero_consonanti = 0;
        int numero_numeri = 0;
        char* numeri_concatenati = malloc(sizeof(char) * strlen(stringa) + 1);
        char* consonanti_concatenate = malloc(sizeof(char) * strlen(stringa) + 1);
        for (int i = 0; stringa[i] != '\0'; i++) {
            lunghezza++;
            if (tolower(stringa[i]) == 'a' || tolower(stringa[i]) == 'e' || tolower(stringa[i]) == 'i' || tolower(stringa[i]) == 'o' || tolower(stringa[i]) == 'u') {
                numero_vocali++;
            }
            if (isalpha(stringa[i]) && tolower(stringa[i]) != 'a' && tolower(stringa[i]) != 'e' && tolower(stringa[i]) != 'i' && tolower(stringa[i]) != 'o' && tolower(stringa[i]) != 'u') {
                numero_consonanti++;
                consonanti_concatenate[numero_consonanti - 1] = stringa[i];
            }
            if (isdigit(stringa[i])) {
                numeri_concatenati[numero_numeri] = stringa[i];
                numero_numeri++;
            }
        }
        numeri_concatenati[numero_numeri] = '\0';
        consonanti_concatenate[numero_consonanti] = '\0';
        printf("La lunghezza è: %d", lunghezza);
        printf("Hai inserito: %d vocali", numero_vocali);
        printf("Hai inserito: %d consonanti", numero_consonanti);
        printf("Hai inserito: %d numeri", numero_numeri);
        printf("Numeri: %s", numeri_concatenati);
        printf("Consonanti: %s", consonanti_concatenate);
        free(numeri_concatenati);
        free(consonanti_concatenate);
        return 0;

    Domani verifico grazie 

  • Re: Utilizzo Funzione Isdigit

    25/10/2023 - Antonio-Sim ha scritto:


    Domani verifico grazie 

    é solo una prova , mi sono impantanato con gli spazi … ed ero curioso di capire il tuo studio, dovrebbe funzionare …. il condizionale è d'obbligo ;-))

  • Re: Utilizzo Funzione Isdigit

    In via del tutto eccezionale, propongo un codice (sulla base di quello di Franco ma rivisto e corretto per non usare malloc/free, per ottimizzarlo e per correggere il fatto che si parla di cifre e non numeri) che possa aiutare Antonio.

    Altre modifiche Antonio le potrà apportare da solo tenendo conto di come è stato scritto il codice.

    #define DIM 50
    
    int main()
    {
       char stringa[DIM];
       char cifre_concatenate[DIM];
       char consonanti_concatenate[DIM];
       int lunghezza = 0;
       int numero_vocali = 0;
       int numero_consonanti = 0;
       int numero_cifre = 0;
       
       printf("Inserire una stringa: ");
       scanf("%50[^\n]", stringa);
       lunghezza = strlen(stringa);
       
       for (int i = 0; stringa[i]; i++)
       {
           char c = tolower(stringa[i]);
           if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
               numero_vocali++;
           else
               if (isalpha(c))
                   consonanti_concatenate[numero_consonanti++] = stringa[i];
           
           if (isdigit(c))
               cifre_concatenate[numero_cifre++] = c;
       }
       
       cifre_concatenate[numero_cifre] = '\0';
       consonanti_concatenate[numero_consonanti] = '\0';
       
       printf("\nLa lunghezza e': %d\n", lunghezza);
       printf("Hai inserito: %d vocali\n", numero_vocali);
       printf("Hai inserito: %d consonanti -> %s\n", numero_consonanti, consonanti_concatenate);
       printf("Hai inserito: %d cifre -> %s\n", numero_cifre, cifre_concatenate);
       
       return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
20 risposte