#include <stdio.h>int main(){ int year, month, day, daysInMonth, weekDay = 0; printf("请输入年份: "); scanf("%d", &year); printf("请输入月份: "); scanf("%d", &month); // 计算这个月有多少天 if (month == 2) { if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) daysInMonth = 29; else daysInMonth = 28; } else if (month == 4 || month == 6 || month == 9 || month == 11) daysInMonth = 30; else daysInMonth = 31; // 计算这个月第一天是星期几 weekDay = 1 + ((year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400); for (int i = 1; i < month; i++) { if (i == 2) { if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) weekDay += 29; else weekDay += 28; } else if (i == 4 || i == 6 || i == 9 || i == 11) weekDay += 30; else weekDay += 31; } weekDay = weekDay % 7; // 输出日历头部 printf("\n日 一 二 三 四 五 六\n"); // 输出日历主体 for (int i = 0; i < weekDay; i++) printf(" "); for (int i = 1; i <= daysInMonth; i++) { printf("%2d ", i); if ((i + weekDay) % 7 == 0) printf("\n"); } return 0;}
时间: 2024-04-28 13:26:09 浏览: 60
这段代码是一个 C 语言程序,它实现了一个简单的万年历。程序首先会要求用户输入年份和月份,然后根据输入的年份和月份计算出这个月有多少天,以及这个月的第一天是星期几。最后,程序会输出一个日历表格,表格中包含了这个月的所有日期,以及对应的星期几。
具体来说,这个程序的实现包含了以下几个步骤:
1. 首先,程序会使用 scanf() 函数从标准输入流中读取用户输入的年份和月份,存储到对应的变量中。
2. 然后,程序会根据输入的年份和月份计算出这个月有多少天。具体来说,如果这个月是 2 月,程序会判断这一年是否是闰年,如果是闰年则这个月有 29 天,否则这个月有 28 天;如果这个月是 4、6、9 或 11 月,则这个月有 30 天;否则这个月有 31 天。
3. 接下来,程序会计算这个月的第一天是星期几。具体来说,程序会先计算出这一年的第一天是星期几,然后根据这个月之前的所有天数,计算出这个月的第一天是星期几。
4. 最后,程序会输出一个日历表格。表格的第一行是星期几的标识,接下来的每一行都包含了一个星期的日期,如果这一行的日期已经到达了这个月的最后一天,则换行输出下一个星期的日期。
需要注意的是,这个程序没有对用户输入的年份和月份进行错误检查。如果用户输入了无效的年份或月份,程序可能会产生意料之外的结果。
相关问题
计算任何一个日期对应的教学周,以及星期几。从键盘输入某学期第1周周一的日期,以及该学期中的某个日期,输出这个日期对应的教学周,以及星期几。学期可能跨年,全年的任何一个周一都可能是第1周,学期教学周长度不限,需要考虑闰年的问题。要求: (1)在程序内部添加必要的注释(至少3处) (2)输入输出要有文字说明 (3)main主函数尽可能只有函数调用语句
好的,以下是代码实现和注释:
```c
#include <stdio.h>
#include <stdlib.h>
// 判断某一年是否为闰年
int isLeapYear(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return 1;
} else {
return 0;
}
}
// 计算某个日期是一年中的第几天
int getDayOfYear(int year, int month, int day)
{
int daysInMonth[] = {0,31,59,90,120,151,181,212,243,273,304,334};
int dayOfYear = daysInMonth[month - 1] + day;
if (month > 2 && isLeapYear(year)) {
dayOfYear += 1;
}
return dayOfYear;
}
// 根据日期计算是星期几
int getWeekday(int year, int month, int day)
{
// 基姆拉尔森计算公式
int weekday = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400 + 1) % 7;
return (weekday + 6) % 7 + 1; // 转换为1-7的范围
}
int main()
{
// 输入第一周周一的日期
printf("请输入某学期第1周周一的日期(如2021年9月6日):");
int year1, month1, day1;
scanf("%d年%d月%d日", &year1, &month1, &day1);
// 输入要查询的日期
printf("请输入要查询的日期(如2021年10月1日):");
int year, month, day;
scanf("%d年%d月%d日", &year, &month, &day);
// 计算第一周的第一天是一年中的第几天
int dayOfYear1 = getDayOfYear(year1, month1, day1);
// 计算要查询的日期是一年中的第几天
int dayOfYear = getDayOfYear(year, month, day);
// 计算要查询的日期是第几周
int week = (dayOfYear - dayOfYear1) / 7 + 1;
// 计算要查询的日期是星期几
int weekday = getWeekday(year, month, day);
// 输出结果
printf("%d年%d月%d日是第%d周,星期%d。\n", year, month, day, week, weekday);
return 0;
}
```
输入格式要求为“xxxx年xx月xx日”,输出结果为“xxxx年xx月xx日是第x周,星期x”。
用c语言编写(9)编写程序,先输入-一个需要组合的整数,再输入3个用来组合的整数,若可以组合(每个数字至少使用1次),则输出所有组合的可能;若不存在组合,则输出无组合(10) 修改第9题的程序,对于有组合的搭配,只输出第1个组合(11)编写程序,假设30个学生的成绩都是50~100分,成绩随机生成,要求每行输出6个学生的成绩,并最后统计输出最高分、最低分和平均分(保留2位小数)(12)编写万年历程序,输入年、月,输出该月的日历表。输入年,输出该年的日历表。已知1900年1月1日是星期一
(9)代码如下:
```c
#include <stdio.h>
#include <stdbool.h>
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void combination(int arr[], int n, int m, int result[], int pos) {
if (m == 0) {
printArray(result, pos);
return;
}
for (int i = n - 1; i >= m - 1; i--) {
result[m - 1] = arr[i];
combination(arr, i, m - 1, result, pos + 1);
}
}
int main() {
int n, m;
printf("请输入需要组合的整数:");
scanf("%d", &n);
printf("请输入用来组合的三个整数:");
int arr[3];
for (int i = 0; i < 3; i++) {
scanf("%d", &arr[i]);
}
int result[3];
for (int i = 1; i <= 3; i++) {
combination(arr, 3, i, result, 0);
}
bool found = false;
for (int i = 0; i < 3; i++) {
if (n == arr[i]) {
found = true;
break;
}
}
if (found) {
printf("%d ", n);
}
for (int i = 1; i <= 3; i++) {
combination(arr, 3, i, result, 0);
for (int j = 0; j < i; j++) {
if (n == arr[j]) {
found = true;
break;
}
}
if (found) {
printArray(result, i);
break;
}
}
if (!found) {
printf("无组合\n");
}
return 0;
}
```
(10)修改后的代码如下:
```c
#include <stdio.h>
#include <stdbool.h>
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void combination(int arr[], int n, int m, int result[], int pos, bool *found) {
if (m == 0) {
if (*found) {
return;
}
printArray(result, pos);
*found = true;
return;
}
for (int i = n - 1; i >= m - 1; i--) {
result[m - 1] = arr[i];
combination(arr, i, m - 1, result, pos + 1, found);
}
}
int main() {
int n, m;
printf("请输入需要组合的整数:");
scanf("%d", &n);
printf("请输入用来组合的三个整数:");
int arr[3];
for (int i = 0; i < 3; i++) {
scanf("%d", &arr[i]);
}
int result[3];
bool found = false;
for (int i = 0; i < 3; i++) {
if (n == arr[i]) {
found = true;
printf("%d\n", n);
break;
}
}
for (int i = 1; i <= 3; i++) {
combination(arr, 3, i, result, 0, &found);
if (found) {
break;
}
}
if (!found) {
printf("无组合\n");
}
return 0;
}
```
(11)代码如下:
```c
#include <stdio.h>
#include <stdbool.h>
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void combination(int arr[], int n, int m, int result[], int pos, bool *found) {
if (m == 0) {
if (*found) {
return;
}
printArray(result, pos);
*found = true;
return;
}
for (int i = n - 1; i >= m - 1; i--) {
result[m - 1] = arr[i];
combination(arr, i, m - 1, result, pos + 1, found);
}
}
int main() {
int n, m;
printf("请输入需要组合的整数:");
scanf("%d", &n);
printf("请输入用来组合的三个整数:");
int arr[3];
for (int i = 0; i < 3; i++) {
scanf("%d", &arr[i]);
}
int result[3];
bool found = false;
for (int i = 0; i < 3; i++) {
if (n == arr[i]) {
found = true;
printf("%d\n", n);
break;
}
}
for (int i = 1; i <= 3; i++) {
combination(arr, 3, i, result, 0, &found);
if (found) {
break;
}
}
if (!found) {
printf("无组合\n");
}
return 0;
}
```
(12)代码如下:
```c
#include <stdio.h>
#include <stdbool.h>
bool isLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return true;
} else {
return false;
}
}
int daysInMonth(int year, int month) {
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && isLeapYear(year)) {
return 29;
} else {
return days[month - 1];
}
}
int daysInYear(int year) {
if (isLeapYear(year)) {
return 366;
} else {
return 365;
}
}
int daysFrom1900(int year, int month, int day) {
int days = 0;
for (int i = 1900; i < year; i++) {
days += daysInYear(i);
}
for (int i = 1; i < month; i++) {
days += daysInMonth(year, i);
}
days += day - 1;
return days;
}
int main() {
int year, month;
printf("请输入年份:");
scanf("%d", &year);
printf("请输入月份:");
scanf("%d", &month);
int days = daysFrom1900(year, month, 1);
int weekDay = (days + 1) % 7;
printf("日 一 二 三 四 五 六\n");
for (int i = 0; i < weekDay; i++) {
printf(" ");
}
int daysOfMonth = daysInMonth(year, month);
for (int i = 1; i <= daysOfMonth; i++) {
printf("%2d ", i);
if ((weekDay + i) % 7 == 0) {
printf("\n");
}
}
if ((weekDay + daysOfMonth) % 7 != 0) {
printf("\n");
}
return 0;
}
```
阅读全文