[C] Come posso creare una scelta decisionale??

piero_2000

Nuovo Utente
69
6
CPU
Intel core i7-9700k
Dissipatore
Corsair serie hydro H150i pro rgb
Scheda Madre
asus rog maximus xi hero
HDD
Samsung Memorie MZ-76E250 860 EVO SSD Interno da 250 GB, SATA, 2.5" / SEAGATE ST2000DM008 1tb
RAM
Corsair Vengeance LPX 16 GB (2 X 8 GB), DDR4, 3200 MHz
GPU
asus rog strix geforce rtx 2070 gddr6 8gb oc edition
PSU
corsair rm 750x
Case
Asus Tuf-gt501
OS
Windows 10 home edition
Salve ,
sono un neofita della programmazione in C (ho fatto solo i cicli),la mia domanda stupida è:
Come posso creare una scelta decisionale??..Per esempio faccio prima un addizione tra due numeri e poi chiedo di premere s o n per continuare o uscire dal ciclo.
Grazie in anticipo per la risposta.
 

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
Ciao, inizia a proporre tu un codice, così ti possiamo aiutare e fare in modo che arrivi tu alla soluzione.
 

piero_2000

Nuovo Utente
69
6
CPU
Intel core i7-9700k
Dissipatore
Corsair serie hydro H150i pro rgb
Scheda Madre
asus rog maximus xi hero
HDD
Samsung Memorie MZ-76E250 860 EVO SSD Interno da 250 GB, SATA, 2.5" / SEAGATE ST2000DM008 1tb
RAM
Corsair Vengeance LPX 16 GB (2 X 8 GB), DDR4, 3200 MHz
GPU
asus rog strix geforce rtx 2070 gddr6 8gb oc edition
PSU
corsair rm 750x
Case
Asus Tuf-gt501
OS
Windows 10 home edition
Ciao, inizia a proporre tu un codice, così ti possiamo aiutare e fare in modo che arrivi tu alla soluzione.
leggere due numeri, stampare la somma in output e chiedere all utente se ripetere l'operazione:
penso di poter usare il ciclo while/do while tuttavia non so come assegnare e collocare la scelta di s ed n :
Codice:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b;
    char s,n;

    do {
        printf("Inserisci il valore di a:\n");
        scanf("%d",&a);

        printf("Inserisci il valore di b:\n");
        scanf("%d",&b);

        printf("la somma e':\n%d",a+b);

        printf("Vuoi proseguire con un altra somma?.s/n\n");
    }
    while()
}
.......da qui non so piu come procedere....oppure pensavo di utlizzare un while con dentro un ciclo if pero non so come allocare le char.
 
Ultima modifica da un moderatore:

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
if non è un ciclo, è una istruzione condizionale "se succede qualcosa allora fai questo" e opzionalmente 2altrimenti fai quest'altro";

nell'ultima stampa inviti l'utente ad inserire una scelta, ('s' oppure 'n');
devi solo leggere il carattere scelto e memorizzarlo in una variabile carattere, qualcosa di simile a
C:
char scelta = getchar();
o qualunque istruzione di lettura input che ti piaccia; poi nella condizione finale while metti qualcosa come
while(scelta != 'n')
in questo modo il corpo del ciclo sdi ripete fina a quando l'utente non inserisce 'n' (quindi per ripetere può inserire qualsiasi carattere tranne la enne
 

Andretti60

Utente Èlite
6,440
5,091
if non è un ciclo, è una istruzione condizionale "se succede qualcosa allora fai questo" e opzionalmente 2altrimenti fai quest'altro";

nell'ultima stampa inviti l'utente ad inserire una scelta, ('s' oppure 'n');
devi solo leggere il carattere scelto e memorizzarlo in una variabile carattere, qualcosa di simile a
C:
char scelta = getchar();
o qualunque istgruzione di lettura input che ti piaccia; poi nella condizione finale while metti qualcosa come
while(scelta != 'n')
in questo modo il corpo del ciclo sdi ripete fina a quando l'utente non inserisce 'n' (quindi per ripetere può inserire qualsiasi carattere tranne la enne
Attento, è rischioso mischiare nello stesso codice input bufferato e no, in questo caso l’utente usa scanf() (giustamente perché deve leggere un intero)quindi meglio che continui a usare scanf(). Il problema è che scanf() lascia il carattere di ritorno nel buffer di ingresso, che quindi viene letto dal successivo getchar()
 
  • Mi piace
Reazioni: BAT

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
si concordo, leggerei un int dove lo 0 indica che non c'è più bisogno di fare somme, un altro intero qualsiasi signifcia che il ciclo deve continuare. Sarà banale ma funziona.
 

Andretti60

Utente Èlite
6,440
5,091
Non hai bisogno di dichiarare due variabili (s,n), te ne basta una (tipo ‘risposta’) che leggi con un altro scanf(). Poi nella istruzione while() alla fine del ciclo fai un semplice test se la variabile che hai appena letto sia uguale a carattere ‘s’. In quel caso il ciclo while continua automaticamente, altrimenti esce.

suggerimenti: in genere la lettura da tastiera viene fatta nella riga in cui si stampa il messaggio, quindi non si inserisce il carattere di ritorno \n alla fine del messaggio (basta aggiungere uno spazio dopo i due punti).
Nel caso di scelta, le possibilità si mettono in parentesi quadre, nel tuo caso sarebbe
C:
printf("Vuoi fare un'altra somma? [s/n] ");
 

piero_2000

Nuovo Utente
69
6
CPU
Intel core i7-9700k
Dissipatore
Corsair serie hydro H150i pro rgb
Scheda Madre
asus rog maximus xi hero
HDD
Samsung Memorie MZ-76E250 860 EVO SSD Interno da 250 GB, SATA, 2.5" / SEAGATE ST2000DM008 1tb
RAM
Corsair Vengeance LPX 16 GB (2 X 8 GB), DDR4, 3200 MHz
GPU
asus rog strix geforce rtx 2070 gddr6 8gb oc edition
PSU
corsair rm 750x
Case
Asus Tuf-gt501
OS
Windows 10 home edition
Non hai bisogno di dichiarare due variabili (s,n), te ne basta una (tipo ‘risposta’) che leggi con un altro scanf(). Poi nella istruzione while() alla fine del ciclo fai un semplice test se la variabile che hai appena letto sia uguale a carattere ‘s’. In quel caso il ciclo while continua automaticamente, altrimenti esce.

suggerimenti: in genere la lettura da tastiera viene fatta nella riga in cui si stampa il messaggio, quindi non si inserisce il carattere di ritorno \n alla fine del messaggio (basta aggiungere uno spazio dopo i due punti).
Nel caso di scelta, le possibilità si mettono in parentesi quadre, nel tuo caso sarebbe
C:
printf("Vuoi fare un'altra somma? [s/n] ");
Grazie ad entrambi per l'assistenza.
In realtà il mio problema principale era il non sapere che si potesse far riconoscere un carattere in questo modo 'carattere'. Ora avendo appreso questa informazione mi vengono in mente 1000 modi per eseguirlo.
Rielaborando il tutto ho tolto il do-while per utlizzare il while ma esce lo stesso risultato fallimentare :

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

void main()
{
    int a,b;
    char risposta;

    while(risposta='s'&&risposta!='n') {
        printf("Inserisci il valore di a: ");
        scanf("%d",&a);

        printf("Inserisci il valore di b: ");
        scanf("%d",&b);

        printf("la somma e': %d",a+b);

        printf("\nVuoi proseguire con un altra somma? [s/n] ");
        scanf("%c",&risposta);

    }
    printf("Hai deciso di terminare.");

}

In Output viene mostrata la frase : ' Vuoi proseguire con un altra somma? [s/n] ' con a fianco 'Inserisci il valore di a:'.
 
Ultima modifica da un moderatore:

Andretti60

Utente Èlite
6,440
5,091
Errore: stai usando una variabile (risposta) senza averla inizializzata. O la inizializzi con ‘s’ oppure cambi il while con un do/while
E nel test del while usi una assegnazione (il singolo = ) invece del test (errore molto comune tra i neofiti, ma salta subito all’occhio ai veterani)
 
  • Mi piace
Reazioni: BAT

piero_2000

Nuovo Utente
69
6
CPU
Intel core i7-9700k
Dissipatore
Corsair serie hydro H150i pro rgb
Scheda Madre
asus rog maximus xi hero
HDD
Samsung Memorie MZ-76E250 860 EVO SSD Interno da 250 GB, SATA, 2.5" / SEAGATE ST2000DM008 1tb
RAM
Corsair Vengeance LPX 16 GB (2 X 8 GB), DDR4, 3200 MHz
GPU
asus rog strix geforce rtx 2070 gddr6 8gb oc edition
PSU
corsair rm 750x
Case
Asus Tuf-gt501
OS
Windows 10 home edition
Ho compreso la logica ma il problema rimane invariato sia con while che do-while :

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

int main()
{
    int a,b;
    char risposta;

    do   {

printf("Inserisci il valore di a: ");
scanf("%d",&a);

printf("Inserisci il valore di b: ");
scanf("%d",&b);

printf("la somma e': %d",a+b);

printf("\nVuoi proseguire con un altra somma? [s/n]");
scanf("%c",&risposta);



    }

 while(risposta!='s');

  printf("Hai terminato le operazioni");
}



sembra come se lo scanf di %c non funzioni.
 
Ultima modifica da un moderatore:

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
sembra come se lo scanf di %c non funzioni.
invece di leggere un carattere, prova a leggere un numero intero: se è 0 il ciclo si interrompe; inizializzi con
// non necessaria l'inizializzazione tanto lo leggi dopo, necessaria invece se usi direttamente il while come ciclo
int risposta = 1;

e nel while finale
while(risposta !=0)
 
  • Mi piace
Reazioni: Andretti60

piero_2000

Nuovo Utente
69
6
CPU
Intel core i7-9700k
Dissipatore
Corsair serie hydro H150i pro rgb
Scheda Madre
asus rog maximus xi hero
HDD
Samsung Memorie MZ-76E250 860 EVO SSD Interno da 250 GB, SATA, 2.5" / SEAGATE ST2000DM008 1tb
RAM
Corsair Vengeance LPX 16 GB (2 X 8 GB), DDR4, 3200 MHz
GPU
asus rog strix geforce rtx 2070 gddr6 8gb oc edition
PSU
corsair rm 750x
Case
Asus Tuf-gt501
OS
Windows 10 home edition
invece di leggere un carattere, prova a leggere un numero intero: se è 0 il ciclo si interrompe; inizializzi con
// non necessaria l'inizializzazione tanto lo leggi dopo, necessaria invece se usi direttamente il while come ciclo
int risposta = 1;

e nel while finale
while(risposta !=0)
Fatto!!!Grazie a tutti per l'aiuto
 
  • Mi piace
Reazioni: BAT

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili