PDA

View Full Version : [C] Un warning su CodeBlocks


Cadetto Entusiasta
03-11-2008, 18:08
Ciao. Oggi mi stavo allenando a fare dei programmi usando prima if-else, e poi lo switch-case. Il fatto è che dovrei fare un programma in cui inserisco un numero da 1 a 12 e lui mi restituisce il nome del mese corrispondente. Ho fatto il programma, ma quando provo a inserirgli 10, 11, 12 mi da sempre gennaio. Guardando bene i build messages, in corrispondenza di questi valori mi da un warning dicendomi "multi-character character constant". Da quello che posso capire, non riesce a leggermi il secondo valore che gli inserisco e quindi mi da il corrispettivo del primo valore che legge. Qualcuno mi saprebbe aiutare, è da 2 ore che ci penso sopra ma senza arrivare ad una conclusione.

Qui sotto posto il programma che ho scritto:

#include <stdio.h>

main()
{
int MM;

printf("Inserire un valore tra 1 e 12: \n");

MM = getchar ();

switch (MM)
{
case '1':
printf("Gennaio\n");
break;
case '2':
printf("Febbraio\n");
break;
case '3':
printf("Marzo\n");
break;
case '4':
printf("Aprile\n");
break;
case '5':
printf("Maggio\n");
break;
case '6':
printf("Giugno\n");
break;
case '7':
printf("Luglio\n");
break;
case '8':
printf("Agosto\n");
break;
case '9':
printf("Settembre\n");
break;
case '10':
printf("Ottobre\n");
break;
case '11':
printf("Novembre\n");
break;
case '12':
printf("Dicembre\n");
break;
default:
printf("Valore numerico non valido\n");
break;
}
}

anyanka
03-11-2008, 18:39
sarà perché con la getchar() prende solo un carattere e non 2??

||ElChE||88
03-11-2008, 18:48
Non solo:


case '12':


1 e 2 sono due caratteri distinti. Non puoi usarli come se fossero un solo carattere.

Cadetto Entusiasta
03-11-2008, 19:55
ah capito, e come potrei ovviare a sto problema? mi chiesto espressamente di farlo con switch-case...

wizard1993
03-11-2008, 19:57
memorizzando la scelta in un int senza passare da char utilizzando lo scanf()

Cadetto Entusiasta
03-11-2008, 23:29
ok va bene, domani c provo, poi se nn ci riesco rompo ancora.... A domani. :)

Cadetto Entusiasta
04-11-2008, 16:28
ok mi è andato tutto bene, ho fatto come mi avete suggerito e non ho avuto problemi.

Adesso però, per non aprire un nuovo topic, ho un altro problemino: nell'esercizio seguente, mi viene chiesto di fare un programma inserendo un anno AA e verificare che sia bisestile. il fatto che io ho provato a farlo, ma di sicuro ho sbagliato qualcosa nelle istruzioni dell'if, perchè mi viene anche suggerito che un anno bisestile è divisibile per 4 ma non per 100, escludendo gli anni-secolo.
Qui di seguito posto il programma da me "iniziato".

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

int main()
{
int x;

printf("Inserire anno: \n");
scanf("%d", &x);

if (x / 4 && ! x /100)
printf("L'anno inserito è bisestile\n");
else
printf("Reinserire nuovi dati\n");
}

anyanka
04-11-2008, 17:25
la condizione di "numero divisibile per..." non coincide con la divisione:

nell'if gli stai dicendo "se x/4 e non x/100" non vuol dire niente per almeno 2 motivi:
1)gli passi 2 cifre e chiedi di fare la divisione per 100... essendo 2 interi hai sicuramente 0 (da quello che si capisce dalla traccia visto che chiami l'anno AA)

2)entrambe le operazioni hanno un risultato ma non è quello che ti interessa: ti interessa che il RESTO della divisione per 4 o per 100 siano 0 o meno...

conclusione: se vuoi sapere se un numero x è divisibile per un numero y la condizione è " x%y == 0 ?"

Cadetto Entusiasta
04-11-2008, 21:37
la condizione di "numero divisibile per..." non coincide con la divisione:

nell'if gli stai dicendo "se x/4 e non x/100" non vuol dire niente per almeno 2 motivi:
1)gli passi 2 cifre e chiedi di fare la divisione per 100... essendo 2 interi hai sicuramente 0 (da quello che si capisce dalla traccia visto che chiami l'anno AA)

2)entrambe le operazioni hanno un risultato ma non è quello che ti interessa: ti interessa che il RESTO della divisione per 4 o per 100 siano 0 o meno...

conclusione: se vuoi sapere se un numero x è divisibile per un numero y la condizione è " x%y == 0 ?"

Scusa, ma non capisco cosa dovrei fare. Al posto della stringa all'interno del comando dell'if (dentro la parentesi) dovrei mettere x % 4 == 0 ?? non ho proprio capito....

anyanka
05-11-2008, 16:02
in pratica la condizione da mettere nell'if è:

(x&4 == 0) && (x%100 != 0)

banryu79
05-11-2008, 17:07
Quello che ti sta suggerendo anyanka è di usare l'operatore modulo [%] per verificare se un numero intero è divisibile per un altro numero intero.

In pratica l'operatore modulo ti restituisce il resto della divisione intera tra due interi.

Es.:
10 diviso 4 fa 2 con resto di 2.
In codice:

int resto;
resto = 10 % 4;

Se ora stampassi a video la variabile "resto" vedresti come valore 2.

Quindi per verificare la divisibilità di un numero intero "n" con un altro numero intero "m" basta verificare che il risultato di "n" modulo "m" sia uguale a zero.
In codice:

int n;
int m;

if (n % m == 0)
{
// ... n è divisibile per m
}