[C] Chiamata a Funzione

Pubblicità

e_ale92

Utente Èlite
Messaggi
17,014
Reazioni
5,013
Punteggio
228
salve ragazzi,
oggi in laboratorio dovevo realizzare un programma in C che inserita una data del tipo
giorno: 16
mese: 11
anno: 2011
verificasse che la data è corretta.

in pratica, se inserisco 42/14/2011 dice che la data è sbagliata e ripete il ciclo di inserimento.

io ho sviluppato l'algoritmo e il diagramma di flusso, però causa pullman (:evil:) ho lasciato l'aula prima di scrivere il codice e ora ho un problemino...

ah! dimenticavo... va fatto come Chiamata a funzione e quindi la verifica va fatta in un sottoprogramma.

il problema è che io non ho capito bene come scrivere le funzioni da richiamare, e dato che questa è il primo programma che faccio con questo procedimento ho difficoltà.
io ho fatto così:

int verifica_data = funzione di verifica da richiamare e che restituisce un valore intero
int g,m,a = variabili per giorno, mese, anno
valido = variabile per stabilire se il giorno è presente nel mese (0 = non presente; 1 = presente)
e ho strutturato così il programma:

Codice:
int verifica_data( [COLOR="#FF0000"][I]punto poco chiaro... insomma, che metto?[/I][/COLOR] );

main() {

int g,m,a, presente;
leggi g,m,a;

presente = verifica_data;

while (presente == 0)
{
printf la data è sbagliata      // ripete il ciclo e il controllo
leggi g,m,a;
}
printf la data è corretta
}

nel sottoprogramma, scritto sotto il main ho messo
Codice:
int verifica_data( [COLOR="#FF0000"][I]richiamo quella di sopra[/I][/COLOR] )
{
int g,m,a,valido;
if (il mese inserito è compreso tra 1 e 12)
{
 switch(m) 
{
...
...   // serie di 12 case in cui verifico con un if se il giorno inserito è compreso tra 1 e l'ultimo giorno di quel mese... 31 per gennaio (case 1=, 28 per febbraio (case 2) ecc.
...  se è compreso, valido = 1;
altrimenti valido = 0;
}
return valido;   // per ritornare al main
}

p.s. vabbè lasciate perdere le parentesi per ora

ora sperando che abbiate capito tutto (altrimenti consigli per spiegare che cosa ho fatto??), vi chiedo...
come scrivo una funzione? o meglio, come faccio a capire come scriverla per questo o per quel programma??
 
ecco:
Codice:
#include <stdio.h>


[B]int verifica_data(int,int,int);[/B]


main() {


int g,m,a, presente;
// ovviamente i dati li devi ricavare.. io li ho dati subito x problemi di tempo :)
 g = 32;
 m = 12;
 a =2011;


[B]presente = verifica_data(g,m,a);[/B]


if (presente == -1)
{
    printf("La data inserita non è valida");
    // chiedi di nuovo l'inserimento della data 
}
if (presente == 0)
{
    printf("La data è valida :)");
}
}


[B]int verifica_data(int giorno,int mese,int anno)[/B]
{
   
    int g0 =-1;
    int m0 = -1;
    int a0 = -1;
    int risultato = -1;
    // controllo giorno
    if (giorno >= 1 && giorno <=31 )
    {
        g0 = 0;
    }


    if (mese >=1 && mese <=12)
    {
        m0 = 0;
    }


    if (anno >= 1990 && anno <=2011)   // non sapevo che limiti dare..
    {
        a0 = 0;
    }


    if (g0 == 0 && m0 == 0 && a0 == 0 )
    {
        risultato = 0;
    }
   [B] return risultato;[/B]
}

Poi logicamente devi modificare la funzione verifica_data() perchè non deve validare una data tipo il 31 febbraio xD
 
dentro le parentesi vanno messi i parametri che ti servono, nel tuo caso la funzione deve prendere tre interi che sono giorno, mese e anno quindi scriverai per esempio verifica_data(int g, int m, int a)

per fare la verifica dentro potresti scrivere una cosa del genere
int verifica_data(int giorno, int mese, int anno) { // secondo me è inutile fare il controllo dell'anno, in quanto gli anni non sono limitati....
int valido=-1
if(mese==2) {
if(giorno >=1 && giorno <=28) {
valido=0
}
}
else if(mese==4 || mese==6 || mese==9 || mese==11) {
if(giorno >=1 && giorno <= 30) {
valido=0
}
}
else if(mese <= 12) {
if(giorno >=1 && giorno <= 31) {
valido=0
}
}
return valido;
}
 
ecco:
Codice:
#include <stdio.h>


[B]int verifica_data(int,int,int);[/B]


main() {


int g,m,a, presente;
// ovviamente i dati li devi ricavare.. io li ho dati subito x problemi di tempo :)
 g = 32;
 m = 12;
 a =2011;


[B]presente = verifica_data(g,m,a);[/B]


if (presente == -1)
{
    printf("La data inserita non è valida");
    // chiedi di nuovo l'inserimento della data 
}
if (presente == 0)
{
    printf("La data è valida :)");
}
}


[B]int verifica_data(int giorno,int mese,int anno)[/B]
{
   
    int g0 =-1;
    int m0 = -1;
    int a0 = -1;
    int risultato = -1;
    // controllo giorno
    if (giorno >= 1 && giorno <=31 )
    {
        g0 = 0;
    }


    if (mese >=1 && mese <=12)
    {
        m0 = 0;
    }


    if (anno >= 1990 && anno <=2011)   // non sapevo che limiti dare..
    {
        a0 = 0;
    }


    if (g0 == 0 && m0 == 0 && a0 == 0 )
    {
        risultato = 0;
    }
   [B] return risultato;[/B]
}

Poi logicamente devi modificare la funzione verifica_data() perchè non deve validare una data tipo il 31 febbraio xD

grazie, però a non è quello che volevo sapere, anche se l'ho dedotto dal codice ;)

dentro le parentesi vanno messi i parametri che ti servono, nel tuo caso la funzione deve prendere tre interi che sono giorno, mese e anno quindi scriverai per esempio verifica_data(int g, int m, int a)

per fare la verifica dentro potresti scrivere una cosa del genere
int verifica_data(int giorno, int mese, int anno) { // secondo me è inutile fare il controllo dell'anno, in quanto gli anni non sono limitati....
int valido=-1
if(mese==2) {
if(giorno >=1 && giorno <=28) {
valido=0
}
}
else if(mese==4 || mese==6 || mese==9 || mese==11) {
if(giorno >=1 && giorno <= 30) {
valido=0
}
}
else if(mese <= 12) {
if(giorno >=1 && giorno <= 31) {
valido=0
}
}
return valido;
}

perfetto... proprio quello che cercavo... ora credo di aver capito un po' di più la chiamata a funzione e appena ho tempo lo scrivo e vedo come va :D

p.s. si l'anno l'ho inserito, ma nel diagramma che ho fatto non l'ho messo perchè anche secondo me è inutile :sisi:
tutt'al più potrei fare che l'anno deve essere per forza positivo altrimenti :cav:
 
Potresti usare l'anno per sapere se è bisestile e quindi permettere anche la data 29/2/2012, ad esempio :)
Un anno è bisestile se la seguente condizione è verificata:
Codice:
((anno % 4 == 0 && anno % 100 != 0) || anno % 400 == 0)
 
:lol: sei troppo avanti :lol:

la traccia prevedeva 3 programmi:
1) inserita una data, verificare se è valida
2) inserita una data (fondamentalmente un anno) stampare l'anno bisestile successivo alla data (ne ho già fatto uno simile tra l'altro)
3) inserita una data, stampare quanti gg sono trascorsi dal 1-1-1901 alla data inserita, tenendo conto anche degli anni bisestili.

tu vuoi anticipare le cose :lol:
 
ragazzi ho un problema...
ho fatto che se il mese inserito è compreso tra 1 e 12 (quindi esiste un mese valido) entra in uno switch(mese) in cui ci sono 12 casi, uno per ogni mese.
il problema è che ho un errore sul case 10,11,12
Codice:
                             case '12' :
                                  {
                                      if (g>=1  &&  g<=31)
                                         valido = 1; 
                                      else 
                                         valido = 0;
                                      break;
                                  }

e i 3 errori dicono:
82:35 C:\Documents and Settings\ [Warning] multi-character character constant

e poi, solo sul case '12' ho:
98:35 C:\Documents and Settings\ ld returned 1 exit status

che cosa c'è che non va??
il prof ha detto che con lo switch sarebbe stato più facile, ma a questo punto non ci credo...
è venuto un codice lunghissimo... immaginate 12 di quei blocchi che ho scritto + tutto il resto della funzione + il main...
forse con una serie di if fatte come ha scritto campo23 sarebbe stato meglio, però mi dite cosa c'è che non va nel mio codice, così imparo
 
EDIT: la funzione l'ho riscritta con una serie (3) di if e funziona.
toglietemi quel dubbio e poi si può chiudere
 
Pubblicità
Pubblicità
Indietro
Top