2015-04-01 3 views
-2

Я пытаюсь создать программу на 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 ; 
} 
+2

Пункт 1. Пожалуйста, научитесь предоставлять ___ [MCVE] (http://stackoverflow.com/help/mcve) ___. Пункт 2) Пожалуйста, используйте английский язык в образце кода, чтобы лучше справляться. –

ответ

6

Я думаю, ваша проблема в

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

Вы должны написать все условия индивидуально, может быть что-то вроде

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

В противном случае, согласно operator precedence, ваш код будет выглядеть так:

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

, где (Mes == 4), производя либо 0, либо 1. Далее, в соответствии с свойством , оператора, < #>

Левый операнд оператора запятой оценивается как выражение недействительным; есть точка последовательности между ее оценкой и правилом операнда. Затем оценивается правый операнд ; результат имеет свой тип и значение.

Таким образом, в конце концов, ваше выражение становится (11), что значение true для if состояния или логического оператора.


[@Quoted от C11 стандарта, глава §6.5.17].

+0

Так что в основном я должен сделать это как стиль переключения? – Samir

+0

@ Самир, если хотите, да. –

+0

¡Buena respuesta! – ryancdotnet

Смежные вопросы