程序员-C语言程序设计(一)
(总分35, 做题时间90分钟)
试题一
阅读以下说明和C语言函数,回答问题。
[说明]
   下面待修改的C程序完成的功能是:对于给定的一个长正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如,将该程序修改正确后,运行时若输入“14251382”,则输出的整数为“4532”。下面给出的C程序代码中有5个错误,请指出所有的错误。
   [C程序代码]
   01  #include  <stdio.h>
   02
   03  int main(    )
   04 
   05  long n, num;
   06  int  i;
   07
   08  do 
   09  printf("清输入一个正整数: ");
   10  scanf("%id", n);
   11  while(n<=0);
   12  k=1;
   13  for(i=1; n>=0; i++) 
   14  if(i io 2=1)
   15  Rum=num+(n%10)*k;
   16  k=k * 10;
   17 
   18  n=n/10;
   19 
   20  printf("新数据为: %d\n", num);
   21  return 0;
   22 
1. 
    该问题分值: 1
答案:变量k没有定义。
2. 
    该问题分值: 1
答案:变量num应初始化为0。
3. 
    该问题分值: 1
答案:第10行n之前应加取地址符号。
4. 
    该问题分值: 1
答案:第13行n应大于0。
5. 
    该问题分值: 1
答案:第14行if语句条件错误,应该将“=”改为“==”。
[解析] 本题中有如下5个错误:(1)变量k没有定义就使用。(2)变量num没有初始值就使用。(3)第10行输入变量时没有使用取地址符号。(4)第13行循环条件设置错误,造成无穷循环。(5)第14行误把赋值符号“=”当做关系运算符“等于”。
试题二
阅读以下说明和C程序代码,将程序补充完整。
[说明]
   下面C程序代码的功能是:对于输入的一个正整数n(100≤n<1000),先判断其是否是回
文数(正读反读都一样的数)。若不是,则将n与其反序数相加,再判断得到的和数是否为回文数,若还不是,再将该和数与其反序数相加并进行判断,依此类推,直到得到一个回文数为止。例如,278不是回文数,其反序数为872,相加后得到的1150还不是回文数,再将1150与其反序数511相加,得到的1661是回文数。
   函数int isPalm(long m)的功能是:将正整数m的各位数字取出存入数组中,然后判断其是否为回文数。若m是回文数则返回1,否则返回0。
   [C程序代码]
   #include<stdio.h>
   #include<stdlib.h>
   int isPalm(long m)
   
   int i=0, k=0;
   char str[32];
   while(m>0)
   str[k++]=  (1)  +'0';
   m=m/10;
   
   for(i=0; i<k/2; i++)
   if(str[i]!=str[  (2)  ])return 0;
   return 1;
   
   int main(    )
   
   long n, a, t;
   printf("input a positive integer: "); scanf("%ld", &n);
   if(n<100||n>=1000)return -1;
   while(  (3)  )
   printf("%id->", n);
   for(a=0, t=n; t>0; )
   a=  (4)  *10+t%10; t=t/10;
   n=  (5)  ;
   printf("%id\n", n);
   system("pause"); return 0;
1. 
    该问题分值: 1
答案:m%10或其他等价形式
2. 
    该问题分值: 1
答案:k-i-1
3. 
    该问题分值: 1
答案:!isPalm(n),或isPalm(n)!=1或isPalm(n)==0
4. 
    该问题分值: 1
答案:a
5. 
    该问题分值: 1
答案:n+a
[解析] 函数isPalm(long m)的功能是判断m是否为回文数,其方法是将m的各位数字依次取出并转换为对应的数字字符保存在数组str中,然后再判断str中的字符中序列是否对称。将m的个位数取出可以采用如下公式“m%10”,即对10取余数。所以(1)处应为m%10或其他等价形式。若判断数组str中的字符序列是否对称,即比较str(i)与str(k-1-i)是否相等,所以(2)应为k-1-i。函数isPalm(long m)的功能是判断m是否为回文数,(3)处应该是对它的调用,同时取反,即“!isPalm(n)”。(4)处为“a”,(5)处应该是数n与反序数a相加得到的新数,即“n+a”。
试题三
阅读以下说明和C语言函数,填补空缺。
[说明]
   已知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;
一个完整的c语言程序   /*计算从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;
   
1. 
    该问题分值: 1
答案:days=days+1或其他等价形式
2. 
    该问题分值: 1
答案:date==5或其他等价形式
3. 
    该问题分值: 1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。