|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
[C] menu + switch
ciao a tutti
sto facendo un programma in grado di calcolare le soluzioni di equazioni di secondo grado. il programma l'ho fatto tranquillamente ma ora vorrei (su consiglio del prof...) complicarlo un po', giusto per sperimentare qualche nuova funzione che ho imparato. in pratica voglio mettere il menu, che chiede quale dipo di equazionie risolvere, in una funzione esterna al main. sto lavorando con tre file distinti: 1. il programma, 2. la mia libreria di funzioni, 3. il file con le intestazioni. questo è il codice del programma: Codice:
#include <stdio.h>
#include <math.h>
#include "funzioni.c"
int main()
{
cleanScreen();
while(grade_menu==grade_menu){
menu();
switch (grade_menu){
case '1': /*Risoluzione equazione di primo grado*/
eq1grado();
break;
case '2': /*Risoluzione equazione di secondo grado*/
eq2gradoCompl();
break;
case '0': /*Uscita*/
printf("\n");
return 0;
}
}
return 0;
}
Codice:
void menu(void)
{
printf("\n*** RISOLUTORE DI EQUAZIONI ***\n");
printf("\nSelezionare il tipo di equazione che si desidera risolvere:\n");
printf("\n\t1) Primo grado\n");
printf("\n\t2) Secondo grado\n");
printf("\n\t0) Esci\n\n");
grade_menu=getchar();
}
Codice:
int grade_menu; void menu(void); Codice:
*** RISOLUTORE DI EQUAZIONI ***
Selezionare il tipo di equazione che si desidera risolvere:
1) Primo grado
2) Secondo grado
0) Esci
2
Si vuole risolvere l'equazione di secondo grado del tipo: AX^2 + BX + C = 0
Inserire A: 2
Inserire B: -4
Inserire C: 2
Le soluzioni sono coincidenti e valgono 1.00
*** RISOLUTORE DI EQUAZIONI ***
Selezionare il tipo di equazione che si desidera risolvere:
1) Primo grado
2) Secondo grado
0) Esci
*** RISOLUTORE DI EQUAZIONI ***
Selezionare il tipo di equazione che si desidera risolvere:
1) Primo grado
2) Secondo grado
0) Esci
1
Si vuole risolvere l'equazione di primo grado del tipo: AX + B = 0
Inserire A: 3
Inserire B: -6
La soluzione e'2.00
*** RISOLUTORE DI EQUAZIONI ***
Selezionare il tipo di equazione che si desidera risolvere:
1) Primo grado
2) Secondo grado
0) Esci
*** RISOLUTORE DI EQUAZIONI ***
Selezionare il tipo di equazione che si desidera risolvere:
1) Primo grado
2) Secondo grado
0) Esci
0
ale@debian:~/Programmi C/bo$
2. la condizione del "while" è un po' stupida... avete consigli a riguardo? magari anche sostituire il while con un'altra funzione elementare equivalente... lo so, visto così sembra un lavoro in utile, visto che avrei potuto semplicemente lasciare come condizione del while un grade=getchar() e il menu all'interno della funzione, ma vorrei capire perchè non funziona... grazie in anticipo a chi mi risponderà
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Metti un bel: "while (getchar() != 0);" prima di "grade_menu=getchar();" in menu(). Quote:
while (1) { }
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Il tuo problema sta qui:
Codice:
void menu(void)
{
printf("\n*** RISOLUTORE DI EQUAZIONI ***\n");
printf("\nSelezionare il tipo di equazione che si desidera risolvere:\n");
printf("\n\t1) Primo grado\n");
printf("\n\t2) Secondo grado\n");
printf("\n\t0) Esci\n\n");
grade_menu=getchar();
}
Codice:
grade_menu=getchar(); puoi: 1) usare: Codice:
char c;
scanf("%s",&c); /*so che dovrebbe essere "%c" ma poi da lo stesso errore*/
/* che invece non si presenta mettendo "%s"*/
3) usare: Codice:
while (getchar()!='\n'); altro non so...è da poco che uso il C. cmq usa la soluzione 1
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
grazie per le risposte
anche se ho ancora molti problemi... aggiorno il file principale: Codice:
#include <stdio.h>
#include <math.h>
#include "funzioni.c"
int main()
{
cleanScreen();
while(1){
menu3opzioni('t','s','A','B','C');
switch (grade_menu){
case '1': /*Risoluzione equazione di primo grado*/
eq1grado();
break;
case '2': /*Risoluzione equazione di secondo grado*/
eq2gradoCompl();
break;
case '0': /*Uscita*/
printf("\n");
return 0;
}
}
return 0;
}
Codice:
void menu3opzioni(char titolo, char sottotitolo, char opzioneA, char opzioneB, char opzioneC)
{
printf("\n%c", titolo);
printf("\n%c", sottotitolo);
printf("\n%c", opzioneA);
printf("\n%c", opzioneB);
printf("\n%c", opzioneC);
printf("\n\n");
do {
scanf("%s", &grade_menu);
check('3', grade_menu);
} while (grade_menu != grade_check);
}
void check(char numero_opzioni, char valore_immesso){
if ((valore_immesso >= 0) && (valore_immesso < numero_opzioni)) {
grade_check = valore_immesso;
}
else {
printf("Scelta non valida. Inserire un nuovo valore.\n");
grade_check = -1;
}
}
Codice:
char grade_menu; char grade_check; void eq1grado(void); void eq2grado(void); float delta(float e,float f,float g); void eq2gradoCompl(void); void menu3opzioni(char titolo, char sottotitolo, char opzione1, char opzione2, char opzione0); void check(char numero_opzioni, char valore_immesso); io pensavo di mettere al posto di "char" l'equivalente per le stringhe ma poi ho pensato che probabilmente non esiste... il secondo problema, più grave, è il fatto che impostando grade_menu e grade_check come char, nella funzione che controlla se il valore appartiene all'intervallo non riesco a fare in modo che mi escluda i valori negativi... anche qui, avete idee? grazie mille
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
il problema sta qua:
Codice:
void menu3opzioni(char titolo, char sottotitolo, char opzione1, char opzione2, char opzione0); in C: Codice:
char carattere; /* dichiarazione carattere */ char stringa[10]; /* dichiarazione per stringhe (da 0 a 9) */
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
Codice:
void menu3opzioni(char titolo[30], char sottotitolo[30], char opzione1[30], char opzione2[30], char opzione0[30]); ero convinto di averci già provato... vabbè... avrò sbagliato qualcosa per l'altro problema?
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel Ultima modifica di negator136 : 30-10-2005 alle 18:40. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
HELP vi prego!!
intanto ho avuto un idea... come posso fare in modo che il programma acquisisca un solo carattere e poi proceda da solo senza dover premere invio? in questo modo risolverei due problemi: - eviterei di dover controllare che i numeri immessi siano positivi, visto che non potrei più immettere "-" e "numero"... - potrei controllare nella stessa funzione tutti i caratteri ascii... lettere e simboli compresi, dal momento che ho impostato le variabili in ingresso come char. dai che ci siamo quasi grazie
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Quote:
Se vuoi far stampare solo i numeri da 0 a 1 fai in questo modo Codice PHP:
Nel caso digitasse altri caratteri il contatore (i) va indietro di uno e il ciclo viene rieseguito.
__________________
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
potresti spiegarmi meglio la frase che ho quotato? non capisco perchè in qual modo dovrebbe convertirmi la variabile da char a int thanks
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Quote:
Essendo un carattere (ricevuto da tastiera) con getch tu vai a memorizzare nella variabile c il codice ascii del corispettivo tasto premuto. In questo modo quando tu per esempio premi 1, la variabile c assumerà il valore del codice ascii del nuemero 0 incrementato di 1 (ovvero 49 se non erro). Così facendo nell'esempio che ti avevo fatto la variabile intera numero verra a trovarsi non il codice ascii, ma il numero convertito. Quindi al controllo che occorre fare successivamente invece di confrontare la variabile numero al corispettivo ascii, la confronti con l'ascii convertito. Non so' se si capisce come ho scritto
__________________
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
purtroppo però sono troppo imbranato e non sono riuscito a mettere in pratica ciò che mi hai detto di fare... resta il problema che se inserisco un numero negativo, o una coppia di caratteri, la funzione "check" non da il risultato sperato (frase di errore), bensì mi rimanda all'inizio della funzione menu... queste sono le due funzioni allo stato attuale... come dovrei modificarle esattamente? preferirei lasciare le funzioni divise, in modo da poter riutilizzare la "check" anche per menu più grandi... Codice:
void menu3opzioni(char titolo[60], char sottotitolo[60], char opzioneA[60], char opzioneB[60], char opzioneC[60]) {
printf("\n%s", titolo);
printf("\n%s", sottotitolo);
printf("\n%s", opzioneA);
printf("\n%s", opzioneB);
printf("\n%s", opzioneC);
printf("\n\n");
do {
scanf("%s", &grade_menu);
check('3', grade_menu);
} while (grade_menu != grade_check);
}
void check(char numero_opzioni, char valore_immesso) {
if ((valore_immesso >= 0) && (valore_immesso < numero_opzioni)) {
grade_check = valore_immesso;
}
else {
printf("Scelta non valida. Inserire un nuovo valore.\n");
grade_check = -1;
}
}
nel frattempo, vi pongo un altro quesito: come faccio a creare una funzione che mi stampi "Premere INVIO per proseguire" e che faccia proprio quello che dice? io ho scritto questa ma, giustamente, prima dell'invio si aspetta l'immissione di un carattere... Codice:
void wait(void){
int invio;
printf("Premere INVIO per proseguire");
scanf("%d", &invio);
}
perdonate la mia ignoranza... ma sono proprio niubbo... grazie mille di nuovo
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Quote:
while(getch() != '\r') ; In pratica questo ciclo continua ad eseguire il ciclo (e quindi a chiederti un carattere) fino a che tu non premi invio (che nell'ascii corrisponde al numero 13 o semplicemente '\r'). Forse ti chiederai, il carattere di andare a capo non era '\n'? Si anche quello, ma quando si va a capo linea (e quidni si preme invio) la tastiera invia due caratteri, il '\r' che va all'inizio della riga e subito dopo il '\n' che va nella riga sotto. Fatto stà quindi che occorre controllare se viene ad esserci il carattere '\r' e non '\n'.
__________________
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Codice:
char stringa[5] = {'h', 'e', 'l', 'l', 'o', 0};
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 01-11-2005 alle 10:19. |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: San Marino
Messaggi: 309
|
Quote:
Pensavo che non venivano presi in considerazione
__________________
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
dal momento che, durante la compilazione, non mi riconosce il comando getch(), ho creato questa funzione...
Codice:
void wait(void){
printf("Premere INVIO per proseguire");
while(getchar() != '\r');
}
funzione invece in questo modo: Codice:
void wait(void){
printf("Premere A e INVIO per proseguire");
while(getchar() != 'a');
}
idee?
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel Ultima modifica di negator136 : 01-11-2005 alle 16:15. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Codice:
#include <string.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
char prova = '-';
char provetta = '-';
strcpy(&prova, "01");
printf("prova: %c, provetta: %c\n", prova, provetta);
return 0;
}
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
Quote:
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Brianza
Messaggi: 2687
|
up
__________________
"Le prime giornate di un europeo in America possono essere paragonate alla nascita di un uomo." Franz Kafka
"Don't cry because it's over. Smile because it happened." Theodor Geisel |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Modifica così: Codice:
printf("Premere INVIO per continuare...");
while (getchar() != '\n');
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:09.



















