c语言上机编程20题

2024-09-14

c语言上机编程20题(精选9篇)

c语言上机编程20题 第1篇

2009春上机试题1(编程)

程序功能:找出7个默森尼数。法国数学家默森尼曾提出下列公式:Mp=2^p-1。当p是素数并且Mp也是素数时,称Mp为默森尼数,例如,p=5, Mp=2^5-1=31,5和31都是素数,因此31是默森尼数;而Mp=2^11-1=2047,11是素数,2047不是素数,因此2047不是默森尼数.【编程要求】

1.编写函数void Mersenne(long a[ ],int m),其功能是求出前m个默森尼数并以此将它们保存到a指向的数组中,2.编写main函数,调用Mersenne函数并保存前7个默森尼数,将运行结果输出到屏幕及结果文件myf2.out中,最后将考生的考号也保存到结果文件myf2.out中

【测试数据与运行结果】

37311278191***7

2009春上机试题2(编程)

用一组整数验证命题,任意一个百位数字与个位数字不同的三位正整数n1在经过以下操作后一定会变换到1089:将n1的百位数与个位数字交换得到n2,求n1和n2差的绝对值得到n3,将n3的百位数字与个位数字交换得到n4;求n3与n4的和得到n5,n5一定是1089,若n1、n3是一位数或两位数,则在高位补0使其成为三位数

例如:n1:123,n2:321,n3:198(321,-123),n4:891,n5:1089(198+891)

【编程要求】

1.编写函数int fun(int a[ ],int b[ ], int n),其功能是用n指向数组的前n个整数验证上述命题,将所有符合命题的整数所在数组元素的下标依次保存到b指向的数组中,函数返回b数组中数据的个数

2.编写main函数,声明a数组并用测试数据初始化,用a数组作为实参调用fun函数,将a数组中所有符合命题的整数输出到屏幕及结果文件myf2.out中,最后将考生本人的准考证号字符串也保存到结果文件myf2.out中

【测试数据与运行结果】

测试数据:123765***31676963589

运行结果:12376514567

c语言上机编程20题 第2篇

一、改错题之方法步骤

1.上机考试中改错题占30分,一般有两个地方有错误,题型简单

2.做改错题时先看出错的地方,分析语法错误,如果能用C语言的语法判断出错误,改之即可 3.没有语法错误即分析逻辑错误,逻辑错误可以从几个方面分析:

(1)从题目的要求中找到错误,例如:题目要求计算s=1+1/2+1/3+„+1/n,那么循环的范围就应该是for(i=0;i<=n;i++),但是考试中经常将其写为:for(i=0;i

(3)重点注意函数的调用、函数的返回值类型,函数的形参,这个是上机考试中的重点(4)注意细节,请参考以下为考生总结的知识(5)多练习,多思考,多总结

二、改错题之语法错误 1.关键字出错

(1)关键字出错,指的是C语言中的关键字出错。C语言的关键字都是小写字母,并且在VC++6.0中以蓝色字体显示,如果常见的关键字是黑色字体,可以断定关键字出错;

(2)if关键字出错

1)举例:上机题库P79第6题

/************found************/ If(substr[k+1]==')

2)类似题目:

12、35题

(3)double关键字出错

1)举例:上机题库P86第23题

/**********found**********/ double fun(double a, dounle x0)2)类似题目:

36、51(4)while关键字出错

1)举例:上机题库P77第2题

/**********found**********/ wihle(q>p)2)类似题目:

(5)return关键字出错

1)举例:上机题库P101第54题

/************found************/ Return(Value);2)类似题目:86 2.格式出错

(1)C语言中的语句、基本结构、函数等都有相应的规范格式,程序中将这些格式书写错误,将导致编译器无法识别程序,因此导致出错;

(2)语句末尾少分号

1)分号是语句结束的标志,每个语句都必须以分号结尾 2)举例:上机题库P77第2题第一个出错点

/**********found**********/ q=p+i 3)类似的题目:28题第一空、29题第1空、34题第2空、37题第2空、48题第2空,49第1空,59第2空、70、79、97

(3)for结构格式出错

1)for结构的格式:for(表达式1;表达式2;表达式3){ 循环体语句 },for结构体中表达式必须以分号隔开,改错题中经常出现将for结构中分号错写为逗号的情况;

2)举例:上机题库P77第3题第2个出错点

/************found************/ for(i = 100, i <= m, i += 100)3)类似的题目:6题第一空、14题第二空、53第1空、73、86第1空

(4)if结构格式出错

1)if结构的格式:if(表达式),if后面必须加上小括号 2)举例:P93第37第1个出错点 /************found************/ if n = = 0 3)类似题目:59题第1空

(5)数组格式出错

1)一维数组的定义形式:类型名 数组名[常量表达式],谨记[]是数组的独有特征 2)举例:P89第28题第2个出错点

/**********found**********/ t(k)=b(j);3)举例2:P97第1个出错点(二维数组不能省略列下标)

/************found************/ int fun(int n, int xx[][])4)类似题目:95题第1空

(6)函数格式出错

1)记住函数名后面一定是花括号,不能是方括号,方括号只有在数组下标中用到 2)举例:P86第22题第1出错点

/**********found**********/ n=strlen[ aa ];3)scanf(输入控制,输入数据列表),scanf函数中输入数据列表要求为变量的地址 4)举例2:P95第41题第2出错点

/*********found**********/ scanf(“%d”,a[i][j]);5)类似题目:第80题第1空

(7)命令行格式错误

1)#include “stdio.h”,include和define前面都必须有# 2)举例:P84第17题第1出错点

/************found************/ include(stdio.a)3.使用了未定义的变量:变量必须先定义后执行

(1)0(零)和o(字母欧)的区别

1)区别:零像鸡蛋,字母欧像乒乓球 2)举例:上机题库P85第19题第一个出错点 /************found************/ a2=k/1o;3)类似题目:19题第一空、23题第二空、43题第二空、51题第二空、77、98、(2)P(大)和p(小)的区别

1)区别:一般在定义时候p为小写,但是在使用的时候变为大写P,做题时候一定要细心

2)举例:上机题库P91第33题第一出错点

fun(int *a,int n,int x){ int p=0,i;a[n]=x;while(x!=a[p])p=p+1;/**********found**********/ if(P==n)return-1;3)类似题目:33题第一空、82

(3)普通变量大小写的区别

1)定义时候和使用时候变量的大小写不一致,违背了变量必须“先定义后执行”的原则

2)举例:18题第2空

int fun(float *s, int n, float *aver){ float ave, t = 0.0;int count = 0, k, i;for(k = 0;k < n;k++)/**************found**************/ t = s[k];ave = t / n;for(i = 0;i < n;i++)if(s[ i ] < ave)count++;/**************found**************/ *aver = Ave;/*分析:定义时候float ave, t = 0.0;ave为小写,但是此时使用时候却是Ave大写,因此出错*/ return count;} 3)类似题目:18题第2空、22题第2空、38题第1空、54题第2空

三、改错题之逻辑错误 1.运算符号出错:

(1)C语言中除号是“/”不是“”(2)赋值号(=)和等号(= =)混淆

1)记住在if语句中出现赋值号(=)一般是讲它改为等号(= =)。2)类似题目:14题第一空和29题第二空都是这样的错误、87、91、94 2.表达式的取值范围出错:

(1)当遇到计算表达式的累加或是累减时,一定用到循环来完成相应的操作。

(2)例如:改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:for(i=2;i

y=1-1/2*2-1/3*3-….-1/(m-1)*(m-1)和题目要求的不符,因此将i

(3)做这样的题目看两点:一看题目中的表达式,二看for语句中变量的取值范围。(4)类似题目:31题第二空、52第2空、81、88、3.C语言中的除法运算:

(1)这个考点同样考查表达式的相关知识。

(2)例如:改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:for(i=2;i

(3)记住:1/2的值为零,只有1.0/2或是1.0/2.0的值为0.5。(4)类似题目:39题第一空也同样是这种错误、57、76 4.找最大值和排序问题:

(1)遇到这种题目在改错题中最容易考查的是大于(>)、小于(<)等符号的变化,当你查找出错的地方没有语法错误,也没有使用了未定义的变量时,记住这个口诀:将大于改为小于,将小于改为大于!

(2)类似题目:11题第二空、12题第一空和13题第二空、4题第二空、58 5.函数的返回值及其参数:重点

int fun(int x,int y)

main(){

{ if(x>y)return x;

int a,b,c;else return y;

scanf(“%d%d”,&a,&b);}

c=fun(a,b);

printf(“最大值为:%d”,c);}(1)函数的返回类型:

1)在上面的例子中fun函数的返回值是int,如果将int改为double,很明显是错误的。从两个地方来看,首先return x;中x的类型必须和fun函数中的返回值相同,x是整型。其次c=fun(a,b);中fun函数将一个返回值赋值给了变量C,说明函数返回的值一定是整型。

2)记住:函数调用、函数的返回值和ruturn中数据类型必须一致!

3)类似题目:1.1、3.1、16.1、19.2、34.1、36.1、40.1、48.1、71都死这样的错误,(注1.1表示第一题第一空)。78、89、90、(2)return后面的表达式及其类型:19.2、30.2、39.2(3)函数传递的参数:

int fun(int *x,int *y)

main(){

{ if(*x>*y)return *x;

int a,b,c;else return *y;

scanf(“%d%d”,&a,&b);}

c=fun(&a,&b);

printf(“最大值为:%d”,c);

} 1)一定注意:传递的是值还是地址。比较上面两个例子大家很容易区别传递的是值还是地址,第一个例子调用函数的时候传递的是值,因此在fun函数的形参中x和y仅仅是普通的变量,而第二个例子中调用函数的时候传递的是地址,因此在fun函数的形参中x和y就是两个指针变量。

2)类似题目:5.1、13.1、17.2、20.1、25.2、52.1、56、84、85、100(4)指针的使用:

int fun(int *x,int *y){ if(*x>*y)return *x;else return *y;}

1)在此例中fun函数的形参是x和y,它们的类型是整型的指针,那么在fun函数的函数体中使用到x和y的值时一定要区分:x>y比较的是x和y所存变量地址的大小,*x>*y才是比较值的大小。2)如果存在*x=x+y;的类似情况一定是错误的,必须要将赋值号的左右两边的类型变为一致。

3)类似题目:5.2、5.3、20.2、24.2、35.1、44.1、72、75、一定特别注意!

6.数组:

(1)数组下标的初始值:数组下标从零开始,到长度减一结束。

1)考试技巧:当出错行在定义部分时,先检查该定义语句有没有语法错误,再看定义语句中的变量有没有赋初始值,最后看变量赋的初始值有没有正确。

2)定义初始值有窍门,遇到累加时,用来存放累加和的变量一般赋值为零,遇到求阶乘时,用来存放阶乘值的变量一般赋值为一。

3)8.1中的变量k赋值为1,但是数组的下标只能从0开始,因此将1改为0就行了。

(2)普通变量的初始值:

1)依照上面的技巧,我们同样可以将它延伸到普通变量中。41.1中需要将变量的值进行初始化,题目中有这样的要求:“输出主对角线元素之和”,既然这样我们很肯定初始值应该为零,接着我们看看是给哪个变量赋值?看printf(“sum=%d”,sum);输出的是sum的值,说明sum就是我们要补充在横线上的变量。2)10.1也可以用同样的方法来分析。

(3)数组和字符串长度减一:

1)当使用数组中的元素时,最大值只能到数组长度减一。字符串以’’作为字符串的结束标志,因此取值最大也只能到字符串长度减一。25.2中输出printf(“%d”,aa[i]);分析程序知道i在此时就是数组的长度,我们要输出数组中的元素,最大就只能到aa[i-1],因此改为 printf(“%d”,aa[i-1]);就行了。2)4.1和38.2中考查的是字符串长度减一的问题。

(4)数组下标往后走:

1)当题目要求将一个数组中的元素直接赋值或是以某种方式复制到另一个数组中时,接受数据的数组中的下标要自增。9.1中s[j]=s[i];将s[i]中的值复制给s[j],联系上下函数段发现i是一个变量被for语句控制,从0开始直到遇到’’结束。i一直在加但是j没有变化,因此改为s[j++]=s[i];即可。2)类似的题目有:25.2、26.2、32.1、50.2。

7.特例:

(1)部分题目的解答很特殊,需要根据上下文中的内容来解答题目:例如10.1,在此题目中,定义了变量t=0;根据下面程序中的循环,s=0.0,首先加的是变量t的值,即s的值是从 0.0开始的,s得到的值是:s=0.0+0.0+1.0/3+„„,观察表达式的值,这个少加了第一项1.0的值,所以变量t的初值不能是0.0,只能是1.0,或者是1;

(2)21.2中的这个题目中,表达式的值是从2/1+3/2+5/3„„即表达式的规律是从第一项开始,以后的每一项的分子是前一项的分子和分母的和,分母为前一项的分子。所以该题目的第二个空中的内容应该是:c=a;a+=b;b+=c;这一条语句中 a代表的变量的分子,b代表的是变量的分母,执行第一个表达式的值,把a的值赋值给变量c,第二个表达式是把分子和分母的和相加复制给变量a,第三个表达式是把原来a的值和变量b的值相加之后得到的值赋值给变量b,则变量b得到的值也为分子分母的和,不满足题意,而分母应该为原来分子的值。第三表达式的值应该改为:b=c;

(3)类似的题目有:33.2、40.2、43.1、47.1、50.1 8.素数 11.1、29、83(1)判断一个数是否是素数的方法很多,的是只用掌握一种即可,首先掌握判断一个素数的方法;

(2)素数的定义:

1)是自然数

2)只能被1和本身整除,2到本身减一之间的数不能整除该数。

(3)判断m是否为素数的格式:

for(i=2;i

if(m%i= =0)

break;

if(m= =i)

表明m是素数;

(4)素数只能被1和m,那么用2到m-1之间的数除m,如果有一个数能整除m,说明m不是一个素数,就不用再判断后面的数值了,用一条break语句提前结束函数;如果一直都不能整除,则说明m是一个素数。那么用循环语句表示2到m-1之间的数的语句为:for(i=2;i

c语言上机编程20题 第3篇

全国计算机等级考试二级C 语言考试分为笔试和上机两部分。笔试考察的是应试者对基础知识和基本理论的掌握情况,而上机考试主要测试的是应试者的逻辑思维能力和运用C 语言的能力。历年来上机考试的通过率比笔试偏低,所以考生要充分认识上机考试的重要性,要有针对性地进行上机考试的练习。上机考试一般包括3 种题型:程序填空题、程序改错题、程序设计题。第一大题(30分)填空题、第二大题(30分)修改题,这两个大题均为基础题,考生应尽量在这部分不丢分;第三大题为程序设计题,相对第一、第二大题难度系数较大,应尽量在这部分能得分。一般情况下,上机考试时间较充足,第一大题一般能在15分钟左右做完,第二大题一般也能在15分钟左右做完,剩下的时间约1小时左右做第三大题程序设计题。

1 程序填空题

此大题是测试考生对C语言基本知识点的掌握,以一个题为例来说明。请补充fun函数,该函数的功能是:把字符下标能被2或3整除的字符从字符串str中删除,把剩余的字符重新保存在字符串str中。字符串str从键盘输入,其长度作为参数传入fun函数。

例如:输入"abcdefghijk",输出"bfh"。

注意:部分源程序如blank.c给出。

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

分析:题目要求在fun函数中把字符下标能被2或3整除的字符从字符串s中删除,把剩余的字符重新保存在字符串s中。字符串s从键盘输入,其长度作为参数传入fun函数。为了实现以上要求,题目中的程序采取了以下思路:使用for循环将s字符串每一个字符拷贝到s字符串前面部分,k变量记录存放的下标,即s[k++]=s[i],然后再判断当前拷贝的s[i]的字符下标i能否被2或3整除。如果可以被2或3整除,那么执行k--,放弃已经占用的位置,等下一次for循环的时候使用k—空出的位置。反复执行以上过程,就能做到把字符下标能被2或3整除的字符从字符串s中删除,把剩余的字符重新保存在字符串s中。所以这试题里考得第一个知识点是取余运算符,第二个知识点for循环,第三个知识点就是数组。

2 程序修改题

2.1 上机改错题的特点和注意事项

(1)上机改错的试题中通常包含两个(或三个)错误需要修改。

(2)试题中用"******found******/"来提示在下一行(或下面第二行)有错。

(3)错误的性质基本分语法错和逻辑错两种,也有些试题要求把语句添加在下划线处。

(4)特别要注意的是:只能在出错的行上进行修改,不要改动程序行的顺序,更不要自己另编程序。

2.2 上机改错测试时,建议按以下步骤进行

(1)首先仔细审题,了解试题的要求,看清楚试题给出的输入和输出示例,以便检验改错后程序运行的结果是否正确。

(2)当在TC或VC环境下调出源程序后,审视"/******found******/"所在函数,根据题义理解程序所采用的基本算法,做到心里有数。

(3)先执行编译对测试程序进行检查是否有语法错误。当编译提示有语法错时,可参考编译提示来查找并改正错误。

(4)当不再出现语法错时,执行运行, 按照试题的示例给出的数据进行试算,若试算的结果与给出的输出结果相同时,该题就做对了;若试算的结果与给出的输出结果不同,就应进一步检查程序中的逻辑错误。

(5)当程序存在逻辑错误时,首先应当理解题意、读懂程序的算法,必要时可按步检查数据的流程,以便确定错误所在。例如,题目要求数据按由小到大排序,而结果数据是按由大到小进行了排序,问题可能出现在条件判断上。又如,输出的字符串比预期的短,就有可能字符串的结束标志放错了位置。再如做循环的时候 数组上限下限错误了 ,基数是从0开始而不是1开始的。修改程序中的逻辑错时,要求考生认真读懂程序代码。

例如有以下改错题:

给定程序MODI1.C中函数 fun 的功能是:计算正整数num的各位上的数字之积。例如,若输入252,则输出应该是20。若输入202,则输出应该是0。请改正程序中的错误,使它能得出正确的结果。

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

分析:这类基础题主要是考察应试者对给变量赋初值的掌握。针对这个题第一个错误是变量k没有初值,根据变量k是存放积的,积的初值一般是1,第二个错误就是是语法错误了,这类错在编译时就能发现,它的除号反了。

3 程序设计题

3.1 上机编程题的特点和说明

在二级C程序设计上机考试中,要求完成一个独立的函数的编程。目前教育部考试中心已出版了上机考试习题集,这些有助于学习编程,但考生应当在学习过程中理解基本的算法,通过实际上机操作积累经验,才能掌握基本的编程能力。

3.2 进行编程测试时,建议按以下步骤进行

(1)首先仔细审题,了解试题的要求,记下试题给出的输入和输出示例,以便检验在完成指定的函数后程序运行的结果是否正确。

(2)当在TC或VC环境下调出源程序后,应对照函数首部的形参,审视主函数中调用函数时的实参内容,以便明确在函数中需要处理的数据对象。

(3)理解试题的要求,审视主函数中调用函数的方式,若在表达式中调用函数(如把函数值赋给某个对象),则要求有函数值返回,需注意函数的类型,并在函数中用return语句返回函数值;若主函数中仅用语句形式调用函数,则需要通过形参间接地返回所得结果。

(4)选择适当的算法进行编程,输入程序语句。

(5)编译程序,直到没有语法错误。

(6)调试程序,利用试题中给出的例示数据进行输入(若要求输入的话),运行程序,用例示的输出数据检验输出结果,直到结果相同。

例如有以下编程题:

编写函数fun,它的功能是:将两个两位正整数a,b 中个位数和十位数合并成一个新的整数放在c 中。合并的方式是:将a 中的十位和个位依次放在变量c 的百位和个位上,b 中的十位和个位依次放在变量c 的十位和千位上。

例如:当a=45,b=12。调用函数后c=2415。

注意:部分源程序存在文件PROG1.C 中,数据文件IN.DAT 中的数据不得修改。请勿改动主函数main( )和其他函数中的任何内容,仅在函数fun 的花括号中填写编写的若干语句。

程序如下:

分析:这类基础题主要是考察应试者对基本运算的掌握。针对这个题关键是把这两个数的个位和十位求出来,然后再重新组合成一个新数。表示两位数a 的个位数的方法是:a 对10 取余,即a%10;表示两位数a 的十位数的方法是:a 先除10 后在对10 取余,即a/10%10。

本题的答案为:c=b%10*1000+a/10*100+b/10*10+a%10;

4 结束语

C语言上机考试是涉及面最广、考生最多, 但每年的通过率都不高, 主要的原因是考生的重视程度不够, 上机操作的次数太少, 很多应该掌握的却没有掌握, 缺乏考试经验等。希望每一位参加该项考试的考生能认真对待, 积极备考。希望以上提供的有关C 语言上机考试的特点和注意事项对考生有帮助。

摘要:主要介绍了全国计算机等级考试C语言上机考试,详细阐述了改错题和编程题的主要特点和注意事项。

关键词:计算机,C语言,上机分析

参考文献

[1]谭浩强.C程序设计[M].3版.清华大学出版社,2007.

[2]全国计算机等级考试(二级C语言程序设计)大纲[S].

[3]高福成,潘旭华.C语言程序设计(二级)重点与难点、例题解析、上机指导、模拟题[M].北京:电子工业出版社,2002.

c语言上机编程20题 第4篇

【摘要】本系统主要研究C语言编程题目中“编译运行结果对比”、“编译错误原因恢复与评阅”、“得分点分割正则动态测试”三种手段,将研究内容运用到自动阅卷系统中,实现对编程题目的自动评分,并实现基于J2EE技术的具有在线考试、自动评分等功能的C语言编程题目自动阅卷考试系统,提高阅卷的准确度的同时能够节省大量的人力物力财力。

【关键词】C语言;编程题;自动评分

随着计算机技术的发展以及互联网的普及,办公自动化已无处不在。作为一门基础课程,C语言考试应用系统也给批阅试卷的工作人员带来了很大的工作量,自上世纪六十年代起,国内外就陆续出现了许多关于语言类课程考试的软件系统,虽然很多已具有基本的随机答卷、上机考试及自动评阅等功能,但只针对客观题,因自然语言的刻画、人工智能、模式识别等核心技术发展缓慢,制约了编程题目阅卷系统研究发展。所以,本系统针对C语言编程题目进行整体规划,致力于做出更精确的C语言编程题自动阅卷的方法,填补自动阅卷软件开发空白,减少人工操作的资源浪费。

1.系统运行环境

智能C语言考试系统、自动评分系统的运行环境是根据我校现有的教学机房的硬件环境(每个机房有70台学生机和一台教师机)规划的,教师端和学生端都采用window 7操作系统,每个机房都采用校园公共网络提供的局域网,运用Myeclipse开发环境、MySQL数据库建立一套具有在线考试、自动评分等功能的C语言编程题目自动阅卷系统,并辅以AJAX技术,确定了用FreeMarker表现层技术增强用户与系统间的交互,加快系统运行效率,同时,尽可能细化评分点,增加准确性。

2.系统运行模式的选择

系统采用B/S三层架构模式,系统的用户可通过Internet网络,客户端不需要手动安装软件,只要有浏览器就可以对系统进行访问和一般操作,本次对阅卷系统主要分析了的C语言编程题目评分功能,充分考虑到系统对灵活性和准确性的要求,并保证安全性的前提下,本系统采用B/S结构以达到轻客户端需求。

3.系统研究内容

通过研究C语言程序结构,从编译原理角度设计评价模型,通过内部运行编译器对比动态运行结果,并且本课题创造性提出利用关键字对比、控制结构判断和正则表达式匹配三种静态测试技术作为结果比对方案的补充,既保证了程序判断的正确性,又确保了相对公正性。

编译结果对比要实现程序内部对C语言编译器的动态调用技术,通过比对测试结果和标准答案进行评分,对于不能编译部分,研究关键字库建立、控制结构规范化和正则表达式建立的具体方案。

其中重点研究C语言编程题目评分标准的两个方面:一是如何检验运行结果的正确性,二是如何评价程序代码包含的分点。

为突出本系统对主观题的评分机制,在试题主观题程序可运行以及不可运行的情况下分别给出了相应的评分策略,以此来一步步细化评分机制。

4.评分核心模块设计

详细设计自动阅卷系统中的关键技术——程序题评分。系统首先采用动态测试技术,编译运行待评价程序,和标准答案进行对比给出分数;需要数值型输入参数的程序,通过均匀分布随机数给出随机输入;需要字符型输入参数的程序,首先在数据库中保存预选文字段,然后随机选取其中的一部分给出随机输入。对于编译运行报错的程序代码,课题会采取错误恢复技术,通过编译信息给出的错误位置尝试以标准答案修复代码,从而给出扣分点。最后对于不能编译运行的代码片段,系统提出关键字对比、控制结构标准化和提取、正则表达式规则匹配相结合的静态测试方法,加入权重处理,分析得分点给出更全面客观的评分结果。

通过对软件模式的对比和分层架构模型的研究,系统拟采用B/S结构,方便用户在线答题和管理操作;在具体实现技术方面,拟采用J2EE技术和SSH开源框架——利用Java语言提供的公开接口开发调用C语言编译器模块和正则表达式匹配模块,利用MySQL数据库完成题库和答案库的建立和开发工作,利用Ajax技术提高系统的整体响应速率,利用FreeMarker表现层技术增强用户与系统之间的交互。

建立计算机矫正机制和完善的评价方案,并对试题多次进行人工阅卷与机器阅卷的对比测试。

5.数据库设计

因需要评测本系统自动阅卷功能和人工阅卷的准确度,给出测评结果,并对仍存在的问题和不足提出进一步改进方案;特别是对系统不能正常评分的特殊题目,建立特例题库,以便在今后的工作进行研究并从中提出新的解决方案。

考生提交试卷首先由c语言编译器自动编译后生成可执行文件并运行输出结果,进行评阅步骤校验结果时,通过试题编号(id)调用试题表数据,对比答案进行准确性校对,调用纠错参考库数据,比对出错原因并根据错因扣除相应分数,通过模糊匹配替代出错关键字,迭代匹配错因至无错,若迭代五次还未改正视为崩溃性错误,不可弥补,判定本段分数为零崩溃性错误,不可弥补,判定本段分数为零,通过题目编号获取相应评分关键点库,通过正则表达式匹配得分点,通过得分点数量给出相应分数,完成试卷评阅。

当程序不能正常编译运行时,系统判定进入系统纠错,系统自动运行修复性算法,代码中个别关键字错误,为此我们把c语言中所有的关键字整理出来,建立关键字库,对错误的关键字进行模糊匹配,通过字符的顺序、相同字符的数量、键盘键位的keycode尽可能的匹配出相似度最高的的关键字替换错误的关键字。

纠错主要是语句拼写错误,我们分了下面三种情况:

1)测试用例由测试输入数据和与之对应的预期输出结果组成,人们常用白盒法和黑盒法设计测试用例,其中白盒法主要是为了检查是否有数据结构或外部数据库访问错误等,对比通过单元测试的模块或组件、编程规范、集成测试来检查测试的准确性。

通过正误判断匹配正误判断表进行结果判定,判定结果是否符合题目,若是则给分,否则进行结果范围判断及结果属性判断,比对结果是否适用本题范围,并进行分数评估。

2)本表主要有三个主要信息id、name、keyword。分别用来存储错误的id、错误的名称、题目中的关键字。Id的数据类型为int(整型),name的数据类型为varchar(字符型),keyword的数据类型为varchar(字符型),id需要主键非空自增,name与keyword非空。通过建立本数据库表可以实现对错误信息的收集归类,同时可以实现判断系统中出现的错误的功能。

定位捕捉错误点,抛出错误原因并与数据库进行比对,并根据错因给予相应分数,运用模糊匹配寻找替代关键词,进行替代继续检查错误,若连续替代五次后仍然不能进行下一步骤视为程序崩溃行错误,不可弥补,判定本段分数为零。

3)正则表达式,又称正规表示法、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,在本字段里,正则表达式通常被用来检索、替换那些符合模式的程序段,进行分步得分。

本数据库包含关键字类库,通过正则表达式匹配关键词多寡,大概率的确定了答题者的思路范围及答题思路的正确与否,给以步骤分,极大的提高了批卷的人性化,拉近了机器阅卷与人工阅卷的阅卷水平,更有说明行的体现了机器阅卷更好的使用性。

C语言考试系统已普遍在各高校使用,对于客观题方面,有了相对完善公平的系统,但是在自动评分方面,还有很多不足之处,有待改善,本系统就是针对这一空白区域,设计公平而相对更准确的算法,主要对C语言考试系统中的编程题部分进行得分点分割,对考生的程序一步步细致分析,做到该得分的地方给考生相应的分数,这样避免了某一点小错误导致的大幅度扣分的不公平性,同时,将系统应用到学生的日常学习中后,能够更好地检验教师的教学成果,查找教学过程中需要注意的地方,对于学生,也能够更好地发现自己的错误,及时改正,这样,在学习的过程中,在保证公平的前提下,培养学生注意细节的习惯,最重要的是,应用到高校的二级C语言考试后,能够更好的给考生更公平更合理的考试成绩,同时也使得阅卷更加节约、方便、快捷,这也顺应了如今社会计算机行业的飞速发展,提高办公自动化的程度及效率。

参考文献

[1]K.A.Redish,W.F.Smyth.Pragram style analysis:a natural by-product of prograrn compilation[J].Cornnnunications of the ACM,1986.(3):126-133.

[2]Yasuhiro Ajiro,KazunoriUeda.Kima:An Automated Error Correction System for Concurrent Logic Progrrams.Automated Software Engineering 2002.9(2):67-94.

[3]王甜甜,基于语义相似度的编程题自动评分方法的研究,哈尔滨工业大学硕士论文,2001;1-52.

[4]李永浩,居于程序理解的编程题自动评分系统愤愤研究与应用,哈尔滨工业大学硕士论文,2001:1-60

[5]王华东.刘国柱.基于局域网下C语言考试系统的设计与实现[J].计算机与信息技术,2006.

C语言上机考试改错题分析总结 第5篇

以下对改错题的改错方式做一些总结,当然这些总结只能对大部分改错行有效。

1、若错误行是函数首部,可分为以下几种情况:

A、该行最后若有分号则删除,中间若有分号则改成逗号

B、形参类型不一致的问题,特别是指针类型,若后面用到某形参时有指针运算则该形参必为指针类型;若形参是二维数组或指向m个元素的指针变量,则第二维的长度必须与main中对应数组的第二维长度相同

C、函数类型不一致的问题,若函数中没有return语句则函数类型为void,若有return语句则函数的类型必须与return后变量的类型一致。

2、若错误行是if或while语句,则首先看有没有用小括号将整个表达式括起,若没有则加上小括号。

3、若错误行中有if、while、for则要特别注意条件表达式的错误问题:

A、指针变量的应用,若表达式中有指针变量且没有指针运算符,则加上指针运算符

B、若条件表达式中只有一个等于号,则改成两个等于号,若为其它比较运算符则一般是进行逆转或加一个等于号

C、for中要用分号分隔表达式,而不是用逗号

4、语法错误

A、语句缺少分号,若错误行中有语句没有用分号结束,则加上分号。

B、大小写不对,若错误行中有大写字母则一般都改成小写字母。

5、指针变量的运用,若错误行中有指针变量,并且该变量名前没有指针运算符则一般都是加上指针运算符

6、若错误行为return语句,则首先看是否是缺少分号若是则加上分号即可;否则就是return后的变量或表达式错误(此时可通过看题意,来分析该返回哪一变量或表达式)

7、若错误行中见到整型1除以某个表达式时,一概改成1.0。但若是整型变量或表达式则只能用强制转换

8、复合运算符写错

9、字符串结束符写错,若有字符串结束符则要特别注意有没有写错,但第11题例外,因为该题是要将数字字符转换成对应的数字。

10、若错误行是定义语句,则首先看类型是否符合;再看所赋初值是否正确;若以上均不是,则看是否少定义了某个变量或少了花括号。

11、表达式错误(占的份量最多,并且没有统一的改法,我们只能通过题目要求来分析并修改)

C语言面试编程题 第6篇

#include

#include

typedef struct array1{

int ID;

struct array1* next;

}A;

typedef struct array2{

int ID;

int a;

int b;

int c;

}* B;

int main

{

A s1[15];

A* s2;

B s3;

for(int i=0;i<10;i++)

{

s1[i].ID=i+64;

}

s2=s1+3;

s3=(B)s2;

printf(”%d/n“,s3->b);

return 0;

c语言上机编程20题 第7篇

青年人网站小编发现很多考生对上机考试存在很大的问题,现在小编将在教学当中对二级C语言上机考试题库总结的经验和大家分享,希望能对我们考生的考试有所帮助,顺利通过考试!以下是对上机考试改错题的做题方法和总结,改错题的错误主要分为以下几类:

1、if或while语句

若错误行是if或者while语句,则要注意以下点:

1)首先判断是否正确书写if或while关键字;

2)然后看有没有用小括号把整个表达式括起来,若没有则加上小括号;

3)若条件表达式中有指针变量而且没有指针运算符时,则加上指针运算符;

4)若if条件表达式中只有一个等于号即数学等号(=),则要改写成两个等于号即逻辑等号(= =);

5)若if条件表达式为其他的比较运算符,则一般是进行逆转或加一个等于号;

2、for语句

若错误行是for语句,则要注意以下几点:

1)首先判断for有没有书写正确;

2)然后看for中的表达式是不是用分号(;)隔开,若不是则改为分号。

记住是分号(;),不是逗号(,)!

3)再者,分析for中的三个表达式,是否符合题意;

第一个表达式表示起始条件,第二个表达式表示终止条件,第三个表达式表示循环变量的变化。

3、return语句

若错误行为return语句,则要注意以下几点:

1)首先看是不是正确书写return关键字;

2)然后看是不是缺少分号,若是则加上分号即可;

3)再者判断return后的变量或表达式是否正确;

这种错误需要根据题意来分析,分析返回变量或表达式的值和类型。

4、赋值语句

若错误行是赋值语句,则要看赋值是否正确,然后看赋值运算符是否写正确。

5、定义语句

若错误行是定义语句,则要注意:

1)首先分析变量类型名是否写对;

2)然后分析给变量赋初值是否正确;

c语言上机编程20题 第8篇

关键词:C语言;编程技巧;应用

中图分类号:G642 文献标识码:B 文章编号:1002-7661(2014)24-002-01

C语言属于一种程序设计类语言,其使用在数据处理方面有突出作用,在很多的学习工作领域都有大规模的应用,像是软件开发、科研建设等都离不开C语言的利用。C语言编程,就是用C语言进行相应计算机代码的编写,C语言的学习,需要掌握一定的技巧,不然没有头绪的学习是得不到良好学习效果的,掌握了C语言的学习技巧,才能够更好的促进C语言的学习[1]。

一、C语言与C语言的优势

当下世界上使用范围最广,流行度最高的计算机编程语言便是C语言,要想良好的学习和使用C语言,必须加深对C语言的了解。C语言发源于上个世纪60年代,成熟在70年代,最近半个世纪的使用过程中,C语言表现了如下几种优势:第一,C语言简洁紧凑,使用方式灵活方便,且语法运用宽松不受限制,书写方式自由随意,结合了高级编程语言的结构性与实用性的特点,组成了一种全新式的有强大使用功能的编程语言;第二,C语言有广泛的应用层面,且可植性强,C语言在各种系统中都能够被兼容使用;第三,C语言的运算符丰富多样,各种数据结构类型的使用,除了C语言可以将各种复杂的数据运算完成外,还具有强大的图形功能;第四,结构式的语言特点分割了代码和数据,其中的程序表现层次条理清楚,后期的使用和维护工作便利,使用C语言可以访问物理地址[2]。从中可知,C语言具有强大的功能,因此在信息技术的领域中,C语言所占据的地位是非常高的。

二、C语言学习难度大的原因

因为C语言所具备的各种强大功能,因此人们对其的关注程度也越来越高,想要学会并且全面掌握C语言技术的人也越来越多。可是大部分在刚刚接触C语言的时候,觉得C语言过于枯燥乏味,学习了一段时间后都没有掌握到多少知识,也没有一个清楚全面的认识对于C语言,觉得十分的茫然。出现这种情况的原因还是因为C语言是一种高级语言,这种语言和面向对象的语言之间存在较大的差别,在C语言的学习过程中,学习者难以从中看到形象的画面,只能够在编程程序成功后,经过调试才可以看到效果。在编程的过程中,只要出现一点粗心错误,就会让整个编程无法成功调试,出现一些错误的现象,除此之外,C语言的使用过程中,包含了大量的算法与数据组成结构,这些没有任何的技巧,就是要死记硬背,所以很多学习者在遇到这些枯燥晦涩的问题时,就会丧失学习兴趣,降低学习效率和学习质量。

三、C语言编程技巧的应用

1、用空间换时间

例如对字符串进行赋值,方法有以下几种:

(1)基础方法:

#define LEN 32

Char string I[LEN];

memset(string 1,0,LEN);

ctrcpy(string 1,“this is a example”) ;

(2)方法2:

const char string2[LEN]=“this is a example”;

char*cp;

cp=string2;

从这个案例中可以发现,方法(1)与方法(2)在电脑上的执行效率是不一样的,第一种方法必须使用两个字符函数才可以完成,而第二种方法直接使用指针就可以完成了。但是第二种方法相比第一种方法灵活性欠缺,如果这个字符串有不断变化的要求,那么第一种方法就有很大的使用优势了,第二种方法要占用较大的内存,但是效率比第一种更高[3]。

2、位运算掌握

在利用位运算的时候,能够让代码变得更加的简洁,提升运算效率,让问题得到顺利解决。在所有的计算机程序之中,最小的数据单位就是位,无特殊情况的话,所有的数据运算和操作都可以使用“位运算”方式完成,从这里就就可以看出,在编程语言之中,“位”有多么重要了。“位”使用在C语言的运算过程中,可以提升工作效率,顺利的将更多难度大的问题解决。

3、C语言特有函数掌握

很多时候进行编程,都需要使用C语言的特有函数,函数不是一种数据,而是一种功能,每一个函数都能够执行一定的功能建设,而相对应的函数名称中也将函数的功能反映了出来。开展函数定义的时候,要求操作者包含名字、参数名、类型和函数返回类型的数据,编译过程中,数据库系统是之前被定义好了的,使用过程中只要通过#include这项指令,把各种相关的头文件包含在本文件当中就可以了。

但是不管在C语言编程过程中使用怎样的技巧,还是需要做到具体问题具体分析,以上各种技巧使用起来因人而异,整体是能够提升编程效率,在学习过程中使用会获得一定的成效,而降低学习的枯燥感,拓宽C语言的使用范围。

C语言的学习过程中,每一位学习者都应该对C语言的特性有充分的了解,学习并且掌握每一种编程技巧,学习好了C语言的编程技巧,可以帮助学生提升C语言的学习兴趣,让学生的学习目的性更强,提升学生的C语言学习效率与学习质量。

参考文献:

[1] 余 勍.王 捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013,07:108.

[2] 赵 黎.范君君.C语言编程技巧在C语言学习中的应用研究[J]. 信息与电脑(理论版),2014,09:252.

C语言期末考试编程题范文 第9篇

int a,b,c,s,i=0;

for(s=100;s<1000;s++)

{

c=s%10;

b=s/10%10;

a=s/100;

if(s==a*a*a+b*b*b+c*c*c)

{

printf(“%dt”,s);

++i;

if(i%5==0)

printf(“n”);

}

} } 2.求1+2!+3!+...+20!的和 #include void main(){ double fact=1.0,sum=0.0;int i,j;for(i=1;i<=20;i++){ for(j=1;j<=i;j++)fact*=j;sum+=fact;fact=1;} printf(“%.0fn”,sum);} 3.输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。#include #include void main(){ long num;int a,b,c,d;printf(“Please input the number:”);scanf(“%d”,&num);if(num<=9999||num>=100000){ printf(“%The number error!n”);exit(0);} a=num/10000;b=num/1000%10;c=num/10%10;d=num%10;if(a==d&&b==c)printf(“nYes,the %ld palindrome!n”,num);else

is is printf(“nNo,the %ld is not palindrome!n”,num);} 4.求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并并按照一行5个的格式输出。

#include void main(){ int num,i=0;for(num=1;num<=1000;num++)

if(((num%7||num%11)==1)&&((num%7&&num%11)==0)){ printf(“%dt”,num);++i;if(i%5==0)printf(“n”);} } 5.编程列出200以内所有的素数,按照一行10个的格式输出,并求出所有素数的平均值,#include #include void main(){ int i,j,k=0,sum=0,avg=0;for(i=2;i<200;i++){ for(j=2;j<=sqrt(i);j++)if(i%j==0)break;if(j>sqrt(i)){ printf(“%dt”,i);++k;sum+=i;if(k%10==0)printf(“n”);} } avg=sum/k;printf(“nThe is %dn”,avg);}

average

6、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1+1/3+1/5...+1/n #include void main(){ void odd(int n);void even(int n);int n;printf(“Please input the number:”);scanf(“%d”,&n);if(n%2)odd(n);else even(n);} void odd(int n){ float sum=0.0;float j;int i;for(i=1;i<=n;i+=2){ j=1.0/i;sum+=j;} printf(“%fn”,sum);} void even(int n){ float sum=0.0;int i;float j;if(n==0)printf(“%fn”,sum);else { for(i=2;i<=n;i+=2){ j=1.0/i;sum+=j;} printf(“%fn”,sum);} }

7、已知abc+cba=1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有 组合。

#include void main(){ int a,b,c;for(a=1;a<=9;a++)for(b=0;b<=9;b++)for(c=1;c<=9;c++)

if((100*a+10*b+c+100*c+10*b+a)==1333)

printf(“a=%d,b=%d,c=%dn”,a,b,c);}

8、用户输入12个0-100之间的整数,统计出小于60,60到79,80到100三个范围的整数各有多少个? #include #include void main(){ int i,j,k,n,num;i=j=k=0;printf(“Please input the 12 numbers with 0~100:”);for(n=1;n<=12;n++){ scanf(“%d”,&num);if(!(num>=0&&num<=100))exit(0);if(num<60)++i;else if(num<80)++j;else ++k;} printf(“nThere

are

%d numbers less than 60,%d numbers between 60 and 79,%d numbers between 80 and 100.n”,i,j,k);}

9、求这样一个三位数并输出该数字,该三位数等于其每位数字的阶乘之和。

即: abc = a!+ b!+ c!#include void main(){ int a,b,c,num;int s(int);for(num=100;num<1000;num++){ a=num/100;b=num/10%10;c=num%10;if(num==s(a)+s(b)+s(c)){ printf(“The is %dn”,num);break;} } } s(int n){ int i,sum=1;for(i=1;i<=n;i++)sum*=i;

number return sum;}

10、猜数游戏:由用户随机输入一个1位正整数数让人来猜,只能猜5次,如果人猜对了,则在屏幕上显示“You are so clever”,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止或者5次都猜不对给出提示“Game Over”。#include #include void main(){ int num,i,n;printf(“Please input the number with 0~9 for guessing:”);scanf(“%d”,&num);system(“cls”);if(num<0||num>9)exit(0);for(i=1;i<=5;i++){ printf(“nPlease input the number you guess:”);scanf(“%d”,&n);if(num==n){ printf(“nYou are so clever!n”);break;} else if(n

have

%d

times left!n”,5-i);continue;} else { printf(“nThe number you input is large,go on please!You

have

%d

times left!n”,5-i);continue;} } if(i>5)Over!n“);}

11、设N是一个四位数,它的9倍恰好是其反序数(例如:123的反序数是321),求N的值。#include void main(){ int n,k,a,b,c,d;for(n=1000;n<=9999;n++){ a=n/1000;

printf(”Game b=n/100%10;c=n/10%10;d=n%10;k=1000*d+100*c+10*b+a;if(k==9*n)printf(“N=%dn”,n);} } 12、100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。#include void main(){ int h1,h2,h3;for(h1=0;h1<=100;h1++)for(h2=0;h2<=100;h2++)for(h3=0;h3<=100;h3+=2){

if(h1+h2+h3==100&&3*h1+2*h2+1/2*h3==100)printf(“The horse has has

%d,middle

old horse horse

%d,young has %dn”,h1,h2,h3);} }

13、一位司机酒驾撞人逃跑。现场三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。(车号为4位数)#include #include void main(){ int n,a,b,c,d,i;for(n=1000;n<=9999;n++){ a=n/1000;b=n/100%10;c=n/10%10;d=n%10;i=sqrt(n);if(a==b&&c==d&&i*i==n)printf(“%dn”,n);} } 14、求S=1/(1*2)+1/(2*3)+1/(3*4)+……前50项之和并输出结果。#include void main(){ float i;float s=0;for(i=1;i<51;i++)s+=1.0/(i*(i+1));printf(“%f”,s);}

15、编程求出所有1000到3000之间能被7、11、17同时整除的整数,并求其平均值,并输出结果(结果保留两位小数)。#include void main(){ int i,k=0,sum=0;for(i=1000;i<=3000;i++)if(i%7==0&&i%11==0&&i%17==0){ sum+=i;++k;printf(“%dt”,i);}

printf(“n%d”,sum/k);}

16、编程找出满足下列条件的所有四位数的和并输出:该数第一、三位数字之和为10,第二、四位数字之积为12。

#include #include int main(void){ int i,j,x,y,z,m;for(i = 1000;i< 10000;i++){ x = i/1000;y =(i/100)%10;z =(i/10)%10;m = i%10;if((x + z)==10&&(y+ m)==12){ printf(“%dt”,i);} } printf(“n”);return 0;}

17、求并输出所有满足如下条件的三位正整数:它是某整数的平方,它的三位数码有两位是相同的。(如100是10的平方,它有两个0,225是15的平方,它有两个2)。#include #include void main(){ int n,i,a,b,c;for(n=100;n<=999;n++){ a=n/100;b=n/10%10;c=n%10;i=sqrt(n);

if((a==b||a==c||b==c)&&n==i*i)printf(“%dt”,n);} }

18、输出所有大于1010的4位偶数,且该类偶数的各位数字两两不相同。#include void main(){ int num,a,b,c,d;

for(num=1012;num<=9999;num+=2){ a=num/1000;b=num/100%10;c=num/10%10;d=num%10;if(a!=b&&b!=c&&c!=d)printf(“%dt”,num);} }

19、编制程序要求输入整数a和b,若a+b大于100,则输出a+b百位以上的数字,否则输出两数字之和。#include 2

222void main(){ int a,b,s;printf(“Please input a and b:”);scanf(“%d%d”,&a,&b);s=a*a+b*b;if(s>100)printf(“n%dn”,s/100);else printf(“n%dn”,a+b);} 20、编写一个程序实现如下功能:计算1~100之间所有包含4或者包含5的数字,并显示其累加之和 #include void main(){ int a,b,i,sum=0;for(i=1;i<=99;i++){ a=i/10;b=i%10;

上一篇:2人员配备标准化下一篇:闯祸作文550字