Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [c] ordine crescente

  1. #1
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85

    [c] ordine crescente

    codice:
    //verificare che gli elementi di a[n] siano in ordine crescente
    
    #include <stdio.h>
    #include <stdlib.h>
    #define max 100
    
    int main()
    {
    
        int n=0,m=0,appo=0,ciao=0,i=0,a[max];
        char risposta;
        int SonoOrdineCrescente=0;
    
        do{
        printf("Ciao. Inserisci n: ");
        scanf("%d",&n);
        do{
            i=0;
        printf("Inserisci il NUMERO %d di %d: ",i,n-1);
        scanf("%d",a[i]);
        i++;
        }while(i<n);
    
    
        //Verificare che l' elemento n-(n-1) sia maggiore di n-(n-2)
        for(i=1,m=0;i<n,m<n;i++)
        {
            if(a[m]>=a[i])
            {
                SonoOrdineCrescente=1;
            }
            else
            {
                SonoOrdineCrescente=2;
            }
            if(i=n-1)
            {
                m++;
            }
        }
    
        if(SonoOrdineCrescente=1)
        {
            printf("\nGli elementi sono in ordine crescente!");
        }
        else
        {
            printf("\nGli elementi non sono in ordine crescente");
        }
    
            printf("Vuoi riprovare?(s\n) ");
            risposta=getch();
        }while(risposta=='s');
    
        return 0;
    }
    l'errore che mi dà è:
    codice:
    Ciao. Inserisci n: 2
    Inserisci il NUMERO 0 di 1: 34
    
    Process returned -1073741819 (0xC0000005)   execution time : 4.219 s
    Press any key to continue.
    SO: Windows 7

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    117
    Probabilmente il problema è qui:
    codice:
        do{
            i=0;
        printf("Inserisci il NUMERO %d di %d: ",i,n-1);
        scanf("%d",&a[i]);       <----- scanf vuole l'indirizzo della variabile
        i++;
        }while(i<n);
    Fammi sapere.

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da Cell
    codice:
        do{
            i=0;
        printf("Inserisci il NUMERO %d di %d: ",i,n-1);
        scanf("%d",&a[i]);       <----- scanf vuole l'indirizzo della variabile
        i++;
        }while(i<n);
    Inoltre questo è un ciclo infinito: l'azzeramente di i va fatto prima del do.

    @l'autore del thread
    Il do-while non è adatto al tuo scopo: tu sai esattamente quante iterazioni fare (da 0 incluso a n escluso), per questo la buona programmazione vorrebbe che venga utilizzato un ciclo for.
    codice:
    for (i = 0; i < n; i++) {
      printf("Inserisci il NUMERO %d di %d: ", i, n - 1);
      scanf("%d", &a[i]);
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    117
    Originariamente inviato da Alex'87
    Inoltre questo è un ciclo infinito: l'azzeramente di i va fatto prima del do.
    Sì, infatti. Hai pienamente ragione.

  5. #5
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    grazie. in qualsiasi caso l'errore lo dà sempre,anche con for. è come se non riuscisse a leggere l'ultima variabile. Il nuovo codice (corretto senza vedere le rsp...(faccina: vanitoso ) )

    codice:
    //verificare che gli elementi di a[n] siano in ordine crescente
    
    #include <stdio.h>
    #include <stdlib.h>
    #define max 100
    
        //prototipo = dichiarazione funzioni
        void Riprova();
        void NonCrescente();
        //fine prototipo (nota: i prototipi vanno prima di main() perchè il pc legge dall'alto al basso)
    
        void NonCrescente()
        {
            printf("\nGli elementi non sono in ordine crescente");
            Riprova();
        }
    
        void Riprova()
        {
            char risposta;
            printf("\nVuoi riprovare?(s/n) ");
            risposta=getche();
            printf("\n");
            if(risposta=='s')
            {
                main();
            }
        }
    
    int main()
    {
    
        int n=0,m=0,ciao=0,i=0,a[max];
        int SonoOrdineCrescente=0;
    
        printf("Ciao. Inserisci n: ");
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {//ERROR: chissà perchè il while non funziona?
         //ERROR: avevo aggiunto i=0;
        printf("Inserisci il NUMERO %d di %d: ",i,n-1);
        scanf("%d",a[i]);
        }
    
    
        //Verificare che l' elemento n-(n-1) sia maggiore di n-(n-2)
        for(i=1,m=0;m<n;i++)
        {
            while(a[m]<a[i])
            {
                SonoOrdineCrescente=1;
            }
            while(a[m]>=a[i])
            {
                NonCrescente();
            }
            if(i=n-1)
            {
                m++;
                i=m++;
            }
            else{}
        }
        printf("\nGli elementi sono in ordine crescente");
        Riprova();
    }
    SO: Windows 7

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da spode
    if(risposta=='s')
    {
    main();
    }
    Richiamare il main in questo modo è la cosa più orribile che si possa fare.

    Originariamente inviato da spode
    scanf("%d",a[i]);
    scanf("%d", &a[i]);

    Originariamente inviato da spode
    codice:
            if(i=n-1)
            {
                m++;
                i=m++;
            }
    Questo if darà sempre "vero" come risultato e verrà sempre eseguito. Controlla quella condizione...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    Citazione: Originariamente inviato da spode if(risposta=='s') { main(); } Richiamare il main in questo modo è la cosa più orribile che si possa fare.
    ah, sì? e come dovrei scriverlo? cosa c'è di male (me lo hanno già detto, ma voglio sapere come fai tu)?

    Citazione: Originariamente inviato da spode codice: if(i=n-1) { m++; i=m++; } Questo if darà sempre "vero" come risultato e verrà sempre eseguito. Controlla quella condizione...
    perchè restituisce sempre vero? all'inizio n può essere 3 (n-1=2) e i parte da 1...
    SO: Windows 7

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da spode
    ah, sì? e come dovrei scriverlo? cosa c'è di male (me lo hanno già detto, ma voglio sapere come fai tu)?
    Il main è una funzione particolare in quanto è la prima a venire eseguita all'avvio del programma. Richiamarla è ridondante e ti fa sprecare memoria inutilmente (hai presente come vengono chiamante le funzioni? Lo stack, il fare "push" ecc?[/QUOTE]

    Se non vuoi far terminare il programma usa un ciclo all'interno del main.

    Originariamente inviato da spode
    perchè restituisce sempre vero? all'inizio n può essere 3 (n-1=2) e i parte da 1...
    i = n - 1 è un ASSEGNAMENTO, non un confronto. Quello che hai scritto significa "assegna il valore di n - 1 a i". E poiché il C considera "vero" qualsiasi valore diverso da 0 (zero), quella i varrà sempre "VERO" a parte il caso in cui n vale 1. L'uguaglianza è ==.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Utente di HTML.it L'avatar di spode
    Registrato dal
    Jul 2010
    Messaggi
    85
    tengo a precisare che la discussione è a fini più "generali", nel senso che forse ho problemi di logica col while, dato che mi è venuta voglia di dare una capocciata al pc dopo 40000 volte che provo a farlo andare con questa consegna.
    Per ale: il codice l'ho scritto direttamente sul forum, quindi non me ne sono accorto. scusa e cerca di comprendere che non l'ho fatto per sfiducia.
    Citazione: Originariamente inviato da spode ah, sì? e come dovrei scriverlo? cosa c'è di male (me lo hanno già detto, ma voglio sapere come fai tu)? Il main è una funzione particolare in quanto è la prima a venire eseguita all'avvio del programma. Richiamarla è ridondante e ti fa sprecare memoria inutilmente (hai presente come vengono chiamante le funzioni? Lo stack, il fare "push" ecc?
    Se non vuoi far terminare il programma usa un ciclo all'interno del main.[/QUOTE] no, non so cosa siano lo stack e il fare il push, ecc. me lo diresti?
    Citazione: Originariamente inviato da spode ah, sì? e come dovrei scriverlo? cosa c'è di male (me lo hanno già detto, ma voglio sapere come fai tu)? Il main è una funzione particolare in quanto è la prima a venire eseguita all'avvio del programma. Richiamarla è ridondante e ti fa sprecare memoria inutilmente (hai presente come vengono chiamante le funzioni? Lo stack, il fare "push" ecc?
    Se non vuoi far terminare il programma usa un ciclo all'interno del main. Citazione: Originariamente inviato da spode perchè restituisce sempre vero? all'inizio n può essere 3 (n-1=2) e i parte da 1... i = n - 1 è un ASSEGNAMENTO, non un confronto. Quello che hai scritto significa "assegna il valore di n - 1 a i". E poiché il C considera "vero" qualsiasi valore diverso da 0 (zero), quella i varrà sempre "VERO" a parte il caso in cui n vale 1. L'uguaglianza è ==.[/QUOTE]
    grazie mille. mi sbaglio sempre!

    allora mi potete aiutare a capire il while in italiano e poi in c? da come uso io il while, il valore della variabile non viene modificata (Ordine o SonoOrdineCrescente): devo capire come cambiarla!

    per l'amministratore/moderatore:
    per favore, metti le discussione iniziate da x (nel mio caso, da spode) per prime nell'elenco. in questo modo non devo per forza impazzire nel cercarle (considera che navigo in EDGE->max 25Kb/s).
    SO: Windows 7

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.