闰年C计划

我可以请一点帮助这个程序:

C程序会反复要求用户输入一年。 然后,程序将显示年份是否为闰年。 但是当用户不想再输入一年时,程序将显示输入的所有年份,如果年份是跳跃,则会写入。

这就是我所做的:

#include  #include  int leapYear (int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) printf("%d is a leap year\n", year); else printf("%d is not a leap year\n", year); return 0; } int main() { int y, ch, i; do { printf("Enter your choice \n 1. Enter a year\n 2. Exit\n "); scanf("%d", &ch); switch (ch) { case 1: printf("Enter a year: "); scanf("%d", &y); leapYear(y); break; case 2: exit(0); } } while (1); } 

我无法做到的是用户想要退出的部分,我需要显示输入的所有年份,如果年份是跳跃,则会写入。

链接列表可能很有用。

 #include  #include  typedef struct node_tag { int year; struct node_tag* next; } node; int leapYear (int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) printf("%d is a leap year\n", year); else printf("%d is not a leap year\n", year); return 0; } int main() { int y, ch; /* i was unused, so I deleted it */ node *head = NULL; node **tail = &head; do { printf("Enter your choice \n 1. Enter a year\n 2. Exit\n "); scanf("%d", &ch); switch (ch) { case 1: printf("Enter a year: "); scanf("%d", &y); *tail = (node*)malloc(sizeof(node)); (*tail)->year = y; (*tail)->next = NULL; tail = &(*tail)->next; leapYear(y); break; case 2: while (head != NULL) { node *next = head->next; leapYear(head->year); free(head); head = next; } exit(0); } } while (1); } 

很少修改你的程序

  #include  #include  /* A custom data type for storing results */ typedef struct { int year; int isleap; }years_t; int leapYear (int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { printf("%d is a leap year\n", year); return 0; } printf("%d is not a leap year\n", year); return -1; } int main() { int ch, i = 0; years_t y[100] ; // Will use this data type instead of simple int int continue_loop = 1; do { printf("Enter your choice \n 1. Enter a year\n 2. Exit\n "); scanf("%d", &ch); switch (ch) { case 1: printf("Enter a year: "); scanf("%d", &y[i].year); y[i].isleap = leapYear(y[i].year); // Keep track of each input with result i ++; break; case 2: continue_loop = 0; // Lets not exit break; } } while (continue_loop); /** Summary at the ent **/ for ( ch = 0; ch < i ; ch ++ ) { printf("%d %s\n", y[ch].year, ( y[ch].isleap == 0 ) ? "Leap Year" : "Not Leap Year" ); } return 0; } 

使用malloc()realloc()的另一个选项

 #include  #include  int leapYear (int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) printf("%d is a leap year\n", year); else printf("%d is not a leap year\n", year); return 0; } int main() { int y, ch, i; /**/ int cnt = 0; /**/ int *leapyr_ptr; /**/ int *temp; /**/ leapyr_ptr = (int *) malloc(cnt); do { printf("Enter your choice \n 1. Enter a year\n 2. Exit\n "); scanf("%d", &ch); switch (ch) { case 1: printf("Enter a year: "); scanf("%d", &y); /**/ cnt++; /**/ leapyr_ptr = (int *) realloc(leapyr_ptr, cnt); //you may want to check the return code of realloc for error handling /**/ temp = leapyr_ptr; /**/ i = 0; /**/ i = 0; /**/ while(i 

你需要的是动态内存分配,因为你不知道用户将进入多少年。


首先,您需要一个指针来分配内存。 由于你要存储的是int ,你需要一个指向int的指针:

 int* years; /* Lets name it 'years' */ 

现在,我们需要一个变量来跟踪我们分配的内存量:

 int size = 10; 

为什么我将size初始化为10? 因为我们首先会为10个int分配内存。

现在,动态分配内存是由stdlib.h名为malloc的函数完成的。 这是你应该怎样malloc years

 years = malloc(sizeof(int) * size); /* Or years = malloc(size * sizeof *years); */ 

我们为size (10) int s分配了内存。 内存分配是否成功? 当malloc返回NULL (并且years指向NULL )时,内存分配将不成功。 所以,让我们检查一下:

 if(years == NULL) /* If malloc failed */ { printf("malloc failed to allocate memory"); return -1; /* Exit from main */ } 

现在你已经分配了内存,我们可以写入分配的内存段。 但是,我们如何知道所有内存是否已用完并需要重新分配更多内存? 我们需要一个新变量来跟踪它:

 int counter = 0; 

我已经将counter初始化为0,因为多年来没有写入任何内容。

现在,我们可以将用户输入添加到数组中

 printf("Enter a year: "); scanf("%d", &y); 

通过使用

 years[counter] = y; counter++; /* Increment counter */ 

counter需要递增,以便我们知道第一个插槽已被使用,下一个空闲插槽为1.但是…当用户输入超过10年时会发生什么? 数据将被写入无效的内存位置,从而调用称为未定义行为 (UB)的现象。 UB的后果可怕。 所以,最好不惜一切代价避免它!

当用户希望进入超过10年时,我们需要分配更多内存。 realloc (来自stdlib.h )是一个可用于分配更多内存的函数。 只需添加

 if(counter == size) { int* temp = years; /* Backup in case realloc fails */ size += 10; /* Which is the same as `size = size + 10` */ years = realloc(years, size * sizeof(int)); /* realloc size(20) memory */ if(years == NULL) /* If realloc failed */ { printf("reallocing memory failed"); years = temp; /* years is NULL, retrieve the original contents */ break; /* Break out of the loop */ } } 

在将用户输入写入years的代码之前,即之前

 years[counter] = y; counter++; /* Increment counter */ 

好。 现在,我们的程序可以在用户希望的时候处理超过10年。 但缺少一些东西。 啊。 我们需要在循环后打印输入。 只需添加以下代码即可

 int i; for(i = 0; i < counter; i++) leapYear(years[i]); 

在循环之后打印结果。

最后,我们需要释放分配的内存,以便不会发生内存泄漏。 加

 free(years); 

就在您打印结果的循环之后,即刚刚之后

 int i; for(i = 0; i < counter; i++) leapYear(years[i]); 

完整计划:

 #include  #include  void leapYear (int year) /* Why does this function return an int? */ { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) printf("%d is a leap year\n", year); else printf("%d is not a leap year\n", year); /* return 0; Function's return type is now changed to void */ } int main() { int* years, size = 10, counter = 0, i, input, ch; years = malloc(sizeof(int) * size); /* Or years = malloc(size * sizeof *years); */ if(years == NULL) /* If malloc failed */ { printf("malloc failed to allocate memory"); return -1; /* Exit the program */ } do { printf("Enter your choice \n 1. Enter a year\n 2. Exit\n "); scanf("%d", &ch); switch (ch) { case 1: printf("Enter a year: "); scanf("%d", &input); if(counter == size) { int* temp = years; /* Backup in case realloc fails */ size += 10; /* Which is the same as `size = size + 10` */ years = realloc(years, size * sizeof(int)); /* realloc space for size(20) ints */ if(years == NULL) /* If realloc failed */ { printf("reallocing memory failed"); years = temp; /* years is NULL, retrieve the original contents */ ch = 2; /* For breaking out of the loop */ break; /* Break out of the switch-case */ } } years[counter] = input; counter++; /* Increment counter */ leapYear(input); /* break; Not required */ /* case 2: ... This isn't required */ } } while (ch != 2); printf("\n\n"); /* Printing some newlines */ for(i = 0; i < counter; i++) leapYear(years[i]); free(years); } 
 #include #include int main() { int year,A,B,C; printf("Enter the value of year :"); scanf("%d",&year); A = year%4; B = year%100; C = year%400; if(((A==0) && (B!=0)) || (C==0)) { printf("The year is Leap year"); } else { printf("The year is't Leap year"); } return 0; }