阅读以下说明和C语言函数,将应填入(n)处。【说明】已知1900年1月1日是星期一,下面的函数count_5_13(int year)用于计算给定的年份year中有几个“黑色星期五”。“黑色星期五”指既是13日又是星期五的日期。函数count_5_13(int year)首先算出年份year的1月13日是星期几,然后依次计算每个月的13日是星期几,若是星期五,则计数。程序中使用了函数isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为1(或0)表示year是(或不是)闰年。【

题目

阅读以下说明和C语言函数,将应填入(n)处。

【说明】

已知1900年1月1日是星期一,下面的函数count_5_13(int year)用于计算给定的年份year中有几个“黑色星期五”。“黑色星期五”指既是13日又是星期五的日期。

函数count_5_13(int year)首先算出年份year的1月13日是星期几,然后依次计算每个月的13日是星期几,若是星期五,则计数。

程序中使用了函数isLeapYear(int year),其功能是判断给定年份是否为闰年,返回值为1(或0)表示year是(或不是)闰年。

【C语言函数】

int count_5_13(int year)

{

int date; /*date为0表示星期日,为1~6分别表示星期一至星期六*/

long days=0; /*days记录天数*/

int m,y,c=0; /*c用于表示黑色星期五的个数*/

if (year<1900) return-1;

/*计算从1900年1月1日起至给定年份year的1月13日间隔的天数*/

days=12;

for (y= 1900; y < year; y++) {

days +=365;

if (isLeapYear(y))(1);

}

date=((days%7) +1) %7; /*算出给定年份year的1月13日是星期几*/

c=((2)) ?1:0;

for(m=1;(3);m++) {

switch (m) {

case 1:case 3: case 5: case 7:case 8:case 10:case 12:

days=31; break;

case 4: case 6: case 9: case 11:

days=30; break;

case 2:days=28;

if((4)) days=29;

break;

}/*end of switch*/

date=((days%7)+ (5) )%7;

if (date==5) c++;

} /*end of for*/

return c;

}


相似考题
更多“阅读以下说明和C语言函数,将应填入(n)处。【说明】 已知1900年1月1日是星期一,下面的函数count_5_13 ”相关问题
  • 第1题:

    阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    [说明]

    编写一个函数,输入为偶数时,调用函数求1/2+?/+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n (利用指针函数)。

    [函数]

    include "stdio. h",

    main()

    {

    float peven (),podd (),dcall ();

    float sum;

    int n;

    while (1)

    {

    scanf("%d",&n);

    if (n>1)

    break;

    }

    if(n%2==0)

    {

    printf("Even="):

    (1);

    }

    else

    {

    pfinff("Odd=");

    (2);

    }

    printf("%f",sum);

    }

    float peven (int n)

    {

    float s;

    int i

    s=1;

    for(i=2;i<=n;i+=2)

    (3);

    return (s);

    }

    float podd (n)

    int n;

    {

    float s;

    int i;

    s=0;

    for(i=1 i<=n;i+=2)

    (4);

    return (s);

    }

    float dcall(fp,n)

    float (*fp) ();

    int n;

    {

    float s;

    (5);

    returu (s);

    }


    正确答案:(1)array+10 (2)array+1 (3)*p>*max (4)k=*max (5)*p=array[0]
    (1)array+10 (2)array+1 (3)*p>*max (4)k=*max (5)*p=array[0]

  • 第2题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。

    【函数2.1说明】

    递归函数sum(int a[], int n)的返回值是数组a[]的前n个元素之和。

    【函数2.1】

    int sum (int a[],int n)

    {

    if(n>0) return (1);

    else (2);

    }

    【函数2.2说明】

    有3个整数,设计函数compare(int a,int b,int c)求其中最大的数。

    【函数2.2】

    int compare (int a, int b, int c )

    { int temp, max;

    (3) a:b;

    (4) temp:c;

    }

    【函数2.3说明】

    递归函数dec(int a[],int n)判断数组a[]的前n个元素是否是不递增的。不递增返回 1,否则返回0。

    【函数2.3】

    int dec( int a[], int n )

    {

    if(n<=1) return 1;

    if(a[0]<a[1]) return 0;

    return (5);

    }


    正确答案:(1)a[n-1]+sum(an-1)或者a[0]+sum(a+1n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1n-1);
    (1)a[n-1]+sum(a,n-1)或者a[0]+sum(a+1,n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1,n-1); 解析:本题考查C语言函数和一些基本运算。
    下面我们分别来分析这几个函数。在函数2.1中,题目要求用此递归函数求数组前 n个元素之和。递归函数的特点是在函数体中不停地调用函数本身,只是将其函数的参数范围改变。题目中要求我们求数组前n个元素之和,我们可以这样理解,即前n个元素之和等于第n个元素加上前n-1个元素之和,现在的问题转化成如何求前n-1个元素之和。同样的道理,可以将求前n-1个元素之和转化成求前n-2个元素之和,直到这个数小于0。从函数2.1的代码中可以知道,在计算以前,首先判断n与0的关系,如果n小于0,说明数组中无元素,因此,返回0值;如果n大于等于0,说明数组中有元素,应该返回的结果是第n个元素加上前n-1个元素之和,而前n-1个元素之和是调用函数本身来计算的。因此,第(1)空和第(2)空的答案分别是a[n-1)+sum(a,n-1),return()。
    在函数2.2中,题目要求我们在三个数中取最大数,在数学中,我们从三个数中取最大数时,一般是首先拿其中两个数比较,取较大的数再与第三个数比较,再取其较大的数,这个数就是三个数中的最大数。从函数2.2的代码中知道,三个数a、b、c,两个整型变量temp与max。根据求三个数中最大数的数学过程和函数中已给出的代码可知,第(3)空处语句应该为temp=(a>b)?a:b,求得a、b中较大数并存放在变量temp中。第(4)空处语句为max=(temp>c)?temp:c。
    在函数2.3中,题目要求判断数组a[]的前n个元素是否是不递增的。不递增返回1,否则返回0。要判断前n个元素是否是不递增的,需要判断前n-1个元素是否是不递增的,以及第n个元素与第n-1个元素的关系。此处与函数2.1一样,用的都是递归函数,只是出口不同,在函数2.1中,只要数组中没有元素了,递归结束,这里只要第n个元素大于第n-1个元素,则返回0,递归结束。又由if(a[0]a[1])语句可知,在每次调用函数时,都将其数组中的第一个元素与第二个元素比较来作为递归的出口,如果结果为假,就说明数组的前面两项的关系是不递增的,在下次调用中不用再考虑第一项。因此第(5)空应该是dec(a+1,n-1)。

  • 第3题:

    试题三(共 15 分)

    阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


    正确答案:

  • 第4题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    【说明】

    有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

    【函数】

    main()

    {

    int number[20],n,m,i;

    printf("the total numbers is:");

    scanf("%d",&n);

    printf("back m:");

    scanf("%d",&m);

    for(i=0;i<=n-1;i)

    scanf("%d,",&number[i]);

    (1);

    for(i=0;i<=n-1;i)

    printf("%d,",number[i]);

    }

    move(array,n,m)

    int n,m,array[20];

    {

    int *p,array_end;

    array_end=(2);

    for(p=array[n-1];(3);p--)

    *p=(4);

    *array=array_end;

    m--;

    if(m>0) (5);

    }


    正确答案:(1)move(numbernm) (2)*(array[n-1]) (3)p>array (4)*(p-1) (5)move(arraynm)
    (1)move(number,n,m) (2)*(array[n-1]) (3)p>array (4)*(p-1) (5)move(array,n,m) 解析:本题考查数字顺序移动和数组的相关知识。
    从数据结构的角度出发,数字在数组中顺序移动,就是将数字一个一个往后搬,例如,将n-1位置的数字移到n位置,然后再把n-2位置的数字移到n-1位置,其实这是一个简单的数字移动。我们只需要取出第n个位置的数字并保存在一个临时变量中,然后,其他的就按顺序依次移动即可,直到一次整体移动完成,我们再从临时变量中取回数字并将其放在数组的第一个位置中。重复这个过程m次,整个数组就往后移动了m个位置。
    首先,我们来看一下主函数,在主函数里面声明了一个容量为20的整型数组 number[20]和其余3个整型变量,数组用来存储我们输入的待处理的数,而变量m、n分别用于存放我们要移动位置的个数和输入整数的个数。第一个循环语句用于n个整数的输入,第二个循环语句用于n个整数的输出,在这中间应该还有一个处理来完成将n个整数顺序向后移m个位置,并让最后m个数变成最前面的m个数这个功能,从下面的程序段我们知道,这里是调用函数muve(number,n,m)来完成的。因此,第(1)空填 move(nurnber,n,m),在调用时我们需要注意参数的传递。
    再来看move(array,n,m)函数,在此函数中,同样声明了一个容量为20的整型数组和 2个整型变量,另外还声明了一个指针变量p。由*array=array_end,结合第(2)空来看,这里是把数组中最后位置的数取出存放在array_end变量当中。因此,第(2)空应填 *(array[n-1])。
    第(3)空是常见的在循环语句中表示判断的语句,由于“p=array[n-1]”把数组最末的地址赋给了指针p,只要p的值大于数组的起始地址循环就可以继续,因此,第(3)空应填p>array。
    第(4)空要完成的任务是将数字后移,因此,第(4)空为*p-1。从程序来分析,数组每移动完成一次,m的值就减一,而现在只有移动m次的功能没有实现,因此,只要m值大于0,就调用函数自身来实现再次移动。因此,第(5)空填写move(array,n,m)进行递归调用。

  • 第5题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    [说明]

    已知r[1...n]是n个记录的递增有序表,用折半查找法查找关键字为k的记录。若查找失败,则输出“failure",函数返回值为0;否则输出“success”,函数返回值为该记录的序号值。

    [C函数]

    int binary search(struct recordtype r[],int n,keytype k)

    { intmid,low=1,hig=n;

    while(low<=hig){

    mid=(1);

    if(k<r[mid].key) (2);

    else if(k==r[mid].key){

    printf("succesS\n");

    (3);

    }

    else (4);

    }

    printf("failure\n");

    (5);

    }


    正确答案:(1) (low+hig)/2 (2) hig=mid-1 (3) returnmid (4) low=mid+1 (5) return 0
    (1) (low+hig)/2 (2) hig=mid-1 (3) returnmid (4) low=mid+1 (5) return 0 解析:折半查找法也就是二分法:初始查找区间的下界为1,上界为len,查找区间的中界为k=(下界+上界)/2。所以(1)应填“(low+hig)/2”。中界对应的元素与要查找的关键字比较。当kr[mid].key时,(2)填“hig=mid-1”;当k==r[mid].key时,(3)填“return mid”;当k>r[mid].key时,(4)填“low=mid+1”。如果low>hig时循环终止时,仍未找到需查找的关键字,那么根据题意返回0,即空(5)填“return 0”。

  • 第6题:

    ()阅读下列说明和C语言程序,将应填入 (n)处的语句写在答题纸的对应栏内。[说明]下面程序是一个带参数的主函数,其功能是显示在命令行中输入的文本文件内容。[C语言函数]#include"stdio.h"main(argc,argv) int argc; char *argv[]; { (1) ; if((fp=fopen(argv[1],”r’’))== (2) ) { printf(”file not open!\n”);exit(0);} while( (3) ) putchar( (4) ); (5); }


    正确答案:()
    (1)FILE *fp; (2)NULL  (3)!feof(fp)  (4)fgetc(fp)   (5)fclose(fp)
    从程序功能来看,程序中需要用到文件型指针变量中,而主函数体没有定义,所以(1)应该填写的是“FILE *fp;”。接下来的语句是标准的打开只读文本文件的语句,显示的是文件没打开,说明文件名不存在,也就是为“NULL”。接着的while循环语句中有两处空白。前一个空白是控制循环的条件,从程序功能来看,要将文本文件中的所有字符显示出来,这儿当然只能填写“不是文件尾则继续循环”,具体说,需要填写的是“!feof(fp)”。(4)出现在循环体中的语句中,该循环体的功能是从fp指向的文本文件中读取单个字符并显示在屏幕上,此处使用的是putchar函数,该函数的功能是将形参对应的字符显示在屏幕上,所以该处的空白就是要显示的字符,这个字符必须是从文本文件中读取的单个字符,完成这项工作的可以利用fgetc()函数,所以(4)填写的是“fgetc(fp)”。最后一句应当是关闭文件,所以(5)应填fclose(fp)。