c语言上机实习编程题

2024-05-17

c语言上机实习编程题(共10篇)

篇1:c语言上机实习编程题

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

篇2:c语言上机实习编程题

实验2顺序结构程序设计

二、6.实现两个数的对调:

#include void main(){ int a,b,t;scanf(“%d%d”,&a,&b);printf(“a=%d b=%dn”,a,b);t=a;a=b;b=t;printf(“a=%d b=%d”,a,b);} 7.编写程序

(1)#include #include void main(){ double a,x,y;scanf(“%lf %lf”,&a,&x);y=sin(sqrt(a*x))+log(a+x);printf(“%lfn”,y);}(2)

#include

#include void main(){ double a,x,y;scanf(“%lf %lf”,&a,&x);y=cos(sqrt(a+x))+exp(a*x);printf(“%lfn”,y);}(3)#include #include void main(){ double a,b,c,s,area;scanf(“%lf %lf %lf”,&a,&b,&c);s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));

篇3:c语言上机实习编程题

二级C语言考试由笔试和上机两部分。笔试考察的是应试者对基础知识和基本理论的掌握情况,而上机考试主要测试的是应试者的逻辑思维能力和运用C语言的能力,一般包括3种题型:填空题、改错题、编程题。该文对考试题库中编程题作出归纳,总结,希望对应试者有所帮助。

1 上机编程题的知识点

上机考试的知识点大概可以有5个,分别是:基本运算、循环、数组、字符串、结构体。以下对这5个知识点分别举例说明。

1.1 基本运算

例如有以下编程题:

编写函数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;

1.2 循环

循环中最主要的应用就是迭代和遍历。迭代一般是用来解决累加、累乘的问题,可用for语句来实现。

例如有以下编程题:

编写函数fun,它的功能是计算并输出以下多项式的值:

例如:当在主函数中从键盘给n输入5,则输出为:s=-0.28333。

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

程序如下:

分析:这类题主要是考察应试者对迭代的掌握。关键是找出迭代公式、变量的起始值和最大值。本题中表达式的每一项是都是一个分数,分子都是1,分母初始值是2,最大值是n, 而且每项增1,所以可设一整型变量i, 用for语句实现:for (i=2;i<=n;i++) 。表达式的值用变量s表示,s的初始值为1,每一项之间用减号连接,所以迭代公式,也就是循环语句可表示为s=s-1/i。除此以外,还应注意两点1。变量s的类型,因为表达式的值是实数,所以变量s应定义为double。2.注意基本算术运算中,两整数相除结果为整数,而题目中每一项要得到的结果为实数,所以应用算术运算中数据类型的转换将s=s-1/i改为s=s-1.0/i。

本题的答案为:

1.3 数组

数组可以分为一维数组和二维数组。

1.3.1 一维数组

编写函数fun, 它的功能是:找出一位整型数组中元素的最大值和它所在的下标,最大值和下标通过形参传回。数组元素中的值已在主函数中赋予。

主函数中的x是数组名,n是x中的数据个数,max存放最大值,index存放最大值的下标。

程序如下:

分析:这类题是遍历在数组中的应用。要找出数组中的最大值,必须对数组中每一个元素查找一遍,同时要进行比较。编程思想:可设一变量max, 假设数组中的第一个元素a[0]是最大的,然后后面的元素依次和max进行比较,只要比当前max的值大,就把它放在max中。

本题的答案为:

1.3.2 二维数组

编写程序,实现矩阵的转置。

例如:输入下面的矩阵:

分析:这类题是关键是解决两个问题:1.怎样对二维数组元素的遍历。2.怎样完成矩阵的转置法。因为二维数组元素表示要用到两个下标即行标和列标,所以遍历数组元素用到两层循环。矩阵的转置就是对应行和变成对应列,换句话说就是关于主对角线的对应元素交换。

本题的答案为:

1.4 字符串

例如有以下编程题:

规定函数中只包含字母和*。请编写函数fun, 它的功能是:删除字符串中的所有*。在编写函数时,不得使用字符串函数。

例如:字符串中的内容为:****A*BC*DEF*G*****,删除后,字符串中的内容为:ABCDEFG。

分析:这类题要对字符串中所有字符遍历,把不是*的字符保留下来。本题要解决两个问题:1.怎样判断字符串结束。2.怎样把不是*的字符放在原来的字符串中。字符串都是以’�’作为结束标志,可以把字符串中元素是不是’�’作为判断字符串结束的依据。可设一变量j作为字符串的新下标,初始值为0,只要原字符串中的元素不是’�’, j就加1,特别注意要在最后加上’�’最为字符串结束标志。

本题的答案为:

1.5 结构体

例如有以下编程题:

学生的记录是有学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun, 它的功能是:把分数最低的学生数据放在数组b中,注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。

程序如下:

分析:这类问题其实编程思想和前面的没有太大的差别,主要考察的是对结构体成员的引用,其引用形式为:结构体变量名.成员名。

本题的答案为:

2 结论

本文只是对计算机等级考试二级C语言的上机题作了简单的分析和总结,仅过分析可以看出,考察的知识点总共有5个,但是基本上都是循环的两方面的应用:迭代、遍历。

参考文献

[1]未来教育与教学研究中心.全国计算机等级考试二级C语言上机考试题库[M].北京:金版电子出版社, 2007.

篇4:c语言上机实习编程题

【摘要】本系统主要研究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.

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

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

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

篇6:C语言上机实习报告

1.能够描述VC++6.0开发平台的使用过程,学会运行一个C程序的基本步骤,包括编辑、编译、链接和运行。

2.能够使用算术表达式和赋值表达式书写正确的语句。3.能够使用输入/输出函数编写简单的程序。

二、实验环境

(调试程序所使用的软硬件环境)软件环境:VC++6.0 硬件环境:宏基

Intel 奔4 主频 2.8GHz,内存256MB

三、实验内容、结果及分析

1、题目1)求华氏温度150°F对应的摄氏温度。计算公式如下: 55cf32

其中:c表示摄氏温度,f表示华氏温度。源程序清单:(调试好的源程序代码)// work1.cpp : Defines the entry point for the console application.//

#include “stdafx.h” #include using namespace std;int main(int argc, char* argv[]){

} 主要标识符说明:(源程序中主要标识符含义说明)Double为双精度类型变量名表

实验结果:(程序运行结果)double f,c;cout<<“输入华氏温度,按Enter执行”<>f;c=5*(f-32)/9.0;cout<<“华氏温度为”<

实验中遇到的问题及解决的方法 源代码的粘贴出现乱码

解决:从Cpp文件中粘消除格式。

2、题目

已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均分。

源程序清单:(调试好的源程序代码)// work2.cpp : Defines the entry point for the console application.//

#include “stdafx.h” #include using namespace std;int main(int argc, char* argv[]){

double a,b,c,average;cout<<“请按顺序输入数学、英语、计算机三科成绩。”<>a>>b>>c;average=(a+b+c)/3.0;cout<<”数学“<

实验中遇到的问题及解决的方法

3、题目

当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。

源程序清单:(调试好的源程序代码)// work3.cpp : Defines the entry point for the console application.//

#include “stdafx.h” #include using namespace std;int main(int argc, char* argv[]){

int n,digit1,digit2,digit3;cout<<“请输入一个三位数n(100﹏999)”<>n;digit1=n%10;

//求个位数字 digit2=n/10%10;

//求十位数字 digit3=n/100%10;

//求百位数字

cout<<“个位数字(digit1)”<

实验中遇到的问题及解决的方法

四、实验体会(心得、收获)

C语言对我们来说是一个崭新的学科。我想学习C语言就像学习其他学科一样,需要我们用心的去学习。它也是我们交流的一种新的方式。只不过是人机之间的。随着科学的进步,与社会的发展,计算机显得尤为重要。C语言又是学习计算机的基础,所以我们更应该该好好的学习C语言。通过这节实验课,我们学到了如何运用6.0来编辑代码,运行我自己编写的程序。虽然过程中会有错误,但在这犯错的过程中我学到了我所不知道的。在这纠错的过程中,我来了解到我还有很多的地方不足。如忘记写分号等。其实就错就是个学习的过程。

篇7:C语言面试编程题

#include

#include

#include

char *GetMemory(char *p)

{

p = (char *)malloc(100);

return p;

}//当调用此函数时,会在栈里分配一个空间存储p, p指向堆当中的一块内存区,当函数调用结束后,若函数没有返回值,

//系统自动释放栈中的P

void Test(void)

{

char *str = NULL;

str=GetMemory(str);

strcpy(str, ”test“);

printf(”%s/n“,str);

}

char *GetMemory1(void)

{

char *p = ”Test1“;

return p;

}//若换成char p=”hello world“; 就会在函数调用结束后,释放掉为”Test1“的拷贝分配的空间,返回的P只是一个野指针

void Test1

{

char *str = ”“;

str=GetMemory1;

printf(”%s/n“,str);

//str=GetMemory;

}

void GetMemory2(char p, int num)

{

*p = (char *)malloc(num);

}//当调用此函数时,会在栈里分配一个空间存储p, p指向栈中的一变量str,在此函数中为str在堆当中分配了一段内存空间

//函数调用结束后,会释放p, 但str所在的函数Test2还没运行完,所以str此时还在栈里.

void Test2(void)

{

char *str = NULL;

GetMemory2(&str, 100);

strcpy(str, ”hello“);

printf(”%s/n“,str);

}

void Test3(void)

{

char *str=(char *)malloc(100);

strcpy(str, ”hello“);//此时的str指向的是拷贝到栈里的”hello“,所以当释放掉str指向的堆空间时,str指向的栈里的值还是不变

free(str);

if(str != NULL)

{

strcpy(str, ”world“);

printf(”%s/n",str);

}

}

int main

{

Test;

Test1;

Test2;

Test3;

篇8:谈C语言上机考试的自动评分

若采用系统自动评分,不但将考生作弊的可能大幅减小,并且智能化的给学生的程序进行评分,以取代教师的低效率的、机械的阅卷模式,改变了院校人工批阅上机考试的现状,更加直观地反应学生的学习水平和教师的教学成果。因此,自动评分技术的研究与实现,在高等教育领域和计算机考试中具有十分重要的实际意义。本文以C语言程序设计为例,给出一种利用LD算法实现自动评分的方法。

1 填空改错题的评分

C语言上机考试系统的题型一般情况下,不外乎有填空题、改错题和编程题,其中填空题和改错题的评分完全可以将比较来判定成绩,即通过比较原题和学生答题找到最长不同字符串,然后将该字符串同标准答案比较即可。其实现方法在VB6.0中可以用以下源代码实现:函数名为CompStrFun,形参indata、dindata表示学生答题结果、试题标准答案,均为字符串类型。该函数返回两个参数最长不同字符串的长度。

2 编程题的评分

对C语言考试系统中的编程题,因为不同学生考虑问题的角度和解决问题的思路与方法存在差异,于是同样的问题学生给出的争取答案多种多样,从而造成系统无法给出标准的答案。

目前,多数程序设计类课程的上机考试系统对于编程题的评判,多是采用比较程序运行所输出结果的文件,而不考虑学生所编写程序。虽然这样能够确保编程完全正确的学生获得该题满分,但是这样造成了以下两种不合理的情况存在。第一种情况,完全不编程而直接通过编辑输出文件来获取满分的情况;第二种情况:编写的程序大部分正确,但程序无法运行得零分的情况。

对于第一种情况,在学生提交考试结果时的时候通过重新生成结果文件来避免。即先删除学生答题所产生的结果文件,再调用编译系统重新编译连接学生编写的程序,生成可执行的exe文件并运行产生最新的结果文件,然后和标准结果进行比较。这样即使学生直接编辑结果文件正确,但没有编写程序,也无法获取成绩。此情况在VB6.0中可以编写如下函数代码来实现。

‘函数名:AgainExe()

‘参数:形参FileName表示学生所编写的源程序文件(包含路径)。

‘返回值:True表示成功重新生成exe文件,Flase表示生成exe文件失败。

Public Function AgainExe(ByVal FileName As String)As Integer

Shell"VCVARS32.BAT"'设置运行环境参数

AgainExe=Shell("Cl.exe"&App.Path&FileName,vbNormalFocus)

End Function

对于第二种情况,因学生的主观因素造成学生的答题结果存在着差异,而编程题的答案并不是唯一的。这样造成该类型的题目并不能采用上述填空改错题的方式来评分。本文通过文本相似性来实现编程题的评分,即借助距离编辑(LD)算法,将学生答案和标准答案进行比较获得答案相似度作为得分比例,然后乘以该题总分作为学生该题的得分。

3 距离编辑算法实现

距离编辑算法(简称LD算法)是以一个字符串A转换成另一个字符串B的过程中,所进行的插入、删除、替换等操作的次数表示两个字符串的相似度。在上机考试系统中,从学生答案读取程序行作为字符串A,而标准答案读取程序行作为字符串B,然后即可按行执行LD算法。

例如学生程序行“x=a[j]”如何变成标准程序行“x=b[++i]”呢?第1步,a替换成b,x=a[j]→x=b[j];第2步,j替换成i,x=b[j]→x=b[i];第3步,在i前插入++,x=b[i]→x=b[++i]。故x=a[j]和x=b[++i]的编辑距离为3。

在VB6.0中实现该算法的函数源代码如下:其中函数名为LD,形参StrA、StrB表示学生答题结果、试题标准答案,均为字符串类型。该函数返回两个参数的编辑距离。

4 结论

本文提出的计算机自动评分方法,已经应用于程序课上机考试系统中。不但可以将该系统作为《C语言程序设计》课程的期末上机考试系统,另一方面还可以让学生熟悉二级语言考试环境,从而提高计算机等级考试通过率。

摘要:在程序设计课的上机考试系统中,如何实现自动评分是最为关键的部分。该文对不同题型给出了不同的评分方法,其中编程题的评分,采用学生答案和标准答案之间的编辑距离作为评分依据,将LD算法用于考试系统的自动评分,并给出用VB6.0实现的函数代码。

关键词:自动评分,考试系统,VB6.0,LD算法

参考文献

[1]吴宗东,李兵元.浅谈SHELL函数使用新法[J].新疆石油科技,2000,21(2):76-80.

[2]王振明,李俊龙.一种简易的文本内容比较算法及在VB中的实现[J].计算机应用与软件,2007,24(8):199-221.

篇9:c语言上机实习编程题

关键词: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.

篇10:c语言上机实习编程题

char ch, filename[200];

int count = 0;

FILE *fp;

scanf(“%s”, filename);

if((fp = fopen(filename, “r”))== NULL)

{

printf(“File open error!n”);

exit(1);

}

while((ch = fgetc(fp))!= EOF)

{

count++;

}

printf(“%dn”,count);

if(fclose(fp))

{

printf(“File close error!n”);

exit(1);

}

return 0;}

2.文件中数据的排序 #include #include int main(void){

int a[10], temp = 0, i = 0, j = 0, k = 0;

char filename1[80], filename2[80];

FILE *fp1,*fp2;

scanf(“%s”, filename1);

scanf(“%s”, filename2);

if((fp1 = fopen(filename1, “rb”))== NULL)

{

printf(“Input file open error!n”);

exit(1);

}

if((fp2 = fopen(filename2,“wb”))== NULL)

{

printf(“Output file create error!n”);

exit(1);

}

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

{

fread(&a[i], sizeof(int), 1, fp1);

/* 读出数据 */

}

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

{

k = i;

for(j = i + 1;j < 10;j++)

if(a[k] > a[j])k = j;

if(k!= i)

{

temp = a[k];

a[k] = a[i];

a[i] = temp;

}

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

/*

{

fwrite(&a[i], sizeof(int), 1, fp2);

}

if(fclose(fp1))

{

printf(“Input file close error!n”);

exit(1);

}

if(fclose(fp2))

{

printf(“Output file close error!n”);

exit(1);

}

/*验证结果的代码,请不要改动*/

if((fp1 = fopen(filename2, “rb”))== NULL)

{

printf(“Result file open error!n”);

exit(1);

}

/* 排序 */ 写入数据 */

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

{

fread(&a[i], sizeof(int), 1, fp1);

/* 读出数据 */

}

if(fclose(fp1))

{

printf(“Result file close error!n”);

exit(1);

}

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

printf(“%d ”, a[i]);

printf(“%dn”, a[i]);

return 0;} 3 二进制数据文件/ #include #include int main(void){

int a[10], temp = 0, i = 0, j = 0, k = 0;

char filename1[80], filename2[80];

FILE *fp1,*fp2;

scanf(“%s”, filename1);

scanf(“%s”, filename2);

if((fp1 = fopen(filename1, “r”))== NULL)

{

printf(“Input file open error!n”);

exit(1);

}

if((fp2 = fopen(filename2, “wb”))== NULL)

{

printf(“Output file open error!n”);

exit(1);

}

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

{

fscanf(fp1, “%d”, &a[i]);

fwrite(&a[i], sizeof(int), 1, fp2);

}

if(fclose(fp1))

{

printf(“Input file close error!n”);

exit(1);

}

if(fclose(fp2))

{

printf(“Output file close error!n”);

exit(1);

}

if((fp1 = fopen(filename2, “rb”))== NULL)

{

printf(“Result file open error!n”);

exit(1);

}

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

{

fread(&a[i], sizeof(int), 1, fp1);

}

if(fclose(fp1))

{

printf(“Result file close error!n”);

exit(1);

}

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

printf(“%d ”, a[i]);

printf(“%dn”, a[i]);

return 0;}

4.比较2个文本文件的内容 #include #include int main(void){

int i = 1, flag = 0;

char filename1[80], filename2[80];

FILE *fp1, *fp2;

/* 读出数据 */

scanf(“%s”, filename1);

scanf(“%s”, filename2);

if((fp1 = fopen(filename1, “r”))== NULL)

{

printf(“Input file1 open error!n”);

exit(1);

}

if((fp2 = fopen(filename2,“r”))== NULL)

{

printf(“Input file2 open error!n”);

exit(1);

}

while(!feof(fp1))

{

if(fgetc(fp1)== fgetc(fp2))

i++;

else

{

flag = 1;

break;

}

}

if(flag)

printf(“%dn”, i);

else

printf(“is equaln”);if(fclose(fp1))

{

printf(“Input file1 close error!n”);

exit(1);

}

if(fclose(fp2))

{

printf(“Input file2 close error!n”);

exit(1);

}

上一篇:XX年9月落实全面从严治党心得体会下一篇:劳动节假期随笔心得