【项目任务】
有一个一维数组,内放10个学生成绩。编写一个程序,求出平均分、最高分和最低分。
【设计思路】
编写一个函数,实现求平均分和最高、最低分。平均分通过函数返回值传递,最高、最低分通过全局变量传递。
【程序代码】
#include <stdio.h>
float max=0,min=0;
float average(float array[],int n)
{
int i;
float aver,sum=array[0];
max=min=array[0];
for(i=1;i<n;i++)
{
if(array[i]>max)max=array[i];
else if(array[i]<min)min=array[i];
sum=sum+array[i];
}
aver=sum/n;
return(aver);
}
main()
{
float ave,score[10];
int i;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
ave=average(score,10);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);
}
【运行结果】
80 90.5 60 80 59 79 69 87 82 80
max= 90.50
min= 59.00
average= 76.65
【知识拓展】
语句float max=0,min=0;定义了两个全局变量,这两个变量在主函数和其他函数中均可见。但如果在函数中重新定义同名变量,可以覆盖它们。本程序中使用全局变量,原因是主函数中要求3个数值,而函数只能返回一个数值,使用全局变量可以获得另外两个数值,它们在函数返回时不会销毁,从而在主函数中可以输出数值。
【项目任务】
输入两个日期,求出它们之间相差的天数。
【设计思路】
如果输入的两个日期不是同一年,则先计算第一年的天数,然后计算中间年份包含的天数,再加上最后一年包含的天数。如输入19900430~20030916,然后先计算19900430年底的天数,再计算1991年初~2002年底的天数,再计算2003年初到20030916的天数。
【程序代码】
#include <stdio.h>
char daysofmon[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/*某日是该年的第几天*/
int daysofyear(short year,short mon,short day)
{
int i, days;
/*如果是闰年,则这年2月有29天*/
if(year%400==0||(year%4==0&&year%100!=0))
daysofmon[1]=29;
else
daysofmon[1]=28;
days=0;
for(i=0;i<mon-1;i++)
days+=daysofmon[i];
days+=day;
return days;
}
/*日期格式,20030916 */
long days_num(long startrq,long endrq)
{
short startyear=(short)(startrq/10000);
short endyear=(short)(endrq/10000);
short mon,day;
long days=0L;
mon=(short)((endrq%10000)/100);
day=(short)((endrq%10000)%100);
days+=daysofyear(endyear,mon,day );
mon=(short)((startrq%10000)/100);
day=(short)((startrq%10000)%100);
/*如果输入的两个日期是同一年,则计算从年初到endrq的天数,减去从年初到startrq的天数*/
if(startyear==endyear)
{
days-=daysofyear(startyear,mon,day);
days+=1;
return days;
}
else
/*如果输入的两个日期不是同一年,则先计算第一年的天数,然后计算中间年份包含的天数,再加上最后一年包含的天数。如19900430-20030916,则先计算19900430-1990年底的天数,然后计算1991年初至2002年底的天数,再计算2003年初到20030916的天数*/
{
if(startyear%400==0||(startyear%4==0 && startyear%100!=0))
days+=366-daysofyear(startyear,mon,day);
else
days+=365-daysofyear(startyear,mon,day);
days+=1;
}
for(short i=startyear+1;i<endyear;i++)
{
if(i%400==0 || (i%4==0 && i%100!=0))
days+=366;
else
days+=365;
}
return days;
}
main()
{
long temp,startrq=20030701,endrq=20030917;
printf("please input the start date(eg:20030102):\n");
scanf("%ld",&startrq);
printf("please input the end date(eg:20030102):\n");
scanf("%ld",&endrq);
if(startrq>endrq)
{
temp=startrq;
startrq=endrq;
endrq=temp;
}
printf("%ld-%ld:%ld\n",startrq,endrq,days_num(startrq,endrq));
}
【运行结果】
please input the start date(eg:20030102):
20051113
please input the end date(eg:20030102):
20070704
20051113-20070704:599
【知识拓展】
这个题目也是通过分析问题的求解步骤,运用函数对总体功能进行分解。如求某天到年初的天数是常用的一个独立功能,所以将它放到一个函数daysofyear( )中以供调用。而days-num( )函数负责计算两个日期之间的时间,其中多次调用daysofyear( )函数。而主函数只负责接收输入的时间,调用函数计算出相差的时间,再输出即可,形式很简洁。如果将程序的总体功能划分清楚,每个函数完成自己的一部分任务,编写起来思维也会清晰。
从给出的典型例子可以看出,一个较大的程序一般应分为若干个程序模块,每一个模块实现一个特定的功能。所以,高级语言中都有子程序这个概念,用子程序实现模块的功能。在C语言中,子程序的作用是由函数完成的。
一个C语言程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数之间也可以相互调用,还可以调用自身。通过函数的调用,可以使程序的主干结构更加清晰,功能划分更明显。所以,函数是实现程序结构化的有效途径。