Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buon Giorno a tutti
Io devo fare un programma che gestisce l'accensione, lo spegnimento e la visualizzazione dello stato di 8 lampadine.
0=spento
1=acceso
le 8 lampadine sono rappresentate dalla variabile 'c' dichiarata char.
questo è il mio codice
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <math.h>
main ()
{
char c, mask, d;
int z, n, j, i, h, f;
c=c & 0 ;
i=0;
h=0;
j=0;
for(j=1;j<9;j++)
{
h=n-1;
c=c &(char)pow(2.0, h);
if(c==1)
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
do
{
printf("inserisci 1 se vuoi accendere, 0 se vuoi spegnere, 2 se vuoi visualizzare \n");
scanf("%d", &z);
if(z==1)
{
printf("inserisci il numero della lampadina che vuoi accendere \n");
scanf("%d", &n);
h=n-1;
d=c |(char)pow(2, h);
printf("%d", d);
if(d==0)
{
printf("La lampadina è gia accesa \n");
}
else
{
printf(" Hai acceso la lampadina \n");
c=d;
}
}
else
{
if(z==0)
{
printf("inserisci il numero della lampadina che vuoi spegnere \n");
scanf("%d", &n);
h=n-1;
d=c &(char)pow(2, h);
printf("%d", d);
if(d!=0)
{
printf("La lampadina è gia spenta \n");
}
else
{
printf("Hai spento la lampadina \n");
c=d;
}
}
else
{
for(j=0;j<8;j++)
{
c=c &(char)pow(2.0, j);
for(i=1;i<9;i++)
{
c=c &(int)pow(2.0, i);
if(c==1)
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
if(c==1)
{
printf("1");
}
else
{
printf("0");
}
printf("\n");
}
}
}
printf(" \n");
printf("Digita 0 se vuoi ripetere l'esecuzione, altrimenti digita 1 \n");
scanf("%d", &i);
}while(i==0);
}
putroppo non so dirvi bene dove sia l'errore, ma penso che non funzioni bene lo spegnimento e la visualizzazione.
Riuscite a correggermelo o almeno farmi capire dove sbaglio??
Grazie
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
Ad una prima occhiata, mi vengono dubbi sull'utilizzo che hai fatto di alcune variabili...potresti perfavore descrivere brevemente le varie porzioni di codice? così riesco a capire come hai ragionato e come vorresti che funzionasse...
Poi credo che qualche switch ogni tanto potresti metterlo per strutturare il menu...
Ad una prima occhiata, mi vengono dubbi sull'utilizzo che hai fatto di alcune variabili...potresti perfavore descrivere brevemente le varie porzioni di codice? così riesco a capire come hai ragionato e come vorresti che funzionasse...
Poi credo che qualche switch ogni tanto potresti metterlo per strutturare il menu...
Sull'utilizzo di alcune variabile premetto che alcune sono inutili perchè ho fatto diverse prove e mi sono scordato di cancellare le variabili superflue.
ti aggiungo le porzioni di codice
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <math.h>
main ()
{
char c, mask, d;
int z, n, j, i, h, f;
c=c & 0 ;
i=0;
h=0;
j=0;
Inclusione librerie, dichiarazioni variabili, inizializzazione variabili a 0;
Codice sorgente - presumibilmente C/C++
for(j=1;j<9;j++)
{
h=n-1;
c=c & (char)pow(2.0, h);
if (c==1)
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
Ciclo che mi stampa in sequenza i bit contenuti in 'c' in modo da verificare l'inizializzazione a 0 di 'c';
Codice sorgente - presumibilmente Plain Text
printf("inserisci 1 se vuoi accendere, 0 se vuoi spegnere, 2 se vuoi visualizzare \n");
scanf("%d", &z);
Specie di menù con il quale chiedo all'utente cosa desidera fare;
Codice sorgente - presumibilmente C/C++
if (z==1)
{
printf("inserisci il numero della lampadina che vuoi accendere \n");
scanf("%d", &n);
h=n-1;
d=c | (char)pow(2, h);
printf("%d", d);
if (d==0)
{
printf("La lampadina è gia accesa \n");
}
else
{
printf(" Hai acceso la lampadina \n");
c=d;
}
}
Se l'utente digita 1 allora gli chiedo la lampadina da accende, poi in 'd' metto l' or tra 'c' e la potenza di 2 e controllo il risultato in modo che poi posso dire se l'aveva già accesa oppure no;
Codice sorgente - presumibilmente C/C++
if (z==0)
{
printf("inserisci il numero della lampadina che vuoi spegnere \n");
scanf("%d", &n);
h=n-1;
d=c & (char)pow(2, h);
printf("%d", d);
if (d!=0)
{
printf("La lampadina è gia spenta \n");
}
else
{
printf("Hai spento la lampadina \n");
c=d;
}
}
Se l'utente digita 2, allora faccio la stessa cosa di sopra, solo che con l'and perchè devo controllare lo spegnimento;
Codice sorgente - presumibilmente C/C++
for(j=0;j<8;j++)
{
c=c & (char)pow(2.0, j);
for(i=1;i<9;i++)
{
c=c & (int)pow(2.0, i);
if (c==1)
{
printf("1");
}
else
{
printf("0");
}
}
Se l'utente digita 2 allora gli faccio visualizzare lo stato delle lampadine facendo l'and tra 'c' e la potenza di 2;
P.s: l'ultima parte di codice è superflua, rientra sempre nel campo dei vari esperimenti che ho provato a fare
Tenuto conto che il mio c risale a "illo tempore" circa 20 anni fa ... io modificherei il tuo sorgente in maniera drastica:
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char*argv[])
{
char c, mask, d;
int z, n, j, i, h, f;
c=0 ;
i=0;
h=0;
j=0;
printf("0 0 0 0 0 0 0 0 \n");
do
{
printf("0) spegni lampadina \n");
printf("1) accendere lampadina \n");
printf("2) visualizza stato \n");
printf("3) uscita \n");
scanf("%d", &z);
if(z==1)
{
printf("inserisci il numero della lampadina che vuoi accendere \n");
scanf("%d", &n);
h=n-1;
d =(char)pow(2, h);
if((c & d)== d)
{
printf("La lampadina %d è gia accesa \n", n);
}
else
{
printf(" Hai acceso la lampadina %d \n", n);
c=c+d;
}
}
elseif(( z==0)|(z==2))
{
if(z==0)
{
printf("inserisci il numero della lampadina che vuoi spegnere \n");
scanf("%d", &n);
h=n-1;
d=(char)pow(2, h);
if((c & d)== d)
{
printf("Hai spento la lampadina %d \n", n);
c=c-d;
}
else
{
printf("La lampadina %d è gia spenta \n", n);
}
}
else
{
printf(" \n", n);
for(j=0;j<8;j++)
{
d=(char)pow(2.0, j);
if((c & d)==d)
{
printf("1 ");
}
else
{
printf("0 ");
}
}
}
}
elseif(z==3)
{break;}
printf(" \n");
}while(i==0);
system("PAUSE");
return0;
}
NB: ho tenuto come base il vecchio sorgente, ma volendo si potrebbe modificare inserendo 2 procedure che fanno tutto.
Esercizio .. trova le differenze
Grazie mille Goblin!!!!!
Sei il mio salvatore.... ahahah adesso mi metto a trovarle tutte ahahah .... mi sa che finirò l'anno possimo.
Comunque, apparte le battute, vorrei chiederti delle cose:
1) cosa vuol dire questo passaggio di parametri
Codice sorgente - presumibilmente C/C++
int main(int argc, char *argv[])
2)cosa è questo:
Codice sorgente - presumibilmente Plain Text
{break;}
3)cosa è questo:
Codice sorgente - presumibilmente C/C++
system("PAUSE");
return 0;
4)Quando finisco l'esecuzione del programma e digito 3, prima di chiudere il programma mi esce
Codice sorgente - presumibilmente C/C++
sh: 1: PAUSE: not found
Scusatemi se vi rompo ancora, ma oltre alla soluzione, mi interessa di più capire il funzionamento e la logica che c'è dietro
Ultima modifica effettuata da ancestral il 09/05/2012 alle 18:29
Ah! Goblin mi ha preceduto con una bella modifica, mi sarei divertito a riprendere a scrivere un pò di codice Comunque il passaggio di parametri
Codice sorgente - presumibilmente C/C++
int argc, char *argv[]
non è indispensabile nel tuo caso: è utilizzato per immettere dei parametri al richiamo del programma,
Codice sorgente - presumibilmente Plain Text
argc
è il numero di parametri e
Codice sorgente - presumibilmente Plain Text
argv
un puntatore al vettore dove saranno registrati i parametri. Mentre
Codice sorgente - presumibilmente Plain Text
break
è utilizzato per uscire da un ciclo o da uno switch.
Avrei strutturato il tutto con uno switch per il menù e per uscire dal programma semplicemente in questo modo:
Codice sorgente - presumibilmente C/C++
case 3:
break;
}
printf(" \n");
}while (z!=3);
}
Immagino che la tua richiesta sia non altro che un compito a casa di scuola vero? quindi non scrivo il codice intero.