c语言程序题~!

2024-11-22 23:00:14
推荐回答(3个)
回答1:

第一个问题

/*--------------------------------------------------------------*/
#include "stdio.h"

int md[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /*每个月的天数*/
int year; /*年*/
int month; /*月*/
int day; /*日*/
int ad; /*要加上的天数*/

int IsLeapYear(int y); /*判断y是否闰年*/
void AddDay(int d); /*在日期上加上d天*/

int main()
{
printf("输入年:");
scanf("%d",&year);
while(year<1)
{
printf("\n输入错误,重新输入:");
scanf("%d",&year);
}
printf("输入月:");
scanf("%d",&month);
while(month<1 || month>12)
{
printf("\n输入错误,重新输入:");
scanf("%d",&month);
}
printf("输入日:");
scanf("%d",&day);
while(day<1 || day>( month==2 ? (IsLeapYear(year) ? 29:md[month-1]) : md[month-1]) )
{/*上面这句有些复杂,因为要判断这个月的天数,还有判断是否年*/
printf("\n输入错误,重新输入:");
scanf("%d",&day);
}
printf("输入要加上的天数:");
scanf("%d",&ad);
while(ad<1)
{
printf("\n输入错误,重新输入:");
scanf("%d",&ad);
}
printf("输入的日期是 %d年%d月%d日\n",year,month,day);
AddDay(ad); /*加上ad天*/
printf("加上%d天后是 %d年%d月%d日\n",ad,year,month,day);
}

int IsLeapYear(int y) /*判断是否闰年*/
{
if((y%400 == 0)||(y%4 == 0 && y%100 != 0))
return 1;
return 0;
}

void AddDay(int d)
{
if((day+d) <= md[month-1]) //如果加上d天后,还未超出本月
day = day+d;
else
{
//首先减去当月剩余的天数
if(IsLeapYear(year) && month == 2)
d -= (29-day);
else
d -= (md[month-1]-day);
month++;
if(month>12) {year++; month=1;} /*加上一个月后检查月份是否超出范围*/
//然后依次减去以后各个月的天数,直到不能再减为止
while( d > ( month==2 ? (IsLeapYear(year) ? 29:md[month-1]) : md[month-1]) )
{
if(IsLeapYear(year) && month == 2) //如果是闰年且是二月
d -= 29;
else
d -= md[month-1];
month++;
if(month>12){year++;month=1;}/*加上一个月后检查月份是否超出范围*/
}
day = d; //减剩的就是day
}

}
/*---------------------------------------------------------------*/

其实三个问题中第一个还比较复杂,其余两个相对简单,先给第一个的答案吧,占个位子,有空再来补上其余两个。
第一个程序经过我调试运行通过,测试没有什么问题,其实你可以加上任意大于0的天数,该程序都能得出正确结果。另外程序中的提示字符串我是用中文,因为VC++支持中文,如果你的编译器不支持中文(如TC),请你自己把中文字符串改为英文。
ps:非常痛恨百度知道的删除空格做法,原本很漂亮的程序变的面目全非了!!!

回答2:

1
4
3
2
8
6
5
7
3
7
2
5
4
8
6
1
原始的数组是这样的,算是个矩阵。
而你那个程序的作用是

矩阵的对角线上的数进行降序排。所以原先对角线上的1
6
2
1
就变成了6
2
1
1了。
变成了
6
4
3
2
8
2
5
7
3
7
1
5
4
8
6
1
6
就跑到了左上角。
而你程序的输出
只是输出
第一行。所以是
6
4
3
2

回答3:

1
4
3
2
8
6
5
7
3
7
2
5
4
8
6
1
二维数组第一次循环K=1
i=0
是a[0][0]与a[1][1]比较大小,如果a[1][1]>a[0][0]两者交换位置,显然a[1][1]>a[0][0]则两者位置交换,第二次循环a[1][1]与a[2][2]重复上面的算法第三次循环a[2][2]和a[3][3]重复上面算法。得到新的二维数组。
6
4
3
2
8
2
5
7
3
7
1
5
4
8
6
1
再输入第一行。
不知道这样说你明不明白。