RISOLTO Esercizio Linguaggio C con Linux

Stato
Discussione chiusa ad ulteriori risposte.

NicoAlte99

Utente Attivo
361
28
Sto cercando di imparare alcuni comandi base del linguaggio c ma non riesco a terminare con successo questo esercizio di prova.
Il mio scopo è quello di creare un semplicissimo "Bancomat" con operazioni di prelievo e deposito ma non riesco a far funzionare quest'ultimo.
Linguaggio c.png
Se premo il tasto 1 funziona tutto correttamente se premo 2 non va nulla. Dove ho sbagliato?
 

Andretti60

Utente Èlite
6,440
5,091
Non hai messo le parentesi graffe nelle istruzioni che devono essere eseguite nei test condizionali.
Nel linguaggio C, senza mettere parentesi viene eseguita solo l’istruzione seguente il IF, se il test è positivo.

PS questo non ha nulla a che vedere con Linux.

PPS usa il TAG Code per pubblicare il codice, come richiesto (e spiegato) nel regolamento di sezione.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,944
11,580
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Dove ho sbagliato?
parecchio pasticciato...
  • intanto quando posti qui dentro del codice di programmazione c'è un tag chiamato codice e dovresti farlo con quello
  • il messaggio è sbagliato "se vuoi prelevare premi 1 e se vuoi prelevare premi 2" non significa niente a parte che vuoi prelevare sia che se premi 1 che 2, magari se premi 2 vorresti depositare...
  • manca l'indentazione del codice
  • probabilmente mancano delle parentesi graffe che separano i blocchi logici delle operazioni
  • mancano tutti i commenti al codice, non si capisce nulla del significato delle variabili
 
  • Mi piace
Reazioni: NicoAlte99

NicoAlte99

Utente Attivo
361
28
Non hai messo le parentesi graffe nelle istruzioni che devono essere eseguite nei test condizionali.
Nel linguaggio C, senza mettere parentesi viene eseguita solo l’istruzione seguente il IF, se il test è positivo.

PS questo non ha nulla a che vedere con Linux.

PPS usa il TAG Code per pubblicare il codice, come richiesto (e spiegato) nel regolamento di sezione.
ok grazie e dove devo mettere le parentesi graffe? Mi scuso per la mancanza del codice ma non scrivo spesso qua. La prossima volta non ricapiterà.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,944
11,580
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
ok grazie e dove devo mettere le parentesi graffe?
subito dopo gli if e alla fine di essi
esempio:
se premi 1 vuoi fare certe operazioni --> acquisire per esempio i soldi da prelevare e poi fare la sottrazione, sono 2 istruzioni da mettere in un unico blocco (in realtà dovresti prima controllare che il totale residuo è sufficiente al prelievo)
quindi
Codice:
if(1==b){
    istruzione1;
    istruzione2;
    ...
    istruzioneN;
}
 

NicoAlte99

Utente Attivo
361
28
subito dopo gli if e alla fine di essi
esempio:
se premi 1 vuoi fare certe operazioni --> acquisire per esempio i soldi da prelevare e poi fare la sottrazione, sono 2 istruzioni da mettere in un unico blocco (in realtà dovresti prima controllare che il totale residuo è sufficiente al prelievo)
quindi
Codice:
if(1==b){
    istruzione1;
    istruzione2;
    ...
    istruzioneN;
}
continua a non funzionare
Immagine 2022-07-09 190724.png
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
  • Mi piace
Reazioni: Andretti60

BAT

Moderatore
Staff Forum
Utente Èlite
22,944
11,580
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
continua a non funzionare
e tu continui a non usare il tag per il codice

premi qui, il menu si allargherà
01.png

poi premi qui
02.png

scegli il linguaggio di programmazione e copia-incolla il codice, non postare foto

ti ho pure postato come si fa, hai messo il punto e virgola immediatamente dopo la condizione dell'if, ma programmi da 1 giorno per caso?
 

Alidara

Bannato a Vita
13
20
ok grazie e dove devo mettere le parentesi graffe? Mi scuso per la mancanza del codice ma non scrivo spesso qua. La prossima volta non ricapiterà.
Visto che hai due if potresti mettere un if - else che fa la stessa cosa ma è più elegante.
Inoltre impara già da adesso che sei all'inizio a dare dei nomi significativi alle variabili, specie come in questo caso che ne hai dichiarate tante: a b c d e f g non significano niente, pensa invece quanto sarebbe più leggibile (e comprensibile) il codice se usassi nomi tipo prelievo, deposito, totale ecc.

Poi, come già ti è stato detto l'indentazione è fondamentale perché spesso ti aiuta a trovare errori a colpo d'occhio (tipo la mancanza delle graffe chiuse) che diversamente faresti molta più difficoltà ad individuare, specie quando avrai sottomano centinaia di righe di codice: è assolutamente impensabile scrivere in maniera non indentata.

Ultimo ma non meno importante: sei agli inizi no? Usa un IDE piuttosto che un semplice text editor, gli IDE ti aiutano molto nella correzione degli errori perché ti segnalano con precisione quasi tutto.
Post unito automaticamente:

La sintassi è questa:

C:
if (condizione) {
   operazione1;
   operazione2;
   operazioneN;
}
else {
   operazione1;
   operazione2;
   operazioneN;
}
Post unito automaticamente:

ma programmi da 1 giorno per caso?
Eh, se è agli if direi...
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Se sei interessato al linguaggio C ti consiglio la sua “Bibbia” :

È di facile lettura e ha esempi molto semplici.
Esiste anche una discussione a riguardo dei libri di testo consigliati, ma visto i problemi che sta avendo (non ti demoralizzare, è perfettamente normale per chi sia alle prime armi) io ti consiglio di partire con quello, gli autori sono quelli che hanno creato il linguaggio C, creato per scrivere il sistema operativo che stavano scrivendo (Unix).
 
  • Mi piace
Reazioni: BAT

Alidara

Bannato a Vita
13
20
Se sei interessato al linguaggio C ti consiglio la sua “Bibbia” :

È di facile lettura e ha esempi molto semplici.
Esiste anche una discussione a riguardo dei libri di testo consigliati, ma visto i problemi che sta avendo (non ti demoralizzare, è perfettamente normale per chi sia alle prime armi) io ti consiglio di partire con quello, gli autori sono quelli che hanno creato il linguaggio C, creato per scrivere il sistema operativo che stavano scrivendo (Unix).
Avrai senz'altro più esperienza e più conoscenze di me, e quindi non vorrei sembrare irriverente, però non gli consiglierei il manuale di riferimento. Perché? Io l'ho avuto, da principiante come lui, l'ho trovato troppo ostico, pochi esempi, spiegazioni troppo stringate.
Infatti poco dopo ho dovuto passare ai Deitel, ora non sto dicendo "o Deitel o niente per i principianti", andrebbe bene un qualunque manuale del C che abbia tanti esempi ed esercizi, basta però che non sia il manuale di riferimento. :)

A meno che il Kernighan e Ritchie sia cambiato così tanto negli ultimi 10 anni...in quel caso ritiro quanto detto.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Avrai senz'altro più esperienza e più conoscenze di me, e quindi non vorrei sembrare irriverente, però non gli consiglierei il manuale di riferimento. Perché? Io l'ho avuto, da principiante come lui, l'ho trovato troppo ostico, pochi esempi, spiegazioni troppo stringate.
Infatti poco dopo ho dovuto passare ai Deitel, ora non sto dicendo "o Deitel o niente per i principianti", andrebbe bene un qualunque manuale del C che abbia tanti esempi ed esercizi, basta però che non sia il manuale di riferimento. :)

A meno che il Kernighan e Ritchie sia cambiato così tanto negli ultimi 10 anni...in quel caso ritiro quanto detto.
Hai fatto bene a raccontare la tua esperienza (non c’è nulla di irriverente) infatti anche io dico sempre che occorre trovare il manuale giusto in base alle proprie conoscenze. Il mio è solo un suggerimento, tra tutti i manuali che ho letto (non solo C) ho sempre trovato il K&R tra i migliori. Ma se non funziona per noi, hai ragione su tutti i fronti, meglio provare altro. Io studiai il C dal suo inizio, primi anni 80, il K&R era l’unico testo a disposizione, in inglese, quindi non so cosa ci sia adesso.
 
  • Mi piace
Reazioni: Alidara

fandango2031

Utente Attivo
803
261
C:
#include <stdio.h>



int main()
{
  
    char selezione;
    int somma_prelevata;
    int somma_depositata;
  


  
    printf("Benvenuto allo sportello automatico:\n se si desidera prelevare premere a\n se si desidera depositare premere b\n");

do
{

scanf("%c" , &selezione);


if(selezione == 'a')
{
    printf("Inserire la somma da prelevare\n");
  
    scanf("%d" , &somma_prelevata);
  
    printf("Hai prelevato: %d" , somma_prelevata);
  
    selezione = 'x'; 
}
else if(selezione  == 'b')
{
    printf("Inserire la somma da depositare\n");
  
    scanf("%d" , &somma_depositata);
  
    printf("Hai depositato: %d " , somma_depositata);
  
    selezione = 'x';
}
else
{
    printf("Si prega di premere a per Prelievo o b per Deposito\n");
  
}
}while(selezione != 'x');
}

Premetto che non sono un gran esperto di C me la cavo meglio con C++, comunque questo è pressapoco quello che vorresti fare tu, con qualche ritocco...unica pecca, non capisco come mai stampa 2 volte la riga interna all'else(quando premo un valore diverso da 'a' o 'b' dovrebbe restituirmi ilmessaggio all'interno dell'else, e solo che invede di stamparlo una sola volta, ne stampa 2) e non capisco dove sia l'errore. Utilizzando delle funzioni con C++ questo non accade...se riuscite a risolvere,fate un gran piacere anche a me. Grazie.
 

Andretti60

Utente Èlite
6,440
5,091
Tutta colpa dello scanf() usando il formato %c che legge solo UN carattere lasciando il ritorno nel buffet di input, che incasina poi le scanf() successive.
Dura da sistemare specie se si è all’inizio, ti consiglio di tornare a leggere la selezione come un numero ossia in formato %d
 

fandango2031

Utente Attivo
803
261
Tutta colpa dello scanf() usando il formato %c che legge solo UN carattere lasciando il ritorno nel buffet di input, che incasina poi le scanf() successive.
Dura da sistemare specie se si è all’inizio, ti consiglio di tornare a leggere la selezione come un numero ossia in formato %d
All'inizio avevo usato numeri interi ma ero incappato in un altro problema, avevo poi cambiato con i caratteri ma non aveva funzionato...dopo aver trovato un ulteriore soluzione ho per pigrizia lasciato il valore char...
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili