Problema Output funzione monotono crescente

di il
41 risposte

Problema Output funzione monotono crescente

Testo esercizio:  

Un numero è strettamente monotono crescente se le cifre che lo costituiscono sono ordinate in ordine crescente da sinistra verso destra. 478, 8 e 123 sono monotoni crescenti mentre 143 e 1223 non lo sono. Scrivere un sottoprogramma monotono che ricevuto in ingresso un intero senz’altro positivorestituisce1 al chiamante se è monotono crescente, 0 in caso contrario, e trasmette al chiamante inoltre il numero di cifre che lo costituiscono.

La mia soluzione: 

#include <stdio.h>
int monotono (int x){
   int n=0;x
   
   while(x!=0){
       x=x/10;
       n++;
   }
   
   int v[n];
   int i, j, k, flag=1;
   
   for (i=0; i<n; i++){
       v[n-1-i]=x%10;
       x=x/10;
   }
   
   for (j=0; j<n; j++){
       for (k=0; k<n; k++){
           if (v[j]>v[k+1])
             flag=0;
       }
   }
   
   
   printf("Le cifre che lo costituiscono sono %d \n", n);
   
   
   return flag;
   
}

int main()
{
   int a=0, b;
   printf("Inserisci un numero positivo: \n");
   scanf("%d", &a);
   
   b=monotono(a);
   printf("%d", b);
   
   
   
   return 0;
}

Sapete dirmi cosa sto sbagliando perchè l'output alcune volte mi viene 0 e altre 1 ma non secondo un senso logico. 

41 Risposte

  • Re: Problema Output funzione monotono crescente

    Guarda che quando inizia la prima for il valore di x non è più quello originale perché lo hai cambiato nella while

  • Re: Problema Output funzione monotono crescente

    Non è l'unico errore

    Inoltre come algoritmo è povero e inutilmente complesso

    Indica scarsa dimestichezza col linguaggio e poca fantasia

    PS

    Io non capisco questi esercizi che fanno “restituire” due cose differenti alla stessa funzione

    Anche questo indica qualcosa: che anche il docente ha problemi con la programmazione

  • Re: Problema Output funzione monotono crescente

    Probabilmente vogliono far impratichire con il passaggio di parametri per puntatore

  • Re: Problema Output funzione monotono crescente

    28/04/2023 - StandardOil ha scritto:


    Non è l'unico errore

    Inoltre come algoritmo è povero e inutilmente complesso

    Indica scarsa dimestichezza col linguaggio e poca fantasia

    PS

    Io non capisco questi esercizi che fanno “restituire” due cose differenti alla stessa funzione

    Anche questo indica qualcosa: che anche il docente ha problemi con la programmazione

    Indica scarsa dimestichezza perchè è un mese che ho iniziato a studiare C e non ho mai programmato prima. Mi scuso se per la poca fantasia ma è l'unica soluzione che mi sia venuta??

    Inoltre non penso che un esperto in C abbia problemi con una funzione semplice come costruire una funzione monotona crescente(o sbaglio?)

    Vorrei inotre specificare che devo trovare una soluzione senza l'uso di puntatori.

    28/04/2023 - oregon ha scritto:


    Guarda che quando inizia la prima for il valore di x non è più quello originale perché lo hai cambiato nella while

    Ho provato a cambiare il while così ma l'output è sempre sbagliato:

    int monotono (int x){
       int n=0, t=x;
       
       while(t!=0){
           t=t/10;
           n++;
       }
  • Re: Problema Output funzione monotono crescente

    Questo è il primo errore non l'unico.

    La seconda correzione riguarda le due for che sono sbagliate. Ne devi usare solo una, la prima, ed eliminare la seconda. Non per risparmiare una for ma proprio perché usarne due è sbagliato.

    Ovviamente usando solo la prima dovrai apportare qualche correzione sia alla for sia alla if

    Prova

  • Re: Problema Output funzione monotono crescente

    X=numero da esaminare (intero)

    S=numero in stringa

    Risposta : boolean

    Ripeti

      Se Riconversione in numero del primo carattere di s è minore della riconversione in numero del secondo carattere di s allora risposta = vero

    (Passi al secondo e terzo carattere e rifai il controllo

    Poi al terzo col quarto ecc…)

    Finché fine caratteri di s oppure risposta = falso (non serve continuare se il primo numero è maggiore del secondo numero)

    Chiaro?

  • Re: Problema Output funzione monotono crescente

    Visto che sei nuovo alla programmazione ( non che io sia diversamente )

    proporrei come soluzione, eccesso di commenti che servono per scrivere a cosa serve quello che si scrive.

    #include <stdio.h>
    
    /*
     monotono
    
     parametri
        x: numero da controllare
    
     ritorna
       0: ....
       1: ....
    */
    int monotono (int x)
    {
       int n1, /* primo numero del confronto */
           n2, /* secondo numero del confronto */
           flag=1; /* flag che indica se e' crescente oppure no - 1=si 0=no */
    
       /* ripete fino a quanto il numero non e' nullo */
       while(x)
       {
        n1=x%10;  /* Estrae prima cifra */
        x=x/10; /* toglie la prima cifra */
        n2=x%10; /* estrae seconda cifra */
        flag=flag&(n1>n2); /* controlla se e' crescente */
       }
    
       return flag; /* ritorna */
    }
    
    int main()
    {
       int a=0, b;
       printf("Inserisci un numero positivo: \n");
       scanf("%d", &a);
    
       b=monotono(a);
       printf("%d", b);
    
       return 0;
    }
  • Re: Problema Output funzione monotono crescente

    A lui serve capire cosa non va nel suo codice, non gli serve un codice alternativo da copiare

  • Re: Problema Output funzione monotono crescente

    Per lo OP

    questo non è un attacco personale a te, tutt'altro

    sono solo considerazioni teoriche, alla fine ti metterò qualche “idea”, non oso chiamarle consigli

    In generale:

    Sono d'accordo che lo OP ha bisogno di sapere cosa ha sbagliato nello specifico

    ma se non esplicita il suo algoritmo non saprò mai se uno specifico errore è “nel programma" o “nell'algoritmo”

    cominciamo con la terza riga, dichiarazione di variabili

    int n=0; x

    qui dichiara senza inizializzarla una variabile che ha lo stesso nome di un argomento

    sono due errori in una riga

    ma a guardare bene bene non è nemmeno vero, è proprio sbagliata la scrittura…

    a me il suo codice non compila nemmeno, quindi come fa ad avere risultati erratici?

    o meglio: come fa ad avere “risultati qualunque essi siano”?

    passato questo andiamo a vedere gli altri errori e discutiamo dell'algoritmo 

    quanto poi a volerlo fare “senza” l'uso di puntatori…

    non ho la minima idea di come si possa soddisfare la prescrizione di “riportare” due valori con “una” sola funzione senza l'uso di puntatori

    se anche la avessi non la userei, comunque: il principio base di C e UNIX (sono stati sviluppati assieme, nello stesso periodo, uno per l'altro e dallo stesso gruppo) è di fare una cosa per volta e farla bene, restituire “due” valori è contrario al C

    per tornare a bomba:

    programmi si scrivono dopo aver definito l'algoritmo

    io ho tentato di ricostruire il tuo, che non hai esplicitato

    1) in un ciclo conti le cifre

    2) crei un array (in realtà un VLA) per contenerle

    3) In un ciclo lo riempi (a rovescio) col metodo dei resti

    4) con un ciclo scorri ogni cifra contenuta nel VLA

    4a) in un ciclo innestato lo confronti con ogni altra

    è lungo e macchinoso, e contiene un errore, non di programma, ma di metodo

    se togli quell'errore comunque dovrebbe andare, perché il principio non è sbagliato, è solo lungo

    di più… potrei anche dire, ma non so se ti aiuterebbe

    invece io penserei laterale:

    a me viene in mente che l'array non serve, posso confrontare le cifre mano a mano che le trovo

  • Re: Problema Output funzione monotono crescente

    Quella x sembra un refuso da copia incolla. Io l'ho eliminata non tenendola in considerazione.

    I principi sono belli ma questo è un semplice esercizio scolastico di base. A parte il fatto che molte API hanno parametri di input output anche nelle interfacce di sistemi reali.

    Forse vuole che si usino le strutture, forse l'op dovrebbe chiedere spiegazioni, ma quello che dico è che fornire altro codice pronto da copiare e incollare non lo aiuta a riflettere  

  • Re: Problema Output funzione monotono crescente

    Condivido 

    infatti non lo ho fornito, ho indicato i problemi

    e per quanto riguarda l'errore in terza riga, io non sarei sicuro che si tratti di un semplice refuso

    ho visto già gente che non si rendeva conto che non compilava e lamentava sempre gli “stessi” errori anche se “riparava” il programma, senza mai leggere i log di compilazione

    e comunque anche fosse un refuso, indica che non c'è stato controllo su quello che scriveva

  • Re: Problema Output funzione monotono crescente

    Lo dico perché ha corretto la while e anche quella riga e ha parlato di risultati ancora sbagliati ma non di errori di compilazione.

    Tutto può essere e che gli studenti di primo pelo siano distratti e poco concentrati ci sta. E dipende anche tanto dal docente. 

    Non mi riferivo a te sul codice pronto.

  • Re: Problema Output funzione monotono crescente

    Invece, una lancia a favore dello OP, adesso se la merita

    una volta avevo delle cose chiamate Leggi di Nelson, un po' boriose, lo ammetto

    Seconda legge di Nelson (che sono io): paradossalmente, le preoccupazioni per la struttura e la "qualità del codice" sono spesso i modi più veloci per far funzionare qualcosa (Bjarne Stroustrup)

    il programma dello OP è strutturato e ben indentato, secondo Bjarne quindi è ben fatto

    io condivido, la forma e l'indentazione e la strutturazione del codice sono il primo passo

    i dettagli del linguaggio e dell'implementazione dell'algoritmo vengono dopo

    e lo OP il primo passo lo ha fatto nella direzione giusta

  • Re: Problema Output funzione monotono crescente

    Mumble mumble. Non posso aiutarti in c ma nella logica di programmazione.

    La cifra monotona più lunga è 123456789

    Usare while, for e di nuovo for per 9 cicli quando gia con la cifra 213456789 sai dal confronto della prima con la seconda la risposta mi sembra una perdita di risorse, se poi devi confrontare per n cifre…

    Il primo controllo lo farei sulla lunghezza della cifra se minore di 123456790. Se maggiore non è monotono crescente.

    Io lascerei solo while.

    Finché risultato=vero e cifra residua sia > 0 continua il ciclo.

    Cosa deve contenere il ciclo?

    controllo da sx a dx implica, usando la cifra massima esposta, che 9 sia maggiore di 8, che 8 sia maggiore di 7 ecc…

    Usando il tuo metodo (tutte le strade portano a roma)

    a=cifra

    b= (a-(a/10) )*10 altrimenti qualsiasi numero intero sarebbe maggiore di un decimale compreso tra zero e 1

    Se hai a disposizione solo una variabile allora diventa:

    Se a>(a-(a/10))*10) allora vero o falso

    Una variabile e nessun puntatore. Ma questa è matematica!

    Ovviamente a e b non saranno interi ma float (o come si identificano in c++)

    Confronta a con b (se a >b) e setti la risposta a vero o falso

    Poi aggiorni la cifra con cifra=cifra/10 ( oppure cifra=b oppure a=b) e ripeti il ciclo

    Programmare non significa conoscere un linguaggio, posso conoscere l'inglese, l'italiano, il cinese, ma se non conosco una materia non posso affrontare un argomento, che sia calcio, politica o letteratura.

    Salvo errori di fretta, questa è una delle tante strade da poter percorrere.

Devi accedere o registrarti per scrivere nel forum
41 risposte