二级c上机.docx

上传人:b****7 文档编号:24024411 上传时间:2023-05-23 格式:DOCX 页数:20 大小:23.21KB
下载 相关 举报
二级c上机.docx_第1页
第1页 / 共20页
二级c上机.docx_第2页
第2页 / 共20页
二级c上机.docx_第3页
第3页 / 共20页
二级c上机.docx_第4页
第4页 / 共20页
二级c上机.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

二级c上机.docx

《二级c上机.docx》由会员分享,可在线阅读,更多相关《二级c上机.docx(20页珍藏版)》请在冰豆网上搜索。

二级c上机.docx

二级c上机

上机考试考点总结

注意事项:

1.上机:

改错18分+编程2270分钟(占总成绩的40%)

一、改错题

设错类型:

语法错误,语义错误,算法错误

江苏省c语言改错题目有四个错误点。

其中两个语法错误,两个逻辑错误。

启动Turboc2.0,按F10,选中File->new,首先按照试卷上的格式将改错题目录入到turboc中,按F10,然后选中compile->compiletoobj,如果有Error那么说明有错误,要看错误点是自己输入错误还是本身试题语法的问题。

另外不要把时间浪费到改错题目中,如果改几处语法错误后。

要转移到编程题目中,首先写出c编程题目中的大框架。

c语言改错题目一定要理解题意,把题目中给的参数直接带到程序中去试验一下,题目中给的参数一定要带到函数中,去看每个for或while循环的含义。

 二、编程题

题目类型:

以实用性为主

我们学习的根本是要操纵计算机,让他给我们做事情。

计算机就是一台机器,我们必须按照他理解的方式操纵他。

我们实际上学习的就是一个C语言用户手册。

在上机中,编写的程序要具有通用性。

编写好框架后首先要保存下来。

要多读好程序

用计算机解决一个具体问题:

首先要从具体问题抽象出一个数学模型,然后设计一个解此数学模型的算法,最后编写程序、进行测试、调整直到最终解答。

寻找数学模型的实质是分析问题,从中提取操作的对象,并找出这些对象之间含有的关系,然后用数学的语言加以描述。

从熟悉基本语法到熟练操作需要有一个时间过程。

第一步熟悉常用的语法与函数。

第二步做典型题目来强化与理解。

c语言编程题目首先要搭大的框架,要不断调试。

通过题目看本质

(1)程序可读性:

主要是为了人的阅读与交流,其次才是计算机的执行,可读性好有助于人对算法的理解,晦涩难懂的程序易于隐藏较多错误难以调试和修改。

上机操作改错题目要严格按照题目格式输入,编程题目要首先把main()函数写出来,然后想出一个解决问题的算法。

千万别写垃圾代码,要象写诗一样优美。

(2)程序是调试出来的:

程序不是写出来,是调试出来的,一个程序编写好后,要经过若干次的调试、修改从能从代码变成可用的程序,那种想一次编写就运行结果正确的,还没有人做得到。

(3)常用标准库函数:

#include作用:

包含所有的输入输出函数如:

printf,putchar,scanf,fprint等函数

一定要熟练掌握printf、scanf函数与显示格式,上机必考

#include作用:

用getch()函数实现从键盘上读入一个字符,目的是使程序执行完后显示窗口不会立即关闭,可以查看浏览结果。

clrscr()用于清除屏幕显示

#include作用:

包含字符串处理函数,例如:

strcmp(),strcpy(),strlen(char*str),strcat()

#include作用:

包括检查类型函数。

例如:

isdigit(intch)判断是否为数字,isalpha(charc)是否是字母

#include作用:

包含对数值处理的函数,例如;sqrt()求平方根,pow(x,y)求x^y

在turboc2.0操作,在键盘上有一个特殊的insert键,如果按了这个键后会出现按enter不换行,

按空格键会删除其他字符的情况。

改错题常见错误:

(1)    宏定义出错:

#define

(2)    传递函数中数组出错是常见错误

(3)    主函数中缺少函数声明

(4)    对字符型二维数组赋值用strcpy,而不是用=常见错误

(5)    for或do循环结束条件问题

(6)    定义二维数组出错

本资料对上机考试中编程部分题目划分为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语言中的一个基本算法,不仅会在程序填空和程序改错中也会有所涉及,应该重点复习。

上机改错题常见错误

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.2f”,&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(“error\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);

 

●一、改错题

●【程序功能】

●函数HolandFlag的功能是:

已知在flag指向的有n个元素的字符数组中,每个元素的值是字符’R’、’W’或’B’中的一个。

函数按照’R’、’W’、’B’的顺序重新排列flag数组中所有元素的值。

●算法提示:

●若flag数组初始值为RBWBRWRBW,则在flag数组中出现数据交换的步骤与效果为:

●第1步:

flag[1]与flag[8]交换后数据为RWWBRWRBB

●第2步:

flag[3]与flag[6]交换后数据为RWWRRWBBB

●第3步:

flag[1]与flag[4]交换后数据为RRWRWWBBB

●第4步:

flag[2]与flag[3]交换后数据为RRRWWWBBB

●【测试数据与运行结果】

●测试数据:

RBWBRWRBW

●运行结果:

RRRWWWBBB

●【含有错误的源程序】

●#include

●#include

●#define10N

●voidHolandFlag(charflag[],intnum)

●{

●inti,j,k,m;

●charc,color[3]={B,W,R};

●m=num;

●for(k=0;k<2;k++)

●for(i=0;i

●if(flag[i]==color[k])

●{

●for(j=m-1;j>i;j--)

●if(flag[j]==color[k])

●{

●c=flag[i];

●flag[i]=flag[j];

●flag[j]=c;

●m--;

●break;

●}

●if(i==j)m=i;

●}

●}

●voidmain()

●{

●charflag[N]="RBWBRWRBW";

●inti,k,n=strlen(flag);

●HolandFlag(flag[N],n);

●for(i=0;i

●printf("%c",flag[i]);

●}

●【要求】

●将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。

●改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或者编译预处理命令,但不能增加其他语句,也不能删去整条语句。

●将改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。

答案:

#defineN10//#define10N

charc,color[3]={'B','W','R'};//charc,color[3]={B,W,R};

if(flag[j]!

=color[k])//if(flag[j]==color[k])

HolandFlag(flag,n);//HolandFlag(flag[N],n);

2.【程序功能】

根据转换说明字符的含义将以某一进制表示的数字字符串转换为一个整型数。

转换说明字符与数字字符串中数字的进制表示规定如下:

d表示十进制;o(小写字母)表示八进制;x(小写字母)表示十六进制。

在函数voidconvert(chary[],chartype,int*x)被调用时,type中存储转换说明字符,y指向的数组中存储一个以某一进制表示的数字字符串,x指向的变量中存储转换后的整型数。

若y字符串中出现与type规定的进制不相符合的非法字符时,只取非法字符之前的字符作转换。

主函数接收并保存键盘输入的一个转换说明字符和一个以某种进制表示的数字字符串,调用convert函数根据转换说明字符将数字字符串转换为整型数,输出转换后的整型数。

【测试数据与运行结果】

输入d31时应输出31,输入d-31时应输出-31.

输入o37时应输出31,输入o-37时应输出-31,输入o378时应输出31.

输入x1f时应输出31,输入x-1f时应输出-31,输入x1fg时应输出31.

【含有错误的源程序】

#include

#include

#include

voidconvert(chary[],chartype,int*x)

{

inti=0,flag,base,xx,sign;

if(y[i]=='-')

{

sign=-1;

i++;

}

else

sign=1;

xx=0;

flag=1;

for(;y[i]!

='\0'&&flag;i++)

switch()

{

case'd':

if(isdigit(y[i]))

xx=xx*10+y[i]-'0';

else

flag=0;

break;

case'o':

if(y[i]>='0'&&y[i]<='7')

xx=xx*8+y[i]-'0';

else

flag=0;

break;

case'x':

if(isdigit(y[i]))

xx=xx*16+y[i]-'0';

else

if([i]>='a'&&y[i]<='f')

xx=xx*16+y[i]+'a'-10;

else

flag=0;

}

x=sign*xx;

}

voidmain()

{

intnumber;

chart,str[7]={0};

puts("inputconversiontypeandnumberstring:

");

scanf("%c%s",&t,str);

number=convert(str,t);

printf("%d",number);

getch();

}

【要求】

●将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。

●改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或者编译预处理命令,但不能增加其他语句,也不能删去整条语句。

●将改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。

改错:

switch(type)//switch()

xx=xx*16+y[i]-'a'+10;//xx=xx*16+y[i]+'a'-10;

*x=sign*xx;//x=sign*xx;

convert(str,t,&number);//number=convert(str,t);

3.【程序功能】

函数voidyanghui(inty[][N],intx[][N],intn)生成n行杨辉三角形数据构成的矩阵,并将其存放到y指向的二维数组中,再将y数组中的矩阵顺时针旋转90度后存储到x指向的二维数组中。

主函数中分别输出n行杨辉三角形及顺时针旋转90度后的n行杨辉三角形。

【测试数据与运行结果】

n=4时应输出

1

11

121

1331

1111

321

31

1

【含有错误的源程序】

#include

#include

#defineN=10

voidyanghui(inty[][N],intx[][N],intn);

voidmain()

{

staticinti,j,n,a[N][N],b[N][N];

printf("inputn(n<%d):

",N);

scanf("%d",&n);

yanghui(a,b,n);

for(i=0;i

{

for(j=0;j<=i;j++)

printf("%3d",a[i][j]);

printf("\n");

}

printf("\n");

for(i=0;i

{

for(j=0;j

printf("%3d",b[i][j]);

printf("\n");

}

getch();

}

 

voidyanghui(inty[][N],x[][N],n)

{

inti,j;

y[0][0]=1;

for(i=1;i

{

y[i][0]=y[i][i]=1;

for(j=1;j

y[i][j]=y[i-1][j+1]+y[i-1][j];

}

for(i=0;i

for(j=0;j

x[i][j]=y[n-1-j][i];

}

【要求】

●将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。

●改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或者编译预处理命令,但不能增加其他语句,也不能删去整条语句。

●将改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。

改错:

#defineN10//#defineN=10

voidyanghui(inty[][N],intx[][N],intn)//voidyanghui(inty[][N],x[][N],n)

y[i][j]=y[i-1][j-1]+y[i-1][j];//y[i][j]=y[i-1][j+1]+y[i-1][j];

for(j=0;j

4.【程序功能】

查找并输出同时出现的两个一维数组中的整数,每个一维数组中的元素均已按值升序排列,并且每个数组中的元素没有相同的值。

函数intcoincidence_count(inta[],intb[],intm,intn,intc[])按上述要求在a指向的数组前m个元素和b指向的数组前n个元素中查找,将找到的整数保存到c指向的数组中。

【测试数据与运行结果】

测试数据:

a数组中的数据:

1,2,4,8,10,12,13,14,16,18

b数组中的数据:

3,4,7,8,9,10,12,13,16,19

运行结果:

No.Array1Array2

013

124

247

388

4109

51210

61312

71413

81616

91819

【含有错误的源程序】

#include

#include

intcoincidence_count(inta[],intb[],intm,intn,intc[])

{

intcount,ia,ib;

count=ia=ib=0;

while(ia

if(a[ia]

ia++;

else(a[ia]>b[ib])

ib++;

else

{

c[count]=a[ia];

ia++;

ib++;

}

returncount;

}

 

voidmain()

{

inta[]={1,2,4,8,10,12,13,14,16,18},b[]={3,4,7,8,9,10,12,13,16,19};

intc[10],i,na,nb,n;

na=sizeof(a)/sizeof(int);

nb=sizeof(b)/sizeof(int);

printf("\nCoincidenceCountoftwoIncreasingArrays\n");

printf("\nNo.Array1Array2");

for(i=0;i

printf("\n%3f%10f%10f",i,a[i],b[i]);

printf("\nThereare%dequalnumbers:

",n=coincidence_count(a,b,na,nb,c));

for(i=0;i

printf("%5d",c[i]);

getch();

}

【要求】

●将上述程序录入到文件myf1.c中,根据题目要求及程序中语句之间的逻辑关系对程序中的错误进行修改。

●改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或者编译预处理命令,但不能增加其他语句,也不能删去整条语句。

●将改正后的源程序myf1.c保存在考试盘的根目录下,供阅卷用,否则不予评分。

改错:

whil

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1