2015-04-01 30 views
-2

我想在C中創建一個程序,它接受任何日期並返回星座sign.I有一個函數,應該驗證日期是否可能(日> 0,月> 0 ,如果月== x,日期< 31等)事情是,它應該驗證月份,並確定是否是30個月或31個月的一部分,它只接受一部分的條件,使其無論是所有月份確定爲30天或所有月份爲31天。 函數名fnValidacion()如果語句遺漏了一個條件

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

/* 
Programa : Signo Zodiaco. 
Autor : Samir Fersobe 1063021 
Fecha : Marzo 28, 2015 
*/ 
const char *signo[12] = {"Aries","Tauro","Geminis","Cancer","Leo","Virgo","Libra","Escorpio", 
         "Sagitario","Capricornio","Acuario","Piscis"};//Arreglo de Signos Zodiacales 


int Ano,Mes,Dia ;//Variables de Ano , Mes y Dia. 
int aprovacion = 0;//Determina si la funcion sigue o no. 
int bisiesto = 1 ;//determina si el año es bisiesto. 
int type   ;//determina la estacion. 
//Funciones 
void fnFecha()  ;//Consigue la fecha 
void fnBisiesto() ;//Define si el año es bisiesto. 
void fnValidacion();//Determina si la fecha es valida. 
void fnSigno()  ;//Determina el signo zodiacal. 
void fnDevuelta() ;//Devuelve la respuesta. 
int main(int argc, char** argv) 
{ 
    fnFecha(); 
    fnBisiesto(); 
    fnValidacion(); 
    fnSigno(); 
    fnDevuelta(); 

} 
void fnDevuelta() 
{/*determinar si la funcion sigue o no, y devuelve el resultado al usuario */ 
    switch (aprovacion){ 
     case 1: 
      printf("El Signo Zodiacal es %s",signo[type]); 
      break; 
     default: 
      printf("\n Intente de nuevo con otra fecha."); 
      break; 
         } 
} 
void fnSigno() 
{/*Determina el signo zodiacal*/ 
    switch(Mes){ 
      case 12: 
       if (Dia < 22) 
        type = 8; 
       else 
        type = 9; 
       break; 
      case 1: 
       if (Dia < 20) 
        type = 9; 
       else 
        type = 10; 
       break; 
      case 2: 
       if (Dia < 18) 
        type = 10; 
       else 
        type = 11; 
       break; 
      case 3: 
       if (Dia < 20) 
        type = 11; 
       else 
        type = 0; 
       break; 
      case 4: 
       if (Dia < 20) 
        type = 0; 
       else 
        type = 1; 
       break; 
      case 5: 
       if (Dia < 21) 
        type = 1; 
       else 
        type = 2; 
       break; 

      case 6: 
       if (Dia < 21) 
        type = 2; 
       else 
        type = 3; 
       break; 
      case 7: 
       if (Dia < 23) 
        type = 3; 
       else 
        type = 4; 
       break; 
      case 8: 
       if (Dia < 28) 
        type = 4; 
       else 
        type = 5; 
       break; 
      case 9: 
       if (Dia < 23) 
        type = 5; 
       else 
        type = 6; 
       break; 
      case 10: 
       if (Dia < 23) 
        type = 6; 
       else 
        type = 7; 
       break; 
      case 11: 
       if (Dia < 22) 
        type = 7; 
       else 
        type = 8; 
       break; 

    } 
} 
void fnBisiesto() 
{/*determina si el ano es bisiesto */ 
    if ((Ano%4 != 0) || ((Ano%100 == 0) && (Ano%400 != 0))) 
     bisiesto = 0; 
} 
void fnValidacion() 
{/*Esta parte determina si la fecha es valida*/ 
    if (
     (Ano < 0) || (Dia <0) || (Mes < 1) || (Mes > 12) ||//Ano,Dia,Mes No negativo.Mes entre 1 y 12. 
     (Dia > 31) || ((Mes == 4,6,9,11) && (Dia > 30)) ||//Dia no mayor que 31.Si mes es de 30, Dia no mayor que 30. 
     ((bisiesto == 0) && (Mes == 2) && (Dia > 28))  ||//Si no es bisiesto febrero no mayor que 28. 
     ((bisiesto == 1) && (Mes == 2) && (Dia > 29))  //Si es bisiesto febrero no mayor que 29. 
     ) 
     printf("Esta fecha no es Valida.");     //Explica al usuario que fecha no es valida. 
    else 
     return aprovacion = 1; 
} 
void fnFecha() 
{/*Adquiere la fecha del usuario */ 
    printf("Inserte el Ano: "); 
    scanf("%d", &Ano); 
    printf("Inserte el Mes: "); 
    scanf("%d", &Mes); 
    printf("Inserte el Dia: "); 
    scanf("%d", &Dia); 
    return ; 
} 
+2

要點1.請學會提供___ [MCVE](http://stackoverflow.com/help/mcve)___。要點2)請在示例代碼中使用英文,以幫助更好地理解。 – 2015-04-01 05:53:22

回答

6

我覺得,你的問題是在

(Mes == 4,6,9,11) 

你必須單獨寫的所有條件,可能像

((Mes == 4) || (Mes == 6) || (Mes == 9) || (Mes ==11)) 

否則,按operator precedence,您的代碼將看起來像

((Mes == 4), 6,9,11) 

其中(Mes == 4)產生01。接着,作爲每,操作者屬性,<#>

逗號操作者的左操作數被評價爲空隙表達;在它的評估和右操作數的評估之間有一個 序列點。然後評估右邊的 操作數;結果有它的類型和價值。

所以,最後,你的表達式變成(11),其是用於if條件或邏輯運算符一個true值。


[從C11標準,章§6.5.17 @Quoted]。

+0

所以基本上我應該讓它像開關風格一樣? – Samir 2015-04-01 05:53:29

+0

@Samir如果你願意,是的。 – 2015-04-01 05:54:03

+0

¡Buena respuesta! – ryancdotnet 2015-04-01 05:54:21