c语⾔毕业论⽂
C语⾔是⼀门⾯向过程的、抽象化的通⽤程序设计语⾔,⼴泛应⽤于底层开发。C语⾔能以简易的⽅式编译、处理低级存储器。C语⾔是仅产⽣少量的机器语⾔以及不需要任何运⾏环境⽀持便能运⾏的⾼效率程序设计语⾔。以⼀个标准规格写出的C 语⾔程序可在包括类似嵌⼊式处理器以及超级计算机等作业平台的许多计算机平台上进⾏编译。
c语⾔毕业论⽂1
⼀、研究背景及研究意义
信息技术的快速发展加速了教育信息化的进程,在线教育系统与测试系统的出现为学⽣提供了⼀个可以提⾼和检测综合能⼒的便捷途径。另⼀⽅⾯,C语⾔教学在各⼤⾼校中都是必修课程之⼀,且在计算机相关课程教学中,针对某个理论性的知识点的考察,⼀般会以客观题的形式给出。由于答案具有唯⼀性,通过简单得匹配⽅式便能识别正确与否从⽽给出相应成绩。针对这类客观题的⾃动评分技术已经相当成熟,因此后续在⾃动评分⽅向的研究中主要集中于主观题的⾃动评判。在过去⼏年的积极探索阶段到现有的实际研究成果来看,有关C语⾔知识的检测中对编程题的考察是必不可少的。虽然检测的形式各不相同(填写空缺代码块完成完整程序,按题⽬要求编写整个程序),但终究是为了考察学⽣掌握编程技巧及编程思想的程度。
本课题研究的主要⽬的是结合编程实现的特征,为⼀个正在初始运营中的在线测试平台提供⼀个能查重与⾃动评分的功能模块。其中最终评分包括两个部分,⼀是对每个学⽣提交的程序代码⽂件相互之间进⾏相似度检测,当相似度超过预定阈值作为抄袭处理,此为查重检测。⼆是将学⽣程序与模板程序匹配检测相似度并由此计算最终得分。
程序语⾔与⾃然语⾔在各⾃适⽤领域上有较⼤差异,其语⾔虽然都有词法、语法规则等,但编写程序语⾔时并没有⾃然语⾔那么的灵活,不会出现⼀词多义,⼀义多词,他只有固定的关键字,标识符编写规则,功能实现结构等,所以较于⾃然语⾔来说识别起来要容易⼀些。国内外对编程题相似度检测及⾃动评分都有不少的研究,现也有⼀些系统⽐较成熟。
⽬前,各⼤⾼校对C语⾔课程考察⽅式⼀般还是以传统的纸质化考试为主。
这样的考试⽅法在⼈⼯阅卷的过程中存在着些许的不确定因素,随着教育的普及,能⼒测试之后需要批改的试卷绝不是⼀个⼩数⽬。这单⼀单调的⼯作很容易使得批改⼈员疲惫不堪,从⽽阅卷出错率将会被动的提⾼。利⽤计算机完成⾃动阅卷将杜绝这⼀问题的出现,同时,其运⾏速度快能及时的给学⽣反馈结果也没有⼈的感官情绪,能公平公正的对待每⼀份试卷。
对于主观题的⾃动评分技术还在不断的完善中,由于在主观题的识别所需的技术:⼈⼯智能、⾃然语⾔处理、模式识别等还处于起步阶段。所以主观题⾃动阅卷技术不能⼀蹴⽽就,还需要不断的实验研
究。⽬前,探索开发出合理试⽤的主观题⾃动评分系统是⼀个技术难题,若能将开发的系统投⼊教学或是别的考察⾥⾯,将会⼤⼤的节省⼈⼒物⼒。
⼆、国内外研究现状
国外对⽂本相似度检测的研究早国内,在20世纪中期,就有学者提出让计算机同⼈⼯阅卷⼀般来对主观题如作⽂进⾏评阅。⾄今,经过数多学者的致⼒研究,出现了许多与教育结合的应⽤系统,并已投⼊使⽤。在对⾃然语⾔的⽂本分析处理⽅法的研究同时,随着计算机教育的普及,程序代码的检测也在逐渐兴起。
1966年,Ellis Page开发了⼀个模拟⼈⼯评分的系统Project EssayGrade(PEG),该系统是总结学⽣提交⽂本的特征向量,然后将⽂本的特征进⾏量化,最后根据量化的结果对其⽂本进⾏判分。
1967年,Halstead提出了⽤属性计数法计算程序代码之间的相似度,所谓的属性是指代码的某些度量值,如:空⾏的数⽬,字符量,语句量,控制结构量等,在他的研究基础之上,1977年Otteiistein设计了检测FORTRAN编程语⾔的代码抄袭检测系统,该系统基于属性技术的相似度检测技术。基于属性技术求解程序代码之间相似度的系统还有Faidhi和Robinson的程序抄袭检测系统,以及Grier设计的Accuse程序抄袭检测系统。
单⽅⾯只考虑属性计数⽽忽略程序的结构组成,得出的代码相似度⽐值准确率较低,在1996年,Verco和Wise对Accuse 程序抄袭检测系统进⾏了⼀系列可能性的测试,通过在源程序中加⼊不影响代码运⾏的字符串或⽤其他结构代替原结构等⽅式。在对测试结果分析研究之后指出:只是单纯的增加供于检测的程序属性数量,在程序相似度检测中并不能得到更加精确的检测结果。
G.Whal⾸次提出了程序结构⽅向的研究思路,通过分析程序的内部结构来匹配两源代码之间的相似度。在此后,学者们朝着这两个⽅向开始研究,同时也有将⼆者结合研究的。
G.Whal设计的Plague系统,Micheal Wise设计的YAP3系统,Sim系统都是采⽤的程序结构度量技术进⾏研究。Donaldson是结合了属性技术与程序结构度量两种技术完成对程序相似度的检测。
还有⽤token(标记)序列来表⽰程序的字符串匹配算法,是根据编译原理技术,将程序的语句进⾏分词的操作,然后将得到的单词存⼊token序列。然后使⽤字符串匹配算法计算相似度。常⽤的字符串匹配算法有:最长公共⼦序列(LCS)算法、余弦算法、编辑距离(Levenshtein)算法等。采⽤这种⽅法的有Duploc、NICAD、Dup、Clone Detective、CCFinder、CP-Miner等。
现在使⽤⽐较⼴泛是Online Judge系统,简称OJ,是⼀个在线的判题系统,系统通过对⽤户提交的代码进⾏编译和运⾏,对于能够运⾏的程序通过预先设定的测试集来检测代码运⾏的结果,以及运⾏时间是否在规定范围之内。该系统最早使⽤在ACM-ICPC国际⼤学⽣程序设计赛和 OI 信息学奥林匹克
竞赛中。该系统的返回结果有7种:Wrong Answer:答案不完全正确;Time Limit Exceeded:
运⾏超出时间限制;Memory Limit Exceeded:超出内存限制;Output LimitExceeded:输出超过限制;Runtime Error:运⾏时错误;Compile Error:编译错误;Accepted :程序通过。该系统采⽤的是动态评分⽅式。
三、研究内容
本⽂的主要研究内容以及创新点有:
1)研究⽂本相似度检测技术,分别⽐较点阵图法、空间向量的余弦算法、最长公共⼦序列LCS算法、最⼩编辑距离Levenshtein distance算法对源程序相似度检测效果。提出基于LCS的C语⾔程序查重算法。并对源代码进⾏适⽤于LCS算法匹配的预处理操作,改进匹配⽅式以提⾼算法匹配效率,提取源代码的特征属性求解阈值。
2)研究程序识别相关技术,以及⾃动评分的两种常见⽅法:动态评分;静态评分。本⽂主要研究静态评分⽅法,将程序抽象提取为SDG的表现形式,分析结构语义对源代码进⾏预处理,并提出基于控制流程匹配度的C语⾔⾃动评分算法。
3)分析C语⾔程序的结构,分析抽象语法树的表现形式,将程序划分为多个不同粒度的⼦程序,并
转换为结构树。运⽤编译原理技术分析数据依赖、控制依赖完成树的构建。因此提出基于最⼩⼦程序匹配的C语⾔⾃动评分算法。
四、提纲
摘要
ABSTRACT
第1章绪论
1.1研究背景及研究意义
1.2国内外研究现状
1.2.1国外研究现状
1.2.2国内研究现状
1.3本论⽂的主要研究内容
1.4论⽂组织安排
第2章相关理论及技术介绍
2.1正则表达式
2.1.1正则表达式的符号元
2.1.2正则表达式的使⽤的规则
2.1.3Java字符串匹配
2.2编译原理技术
2.2.1词法分析
2.2.2语法分析
2.2.3语义分析
2.3系统依赖图
2.3.1结构化程序设计
2.3.2程序流程图
2.3.3程序依赖图
2.3.4系统依赖图
2.4C语⾔
2.4.1C语⾔程序设计
2.4.2C语⾔结构特点
2.4.3C语⾔基础概述
2.4.4C语⾔代码多样性分析
2.5本章⼩结
第3章基于LCS的C语⾔程序查重算法
3.1代码抄袭概述
3.2抄袭常⽤⽅法
3.3源代码查重预处理
3.4程序代码查重算法
3.4.1⽂本相似度算法
3.4.2LCS最长公共⼦序列
3.4.3阈值分析
3.4.4检测代码重复率
3.4.5算法分析
3.5实验结果及分析
3.6本章⼩结
第4章基于流程控制匹配的⾃动评分算法 4.1流程控制结构图
4.1.1流程控制结构划分
4.1.2流程控制结构划分细节说明
4.1.3结构依赖关系划分
4.1.4结构依赖关系划分说明
4.2程序流程控制结构图
4.2.1代码预处理
4.2.2⾃定义函数分析
4.2.3⽣成流程控制结构图算法
4.3程序流程控制结构图匹配算法
4.3.1匹配单位元素定义
4.3.2程序代码⾃动评分算法
4.3.3算法分析
4.4实验结果及分析
4.5本章⼩结
第5章基于最⼩⼦程序匹配的⾃动评分算法
5.1⼦程序的概述
5.1.1⼦程序的定义
5.1.2定义基本语句单元
5.2基于结构树的程序中间表⽰
5.2.1代码预处理
5.2.2结构树定义
5.2.3⽣成树状图算法
5.3最⼩⼦程序匹配评分算法
5.3.1划分最⼩粒度⼦程序
5.3.2⼦程序匹配描述
5.3.3⼦程序匹配的⾃动评分算法
5.3.4算法分析
5.4实验结果及分析
5.5本章⼩结
第6章总结与展望
6.1结论
6.2展望
参考⽂献
致谢
五、组织安排
整个论⽂包含个章节,整体组织结构如下所⽰:
第⼀章绪论,根据研读的国内外⽂献简要描叙⼀下本⽂所研究主题的背景、意义,然后介绍国内外相关研究⽅法及成果,以及⾃⼰研究的内容简介。
第⼆章介绍了完成本⽂实验的相关理论知识:正则表达式的应⽤、编译原理技术、程序与图的关系、C语⾔编码特性、多样性等。
第三章介绍程序查重算法动态求解最长公共⼦序列。
第四章介绍了基于流程控制匹配的⾃动评分算法第五章介绍了基于最⼩⼦程序匹配的⾃动评分算法。
第六章总结了整个算法实现过程中主要⼯作,分析优缺点,并对后续的⼯作进⾏展望。
六、进度安排
20xx年11⽉01⽇-11⽉07⽇论⽂选题、
在线代码运行器 20xx年11⽉08⽇-11⽉20⽇初步收集毕业论⽂相关材料,填写《任务书》
20xx年11⽉26⽇-11⽉30⽇进⼀步熟悉毕业论⽂资料,撰写开题报告
20xx年12⽉10⽇-12⽉19⽇确定并上交开题报告
20xx年01⽉04⽇-02⽉15⽇完成毕业论⽂初稿,上交指导⽼师
20xx年02⽉16⽇-02⽉20⽇完成论⽂修改⼯作
20xx年02⽉21⽇-03⽉20⽇定稿、打印、装订
20xx年03⽉21⽇-04⽉10⽇论⽂答辩
c语⾔毕业论⽂2
近年来C语⾔作为计算机语⾔在国内外得到迅速推⼴应⽤,在程序语⾔使⽤中排名第⼆,只和排⾏第⼀的JAVA语⾔相差甚微。其功能丰富,表达⼒强,使⽤灵活⽅便,⽬标代码运⾏效率⾼,兼有⾼级语⾔与低级语⾔的许多特点,⼏乎所有操作系统都⽀持C语⾔开发。“C语⾔程序设计”在⾼校相关专业往往是编程的⼊门课,从“门外汉”变成“门内汉”的过程不仅需要学习基础概念、编程知识、编程⽅法,还
需将⾃⼰的智慧转换成计算机能够识别的代码,这个转换过程需要我们学会⽤计算机的思维⽅式⽅法解决问题。所以,学习C语⾔、设计算法、编写程序的教学,就是对学⽣进⾏思维⽅式引导和培养的过程。
1教学现状
C语⾔程序设计课程⼀般在⼤学低年级开设,该阶段的学⽣⼤多数没有编程基础,甚⾄于⼀些计算机的基础知识也似是⽽⾮,仅停留在计算机的使⽤上,对于计算机能够实现各种操作的原因不了解。刚开始许多学⽣认为学习编程和学习应⽤软件的使⽤⼀样,在不长的时间内就能够成为编程“⾼⼿”。⽽C语⾔程序设计作为编程的⼊门课,⾸先必须讲授编程的⼀些基本概念,⽐如常量、变量、数据类型、运算符、表达式等。这些内容相对显得枯燥,部分性急的学⽣要耐⼼学习。因为这些内容是编程的基础,需要学⽣深⼊掌握,由此对学⽣的⼼理就要有所把握。随着教学内容的推进,有些学⽣慢慢跟不上进度,课上听得懂,但⾃⼰编程就不知从何⼊⼿,究其原因,其⼀是对算法没有掌握,其⼆是对这门语⾔了解不够。算法是编程的思路,有了算法,才可能写出程序,如果学⽣对算法不理解或者掌握不够,则直接影响编程。除此之外,如何将现成的算法⽤C语⾔描述出来,许多学⽣仍然不很熟悉。
2教学内容与⽬的
C语⾔的教学是从常量、变量、运算符、表达式等基本概念开始,逐步引导学⽣进⼊与计算机沟通交
流的初级阶段。这不仅要使学⽣掌握这些基本概念,还需要让学⽣理解这些就是编程的素材。C语⾔解决的所有问题最终都需要⽤语句来描述,⽽语句是由这些语⾔要素所构成,怎样把常量、变量、运算符、表达式灵活地组合成解决问题的语句,是编程的关键。类似我们把汉语的⼀个个单词组合成表达特定含义的语句,C语⾔的常量、变量、运算符、表达式相当于词汇,将它们组合成完成特定要求的语句。在结构化编程中,学⽣只能从总体到具体,逐步细化、逐步分解,只有知道计算机能够执⾏什么后,才能写出算法乃⾄程序。学习编程语⾔很难像学习汉语⼀样,时时都有⼀个环境,只在课堂的时间接触C语⾔,熟悉的进程必然缓慢。课堂的作⽤仅在于接触、理解,⽽真正掌握则需要⾃⼰尽可能多的应⽤所学知识。也就是我们常说的“C语⾔的编程能⼒不是看出来的,不是听出来的,⽽是⾃⼰动⼿练出来的”。⼀个⼈知道很多汉语词汇,但不能将它们连成通顺的句⼦表达⾃⼰的思想,说明这个⼈表达能⼒不⾏。学习编程的过程中,如果只知道基本概念和知识,⽽不能灵活的⽤来解决问题,就没有意义了,因为掌握基础知识的⽬的是为了利⽤它们编写程序,让计算机完成我们交付的任务。
3教学⽅法和策略
计算机只执⾏程序,不能告诉我们如何解决问题。我们编写程序,就需要考虑解决问题的思路和⽅法,并且让这些思路和⽅法能够在计算机上实现,这就是设计算法、编程。教学过程中可以使学⽣理解这些思路和⽅法,逐步接受计算机的思维⽅式,熟悉编程语⾔。
3.1⽬标定位
根据C语⾔的特点,将教学划分为三个阶段:第⼀阶段是基本语⾔要素,包括常量与变量、数据类型与操作符、程序的基本结构、数组与指针、函数;第⼆阶段是⾼级程序设计要素,包括结构体、变量的作⽤域、模块化程序设计、⽂件;第三阶段是课程设计,要求学⽣解决⼀些实⽤的问题。第⼀阶段的教学可以为每章列出⼀个提纲,指出重点和难点。例如,讲授“操作符与表达式”时,重点强调C语⾔的许多语句都是通过表达式来描述,运输符的优先级和结合律是表达式的核⼼,如果牢记了运输符的优先级和结合律,在读懂程序的过程中就可以做到事半功倍,⽽数据类型、变量、常量则⼀带⽽过。这样既可以提⾼课堂效率,⼜避免学⽣因过于繁杂的内容失去耐⼼。⼜如,讲解数组与指针时,区分数组名与指针变量的相同与不同,许多学⽣还会纠结引⼊指针的必要性,但通过解释类似邮件快递的具体地址与惯常⽤名在收件速度上的不同,则增强学⽣对指针变量的理解。总之,难易结合,通过简单易懂的例⼦解释复杂问题,需要死记硬背的基本概念则通过读程序、改写程序得以加强,由此为⾃⼰编写程序打下良好的基础。第⼆阶段的教学是在学⽣已经掌握基本语⾔要素的基础上展开。这时可以延续前⾯的教学模式,⽤少量的时间对知识要点⼤致讲述,不过多涉及细节问题,布置较⼤的案例程序进⾏分析和练习,总结所学知识。本阶段要遵循循序渐进的原则,先要求学⽣读懂程序,再修改部分程序、观察程序的运⾏结果,然后要求学⽣对解决类似的问题尝试着编写程序,最后摆脱开熟悉的命题,提出完全陌⽣的问题让学⽣解决。第三阶段是课程设计,教师提出的选题要能调动学⽣的兴趣和参与热情,既实⽤⼜不⾄于让学⽣产⽣畏难情绪。例如,编写学⽣学籍管理、输出企业的⼈事管理等。该阶段是对前期学习的总结。
3.2设⽴案例库
案例库的质量将影响教学效果。因此案例必须:1)典型性,能够覆盖课程的相关知识点。2)实⽤性、趣味性,便于调动学⽣的兴趣。3)针对性,要考虑到学⽣的接受能⼒。4)系统性,案例间要相互联系。例如,讲解数组与指针的时,列举了⼀个例⼦,给出利⽤下标法编写的程序,要求学⽣修改为利⽤指针编程。另外,提醒学⽣如何正确使⽤⼀维数组和⼆维数组。需要注意的是让学⽣⾃⼰编程,除了布置课后作业,课堂上的练习也⾮常必要。因为教师很难控制课后学⽣到底⽤了多长时间去编程或思考编程,但是让他们在课堂上的练习⼜要占⽤⼤量时间,这和紧张的课时有冲突,作者认为⽐较折中的办法是
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论