c - 我的C语法有问题吗?

标签 c

在开始之前,我想说我是新来的,而且我也刚接触 C 编程 3 周,所以我没有那么丰富的经验。

这是使用末日方法确定星期几的代码。请注意,标题和主要功能是模板,并且是应有的样子。主函数下方的所有其他内容以及顶部的相应声明都是我的代码。

    /*
*  doomsday.c
*  A program to test a function dayOfWeek which determines which
*  day of the week a particular date falls on.
*  (only for dates after the start of the Gregorian calendar).
*
*  Program stub created by Richard Buckland on 17/03/14
*  This program by YOUR-NAME-HERE
*  Freely licensed under Creative Commons CC-BY-3.0
*
*
*/

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

#define THURSDAY 0
#define FRIDAY   1
#define SATURDAY 2
#define SUNDAY   3
#define MONDAY   4
#define TUESDAY  5
#define WEDNESDAY 6

#define TRUE 1
#define FALSE 0
#define DAYS_PER_WEEK 7

int dayOfWeek (int doomsday, int leapYear, int month, int day);
int doomsDate (int month, int leapYear, int doomsday);
int numDaysLeft (int numDays, int doomsdayDate, int day);
int doomsdayDate;
int numDays;

int main (int argc, char *argv[]) {

   assert (dayOfWeek (THURSDAY,  FALSE,  4,  4) == THURSDAY);
   assert (dayOfWeek (FRIDAY,    FALSE,  6,  6) == FRIDAY);
   assert (dayOfWeek (MONDAY,    FALSE,  8,  8) == MONDAY);
   assert (dayOfWeek (WEDNESDAY, FALSE, 10, 10) == WEDNESDAY);
   assert (dayOfWeek (FRIDAY,    FALSE, 12, 12) == FRIDAY);
   assert (dayOfWeek (THURSDAY,  FALSE,  9,  5) == THURSDAY);
   assert (dayOfWeek (FRIDAY,    FALSE,  5,  9) == FRIDAY);
   assert (dayOfWeek (SUNDAY,    FALSE,  7, 11) == SUNDAY);
   assert (dayOfWeek (TUESDAY,   FALSE, 11,  7) == TUESDAY);
   assert (dayOfWeek (WEDNESDAY, FALSE,  3,  7) == WEDNESDAY);

   assert (dayOfWeek (THURSDAY,  FALSE,  4,  5) == FRIDAY);
   assert (dayOfWeek (SATURDAY,  FALSE,  6,  5) == FRIDAY);
   assert (dayOfWeek (MONDAY,    FALSE,  8,  9) == TUESDAY);
   assert (dayOfWeek (WEDNESDAY, FALSE, 10,  9) == TUESDAY);
   assert (dayOfWeek (FRIDAY,    FALSE, 12, 20) == SATURDAY);
   assert (dayOfWeek (THURSDAY,  FALSE,  9,  9) == MONDAY);
   assert (dayOfWeek (FRIDAY,    FALSE,  5,  5) == MONDAY);
   assert (dayOfWeek (SUNDAY,    FALSE,  7,  7) == WEDNESDAY);
   assert (dayOfWeek (TUESDAY,   FALSE, 11, 11) == SATURDAY);
   assert (dayOfWeek (THURSDAY,  FALSE,  3, 30) == SATURDAY);

   assert (dayOfWeek (TUESDAY,   FALSE,  2,  28) == TUESDAY);
   assert (dayOfWeek (TUESDAY,   FALSE,  2,  27) == MONDAY);
   assert (dayOfWeek (THURSDAY,  FALSE,  1,  3)  == THURSDAY);

   printf ("all tests passed - You are awesome!\n");
   return EXIT_SUCCESS;
}

// given the doomsday for a year, and whether or not it is a
// leap year, this function return the day of the week for any
// given month and day in the year.

int dayOfWeek (int doomsday, int leapYear, int month, int day) {
   int dayOfWeek;

   // Call function
   doomsDate (month, leapYear, doomsdayDate);

   // Making numDays always positive
   if (day < doomsdayDate) {
       doomsdayDate = -(doomsdayDate);
       day = -(day);     
    }

    // Calculate how many days between given day and closest doomsday
    numDays = (day - doomsdayDate);

    // Conditions needed to be satisfied
    if ((numDays = 0)) {
       numDays = 0;         
    } else if (numDays >= DAYS_PER_WEEK) {
       numDays = numDays % DAYS_PER_WEEK;    
    } else if (numDays > 0 && numDays < DAYS_PER_WEEK) {
       numDays = numDays;    
    }

   // Final calculation for the day of the week
   dayOfWeek = (numDays + doomsday);

   return (dayOfWeek);
}

//Function to calculate nearest doomsday date
int doomsDate (int month, int leapYear, int doomsdayDate) {

   if (month == 1) {
      if (leapYear == TRUE){
         doomsdayDate = 11;          
      } else if (leapYear == FALSE){
         doomsdayDate = 10;    
      }
   } else if (month == 2) {
      if (leapYear == TRUE) {
         doomsdayDate = 29;          
      } else if (leapYear == FALSE) {  
         doomsdayDate = 28;
      } 
   } else if (month == 3){
      doomsdayDate = 0;    
   } else if (month == 4) {
      doomsdayDate = 4;    
   } else if (month == 6) {
      doomsdayDate = 6;    
   } else if (month == 8) {
      doomsdayDate = 8;    
   } else if (month == 10) {
      doomsdayDate = 10;    
   } else if (month == 12) {
      doomsdayDate = 12;    
   } else if (month == 7) {
      doomsdayDate = 11;    
   } else if (month == 11) {
      doomsdayDate = 7;    
   } else if (month == 9) {
      doomsdayDate = 5;    
   } else if (month == 5) {
      doomsdayDate = 9;
   }

return doomsdayDate;    
}

我的代码中有一个神秘的错误,我无法查明,但我相信它可能位于我编写的变量或 if 语句中。所有计算似乎都是正确的,但是,只要世界末日变量(在主函数中)不等于相应的答案,代码就会失败。我已经摆弄了我的变量,在我看来,它们的值没有按应有的方式改变。有什么建议吗?

编辑:更新了代码。在 main 函数的断言第 2 部分仍然失败。 gcc 接受代码,调试器不返回任何内容。

最佳答案

至少这部分会带来麻烦;

if (month == 1) {
  if (leapYear = TRUE){
     doomsdayDate = 11;          
  } else if (leapYear = FALSE){
     doomsdayDate = 10;    
  }
} else if (month == 2) {
  if (leapYear = TRUE) {
     doomsdayDate = 29;          
  } else if (leapYear = FALSE) {  
     doomsdayDate = 28;
  } 
...

例如,一些比较实际上是赋值;

if (leapYear = TRUE) {

应该是

if (leapYear == TRUE) {

编辑:您似乎还存在一些逻辑问题,在您的方法dayOfWeek中,您使用了全局变量doomsdayDate而没有设置它。我假设您在某处错过了对 doomsDate 的调用。另外,如果变量是本地变量,编译器会告诉您它从未初始化。

关于c - 我的C语法有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589415/

相关文章:

c - 为什么我会收到此段错误?

c - 如何确定要使用哪个 SOC 或 SDK 板?

用 C 编写的程序可以获取/打印编译时间吗?

c - 如何从 GET HTTP 请求中仅获取消息正文?

c - scanf()将新行char留在缓冲区中

c - 这个C结构赋值语句合法吗?

c - 在 VirtualBox 内的 Debian 上调用 socket() 时出现错误 97

c - 在 C 中拆分字符串时出现内存泄漏问题

c++ - 在 C++ 中初始化 C 结构

c - 如何使用Arduino在LCD上闪烁单个字符而没有延迟()方法?