PROBLEMA [linguaggio C] esercizio sui cicli

stayhungry

Utente Attivo
449
42
Salve a tutti, sono arrivato a studiare i cicli nel linguaggio C (while, do-while, for) , fino ad adesso non ho avuto difficoltà rilevanti, le ho sempre superate tutte ma questo capitolo fa fatica ad entrarmi in testa, cioè, ho capito come si usato le varie strutture ma quando c'è da scrivere un programma tentenno.

allora il problema è il numero 1 nella foto
ac33005823d37c264ad0d151ed61fa96.jpg


quello che non capisco è : come posso fare a confrontare ogni numero e ho un dubbio sulle variabili da utilizzare, devo usare solo una variabile a cui associo tutti i numeri?

non chiedo che mi risolviate il problema (ci mancherebbe altro..) ma vorrei alcune dritte almeno per impostare l'esercizio .

grazie a tutti!



edit:
dimenticavo di chiedere una cosa.. qualcuno ha degli esercizi sul C? sul mio libro ci sono al massimo una decina di progetti di programmazione e alcuni sono solo esercizi dove devo modificare codici già forniti dal libro.. nello specifico mi servono degli esercizi sui cicli perché penso di dover restare un po di più su questo argomento e di dover fare pratica ma non disdegno esercizi anche per altri argomenti.

thanks!
 
Ultima modifica:

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Hai dubbi sulla progettazione (idea risolutiva) o su come implementare (codice)?
A te non serve tenere traccia di tutti i numeri, ti bastano 2 variabili (double).
Sapendo che il programma termina con l'inserimento di valore 0 o inferiore, puoi fare una cosa del genere (pseudocodice):
Codice:
max = -1 
do
   tmp = leggi_valore
   if tmp > max then 
      max = tmp 
   endif
while tmp > 0
if max >= 0 then
   scrivi "il maggiore è " max
endif
max è inizializzato a un valore negativo perchè se il primo numero inserito è inferiore di zero allora viene scartato dall'if dell'output
 

stayhungry

Utente Attivo
449
42
ciao, ho dubbi sull'idea risolutiva.
poi volevo dirti che il mio libro non usa per niente il then quindi ci sarebbe altro che potresti dirmi ?? @1nd33d

- - - Updated - - -

io ho scritto questo codice ;

#include <stdio.h>

int main ()
{

float num, max = 0;


while ( num > 0 ) {

printf ( " enter a number : " ) ;
scanf ("%f", &num) ;

if (max < num) {
max = num;
}

}
printf ( " the largest number entered was %.2f " , max) ;


return 0 ;

}

anche grazie all'aiuto di questo video qui https://www.youtube.com/watch?v=ivFDvUT04Us la quale prima parte dell'esercizio del video è uguale al mio esercizio.


al tipo nel video torna tutto,invece quando io compilo il codice ho questo risultato : Istantanea_2015-07-13_10-48-20.png
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
quello che ho scritto sopra è uno pseudocodice, non è codice C. Serve a descrivere una procedura, poi va tradotto nel linguaggio di implementazione. Se si parla di C ovviamente non c'è then e nemmeno endif.

Il codice che hai scritto è giuasto in linea di massima ma presenta un piccolo "bug". Se inserisci come primo numero un numero "stop" (minore o uguale a zero), il programma dirà che il massimo numero inserito è 0. Ma non è vero, perchè non l'hai nemmeno mai inserito lo zero.
 
  • Mi piace
Reazioni: Mursey

stayhungry

Utente Attivo
449
42
quello che ho scritto sopra è uno pseudocodice, non è codice C. Serve a descrivere una procedura, poi va tradotto nel linguaggio di implementazione. Se si parla di C ovviamente non c'è then e nemmeno endif.

Il codice che hai scritto è giuasto in linea di massima ma presenta un piccolo "bug". Se inserisci come primo numero un numero "stop" (minore o uguale a zero), il programma dirà che il massimo numero inserito è 0. Ma non è vero, perchè non l'hai nemmeno mai inserito lo zero.
quindi come posso correggere il codice?
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
quindi come posso correggere il codice?
Come ti ho scritto nello pseudocodice: max lo inizializzi a un numero negativo, e alla fine del programma fai un controllo. Se max è ancora negativo vuol dire che non è stato inserito nessun numero valido.
Ah noto ora che comunque il tuo codice lì non funzionerà mai, se inizializzi num = 0 la condizione di while non sarà mai vera.
 

stayhungry

Utente Attivo
449
42
@1nd33d scusa ma non ho capito, ora ho fatto come hai detto te :
#include <stdio.h>

int main ()
{

float num, max = -1 ;


while ( num <= 0 ) {

printf ( " enter a number : " ) ;
scanf ("%f", &num) ;

if (max < num) {
max = num;
}

}
printf ( " the largest number entered was %.2f " , max) ;


return 0 ;

}



max l'ho inizializzato come -1 quindi un numero negativo e nelle condizioni del while ho messo ( n <= 0), è questa la parte poco chiara mi sa

- - - Updated - - -

edit :

allora, mi sono riguardato lo preudocodice e ho sistemato il programma. ora tutto funziona correttamente, questo è il codice finale :

#include <stdio.h>

int main ()
{

float num, max = 0 ;


do {

printf ( " enter a number : " ) ;
scanf ("%f", &num) ;

if (num > max) {
max = num;
}

} while ( num > 0 ) ;

if (max >= 0 )
printf ( " the largest number entered was %.2f " , max) ;


return 0 ;


}

- - - Updated - - -

ultima cosa : il ciclo do- while può essere sostituito anche con un ciclo for vero ??
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Lascia perdere l'ultima frase del mio precedente post, ho avuto una svista :asd:

Per quanto riguarda il for non mi pare esista un modo "pulito" per scrivere un do-while con solo un for. Ovviamente si può fare una cosa "sporca" del genere:
Codice:
do{
   istruzione
}while(condizione)
//diventa
int X;
for (X=0; X==0 || condizione;X++){
   istruzione
}
quel "X==0 || condizione" permette l'esecuzione del ciclo sicuramente almeno una volta... ma è veramente, veramente brutto...

E' invece vero che ogni ciclo while-do può essere sostituito con un ciclo for. Infatti è equivalente scrivere:
Codice:
while (<condizione>){
    istruzione
}
for (;condizione;){
   istruzione
}
ma anche qui, meglio usare il while per una cosa del genere.

Più in generale il for permette di accorpare più istruzioni in una:
Codice:
int A = 1
while (A < 10){
   istruzione
   A++;
}
printf("%d",A);  //stampa 10
// equivale a
int A;
for (A = 1; A < 10; A++){
   istruzione
}
printf("%d",A);  //stampa 10
Un'altra peculiarità del ciclo for in C/C++, secondo gli standard C99 e successivi è la possibilità di dichiarare variabili nello statement del for:
Codice:
for (int A = 1; A < 10; A++){
   istruzione
}
printf("%d",A);  //non funziona
L'accortezza che qui devi avere è che lo scope della variabile A, è interno al for. Quando il ciclo finisce, la variabile A non "esiste" più. Nel for precedente invece, int A è dichiarata prima del for, quindi continua ad esistere anche dopo.
 
Ultima modifica:
  • Mi piace
Reazioni: stayhungry

stayhungry

Utente Attivo
449
42
mhm no non è per niente pulito ahahha

comunque grazie mille !

- - - Updated - - -

piccola variazione ( @1nd33d ) ;

ho cominciato a fare un altro esercizio che in linea teorica mi sembra simile a quello appena fatto, l'esercizio consiste nel far inserire all'utente una serie di numeri e quando questo digita 0/0/0 il programma restituisce la data che viene prima, quindi se per esempio digito 6/6/2012, 8/12/2006 , 14/2/ 1969 e inseguito 0/0/0 il programma deve darmi "a data che viene prima è 14/2/1969"

questo è il codice che ho scritto :

#include <stdio.h>

int main () {

// mm, gm e ym sono rispettivamente il mese minore, il giorno minore e l'anno minore

int m, g, y, mm= 0, gm= 0, ym= 0 ;

do {

printf ( " enter a date ( mm/gg/yyyy ) : " ) ;
scanf ( "%d/%d/%d", &m, &g, &y ) ;

if ( m < mm && g < gm && y < ym ) {

m = mm;
g = gm ;
y = ym ;
}
} while ( m = 0 && g = 0 && y = 0 ) ; // se l'utente inserisce 0/0/0 il ciclo dovrebbe terminare

printf ( " the earliest date is %d/%d/%d ", mm, gm, ym ) ;

return 0 ;

}


e nell'immagine vedete l'errore che ricevo se provo a compilare Istantanea_2015-07-13_17-16-01.png

so che posso sembrare fastidioso ma ci sto mettendo anima e corpo per imparare per bene il tutto :D .
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
usa il doppio uguale per controllare l'uguaglianza.
Il singolo = è una assegnazione.

Sei sicuro che questa condizione sia giusta?
Codice:
if ( m < mm && g < gm && y < ym )
ps: usa i tag
Codice:
 
Ultima modifica:

Rav

Utente Attivo
127
10
Come ha detto l'utente sopra di me per il confronto devi usare ==, e la prima condizione è sbagliata.
Inoltre per copiare la variabile m in mm(così come per le altre) devi scrivere
mm=m;
...
...
Infine tu vuoi che il ciclo si ripeta finchè la data non è 0/0/0, ovvero almeno una variabile è diversa (||) da 0.

Ps:Una volta che ti funzionerà il programma base, puoi aggiungere dei controlli sulla data, ovvero puoi verificare che il giorno non sia maggiore di 31 e il mese maggiore di 12.
 
Ultima modifica:

stayhungry

Utente Attivo
449
42
@Rav @1nd33d allora, tra stasera e domani mattina ci lavoro, prevalentemente devo lavorare sulle condizion if. per quanto detto da te, Rav, a riguardo del ciclo mi sa che non mi sono spiegato bene, il comando dell'esercizio mi ordina esplicitamente che solo all'inserimento della data 0/0/0 il ciclo deve terminare.

domani mattina scrivo qui cosa sono riuscito a fare per la condizione if e se ho difficoltà vi scrivo qui.
a tra poco e grazie a entrambi !

edit:
mi scuso con l'utente rav per aver frainteso quello che ha scritto a proposito della conclusione del ciclo, hai ragione te !

ho modificato il codice nel seguente modo, c'è stato qualche passo avanti penso ma ancora il programma non va

Codice:
 #include <stdio.h>

int main () {
    
    int m, g, y, mm= 0, gm= 0, ym= 0  ;
    
    do {
        
        printf ( "  enter a date ( mm/gg/yyyy ) : " ) ;
        scanf ( "%d/%d/%d",  &m, &g, &y ) ;
        
    
        if ( y < ym ) 
        printf ( " %d/%d/%d  is the earliest ", m, g, ym ) ;
        
        else if ( y == ym && m < mm )
        printf ( " %d/%d/%d is the earliest day " , mm, g, ym ) ;
        
        else if  ( y == y && m == mm && g < gm )
        printf ( " %d/%d/%d is the earliest  ", mm, gm, ym ) ;
        
        } while ( m != 0 ||  g != 0 || y != 0 ) ;
        
        return 0 ;
        
    }


Questo è quello che ottengo avviando il programma Istantanea_2015-07-13_21-46-20.png
 
Ultima modifica:

Rav

Utente Attivo
127
10
L'errore sta nel procedimento logico, in quanto continui ad usare il < quando tu vuoi sapere la data precedente, non la minore.
Allora, per prima cosa devi chiedere all'utente in input la data, e fin qui ci siamo.
Dopodichè bisogna copiare l'ultima data inserita nella variabile di lavoro, in modo che quando ci sarà il bisogno di visualizzarla tu ce l'abbia da qualche parte (altrimenti il programma ti mostrebbe sempre 0/0/0).
Questo va fatto solo se la data inserita è diversa da 0/0/0, quindi anche qua va usata giustamente la condizione if(a!=0||b!=||c!=0).
All'interno di questa condizione(quindi se è vera) si copiano i valori di m in mm ecc.(mm=m;...).
In questo modo all'inserimento di 0/0/0 il programma non ripete il ciclo e tu avrai la data precedente a 0/0/0 salvata nelle variabili copia(dato che non è stata sovrascritta grazie alla condizione).
Giusta la condizione del ciclo (a!=0||b!=0||c!=0).
In fine, ti basta visualizzare la.data salvata in mm,mg,my.
Scusa se sono stato poco chiaro, per ogni cosa sono qui :)
 

stayhungry

Utente Attivo
449
42
Allora mi sa che mi sono spiegato male io o hai frainteso te... io non voglio ottenere la data PRECEDENTE a 0/0/0, io voglio ottenere la data che si trova prima su un calendario.
per esempio: se immetto 6/6/1999, 6/3/1976, 2/ 3/ 1876, devo ottenere " 2/ 3/ 1876 is the earliest date " poichè è questa la data che viene prima di tutte le altre
ecco cosa ho se faccio come mi dici te : Istantanea_2015-07-14_10-52-52.png


mi sono spiegato adesso ? @Rav
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Quel codice presenta alcuni errori abbastanza grossi, di natura logica e concettuale
- L'output lo devi dare alla fine del programma, non a ogni ciclo
- le condizioni sono giuste ma non saranno mai vere se inizializzi ym, gm e mm a 0 (non avrai mai una data antecedente a 0/0/0).
- quel do while fatto così ha comunque problemi se la prima data è una data "terminale" (con degli zeri)
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili