如果声明省略了条件

时间:2015-04-01 05:49:19

标签: c

我正在尝试在C中创建一个程序,它接受任何日期并返回星座。我有一个函数应该验证日期是否可能(日> 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 ;
}

1 个答案:

答案 0 :(得分:6)

我认为,你的问题在于

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

您必须单独编写所有条件,可能类似

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

否则,根据operator precedence,您的代码将显示为

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

其中(Mes == 4)生成01。接下来,根据,运算符属性,&lt;#&gt;

  

逗号运算符的左操作数被计算为void表达式;有一个   其评估与右操作数之间的序列点。然后是正确的   操作数被评估;结果有其类型和价值。

最后,您的表达式变为(11),这是true条件或逻辑运算符的if值。


[@引自C11标准,章§6.5.17]