2022年山西省忻州市全国计算机等级考试C语言程序设计真题(含答案)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2022年山西省忻州市全国计算机等级考试C语言程序设计真题(含答案) 学校:________ 班级:________ 姓名:________ 考号:________
一、2.填空题(10题)
1.下列程序的功能:对输入的一行字符中的数字字符的字面值累加,输出此累加和,请填空。

#include<stdio.h>
#include<ctype.h>
main()
{ char c;
int a,s=0;
while(______)
if(isdigit(c))
{a=c-'0';s+=a;}
printf("s=%d",s);
}
2. 下列程序将二维数组a的行和列元素互换后存放到另一个二维数组b 中。

请填空。

main()
{ int a[2][3]={ {1,2,3},{4,5} }, b[3][2],i,j;
for(i=0;i<2;i++)
{ for(j=0; j<3;j++)
}
}
3. 一般来说,算法可以用顺序、选择和______三种基本控制结构组合而成。

4. 以下程序的功能是建立一个带有头结点的单向链表,链表结点中的数据通过键盘输入,当输入数据为-1时,表示输入结束(链表头结点的data域不放数据,表空的条件是ph->next==NULL),请填空。

#include<stdio.h>
struct list { int data; struct list *next;};
struct list*creatlist()
{ struct list *p,*q,*ph;int a;ph=(struct list *)malloc (sizeof(struct list));
p=q=ph;printf("Input an integer number; entre-1 to end:\n");
scanf("%d",&a);
while(a!=-1)
{ p=(struct list*)malloc(sizeof(struct list));
【】=a;q->next=p;【】=p;scanf("%d",&a);}
p->next=′\0;return(ph);}
main()
{struct list * head; head=creatlist();}
5. 队列是限定在表的一端进行插入和在另一端进行删除操作的线性表。

允许插入的一端称作______。

6. 若有以下程序
main()
{ char a;
a='H'-'A'+'0';
printf("%c\n",A) ;
}
执行后输出结果是【】。

7. 以下程序中函数fun()的功能是构成一个如图所示的带头结点的单向链表,在结点的数据域中放入了具有两个字符的字符串。

函数disp的功能是显示输出该单向链表中所有结点中的字符串。

请填空完成函数disp。

#include <atdio.h>
typedef struct node /*链表结点结构*/
{ char sub[3];
struct node * next;
} Node
Node ~un(char s) /*建立链表*/
{......}
void disp(Node * h)
{ Node * Ps
p=h->next;
while(【】)
{ printf("%s\n",p->suh);p= 【】;}
}
main( )
{ Node * hd;
hd = fun( ); disp(hd) ;prinff(" \n" );
8. 在一个容量为25的循环队列中,若头指针front=16,尾指针rear=9,则该循环队列中共有【】个元素。

9. 以下函数sstrcat()的功能是实现字符串的连接,即将t所指字符串复
制到s所指字符串的尾部。

例如:s所指字符串为abed,t所指字符串为efgh,函数调用后s所指字符串为abodefgh。

请填空。

#include <string.h>
void sstrcat(char *s,char *t)
{int n;
n=strlen(s);
while(*(s+n)=【】){s++;t++;}
}
10. 以下程序的功能是输出如下形式的方阵:
13 14 15 16
9 10 11 12
5 6 7 8
1 2 3 4
请填空。

#include <stdio.h>
main( )
{ int i,j,x;
for(j =4;j 【】;j--)
{ for(i = 1 ;i<=4;i++)
[ x=(j-1) *4+【】;
printf( "%4d" ,x);
}
printf(" \n" );
}
二、单选题(10题)
11. 有以下程序#include<stdio.h>main(){int a[]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a+5,*q=NULL;*q=*(p+5);
printf("%d%d\n",*p,*q);}程序运行后的输出结果是______。

A.运行后报错
B.6 6
C.611
D.510
12.
13.设有二维数组A7×8,每个数据元素占8个字节存储单元,顺序存放,A第一个元素A0,0的存储地址为1000,数组A的最后一个元素A6,7的存储地址为()。

A.1024
B.1440
C.1448
D.1432
14.设有定义:
char c[ ]=“Cc”;
FILE *fp;
且fp指向以“w”的方式成功打开的文件,若要将c中的两个字符写入文件,且每个字符占一行,则下面的选项中正确的是()。

A.fprintf(fp,“%c\n%c\n”,c[0],c[1]);
B.fprintf(fp,“%c\r\n%c\r\n”,c[0],c[1]);
C.fprintf(fp,“%c %c”,c[0],c[1]);
D.fprintf(fp,“%s\n”,c);
15.C语言中,组成数据文件的成分是()。

A.A.记录
B.数据行
C.数据块
D.字符(字节)序列
16.下列叙述中正确的是
A.为了建立一个关系,首先要构造数据的逻辑关系
B.表示关系的二维表中各元组的每一个分量还可以分成若干数据项
C.一个关系的属性名表称为关系模式
D.一个关系可以包括多个二维表
17.若变量均已正确定义并赋值,以下合法的C语言赋值语句是( )。

A.x=y==5;
B.X=n%2.5:
C.x+n=i;
D.x=5=4+1:
18. 需求分析最终结果是产生
A.项目开发计划
B.需求规格说明书
C.设计说明书
D.可行性分析报告
19.算法的有穷性是指
A.算法程序的运行时间是有限的
B.算法程序所处理的数据量是有限的
C.算法程序的长度是有限的
D.算法只能被有限的用户使用
20.对包含N个元素的散列表进行检索,平均检索长度________
A.为o(log2N)
B.为o(N)
C.不直接依赖于N
D.上述三者都不是
三、程序设计题(10题)
21.
请编写函数proc(),该函数的功能是:将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。

例如,若二维数组中的数据为:13233343 14243444 15253545 则一维数组中的内容应该是13 23 33 43 14 24 34 44 15 25 35 45。

注意:部分源程序给出如下。

请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。

试题程序:
22.下列程序判断字符串s是否对称,对称则返回1,否则返回0;如
f("abba")返回1,f("abab")返回0。

23.N名学生的成绩已在主函数中放人一个带头节点的链表结构中,h指向链表的头节点。

请编写函数fun,其功能是:求出平均分,并由函数值返回。

例如,若学生的成绩是:85 76 69 85 91 72 64 87,则平均分应当是:78.625。

注意:部分源程序在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填人你编写的若干语句。

24. 有一个一维数组,内放10个学生成绩,写一个函数,求出平均分。

25.
数组point中存放着m个人的成绩,请编写函数fun().它的功能是:返回高于平均分的人数,并将高于平均分的分数放在high所指的数组中。

例如,当point数组中的数据为50,60,65,70.75,80.88,90,95时,函数返回的人数应该是5,high中的数据应为75,80,88,90,95。

请勿改动main()函数与其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。

注意:部分源程序给出如下。

试题程序:
26.n个人的成绩存放在score数组中,请编写函数proc(),它的功能是将低于平均分的人数作为函数值返回,将低于平均分的分数放在down 所指的数组中。

例如,当score数组中的数据为{99,80,40,56,59,84,60,76,100}时,函数返回的人数应该是4,down中的数据应为
40565960。

注意:部分源程序给出如下。

请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。

试题程序:
27.请编写函数proc(),该函数的功能是:删去一维数组中所有相同的数,使之只剩一个。

数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如,若一维数组中的数据是:
1122234 4566667 7 8
99101010 10
删除后,数组中的内容应该是:
123 45678910
注意:部分源程序给出如下。

请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括
号中填入所编写的若干语句。

试题程序:
28.使用VC++2010打开考生文件夹下prog1中的解决方案。

此解决方案的项目中包含一个源程序文件prog1.c。

在此程序中,请编写函数fun(),其功能是将M行N列的二维数组中的数据,按列的顺序依次存放到一维数组中,将一维数组中数据的个数存放在形参n所指的存储单元中。

注意:部分源程序给出如下。

请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。

试题程序:
#include <stdio.h>
void fun (int (*s) [10] , int *b, int *n, int mm, int nn)
{
}
main ()
{
int w[10][10]={{33,33,33,33},{44,44,44,44 }, {55,55,55,55}},i,j;
int a[100]={0},n=0;
printf(“The matrix:\n”);
for (i=0;i<3;i++)
{
for(j=0;j <4;j ++)
printf (“%3d”,w[i][j]);
printf (“\n”);
}
fun(w,a, &n,3,4);
printf(“The A array:\n”);
for(i=0;i<n;i++)< p=""></n;i++)<>
printf(“%3d”,a[i]);
}
29.请编写函数proc,其功能是:将str所指字符串中除下标为偶数、同时ASCIl码值为奇数的字符外,其余的字符都删除,串中剩余字符所形成的一个新串放在t所指的数组中。

例如,若str所指字符串中的内容为ABCDEFGl2345,其中字符B的ASCIl码值为偶数,所在元素的下标为奇数,因此必须删除;而字符A的ASCIl码值为奇数,所在数组中的下标为偶数,因此不应当删除。

依此类推,最后t所指的数组中的内容应是ACEG。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括号中填人所写的若干语句。

试题程序:
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
void proc(char*str,char t[])
{
}
void main
{
char str[100],t[100];
system("CLS");
printf("\nPlease enter string str:");
scanf("%S",str);
proc(str,t);
printf("\nThe result iS:%s\n",t);
30.请编写一个函数voidproc(char*str),其功能是:将字符串str中所有下标为偶数位置上的字母转化为大写(若该位置上不是字母,则不转换)。

例如,若输入字符串:“thankyou6verymuch”,则应输出:“TbAnKYoU6vErYMuCh”。

注意:部分源程序给出如下。

请勿改动main ()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。

试题程序:
四、2.程序修改题(10题)
31. 下列给定的程序中,函数fun()的功能是:用选择法对数组中的n个元素按从大到小的顺序进行排序。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:
#include<stdio.h>
#define N 20
void fun(int a[ ],int n)
{
int i,j,t,p;
/*************found*************/
for(j=0;j<n-1;j++) ;
{
p=j;
for(i=j;i<n;i++)
if(a[i)>a[p])
p=i;
t=a[p];
a[p]=a[i];
/*************found**************/
a[p]=t;
}
}
main()
{
int a[N]={11,32,-5,2,14},i,m=5;printf(“排序前的数据:”);
for(i=0;i<m;i++)
printf(“%d”,a[i]);
printf(“\n”);
fun(a,m);
printf(“排序后的顺序:”);
for(i=0;i<m;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
32. 给定程序MODll.C中函数fun的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。

高位仍在高位,低位仍在低位。

例如,当s中的数为:87653142时,t中的数为:7531。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
33. 下列给定程序中,函数fun()的功能是:在字符串str中找出ASCII 码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后
顺序移动。

例如,调用fun()函数之前给字符串输入ABCDeFGH,调用后字符串中的内容为eABCDFGH。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:
#include<stdio.h>
/***************found************/
fun(char *p)
{ char max, *q;int i=0;
max=p[i];
while (p[i]!=0)
{if (max<p[i])
{
/***************found************/
p = q +i;max=p[i];
}
i++;
}
/***************found************/
while (q<p)
{*q=*(q-1);
q--;
}
p[0]=max;
}
main()
{ char str[80];
printf("Enter a string: "); gets(str);
printf("\nThe original string: ");
puts(str);
fun(str);
printf("\nThe string after moving: ");
puts(str); printf("\n\n");
}
34. 下列给定程序中,函数fun()的功能是:求出以下分数序列的前n项之和。

2/1,3/2,5/3,8/5,13/8,21/13,……
和值通过函数值返回main()函数。

例如,若输入n=5,则应输出8.391667。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:
#include <conio.h>
#include <stdio.h>
/*************found**************/
fun (int n)
{ int a=2,b=l,c, k;
double s=0.0;
for(k=l;k<=n;k++)
{s=s+l.0*a/b;
/*************found**************/
c=a; a+=b; b+=c;
}
return (s);
}
main ()
{ int n=5;
clrscr ();
printf("\nThe value of function is:
%1f\n", fun (n));
}
35. 给定程序MODll.C中函数fun的功能是:统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数;并把该整数中各位上最大的数字值作为函数值返回。

例如,若输入无符号整数30800,则数字
值为零的个数为3,各位上数字值最大的是8。

请改正函数fun中指定部位的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
36. 给定程序MODll.C中函数fun的功能是:求出以下分数序列的前n项之和。

和值通过函数值返回到main函数。

例如,若n=5,则应输出:8.391667。

请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
37. 给定程序MODll.C中函数fun的功能是:输出M行M列整数方阵,然后求两条对角线上元素之和,返回此和数。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
38. 已知一个数列从第0项开始的前三项分别为0,0,1,以后的各项都是其相邻的前三项之和。

给定程序MODll.C中函数fun的功能是:计算并输出该数列前n项的平方根之和。

n的值通过形参传入。

例如,当n=10时,程序的输出结果应为:23.197745。

请改正程序中的错误,使程序能输出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
39. 下列给定程序中函数fun()的功能是:将长整型数中每一位上为偶数的数依次逆向取出,构成一个新数放在t中。

高位在低位,低位在高位。

例如当s中的数为25846513时,t中的数为6482。

请改正函数fun()中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:
#include <stdio.h>
#include <conio.h>
void fun(long S,long *t)
{
int d;
long sl=l,i=1;
*t=0;
while(s/i>0)
i=i*10;
i=i/10;
while(s>0)
{
d=s/i
/*************found*************/ if(d%2!=0)
{
/*************found*************/ t=d*sl+t;
sl*=l0;
}
S=S%i;
i=i/10;
}
}
main()
{
long S,t;
clrscr();
printf("\nPlease enter S:");
scanf("%ld",&s);
fun(S,&t);
printf("The result is:%ld\n",t);
40. 下列给定程序中,函数fun()的功能是:输出M行N列整数方阵,然后求两条对角线上的各元素的平方和,返回此和数。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:
#include <conio.h>
#include <stdio.h>
#define M 5
int fun(int n,int XX[][M])
{
int i,j,sum=O;
printf("\nThe %d x %d matrix:\n",M,M);
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
/*************found*************/
printf("%4d",XX[i j]);
/*************found*************/
printf('\n');
}
for(i=0;i<n;i++)
sum+=xx[i][i]*XX[i][i]+XX[i][n-i-1]
*XX[i][n-i-1];
return(sum);
main()
{
int aa[M][M)={{3,12,4,24,35},
{11,3,3,7,56},{61,27,58,49,24},
{17,28,7,36,85},{15,33,5,24,9}};
clrscr();
printf("\nThe result of all elements on 2
diagnals iS%d",fun(M,aa));
}
五、程序改错题(2题)
41.下列给定程序中,函数proc()的功能是:将m(1≤m≤10)个字符串反着连接起来,组成一个新串,放入pt所指字符串中,例如,把“ab、cd、ef9”3个字符串反着串连起来,结果是efgcdab。

请修改程序中的错误,使它能得出正确的结果。

注意:不要改动main()函数,不得增行或者删行,也不得改变程序的结构!
试题程序:
42.下列给定程序中函数fun()的功能是:把从主函数中输人的3个数。

最大的数放在a中,中间的数放在b中,最小的数放在C中。

例如,若输入的数为:55,12,34,输出的结果应当是:a=55.0,b=34.0,c=12.0。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构! 试题程序:
六、操作题(2题)
43.请补充main()函数,该函数的功能是:从键盘输入一个长整数,如果这个数是负数,则取它的绝对值,并显示出来。

例如,输入:-123456,结果为:123456。

注意:部分源程序给出如下。

请勿改动main()函数和其他函数中的任何内容,仅在横线上填入所编写的若干表达式或语句。

试题程序:
44.使用VC++打开考生文件夹下modi1中的解决方案。

此解决方案的项目中包含一个源程序文件modi1.c。

在此程序中,函数fun()的功能是求出s所指字符串中最后一次出现的t所指字符串的地址,并将此地址通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到,则函数值为NULL。

例如,当字符串中的内容为“abcdabfabcdx”,t中内容为“ab”时,输出结果应是“abcdx”。

当字符串中的内容为“abcdabfabcdx”,t中内容为“ abd”时,则程序输出未找到信息“Not found!”。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
char * fun (char *s, char *t)
{
char * p, * r, * a;
/********* found *********/
a=Null;
while(*s)
{
p=s; r=t ;
while ( * r)
/********* found *********/
if (r==p)
{ r++; p++; }
else break;
if ( * r=='\0') a=s;
s ++; }
return a;
}
void main ()
{
char s[l00],t[100], *p;
system(“CLS”);
printf (“\nPlease enter string s:”);
scanf(“%s”,s);
printf(“\nPlease enter substring t:”);
scanf (“%s”,t);
p=fun (s, t);
if(p)
printf (“\nThe result is: %s\n”, p);
else
printf (“\nNot found!\n”);
}
参考答案
1.
分析题目可知,程序中运用函数c=getchar()从标准输入设备读取下一
个字符,而且是一行的字符(即没有换行),所以条件为
(c=getchar())!='\\n'。

\r\n
\r\n
2.b[j][i]=a[i][j]b[j][i]=a[i][j] 解析:本题考查二维数组的基本知识。

它是要将一个二维数组,的行和列元素互换后存放到另一个二维数组b中,只要将数组a的行标和列标互换,然后赋给数组b即可。

3.循环循环解析:算法一般由顺序,选择和循环三种基本控制结构组合而成。

4.p->data qp->data , q 解析:本题考查的是链表这一数据结构对结构体变量中数据的引用。

链表的特点是结构体变量中有两个域,一个是数据,另一个是指向该结构体变量类型的指针,用以指明链表的下一个结点。

5.队尾队尾解析:在队列中,允许插入的一端叫做“队尾”,允许删除的一端叫做“队头”。

6.77 解析:字符型数据可作为整型参加算术运算,其值为其对应的ASCII码。

'H'-'A',的结果是7,加'0'后是'7'的ASCII码,所以输出的是字符'7'。

7.p! =NULL或P或p! =0或p! ='0' p->next或(*p).nextp! =NULL或P或p! =0或p! ='0' \r\np->next或(*p).next 解析:程序中定义了一个结构体类型名Node,其中定义了一个指向结点类型的指针next。

接下来用Node定义了头结点指针变量h和指向第一个结点的指针变量p,在满足p未指向最后一个结点的空指针时(即为NULL),输出p所指向结点的
字符串,所以第一处应填p! = NULL,然后将p指向下一个非空结点,所以第二处应填P->next或与其等效的形式,反复执行直到所有的结点都输出。

8.1818 解析:设循环队列的容量为n。

若rear>front,则循环队列中的元素个数为rear-front;若rear<front,则循环队列中的元素个数为n+(rear-front)。

题中,front=16,rear=9,即rear<front,所以,循环队列中的元素个数为m+(rear-front)=25+(9-16)=18。

9.*t*t 解析:函数中首先让n=strlen(s),所以while循环的循环条件表达式中*(s+n)指向字符串s的结束标志'\\0'处,而该处应该等于字符串t的第1个字符,另外循环体中让s和t指向下一个字符,即s+n和t同时被移动到下一个位置,所以该处应该填*t,即t所指内容。

当t指向字符串结束标志'\\0'的时候,整个循环条件表达式的值也为0(“假”)了,循环结束。

正好满足将t所指字符串复制到s所指的字符串的尾部。

10.>=1或>0 i>=1或>0 \r\ni 解析:程序的外层for循环控制输出数据的行数,故第一处填“>=1”或“>0”;内层循环控制每行输出的个数。

在内层for循环中,语句x=(j-1)*4+______;用于控制输出方阵中的具体数据,由于这些数据与其所在的行、列(j,i)具有x=(j-1)*4+i的关系,故第二处填i。

11.A解析:本题考核的知识点是通过指针引用数组的元素的方法.本题中首先定义了一个一维数组a并初始化,由于定义该数组的时候省略了长度,因此该数组的长度为初始化时候赋初值的个数即为12。

数组名a 代表数组的首地址,所以*p=a+5语句使得p指向数组的第6个元素,
而在程序中定义了一个指针q并让它指向空,实际上程序并没有在内存中为指针q开辟存储空间,这样给q赋值不允许的,故该程序运行后报错。

所以,4个选项中选项A符合题意。

12.A
13.B
14.A要写入字符数据,需要使用格式字符%c,选项D错误;换行符需要使用‘\\n’,而不是‘\\r\\n’,选项B错误;选项C中未使用换行符,不满足题意。

故本题答案为A选项。

15.D解析:C语言中的文件是流式文件。

流式文件是一种无结构文件,即整个文件是一串字符流或二进制流。

文件的存取以字符或字节为单位。

16.C解析:在格式化模型中,要事先根据应用的需要,确定数据之间的逻辑关系,即先对数据进行结构化。

在关系模型中,不需要事先构造数据的逻辑关系,只要将数据按照一定的关系存入计算机,也就是建立关系。

所以选项A错误。

对于一个表示关系的二维表,其最基本的要求是表中元组的每一个分量必须是不可分的数据项,即不允许表中再有表。

所以,选项B、D说法是错误的。

一个关系的属性名表称为关系模式,也就是二维表的表框架,相当于记录型。

因此,选项C说法正确。

17.AB选项中运算符“%”的运算对象为整数。

C选项中不能将变量赋给表达式“x+n”。

D选项中不能将表达式“4+1”赋给常量5。

故本题答案为A选项。

18.B解析:本题考核软件工程中的需求分析环节。

需求分析应交付的主要文档就是需求规格说明书。

19.A
算法的有穷性,是指算法必须能在有限的时间内做完,即算法必须能在执行有限个步骤之后终止。

20.C
21.
【解析】要将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,可以首先通过行循环,然后列循环取出二维数组中的每一个元素,并将其放入一维数组中,最后将一维数组的长度通过形参返回到主函数当中。

22.
23.
【考点分析】
本题考查:链表的操作,对链表的主要操作有以下几种:建立链表、结构的查找与输出、插入一个结点、删除一个结点。

【解题思路】
题目要求求链表中数据域的平均值,应首先使用循环语句遍历链表,
求各结点数据域中数值的和,再对和求平均分。

遍历链表时应定义一个指向结点的指针P,因为“头结点”中没有数值,所以程序中让P直接指向“头结点”的下一个结点,使用语句STREC+P=h÷next。

24.\nfloat average(float array[ ],int n)
\n{ int I;
\nfloat aver,sum=array[0];
\nfor(I=1;Isum=sum+array[I];
\naver=sum/n;
\nreturn(aver); }
\nmain
\n{ float ave,score[10];
\nint I;
\nfor(I=0;I<10;I++)
\nscanf('%f',&score[I]);
\nave=average(score,10);
\nprintf('%f\\n',ave); }
\n
25.
【解析】(1)该程序功能是返回高于平均分的人数。

它的解题思路可以分解为以下几步:求总分一求平均分一元素逐个与平均分比较一统计高于平均分的人数。

(2)从已给部分源程序的main()函数开始入手,核心函数fun(point,9,high)中的参数由题目可知,point存放着m个人的成绩,high存放着高于平均分的分数。

另外,根据point的定义,可知9为point数组中元素的个数,传给函数fun ee的参数n。

26.
【解析】要找到所有学生中成绩低于平均分数的人数,首先需要算出所有学生的平均成绩。

然后将所有学生的成绩与平均成绩相比较。

将低于平均分数学生的记录存放在新的数组中,并将低于平均分数的学生数返回给主函数。

27.
【解析】题目中要求删去一维数组中所有相同的数,使之只剩一个。

首先需要将字符串中的每一个字符与其后的一个字符相比较,相同则不做任何操作,不相同则将其放入新的字符串中。

最后将新的字符串中的字符个数返回给主函数。

28.void fun (int (*s)[10],int *b, int *n, int mm, int nn)
{
int i, j;
for(j = 0; j < nn; j++)/*将二维数组中的数据按列的顺序依次存入一维数组中*/
for(i= 0; i<="" p="">
{
b[*n]=*(*(s+i)+j);
*n=*n+1;/*通过指针返回元素个数*/
}
}
题目要求实现将二维数组元素存入一维数组。

使用for循环语句来控制二维数组元素的下标,同时使用指针变量配合操作。

可以用两个循环来处理问题,由于是按列的顺序取出,因此第1个循环用于控制列下标,第2个循环用于控制行下标。

29.void proc(char*str。

chart[3])
\n{
\nint i,j=0;
\nfor(i=0;str[i]! =\\O;i++)//从数组的第一个元素开始,到其最后一个\n{if(i%2= =0str[i]%2 1=o)//下标为偶数、同时ASCIl码值为奇数的字符\nt[j++]=str[i];} //如果成立,则把它放到t数组中
\nt[i]=\\o;//字符串结束标志为\\0
\n}
\n【解析】题目中要求将字符串str中下标为偶数,同时ASCIl码值为奇数的字符放在数组t中。

首先,需要检查字符串str中下标为偶数的字符其ASCIl码值是否为奇数,将符合要求的字符放在数组t中。

最后,为新的字符串数组添加结束符。

\n
30.
【解析】要将字符串str中下标为偶数位置上的字符转化为大写字母,首先应该判断字符串str中下标为偶数位置上的字符是否为小写字母,若是将其转化为大写字母.若不是不做任何变化。

31.(1)错误:for(j=0;j<n-1;j++);正确:for(j=0;j<n-1;j++) (2) 错误:a[p]=t 正确:a[j]=t;(1)错误:for(j=0;j<n-1;j++);正确:for(j=0;j<n-1;j++)\r\n(2)
错误:a[p]=t 正确:a[j]=t;解析:错误1:根据C语言语法,for循环中循环条件后不加分号,除非做空操作。

错误2:将两数进行交换的常用语句,借助第三个变量。

32.(1)*t=0;(2)if(d%2!=0)(1)*t=0;(2)if(d%2!=0) 解析:本题中函数的功能是依次取出为奇数的数。

该题的解题思路主要是判断数字中的每一位是否是奇数。

33.(1)错误:fun(char*p) 正确:void fun(char*p) (2) 错误:p=q+i;正确:q=p+i;(3) 错误:while(q<p) 正确:while(q>p)(1)错误:fun(char*p) 正确:void fun(char*p)\r\n(2) 错误:p=q+i;正确:q=p+i;\r\n(3) 错误:while(q<p) 正确:while(q>p) 解析:本题解答需要3个步骤:
(1) 找到字符串中ASCII码值最大的字符,并保存。

(2) 将该字符复制,并将该字符前面的字符串顺次后移。

(3) 将ASCII码值最大的字符赋给字符串的第1个字符。

找到ASCII码值最大的字符可以通过定义一个字符max,该字符初始时等于字符串的第1个字符,若字符串的下一个字符大于max,则将下一个字符赋给max,如此循环到字符尾,即可得到ASCII码值最大的字符,同时令指针q指向最大字符。

之后对最大字符前面的子串顺次后移,可采用while 语句实现。

此题需要熟练掌握和灵活应用C语言的字符与整型变量的关系以及字符串操作。

34.(1)错误:fun(int n) 正确:double fun(int n) (2)错误:c=a;a+=b;;b+=c;正确:c=a;a+=b;b=c;(1)错误:fun(int n) 正确:double fun(int n)\r\n(2)
错误:c=a;a+=b;;b+=c;正确:c=a;a+=b;b=c;解析:该题题干是著名的斐波拉契分数序列,所以循环条件应该是c=a;a+=b;b=c。

35.(1)if(t==0) (2)*zero=count;(1)if(t==0) (2)*zero=count;解析:本题中函数的功能是统计一个无符号整数中各位数字值为0的个数。

对无符号数进行截取,然后对每个数字进行判断并统计。

36.(1)double fun(int n) (2)s=s+(double)a/b;(1)double fun(int n) (2)s=s+(double)a/b;解析:本题中函数的功能是求出分数序列的前n 项之和。

首先根据题干中给出的公式推出每一项之间的关系,求出每一项的表达式,然后求得数列的和。

每一项的分母是前一项的分子,分子是前一项分子和分母的和。

37.(1)int fun(int nint xx[][M]) (2)printf(“%4d”xx[i][j]);(1)int fun(int n,int xx[][M]) (2)printf(“%4d”,xx[i][j]);解析:本题中函数的功能是输出M 行、M列正方阵,然后求两条对角线上各元素之和。

其中,假设矩阵行、列分别为i、j,那么对角线上的元素特点是主对角线上i=j,以及逆对角线j=M-i-1。

38.(1)double fun(int n) (2)return sum;(1)double fun(int n) (2)return sum;解析:本题中函数的功能是计算并输出该数列前n项的平方根之和sum。

解题思路首先根据题干求得每一项的值,然后再计算数列前n项的平方根之和。

39.(1)错误:if(d%2!=0) 正确:if(d%2==0) (2) 错误:t=d*s1+t;正确:*t=d*s1+*t;(1)错误:if(d%2!=0) 正确:if(d%2==0)\r\n(2) 错误:t=d*s1+t;正确:*t=d*s1+*t; 解析:错误1:偶数是能被2整除,而奇数是不能被。

相关文档
最新文档