二级C冲刺班上机复习材料.docx
《二级C冲刺班上机复习材料.docx》由会员分享,可在线阅读,更多相关《二级C冲刺班上机复习材料.docx(91页珍藏版)》请在冰豆网上搜索。
二级C冲刺班上机复习材料
上机考试考点总结
注意事项:
1.分值为程序填空30分+程序修改30分+程序设计40分
2.2008.4开始两大变化:
时间60分钟->90分钟
上机环境TC2.0->VC++6.0
上机填空的试题中常包含3个空缺需要填写,试题中用
“______数字_____”来提示在此处填写程序代码,需要填写的代码一般是程序运行的关键部分,因此需要考生理解整个程序流程。
特别要注意的是,只能在有数字标号的空缺处填写,不要试图改动程序行的顺序和其他的非空缺处填写。
改错的试题通常包含两个(或三个)错误需要修改,试题中用“******found******”来提示下一行(或下面第二行)有错。
错误的性质基本分语法错和逻辑错两种,也有些少量的试题把语句添加在下划线处。
特别要注意的是,只能在出错行上进行修改,不要改动程序行的顺序,更不要自己另编程序。
最后,在二级C语言程序设计上机考试编程中,要求完成一个独立的函数的编程。
本资料对上机考试题目划分为6大类,对每种类型的题目进行了分析。
1.对一维数组(排序)和字符串(指针)操作
该类型的题目在以往的机试中占有比例较大,约40%,考生应该对该知识点
做全面的复习和掌握,一维数组可以分成数值型和字符型,其中数值型数组的数据类型为整型和实型,字符串数组的数据类型为字符型,我们通常会把字符型数组叫做字符串,但是应该注意字符型数组与字符串之间是存在区别的,也就是‘\0’结束标识符问题。
在复习该部分时,考生应该注意掌握以下两个问题:
(1)对一维数组的操作
对一维数组操作时,不可避免的要访问相关的数组元素,在C语言中访问数组元素一般采用单层循环的方法进行遍历,假设数组长度为n,数组下标是在0到(n-1)之间的,考生应该牢固掌握在一维数组中求最大值、最小值、移动元素、查找特定值(通过具体数值或通过下标)、存储数组元素等的方法。
其中一个非常重要的操作一定要重视:
两种排序算法,冒泡排序额和选择排序,具体的过程和实现代码要求考生必须掌握。
(2)对字符串的操作(指针)
该类问题是每次考试的重点和难点,特别是将字符串同指针结合起来以后,难度就更大了。
考生在解决此类问题时应特别注意字符串的结束标志‘\0’,它不仅用来作为字符串的结束标志,而且对字符串进行操作时,它也是循环的结束标志。
考生在复习该部分的时候应该注意这样几个基本问题:
大小写字母的转换、奇偶数判别、添加或删除指定的字符和字符的移动。
此外,考生应该牢固掌握指针的特性及字符串操作函数的使用和实现方法,曾出现过考题要求考生自己编程完成字符串操作函数,特别是字符串连接函数和求子串函数,应当引起足够重视。
另外对于指针应该清楚指针的建立、遍历、添加或删除一个结点的操作代码。
2.数值计算
该类型的题目在历年的机试中占20%,考查的机率也非常高。
该类题目一般给定一个数列计算公式,然后要求考生编写一个函数实现求数列的前n
项的值、累加和或积,在解决该类问题时,首先重要的找到给定数列的变化规律,然后其变化规律来编写一个单层或者双层的循环来求相应的值。
在编写程序的过程中,往往还会用到一些数学函数,如sqrt()、fabs()、pow()等,考生应该牢固掌握math.h中一些常用的数学函数的用法和使用方法。
另外还应注意数据类型之间的区别,特别是float和int类型,不同的数据类型产生的运算结果是不一样的。
3.对结构体的操作
这部分对非计算机专业的学生来说是个难点,但以往的机试中,有17%的题目是属于该类型。
考生在复习这部分的时候,首先应该注意结构体成员的两种不同的引用方法:
结构体变量和指向结构体的指针,也就是结构体成员运算符‘.’和指向运算符‘->’,在编程的过程中,往往会涉及到结构体数组,其实这类数组除了数据类型是结构体外,其他的特性和普通数组是一样的,结构体除了定义、赋值和初始化以外,其他的操作和普通变量也是一样的,包括在结构体数组(记录)中进行查找、删除、求最大最小值等操作,我们应该用对待普通变量的方法来解决结构体的问题,这样的话,难度就大幅度的降低。
4.对二维数组的操作
该类问题在历年的机试中占16%,考生应该对二维数组的元素遍历方法、存储方式、矩阵转换等问题做重点掌握。
在C语言中,访问二维数组的数族元素一般采用双层循环的方法实现,因为二维数组具有两个下标:
行下标和列下标;二维数组可以按行或者按列转化成一维数组进行存储;对二维数组进行行列转换的时候,要将行下标和列下标进行互换。
考生还应该掌握上三角矩阵、下三角矩阵的特性,在考试中,矩阵的表达形式经常考到二维数组的坐标转换。
5.数制转换
该部分在以往的机试中占11%,包括两类问题:
一是整数合并,而是类型转换,例如对一个数的各位进行一系列的变化。
在复习该部分时,考生应该注意C语言中int、long、float、double类型数据所占的存储空间大小和精度,注意%(模)运算和/(整除)运算的特点,特别应该灵活的使用模运算与除法运算求数据相应位数上的数值,掌握强制类型转换的方法以及按规定的位数保留小数的方法。
6.素数
该部分在历年机试中占6%,考生应该牢固掌握素数的基本概念和判断素数的方法,特别要求考生注意整数1不是素数,所以在判断素数时应该从2开始,到(n-1)结束,能够除尽的不是素数,不能除尽的是素数。
判断素数是C语言中的一个基本算法,不仅会在程序填空和程序改错中也会有所涉及,应该重点复习。
C语言编程常见错误
1.书写标识符时,忽略了大小写字母的区别。
main()
{
inta=5;
Printf(“%d”,A);
}
2.忽略了变量的类型,进行了不合法的运算。
main()
{
floata,b;
printf(“%d”,a%b);
}
3.将字符常量与字符串常量混淆。
charc;
c=“a”;
4.忽略了“=”与“==”的区别。
if(a=3)……if(a==3)……
5.忘记加分号。
a=1
b=1
6.多加分号。
{
z=x+y;
t=z/100;
printf(“%f”,t);
};
inta[10];
for(i=0;i<10;i++);
s+=a[i];
7.输入变量时忘记加地址运算符“&”。
inta,b;
scanf(“%d%d”,a,b);
8.输入数据的方式与要求不符。
scanf(“%d%d”,&a,&b);
输入3,4
9.输入字符的格式与要求不一致。
在用%c格式输入字符时,空格字符和转义字符都将作为有效字符输入
scanf(“%c%c%c”,&c1,&c2,&c3);输入abc
10.输入输出的数据类型与所用格式说明符不一致。
inta=3;
floatb=4.5;
printf(“%f%d”,a,b);
11.输入数据时,企图规定精度。
scanf(“%7.2”,&a);
12.switch语句中漏写break语句。
switch(grade)
{
case‘A’:
printf(“85~100\n”);
case‘B’:
printf(“70~84\n”);
case‘C’:
printf(“60~69\n”);
case‘D’:
printf(“<60\n”);
default:
printf(“errer\n”);
}
13.定义数组时误用变量
intn;
scanf(“%d”,&n);
inta[n];
14.在定影数组时,将定义的“元素个数”误认为是可使的最大下标值
inta[10]={1,2,3,4,5,6,7,8,9,10};
printf(“%d”,a[10]);
15.在不该加地址运算符&的未知加了地址运算符。
scanf(“%s”,&str);
上机-填空部分
一、填空题
考试做题要求:
1、在__1__处填写正确的答案,并将下划线和数字删除。
2、将题目做完之后一定要保存。
3、不能删除/**********found**********/,也不能多行或少行。
1.函数fun的功能是:
统计所有小于等于n(n>2)的素数的个数,素数的个数作
为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
intfun(intn)
{inti,j,count=0;
printf("\nTheprimenumberbetween3to%d\n",n);
for(i=3;i<=n;i++){
/**********found**********/
for(___1___;j
/**********found**********/
if(___2___%j==0)
break;
/**********found**********/
if(___3___>=i)
{count++;printf(count%15?
"%5d":
"\n%5d",i);}
}
returncount;
}
main()
{intn=20,r;
r=fun(n);
printf("\nThenumberofprimeis:
%d\n",r);
}
2.人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入
结构体数组std中。
函数fun的功能是:
找出指定出生年份的人员,将其数据放
在形参k所指的数组中,由主函数输出,同时由函数值返回满足指定条件的人数。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#defineN8
typedefstruct
{intnum;
intyear,month,day;
}STU;
intfun(STU*std,STU*k,intyear)
{inti,n=0;
for(i=0;i/**********found**********/
if(___1___==year)
/**********found**********/
k[n++]=___2___;
/**********found**********/
return(___3___);
}
main()
{STUstd[N]={{1,1984,2,15},{2,1983,9,21},{3,1984,9,1},{4,1983,7,15},
{5,1985,9,28},{6,1982,11,15},{7,1982,6,22},{8,1984,8,19}};
STUk[N];inti,n,year;
printf("Enterayear:
");scanf("%d",&year);
n=fun(std,k,year);
if(n==0)
printf("\nNopersonwasbornin%d\n",year);
else
{printf("\nThesepersonswerebornin%d\n",year);
for(i=0;iprintf("%d%d-%d-%d\n",k[i].num,k[i].year,k[i].month,k[i].day);
}
}
3.给定程序中,函数fun的功能是:
求ss所指字符串数组中长度最短的字符串所
在的行下标,作为函数值返回,并把其串长放在形参n所指变量中。
ss所指字符
串数组中共有M个字符串,且串长请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
#defineM5
#defineN20
intfun(char(*ss)[N],int*n)
{inti,k=0,len=N;
/**********found**********/
for(i=0;i<___1___;i++)
{len=strlen(ss[i]);
if(i==0)*n=len;
/**********found**********/
if(len___2___*n)
{*n=len;
k=i;
}
}
/**********found**********/
return(___3___);
}
main()
{charss[M][N]={"shanghai","guangzhou","beijing","tianjing","chongqing"};
intn,k,i;
printf("\nTheoriginalstringsare:
\n");
for(i=0;ik=fun(ss,&n);
printf("\nThelengthofshorteststringis:
%d\n",n);
printf("\nTheshorteststringis:
%s\n",ss[k]);
}
4.给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用fun
函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表
缩短。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
#defineN8
typedefstructlist
{intdata;
structlist*next;
}SLIST;
voidfun(SLIST*p)
{SLIST*t,*s;
t=p->next;s=p;
while(t->next!
=NULL)
{s=t;
/**********found**********/
t=t->___1___;
}
/**********found**********/
printf("%d",___2___);
s->next=NULL;
/**********found**********/
free(___3___);
}
SLIST*creatlist(int*a)
{SLIST*h,*p,*q;inti;
h=p=(SLIST*)malloc(sizeof(SLIST));
for(i=0;i{q=(SLIST*)malloc(sizeof(SLIST));
q->data=a[i];p->next=q;p=q;
}
p->next=0;
returnh;
}
voidoutlist(SLIST*h)
{SLIST*p;
p=h->next;
if(p==NULL)printf("\nThelistisNULL!
\n");
else
{printf("\nHead");
do{printf("->%d",p->data);p=p->next;}while(p!
=NULL);
printf("->End\n");
}
}
main()
{SLIST*head;
inta[N]={11,12,15,18,19,22,25,29};
head=creatlist(a);
printf("\nOutputfromhead:
\n");outlist(head);
printf("\nOutputfromtail:
\n");
while(head->next!
=NULL){
fun(head);
printf("\n\n");
printf("\nOutputfromheadagain:
\n");outlist(head);
}
}
5.给定程序中,函数fun的功能是:
在形参s所指字符串中的每个数字字符之后插入一个*号。
例如,形参s所指的字符串为:
def35adh3kjsdf7。
执行结果为:
def3*5*adh3*kjsdf7*。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
voidfun(char*s)
{inti,j,n;
for(i=0;s[i]!
='\0';i++)
/**********found**********/
if(s[i]>='0'___1___s[i]<='9')
{n=0;
/**********found**********/
while(s[i+1+n]!
=___2___)n++;
for(j=i+n+1;j>i;j--)
/**********found**********/
s[j+1]=___3___;
s[j+1]='*';
i=i+1;
}
}
main()
{chars[80]="ba3a54cd23a";
printf("\nTheoriginalstringis:
%s\n",s);
fun(s);
printf("\nTheresultis:
%s\n",s);
}
6.函数fun的功能是:
把形参a所指数组中的偶数按原顺序依次存放到a[0]、a[1]、a[2]、……中,把奇数从数组中删除,偶数个数通过函数值返回。
例如:
若a所指数组中的数据最初排列为:
9、1、4、2、3、6、5、8、7,删除奇数后a所指数组中的数据为:
4、2、6、8,返回值为4。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#defineN9
intfun(inta[],intn)
{inti,j;
j=0;
for(i=0;i/**********found**********/
if(___1___==0){
/**********found**********/
___2___=a[i];j++;
}
/**********found**********/
return___3___;
}
main()
{intb[N]={9,1,4,2,3,6,5,8,7},i,n;
printf("\nTheoriginaldata:
\n");
for(i=0;iprintf("\n");
n=fun(b,N);
printf("\nThenumberofeven:
%d\n",n);
printf("\nTheeven:
\n");
for(i=0;iprintf("\n");
}
7.给定程序中,函数fun的功能是:
统计形参s所指字符串中数字字符出现的次数,并存放在形参t所指的变量中,最后在主函数中输出。
例如,形参s所指的字符串为:
abcdef35adgh3kjsdf7。
输出结果为:
4。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
voidfun(char*s,int*t)
{inti,n;
n=0;
/**********found**********/
for(i=0;___1___!
=NULL;i++)
/**********found**********/
if(s[i]>='0'&&s[i]<=___2___)n++;
/**********found**********/
___3___;
}
main()
{chars[80]="abcdef35adgh3kjsdf7";
intt;
printf("\nTheoriginalstringis:
%s\n",s);
fun(s,&t);
printf("\nTheresultis:
%d\n",t);
}
8.给定程序的功能是:
从键盘输入若干行文本(每行不超过80个字符),写到文件myfile4.txt中,用-1作为字符串输入结束的标志。
然后将文件的内容读出显示在屏幕上。
文件的读写分别由自定义函数ReadText和WriteText实现。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
#include
voidWriteText(FILE*);
voidReadText(FILE*);
main()
{FILE*fp;
if((fp=fopen("myfile4.txt","w"))==NULL)
{printf("openfail!
!
\n");exit(0);}
WriteText(fp);
fclose(fp);
if((fp=fopen("myfile4.txt","r"))==NULL)
{printf("openfail!
!
\n");exit(0);}
ReadText(fp);
fclose(fp);
}
/**********found**********/
voidWriteText(FILE___1___)
{charstr[81];
printf("\nEnterstringwith-1toend:
\n");
gets(str);
while(strcmp(str,"-1")!
=0){
/**********found**********/
fputs(___2___,fw);fputs("\n",fw);
gets(str);
}
}
void