Domanda Risolto Stampa numeri in formato "abaco"

Stato
Discussione chiusa ad ulteriori risposte.

gius1805

Utente Bronze
13 Novembre 2020
42
22
0
38
ES3. Scrivere un programma in C che chiede un numero intero positivo e nel caso in cui l'utente inserisca un numero non valido lo richiede. Il programma visualizza in formato "abaco" il numero dalla cifra meno significativa alla più significativa. Ad esempio se viene inserito il numero 2134, il programma stamperà a video:
|****
|***
|*
|**
VARIANTE: modificare il programma in modo tale che visualizzi le cifre dalla più significativa alla meno significativa.
Quindi per il numero 2134 il programma visualizza:
|**
|*
|***
|****
Qualcuno riuscirebbe a scrivermi il programma o a dirmi come strutturarlo?
Grazie in anticipo.
 
Non puoi chiedere di scrivere un programma. Andiamo ... ma che modo di imparare è?

A parte il fatto che non si impara nulla facendosi fare gli esercizi dagli altri, poi usi sempre lo stesso (inutile) titolo di thread.

Comincia a scriverlo e facci vedere il codice e dove incontri problemi.
 
Non puoi chiedere di scrivere un programma. Andiamo ... ma che modo di imparare è?

A parte il fatto che non si impara nulla facendosi fare gli esercizi dagli altri, poi usi sempre lo stesso (inutile) titolo di thread.

Comincia a scriverlo e facci vedere il codice e dove incontri problemi.
C:
#include <stdio.h>

int main(){

    int n, num, i, j, count=0;

    printf("inserire numero: \n");
    scanf("%d", &n);
    while(n<=0){
        printf("valore non valido\n");
        scanf("%d", &n);
    }
    
    num = n;
    do{
        num = num / 10;
        count++;
    }while(num>0);

    num = n;
    for(i=0; i<count; i++){
        for(j=0; j<count-i; j++){
            num = num / 10;
        }
        while(num>9){
                num = num - 10;
        }
        printf("|");
        for(j=0; j<num; j++){
            printf("*");
        }
        printf("\n");
    
    }
    return 0;
}
penso di essermi sbagliato a esprimermi prima. Io non volevo il codice fatto in modo da non fare niente ma volevo un idea per svolgerlo visto che non sapevo come dividere il numero in cifre separate.
 
Beh "Qualcuno riuscirebbe a scrivermi il programma" è abbastanza chiaro.

Potevi chiedere "non so come dividere il numero in cifre separate ... mi date un'idea"?
 
Come "strutturarlo" è scritto nel testo dell'esercizio

- chiede un numero intero positivo
- nel caso in cui l'utente inserisca un numero non valido lo richiede
- visualizza in formato "abaco" il numero dalla cifra meno significativa alla più significativa

A questo punto uno può chiedere chiarimenti sul primo, secondo o terzo punto, non chiedere di scrivere tutto il codice.
 
Ultima modifica:
C:
#include <stdio.h>

int main()
{
    int n;
    //Richiede il numero finche è non è un numero appartenente ai numeri interi positivi
    do{
        printf("\nInsert a number ");
        scanf("%d", &n);
    }while( n <= 0 );

    /*
        Estraggo la cifra meno significativa ad ogni ciclo
        e ne stampo L volte il carattere, dove L è il numero estratto al ciclo corrente.
        Prima di passare al prossimo ciclo, divido il numero per 10, così da avere
        il prossimo ciclo già pronto per essere eseguito
    */
    do{
        int l = n % 10;
        int k;
        n/=10;
      
        printf("|", l);
        for(k = 0; k < l; k++){
            printf("*");
        }
        printf("\n");
    }while(n != 0);
    return 0;
}
Messaggio unito automaticamente:

C:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int n;
        //Richiede il numero finche è non è un numero appartenente ai numeri interi positivi
    do{
        printf("\nInsert a number ");
        scanf("%d", &n);
    }while( n <= 0 );

    //Ricopio il numero in una stringa per semplicità
    char nInStr[50];
    sprintf(nInStr, "%d", n);
    
    int i,k;
    /*
        Per ogni singolo carattere, lo converto in intero e ne tolgo il valore di '0', perchè
        quando ne fai il Typecasting, viene convertito nel valore numerico ASCII corrispondente,
        e levandone il carattere '0', ho il numero esatto in intero ;-)
        Quindi ne vado stampare la formattazione desiderata
    */
    for( i = 0; i < strlen(nInStr); i++){
        int digit = (int)(nInStr[i] - '0');
        printf("\n|");
        for( k = 0; k < digit; k++){
            printf("*");
        }
    }

    return 0;
}

Secondo punto
 
  • Mi piace
Reazioni: gius1805
C:
#include <stdio.h>

int main()
{
    int n;
    //Richiede il numero finche è non è un numero appartenente ai numeri interi positivi
    do{
        printf("\nInsert a number ");
        scanf("%d", &n);
    }while( n <= 0 );

    /*
        Estraggo la cifra meno significativa ad ogni ciclo
        e ne stampo L volte il carattere, dove L è il numero estratto al ciclo corrente.
        Prima di passare al prossimo ciclo, divido il numero per 10, così da avere
        il prossimo ciclo già pronto per essere eseguito
    */
    do{
        int l = n % 10;
        int k;
        n/=10;
    
        printf("|", l);
        for(k = 0; k < l; k++){
            printf("*");
        }
        printf("\n");
    }while(n != 0);
    return 0;
}
Messaggio unito automaticamente:

C:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int n;
        //Richiede il numero finche è non è un numero appartenente ai numeri interi positivi
    do{
        printf("\nInsert a number ");
        scanf("%d", &n);
    }while( n <= 0 );

    //Ricopio il numero in una stringa per semplicità
    char nInStr[50];
    sprintf(nInStr, "%d", n);
  
    int i,k;
    /*
        Per ogni singolo carattere, lo converto in intero e ne tolgo il valore di '0', perchè
        quando ne fai il Typecasting, viene convertito nel valore numerico ASCII corrispondente,
        e levandone il carattere '0', ho il numero esatto in intero ;-)
        Quindi ne vado stampare la formattazione desiderata
    */
    for( i = 0; i < strlen(nInStr); i++){
        int digit = (int)(nInStr[i] - '0');
        printf("\n|");
        for( k = 0; k < digit; k++){
            printf("*");
        }
    }

    return 0;
}

Secondo punto
Innanzitutto grazie per avermi risposto.
Con il tuo codice il numero che posso inserire da tastiera è di al massimo 50 cifre se non sbaglio. Utilizzando le liste e l'allocazione dinamica della memoria dovrei aver aggirato questo problema.
C:
#include <stdio.h>
#include <stdlib.h>

typedef struct nodo_{
    int num;
    struct nodo_* next;
}nodo_t;

nodo_t* inserisciInTesta(nodo_t* l, int num);
void visualizza(nodo_t* l);

int main()
{
    int n, cifra, k, *p;
    nodo_t *head;
    
    head=NULL;
    do{
        printf("\nInsert a number ");
        scanf("%d", &n);
    }while( n <= 0 );

    do{
        cifra = n % 10;
        n/=10;
        head = inserisciInTesta(head, cifra);
    }while(n != 0);

    visualizza(head);

    return 0;
}

void visualizza(nodo_t* l){
    int k;
    while(l){
        printf("|");
        for(k=0; k<l->num; k++)
            printf("*");
        printf("\n");
        l = l->next;
    }
}

nodo_t* inserisciInTesta(nodo_t* l, int num){
    nodo_t *tmp;
    tmp = malloc(sizeof(nodo_t));
    if(tmp != NULL){
        tmp->num = num;
        tmp->next = l;
        l = tmp;
    }else
        printf("Mem. esaurita\n");
    return l;
}
 
Esattamente... ma potevi fare qualcosa di più semplice ed immediato... ovvero contare il numero di cifre del numero inserito ed allocare dinamicamente la stringa dove ricopi il numero per semplicita ^^

C:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int n;
        //Richiede il numero finche è non è un numero appartenente ai numeri interi positivi
    do{
        printf("\nInsert a number ");
        scanf("%d", &n);
    }while( n <= 0 );

    //Calcolo quanta memoria allocare
    int count = (log10(n) + 1);
    //Ricopio il numero in una stringa per semplicità
    char *nInStr = malloc(count*sizeof(char));
    sprintf(nInStr, "%d", n);
    
    int i,k;
    /*
        Per ogni singolo carattere, lo converto in intero e ne tolgo il valore di '0', perchè
        quando ne fai il Typecasting, viene convertito nel valore numerico ASCII corrispondente,
        e levandone il carattere '0', ho il numero esatto in intero ;-)
        Quindi ne vado stampare la formattazione desiderata
    */
    for( i = 0; i < strlen(nInStr); i++){
        int digit = (int)(nInStr[i] - '0');
        printf("\n|");
        for( k = 0; k < digit; k++){
            printf("*");
        }
    }

    return 0;
}
 
  • Mi piace
Reazioni: gius1805
Stato
Discussione chiusa ad ulteriori risposte.