c语言概念题
(B)一个C函数可以单独作为一个C程序文件存在(C)C程序可以由一个或多个函数组成(D)C程序可以由多个程序文件组成
4、以下叙述中错误的是_____________。(标准答案:A)
(A)C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令(B)C语言源程序经编译后生成后缀为.obj的目标程序
(C)用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中(D)C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文件
13、以下叙述中错误的是A(A)使用三种基本结构构成的程序只能解决简单问题(B)C语言是一种结构化程序设计语言(C)结构化程序由顺序、分支、循环三种基本结构组成(D)结构化程序设计提倡模块化的设计方法
18、以下关于结构化程序设计的叙述中正确的是
(A)一个结构化程序必须同时由顺序、分支、循环三种结构组成(B)有三种基本结构构成的程序只能解决小规模的问题(C)在C语言中,程序的模块化是利用函数实现的(D)结构化程序使用goto语句会很便捷 标准答案:C
19、对于一个正常运行的C程序,以下叙述中正确的是C(A)程序的执行总是从main函数开始,在程序的最后一个函数中结束(B)程序的执行总是从程序的第一个函数开始,在main函数结束(C)程序的执行总是从main函数开始
(D)程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束
33、以下选项中关于程序模块化的叙述错误的是
(A)把程序分成若干相对独立的模块,可便于编码和测试
(B)可采用自顶向下、逐步细化的设计方法把若干独立模块组装成所要求的程序(C)把采用分成若干相对独立、功能单一的模块,可便于重复使用这些模块
(D)可采用自顶向上、逐步细化的设计方法把若干独立模块组装成所要求的程序 标准答案:D
34、以下叙述中正确的是
(A)C程序中的注释只能出现在程序的开始位置和语句的后面(B)C程序书写格式严格,要求一行内只能写一个语句(C)用C语言编写的程序只能放在一个程序文件中(D)C程序书写格式自由,一个语句可以写在多行上 标准答案:D
36、以下关于C语言数据类型使用的叙述中错误的是(A)若只处理“真”和“假”两种逻辑值,应使用逻辑类型(B)若要保存带有多位小数的数据,可使用双精度类型(C)整数类型表示的自然数是准确无误差的
(D)若要处理“人员信息”等含有不同类型的相关数据,应自定义结构体类型
38、以下叙述中错误的是
(A)C程序在运行过程中所有计算都以二进制方式进行(B)C程序在运行过程中所有计算都以十进制方式进行
一、指针的概念
一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
指针的引入为系统存取数据提供“直接访问”和“间接访问”。有两个上锁且放着物品的盒子A、B, 如果你有A盒子的钥匙, 则可以直接打开A盒子将物品取出;如果你有B盒子的钥匙, 而A盒子的钥匙在B盒子中, 要想取出A盒子中的物品, 则必须先打开B盒子, 取出A盒子的钥匙, 再打开A盒子将物品取出。上面两种情况就是直接访问和间接访问的概念。所谓间接访问, 是先访问存放变量地址的存储单元, 得到该变量的地址, 再对变量内容进行访问。通过指针变量实现对变量的访问方式, 称为间接访问。首先要定义一个指针变量, 然后将一个同类型变量的地址赋给该指针变量 (这时我们称指针变量指向该变量) , 这样就可以进行间接访问了。间接访问的过程是:由指针变量得到变量的地址, 根据该地址找到变量的存储区, 再对该存储区的内容进行存取, 从而实现了对变量的间接访问。
指针变量是一种特殊变量。系统为指针变量分配一块连续存储单元不是供其存储数据, 而是存储内存地址。因此, 指针变量是存储内存地址的变量。在计算机中, 把内存区划分为一个一个的存储单元, 每个单元为一个字节 (8位) , 它们都有一个编号, 这个编号就是内存地址。
注意:1.程序中定义的每个数据在编译后都占有各自的内存区。
2.数据所占有的存储单元个数是由其类型决定的。
3.首地址:第1个单元的地址。
4.表示地址的数与整数的区别。
二、指针的类型
1.指向简单变量的指针。指针所指的数据类可以是简单的数据类型。
例: (1) ;意思是指针变量指向整型变量i
(2) ;意思是指针变量指向字符型变量a
(3) ;意思是指针变量指向数组a
2.指向数组的指针。指针所指的数组既可以是一维数组, 也可以是多维数组。
分析:指针p指向了a数组的首地址, 通过p++来访问a数组的每一元素。
3.指针数组。指针数组是一种特殊的数组, 它每个元素的类型都是指针类型 (即地址) , 其他与一般数组相同。当把某个量的地址放入某元素中后, 即可通过该元素对相应的量进行间接访问。数组元素是由指针变量组成的一种指针。定义如:;指针数组p包含两个元素, 每个元素指向一个整型数据。
分析:指针p是一个数组, 通过for循环语句给指针数组中的每个指针变量赋值, p[1]的初值为数组a的第二行的首地址, 便是元素a[1][1], 因此程序输出7。
4.指向指针的指针。指针变量指向的是指针的地址, 定义如:。
分析:指针数组p的各个指针变量指向数组a的各行首地址, q指向指针数组p的首地址, 等同p[1], 如此, 便等同也就是a[1][1], 因此程序输出7。
5.指向函数的指针。指针变量指向函数的首地址, 然后通过该指针变量调用该函数。定义如:。
分析:表示定义了一个指向函数的指针变量, 函数名max代表了函数的入口地址, 执行p=max后, p指向了函数max, 便是通过p调用函数max。
6.指向文件的指针。C语言对文件的操作并不是直接通过文件名进行的, 而是根据文件名生成一个文件指针, 通过该指针来对文件进行操作.定义如:; (fp为文件指针, 此时fp不指向任何文件) 。
7.指向字符串的指针。字符串是一种特殊的一维数组, 所以上节中介绍的方法同样适用于对字符串的访问。字符串的特殊性在于:字符串的末尾是结束标志′�′, 所以访问字符串时常用结束标志进行判断。
三、指针应用中常见的错误
1.把数据赋给指针变量。指针在使用前必须进行初始化, 赋予指针的值必须是地址。
正确语句:p=&i;“&”是一个取变量地址的运算符。
2.指针常量运算错误。程序中常量指针是不能被修改的。典型有数组名指针常量和指向字符串常量的指针。
3.指针赋值类型不一致。
正确语句:p=a[0];或p=&a[0][0];如果一定把a赋值给p, 必须先将a转换成整型指针类型。如:;。特别是将多维数组赋值给指针变量时应注意类型匹配。
摘要:指针是C语言的精髓部分, 也是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.
分析:
逻辑结构:线性结构 非线性结构
线性结构:线性表 栈 队列
非线性结构:树 图
存储结构:顺序存储结构 链式存储结构
2.关于循环队列中起始元素为0,还是1的问题,然后是否空出一个元素避免队满队空一样。不管是栈还是队列栈顶指针都是指向下一个位置,所以对循环队列为(Q.rear-Q.font+MAXSIZE)%MAXSIZE
3.关于逗号表达式的运算顺序(A , B)是先算B再算A ?
赋值表达式是左值表达式,逗号表达式是自左向右运算的,逗号表达式的返回值是最右值
4.转义字符:ddd表示反斜杠后为1~3位8进制数所代表的字符数,xhh为1~2位十六进制数所代表的字符数
5.关于switch没有default会不会一直进行下去
6.*与+=运算符优先级的比较 *p+=2,是先算哪个 先算*p
7.循环队列是顺序存储结构(是队列的顺序存储结构的拓展,虽然有链队列,但是循环队列只限于顺序存储结构)
8.能够给出数据库物理存储结构与物理存取方法的是 :内模式
9.在满足实体完整性约束的条件下:一个关系中应该有一个或者多个候选关键词
10.软件生命周期中的活动不包括:市场调研
11.在黑盒测试方式中,设计测试用例的主要根据是:程序外部功能
12.在软件设计中不使用的工具是 D A、系统结构图
B、程序流程图
C、PAD图
D、数据流图(DFD图)
13.只要在在允许范围内整型和实型都能精确表示
14.一个正确的算法可以没有输入,但是要有输出
15.char str[3][10];str[1]={“guest”};(X)解释:str[1]是str[1][0]的地址,所以不能直接赋值 16.关于define定义的函数 S(x)(x)*x*2 在main函数中赋值时是按值固有的形式进行的运算,传a+b就为(a+b)*a+b*2
17.ftell不能用于向函数写入数据,fwrite fput fprintf 都可以
18.一般没有特殊说明时,循环队列并不会单独留一个空间来区分队满与队空,所以对于初始状态front=rear=n的条件,表明的就是n为队列能存放的最多元素,队满时就为rear比front小1
19.数据库管理系统提供的数据语言中,负责数据的增、删、改和查询的是(数据操纵语言)。
20.表达式的优先级:赋值表达式和关系表达式的优先级比较 k1=k1>k2
21.if表达式中如果是负值表示成立还是不成立
22.二维数组赋初值第一维长度可以省略的条件是什么
23对数据设计来说,.数据字典是进行详细数据收集和数据分析所获得的主要结构 所以在需求分析阶段建立数据字典
24.数据库系统的三级模式:概念模式,内模式(物理模式),外模式
没有数据模式
25.面向对象程序设计特征:继承,封装,多态
结构化程序设计:自顶向下,模块化,逐步求精
26.double a,*p=&a,*只是说明其为指针变量,表明p只能存放double类型变量的地址
27.在函数定义的静态变量,只需赋值一次,即可保持初始值,不需要每次调用都赋初值
形参不可说明为static型变量
28.采用结构化开发软件时,需要使用数据流图
29.数据库的核心:数据库管理系统(DBMs)
数据库系统包括四个部分:数据库、数据库管理系统、数据库应用程序、数据库管理员。
30.在实体,关系图中的联系通常被转化为关系。
结构化程序设计的主要特点是 : 每个控制结构只有一个入口和一个出口 在模块化程序设计中 , 按功能划分模块的原则是 : 各模块的功能尽量单一 , 31.且各模块之间的联系尽量少
在面向对象的程序设计中 , 各个对象之间相对独立 , 相互依赖性小
32.在面向对象方法中,一个对象请求另一个对象为其服务和方式是通过发送 D
A)调用语句
B)命令
C)口令
D)消息
33.软件三要素:程序、数据和文档 软件生命周期包括软件定义、软件开发及软件维护三个阶段
结构化分析常用工具:数据流图(DFD)
34.软件工程的三个要素的是:工具,过程,方法
35.内聚性最强的是:功能内聚
1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名?位域名 位域允许用各种格式输出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
pri
改错:
#include
int main(void) {
int **p;
int arr[100];
p = &arr;
return 0;
}
解答:
搞错了,是指针类型不同,
int **p; //二级指针
&arr; //得到的是指向第一维为100的数组的指针
#include
int main(void) {
int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;
}
下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main()
{
unsigned char A[MAX],i;//i被定义为unsigned char
for (i=0;i<=MAX;i++)
A[i]=i;
}
解答:死循环加数组越界访问(C/C++不进行数组越界检查)
MAX=255
数组A的下标范围为:0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:
A[255]=255;
这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时,
由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去.
struct name1{
char str;
short x;
int num;
}
struct name2{
char str;
int num;
short x;
}
sizeof(struct name1)=8,sizeof(struct name2)=12
在第二个结构中,为保证num按四个字节对齐,char后必须留出3字节的空间;同时为保证整个结构的自然对齐(这里是4字节对齐),在x后还要补齐2个字节,这样就是12字节。
intel:
A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题?这两个static变量会保存到哪里(栈还是堆或者其他的)?
static的全局变量,表明这个变量仅在本模块中有意义,不会影响其他模块。
他们都放在数据区,但是编译器对他们的命名是不同的。
如果要使变量在其他模块也有意义的话,需要使用extern关键字。
struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
struct s2
{
int i: 8;
int j: 4;
double b;
int a:3;
};
printf(”sizeof(s1)= %d“, sizeof(s1));
printf(”sizeof(s2)= %d“, sizeof(s2));
result: 16, 24
第一个struct s1
{
int i: 8;
int j: 4;
int a: 3;
double b;
};
理论上是这样的,首先是i在相对0的位置,占8位一个字节,然后,j就在相对一个字节的位置,由于一个位置的字节数是4位的倍数,因此不用对齐,就放在那里了,然后是a,要在3位的倍数关系的位置上,因此要移一位,在15位的位置上放下,目前总共是18位,折算过来是2字节2位的样子,由于double是8 字节的,因此要在相对0要是8个字节的位置上放下,因此从18位开始到8个字节之间的位置被忽略,直接放在8字节的位置了,因此,总共是16字节。
第二个最后会对照是不是结构体内最大数据的倍数,不是的话,会补成是最大数据的倍数
1)读文件file1.txt的内容(例如):
12
34
56
输出到file2.txt:
56
34
12
(逆序)
2)输出和为一个给定整数的所有组合
例如n=5
5=1+4;5=2+3(相加的数不能重复)
则输出
1,4;2,3。
望高手赐教!!
第一题,注意可增长数组的应用.
#include
#include
int main(void)
{
int MAX = 10;
int *a = (int *)malloc(MAX * sizeof(int));
int *b;
FILE *fp1;
FILE *fp2;
fp1 = fopen(”a.txt“,”r“);
if(fp1 == NULL)
{printf(”error1“);
exit(-1);
}
fp2 = fopen(”b.txt“,”w“);
if(fp2 == NULL)
{printf(”error2“);
exit(-1);
}
int i = 0;
int j = 0;
while(fscanf(fp1,”%d“,&a[i]) != EOF)
{
i++;
j++;
if(i >= MAX)
{
MAX = 2 * MAX;
b = (int*)realloc(a,MAX * sizeof(int));
if(b == NULL)
{
printf(”error3“);
exit(-1);
}
a = b;
}
}
for(;--j >= 0;)
fprintf(fp2,”%d“,a[j]);
fclose(fp1);
fclose(fp2);
return 0;
}
第二题.
#include
int main(void)
{
unsigned long int i,j,k;
printf(”please input the number“);
scanf(”%d“,&i);
if( i % 2 == 0)
j = i / 2;
else
j = i / 2 + 1;
printf(”The result is “);
for(k = 0; k < j; k++)
printf(”%d = %d + %d“,i,k,i - k);
return 0;
}
#include
void main()
{
unsigned long int a,i=1;
scanf(”%d“,&a);
if(a%2==0)
{
for(i=1;i
printf(”%d“,a,a-i);
}
else
for(i=1;i<=a/2;i++)
printf(” %d, %d“,i,a-i);
}
兄弟,这样的题目若是做不出来实在是有些不应该, 给你一个递规反向输出字符串的例子,可谓是反序的经典例程.
void inverse(char *p)
{
if( *p = = ”�“ )
return;
inverse( p+1 );
printf( ”%c“, *p );
}
int main(int argc, char *argv[])
{
inverse(”abc�“);
return 0;
}
借签了楼上的“递规反向输出”
#include
void test(FILE *fread, FILE *fwrite)
{
char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread))
return;
test( fread, fwrite );
fputs(buf, fwrite);
}
int main(int argc, char *argv[])
{
FILE *fr = NULL;
FILE *fw = NULL;
fr = fopen(”data“, ”rb“);
fw = fopen(”dataout“, ”wb");
test(fr, fw);
fclose(fr);
fclose(fw);
return 0;
}
在对齐为4的情况下
struct BBB
{
long num;
char *name;
short int data;
char ha;
short ba[5];
}*p;
p=0x1000000;
p+0x200=____;
(Ulong)p+0x200=____;
(char*)p+0x200=____;
希望各位达人给出答案和原因,谢谢拉
解答:假设在32位CPU上,
sizeof(long) = 4 bytes
sizeof(char *) = 4 bytes
sizeof(short int) = sizeof(short) = 2 bytes
sizeof(char) = 1 bytes
由于是4字节对齐,
sizeof(struct BBB) = sizeof(*p)
= 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (经Dev-C++验证)
p=0x1000000;
p+0x200=____;
= 0x1000000 + 0x200*24
(Ulong)p+0x200=____;
= 0x1000000 + 0x200
(char*)p+0x200=____;
= 0x1000000 + 0x200*4
一、改错题之方法步骤
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程序设计操作题考试系统总体设计 该系统用户分为两类, 分别是学生用户和教师用户。教师用户具有出题评分等权限, 学生用户抽题和答题权限。本系统分为出题模块、评分模块、成绩处理和答题模块。当用户登录时可以利用数据库用户表的权限字段加以区分用户角色, 然后分配给不同权限。用户如果是教师则在主界面显示出题评分等操作, 如果是学生用户则显示试题抽取操作, 学生抽取试题后进入答题界面。学生答题结束则提交操作后的C源文件。具体层次图如图1所示。 三、阅卷算法的实现 在该系统中除阅卷模块外, 其他模块的功能在实现方法上有比较成形的技术都能够比较容易达到设计目标。但对于评卷模块来说, 它要完成的是主观操作题的评阅因此实现起来有一定的难度。经过多次的实验和资料查阅, 最后选用了人工智能技术来实现。 (一) 基本设计思想。 本系统中主要包含三类操作题分别是程序改错, 程序填空和函数编写。每类题的答题点都有可能出现多种答案。可以将每个答题点的答案存放到答案表中, 答案表也可以被称为阅卷知识库。 对于改错和程序填空题在知识库中每个答题点都可以有多个可选答案相对应, 并且不同的答案具有不同的得分权重, 由此每个答题点Point有多个带有不同权重w的答案Ans构成: 每个答题点的成绩最终为某个Ans的权重w成绩该答题点的分值得出, 因此权重w取值为[0, 1]。 对于函数编写题则在答案知识库中与改错和程序填空有一定差别, 在该知识库中将答案视为一个文本T, T应该由多个关键词Key构成。每个关键词Key组合成T, 每个关键词Key在答案文本中有一定的得分比例Percent。由此每个题的答案可以为: 该式中得分比例累积为1, 该题得分为最终得分比累加和乘以该题分值。 (二) 基本数据表设计。 对应上述设计思想, 设计如下两个表作为阅卷知识库。 对于改错程序和程序填空题阅卷知识库表结构设计如表1: 对于函数编写题阅卷知识库表结构如表2: (三) 算法实现。 当学生完成答题后, 将答题结果提交到学生答题答案表。表中包含学生学号、姓名、试题套号、程序改错答题结果、填空题答题结果和函数编写答题结果。算法按照改错题评阅、填空题评阅和函数编写题评阅顺序进行。 1.改错题与填空题评阅算法。首先提取答案表中的一条记录, 然后提取该记录中的试题各个答题点结果, 提取后放入相应变量内。提取该试题套号, 以试题套号、类别号和具体答题点号为条件在评阅知识库表Testans中查找相关记录, 将提取的结果集中记录的具体答题点的具体答案与学生答题点的答案进行字符串匹配测试。当某个评阅知识库表中的某个具体答案与学生答题结果中的答案匹配成功时则提取该记录的权重值然后乘以该答题点分值。依照上述方法重复进行直至所有答案表中的相关答案全部进行了匹配运算的出具体分值为止, 将所有分值累加, 结果为该考生改错与填空题最终成绩。 2.函数编写题评阅算法。在考生答案记录提取后, 将其中的函数编写答案字段提取, 此字段中存储考生函数编写题的程序文本。同时以试题套号为依据在函数编写题评阅知识库表progans中搜索该套试题答案关键词记录。得到结果集为该题程序中应该出现的关键词结果集, 以每个关键词为依据在考生函数编写题答案文本中搜索该关键词, 一旦匹配成功则累加该关键词对应的权重。结果集每个关键词都进行以上算法后累加的权重值乘以该题的分值即为考生得分。 (四) 知识库知识累积实现。 上述算法基本解决了当主观题答案出现多种变化时不能公平给分的矛盾。但是由于出题者对知识库构建时难免发生遗漏, 因此评阅试题知识库最初的质量并不一定很高。为了能使知识库中知识更加丰富本算法中还增加了知识库知识累积处理。主要是通过人工干预评阅试卷, 当教师对考生答题点逐个人工查看时, 如果知识库中没有出现相应答案但又是正确答案时评阅教师可以将该答案加入知识库。添加到知识库后的答案同时给予一个适当的权重, 如果是函数编写题在加入新的评阅关键词后所有的关键词权重要重新分配使得权重累加结果为1。 这样经过几轮人工干预评阅试卷知识库中的内容将更加丰富, 对以后的评阅更加公平起到促进作用。 四、结语 本文主要阐述了基于人工智能原理的C语言操作考试题的评阅算法。算法中主要利用了知识库功能和简单字符匹配算法。为了解决知识库内容起初不够丰富的问题, 设计了知识库知识累积算法。经过测试表明在经过若干轮人工干预后基本实现了公平评阅试卷。 参考文献 [1].蒋秀莲.基于人工智能技术的智能教学系统研究与设计[J].Microcomputer Applications, 2009 [2].李闯, 常锐.基于人工智能原理的考试系统[J].长春工业大学学报 (自然科学版) , 2009 【c语言概念题】推荐阅读: 华为c语言经典面试题09-24 大一c语言期末编程题10-07 c语言程序设计基础题10-28 c语言总结07-15 C语言教学建议10-25 c语言递归程序11-06 c语言设计程序11-11 c语言排序算法总结06-25 C语言实验报告模版07-10 c语言实验报告总结07-13智能C语言操作题评分算法研究 篇7