DOMANDA Esercizio Programmazione in C

lucagallo128

Nuovo Utente
14
0
ragazzi mi servirebbe una mano per questo esercizio:

Esercizio
Scrivere un programma in grado di:
 leggere un numero imprecisato di numeri dallo standard input (scanf) e calcolare il prodotto dei
numeri letti fino a che viene letto il numero 36. A questo punto il programma termina e stampa
il risultato;
 se pero' l'utente ha inserito il numero 11, tutti i numeri dati successivamente sono ignorati fino
a che è inserito il numero 36 e quindi il programma termina oppure è inserito il numero 22 e
quindi il programma riprende ad effettuare il prodotto dei numeri in input.

io l'ho risolto così il programma funziona ma non sono sicuro che vada bene:
C:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  int contatore,numero,prodotto;
  printf("INSERISCI UN NUMERO \n");
  for(contatore=0;numero!=36;contatore++){
    scanf("%d",&numero);
    prodotto=prodotto*numero;
    printf("il loro prodotto e': %d \n",prodotto);
    while(numero==11){
      for(contatore=0;numero!=11;contatore){
        scanf("%d",&numero);}
      for(contatore=0;numero!=22;contatore){
        printf("INSERISCI 36 PER CHIUDERE IL PROGRAMMA OPPURE 22 PER CONTINUARE AD OPERARE (DOPO IL 22 INSERIRE UN ALTRO NUMERO) \n");
        scanf("%d",&numero);
        for(contatore=0;numero==36;contatore){
          return 0;
        }
      }
    }
  }
  return 0;
}
Inoltre dovrei farne una versione anche con il costrutto funzionale ma non riesco a trovare soluzioni.
Spero qualcuno possa aiutarmi, grazie mille a tutti.
 
Ultima modifica da un moderatore:

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Ciao, dovresti indentare opportunamente il codice e inserirlo nell'apposito tag CODE (selezionabile anche dal menù con l'icona "..."), altrimenti è difficile da leggere.
Comunque non mi pare che il programma faccia quello che deve: la variabile prodotto non è inizializzata, quindi moltiplicandola per il numero inserito dall'utente ottieni un valore indefinito. In C una variabile con tempo di vita automatico (variabile locale non statica) a cui non è stato assegnato un valore dal programmatore, ne ha uno indefinito.
In secondo luogo, perché hai messo un return 0 nel for?
 

lucagallo128

Nuovo Utente
14
0
Allora, innanzitutto grazie per avermi risposto . Io ho interpretato l'esercizio in questo modo, ovvero comporre un programma in grado di fare il prodotto dei numeri inseriti, ho fatto sì che ogni numero faccia il prodotto con quello dopo , finché non si mette il numero 36 e il programma si chiude. Se si inserisce il numero 11 ogni numero che si inserisce non viene più contato per il prodotto finché non si mette 22 per riprendere a fare il prodotto o 36 per chiudere il programma. Dunque il for con il return l'ho dovuto utilizzare per chiudere il programma quando si inseriva il 36 dopo 11. Il programma che ho fatto da tutte queste cose te lo assicuro perché l'ho eseguito più e più volte. Sinceramente non riuscivo a trovare un altro modo per farlo quindi se hai una soluzione migliore credimi mi aiuteresti tantissimo perché è un progetto che devo consegnare per un esame.
 

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Ti invito a riflettere su cosa succede alla seguente linea di codice: prodotto=prodotto*numero; sapendo che la variabile prodotto non è inizializzata. Stai moltiplicando un valore undefined per il numero inserito dall'utente, quindi è scorretto. Quali test hai fatto? Per quanto riguarda il return 0 nel for è concettualmente sbagliato, perché comporta la terminazione del programma non appena si entra nel ciclo. E allora a che serve avere un ciclo se non ci sarà mai alcuna iterazione? Casomai ci andava un if.
Inoltre ti faccio notare che la variabile contatore non viene mai utilizzata, quindi non serve.
 
  • Mi piace
Reazioni: BAT

lucagallo128

Nuovo Utente
14
0
Allora io so che comunque il programma è sbagliato e presenta vari errori, ma ti assicuro che se lo compili e lo esegui funziona correttamente. La variabile contatore all'inizio l'avevo stampata a video ma portava un conto non corrispondente ai numeri messi perciò l'ho utilizzata solo per costruire for, perché non sono riuscito a trovare altre soluzioni.
Post unito automaticamente:

Comunque ti ringrazio per il consiglio sull'if ho utilizzato quello e il programma continua a funzionare
 
Ultima modifica:

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Allora io so che comunque il programma è sbagliato e presenta vari errori, ma ti assicuro che se lo compili e lo esegui funziona correttamente.
Che compilatore usi? Io ho provato con due versioni di gcc e la variabile prodotto veniva inizializzata a 0, ma si tratta di un caso. Infatti in C, come ho scritto nel primo post, le variabili locali, se non avvalorate esplicitamente dal programmatore, sono inizializzate con un valore grezzo, indefinito. Non ho avuto modo di provare con il compilatore Microsoft, nel caso tu usassi Visual Studio, ma sulla documentazione c'è scritto: "Scalar variables are default initialized when they are defined with no initialization expression. They have indeterminate values". Quindi, come vedi, usare una variabile non inizializzata è rischioso, perché ti ritroverai a dover fare i conti con un valore casuale, e non è certamente corretto.
La variabile contatore all'inizio l'avevo stampata a video ma portava un conto non corrispondente ai numeri messi perciò l'ho utilizzata solo per costruire for, perché non sono riuscito a trovare altre soluzioni.
Se studi il ciclo for vedrai che tutti i suoi argomenti sono opzionali, quindi avresti potuto scrivere anche for(;numero!=36;). Ma probabilmente è più appropriato e naturale un while o un do-while, dato che for(;numero!=36;) equivale a while(numero!=36).
 
  • Mi piace
Reazioni: BAT

lucagallo128

Nuovo Utente
14
0
Allora ho seguito i tuoi consigli eliminando il contatore ti ringrazio, anche perché mi hai risolto un grosso dilemma con il for poiché io non usavo il ; e perciò mi dava errore quando utilizzavo un for. Il compilatore che uso è dev-c++. Ma per costruire questo esercizio con delle funzioni hai qualche idea?
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,451
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Allora io so che comunque il programma è sbagliato e presenta vari errori, ma ti assicuro che se lo compili e lo esegui funziona correttamente.
Non diciamo sciocchezze, è evidente che il programma non può funzionare correttamente perché non hai inizializzato il prodotto (devi inizializzarlo a 1). In tal caso la variabile viene inizializzata con un valore a caso, oppure a 0 (se il compilatore è un po' più "furbo").
Controprova:
ho compilato ed eseguito il tuo programma con GCC 9.2.0 ed il prodotto è sempre 0, qualunque cosa tu inserisca.

Lascia stare DevC++ è un progetto obsoleto, usa CodeBlocks come IDE e come compilatore il GCC in versione più aggiornata possibile.
 
  • Mi piace
Reazioni: fabio93

lucagallo128

Nuovo Utente
14
0
Allora ho risolto così per ora. Adesso provo a rifare il programma con il do-while.





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



int main() {
int numero,prodotto;
printf("INSERISCI UN NUMERO \n");
prodotto=1;

for(;numero!=36;){
scanf("%d",&numero);
prodotto=prodotto*numero;
printf("il loro prodotto e': %d \n",prodotto);       
while(numero==11){
for(;numero!=11;){
scanf("%d",&numero);}                   
for(;numero!=22;){
printf("INSERISCI 36 PER CHIUDERE IL PROGRAMMA OPPURE 22 PER CONTINUARE AD OPERARE (DOPO IL 22 INSERIRE UN ALTRO NUMERO) \n");
scanf("%d",&numero);                               
if(numero==36){
return 0;   
}
}
}
}

return 0;
}
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,451
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
non è che devi provare col do-while DEVI farlo col do-while, quel ciclo for all'esterno potrebbe non essere mai eseguito...
essendo la variabile "numero" non inizializzata, è teoricamente possibile (sebbene molto improbabile) che un compilatore ci metta "casualmente" il valore 36! Non verrebbe eseguito nulla! E' concettualmente sbagliato fare un ciclo for così indefinito a meno che tu stesso non inizializzi la variabile "numero" e provvedi a leggerla immediatamente nel ciclo
 
Ultima modifica:
  • Mi piace
Reazioni: fabio93

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Altra cosa: il primo ciclo for all'interno del while non serve, dato che la sua condizione non si avvera mai in quanto se si entra nel while vuol dire che numero==11, quindi ovviamente non è vero che numero!=11, per cui si entra nel secondo for (la cui condizione è numero!=22). Da qui, si esce solo se si inserisce 36 (nel qual caso il programma termina) o 22, nel qual caso si ritorna alla valutazione della condizione del while (numero==11) che, essendo falsa, ci fa uscire dal while e ritornare nel for esterno.
 
  • Mi piace
Reazioni: BAT

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Sto cercando di risolvere il programma usando il do-while ma non riesco a trovare soluzione voi avete qualche idea?
In che senso non trovi la soluzione? Devi semplicemente sostituire il for più esterno con un do-while, e possibilmente i for interni con dei while che sarebbero più appropriati semanticamente, sebbene il for non sia sbagliato sintatticamente. Provaci e posta il codice (per favore indentato).
 

lucagallo128

Nuovo Utente
14
0
cosi?



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



int main() {
int contatore,numero,prodotto;
printf("INSERISCI UN NUMERO \n");
prodotto=1;
do{
scanf("%d",&numero);
prodotto=prodotto*numero;
printf("il loro prodotto e': %d \n",prodotto);       
while(numero==11){
while(numero!=11){
scanf("%d",&numero);}                   
while(numero!=22){
printf("INSERISCI 36 PER CHIUDERE IL PROGRAMMA OPPURE 22 PER CONTINUARE AD OPERARE (DOPO IL 22 INSERIRE UN ALTRO NUMERO) \n");
scanf("%d",&numero);                               
if(numero==36){
return 0;   
}
}
}
}
return 0;
}
 

fabio93

Utente Attivo
609
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
Manca il while al do-while. Guardati la sintassi.
A parte questo, leggi il mio post immediatamente precedente. Continuo qui:
Una volta eliminato il ciclo inutile (che ora è un while), ti restano, a parte il do-while esterno, due while innestati, con condizioni rispettivamente numero==11 e numero!=22. Poiché quello più esterno non fa nulla se non ospitare quello più interno, puoi unificarli in un unico ciclo: dovrai modificare il programma in modo da ottenere lo stesso effetto. Lascio a te scoprire come.
 
Ultima modifica:

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

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili