您的位置: 网站首页 > 程序开发 > C语言程序设计案例教程 > 第七章 函数程序设计 > 【7.4 局部变量和全局变量案例】

7.4 局部变量和全局变量案例

 

7.4  局部变量和全局变量案例

案例7.7  学生成绩

【项目任务】

有一个一维数组,内放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个数值,而函数只能返回一个数值,使用全局变量可以获得另外两个数值,它们在函数返回时不会销毁,从而在主函数中可以输出数值。

案例7.8  计算天数

【项目任务】

输入两个日期,求出它们之间相差的天数。

【设计思路】

如果输入的两个日期不是同一年,则先计算第一年的天数,然后计算中间年份包含的天数,再加上最后一年包含的天数。如输入1990043020030916,然后先计算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语言程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数之间也可以相互调用,还可以调用自身。通过函数的调用,可以使程序的主干结构更加清晰,功能划分更明显。所以,函数是实现程序结构化的有效途径。