c语言开发

2022-03-23 版权声明 我要投稿

第1篇:c语言开发

嵌入式C语言系统开发在智能手机中的运用

【摘要】?:随着时代的不断发展,智能手机在人们生活中运用得越来越广泛,在智能手机中运用嵌入式C语言系统开发技术能够使智能手机得到更好地开发,由此本文接下来将要分析嵌入式C语言系统开发技术在智能手机中的具体运用,希望通过以下分析能够使智能手机得到更好地发展。

【关键词】?:智能手机 嵌入式C语言系统 开发技术

【引言】?:如今智能手机已经与人们的生活息息相关,但是在人们使用智能手机的过程中仍然存在诸多问题。例如,智能手机在使用过程中容易遭受病毒的入侵,并且手机容易出现卡顿现象,而当嵌入式C语言系统开发技术运用到智能手机的开发中后,能够使智能手机得到有效地开发,从而解决智能手机中出现的諸多问题。

一、运用嵌入式C语言开发技术,避免病毒入侵

在智能手机开发的过程中,开发员应当将嵌入式C语言有效地运用于开发的过程中,以此来尽量避免手机被病毒所干扰,从而让手机的功能得到更好地实现。例如,随着时代的发展,智能手机的功能越来越强大,诸多智能手机都可以实现与以太网连接,但是在与以太网连接的过程中容易出现病毒入侵手机的现象。由此为了使病毒能够更好地被隔绝,让智能手机的功能得到更好地实现,开发员在智能手机中可以有效地应用嵌入式C语言系统开发技术,并且开发员应当对病毒有更加深入的了解,以此来减少病毒对智能手机的入侵。除此之外,在智能手机中运用嵌入式C语言系统还需要将流量问题考虑进去。部分智能手机在没有连接网络的时候,仍然会出现流量消耗,甚至是扣费的现象,这会进一步导致人们对智能手机的使用率降低,并且对软件应用程序的使用率降低。由此在进行智能手机开发的过程中,开发员应当充分运用嵌入式C.语言系统开发技术来进行程序的编写,并且进一步对程序进行完善,还应当注重对编写的程序进行加密,以此来避免病毒的入侵,从而使智能手机能够进行更好地运行,让用户拥有更好地使用体验。由此可见,在智能手机中运用嵌入式C语言系统开发技术能够有效地避免病毒对手机的入侵。

二、运用嵌入式C语言设计短信,提升用户体验

嵌入式C语言系统开发可以充分地运用到智能手机短信应用软件的设计过程中,通过在短信应用软件的设计过程中运用嵌入式C语言系统开发技术,能够使短信的收发更加安全,从而带来更好地使用体验。例如,在智能手机短信应用软件的开发过程中,开发者可以充分地运用C语言来设定定时器,并且让定时器能够在相应的时间内被有效地触发。在短信应用程序基本的操作完成之后,开发员应当对串行口和定时器的状态进行确认,如果此时没有任何数据发送过来,那么短信应用程序将不会执行动作,当定时器发出信号后,短信应用程序才会进行操作,并且当手机在接收短信之后,手机页面将会进行提示。由此可见,在智能手机短信应用程序中运用嵌入式C语言系统开发技术能够使用户更好地运用手机短信,使用户的体验感增强。

三、使用嵌入式C语言设计来电,保证手机流畅

嵌入式C语言系统开发技术还可以被有效地运用于智能手电话功能的设计过程中,从而让智能手机的电话功能更加流畅,使用户的使用体验更好。例如,用户在运用智能手机的电话功能来接听电话或者挂断电话时,就是利用串行口来写入ATD这个基础功能,在基础功能之上再加上用户要进行呼叫的电话号码,最终在通过ATH命令来让手机的呼叫功能能够得到有效地实现。如果用户输入了错误的电话号码,那么智能手机将会弹出相应的提示框,让用户重新进行输入。由此可见,串行口是智能手机来电功能设计的重要部分,智能手机的功能要得到正常的发挥,少不了串行口和通讯模块的作用。只有当串行口和通讯模块发挥作用,才能够使智能手机进行电话的接听、挂断,以及短信的收发。由此可见,开发员可以使用嵌入式C语言系统开发技术来进行电话功能的有效设计,从而使手机能够更加流畅的进行电话的接听,让用户拥有更好地智能手机使用体验。

四、使用嵌入式C语言优化程序,提高运行效率

开发员在完成智能手机的开发之后还应当充分运用嵌入式C语言系统开发技术来进行手机程序的优化,只有手机的程序得到了较好的优化,手机的性能才能够得到不断的进步,这样才能够避免手机被病毒入侵,从而使手机运行的效率得到提升。例如,当手机到达了用户手中之后,开发员还应当对智能手机系统进行进一步的优化,由此来使智能手机能够更好地运用。开发员应当紧随时代的脚步来对智能手机的应用程序进行优化,从而使到达用户端的智能手机能够进行不断地进行升级,进而增强智能手机抵抗病毒的能力,让智能手机更好地进行运用。此外,在运用嵌入式C语言系统开发技术对智能手机进行开发的过程中,开发员还应当对手机的通信模块进行进一步的开发,并且来提高处理器的工作效率,让手机运行的效率更高。在手机系统和手机软件的开发过程中充分地运用嵌入式C语言系统,能够使得手机的解码效率得到有效地提升,从而使得智能手机能够更好地进行开发。

【结束语】?:随着时代的不断发展,智能手机变得越来越普遍,开发员想要在竞争激烈的智能手机开发中占据优势,则可以使用嵌入式C语言系统开发技术来进行智能手机的开发,以此使开发出来的智能手机更具有竞争力,从而使用户拥有更好的使用体验。本文分析了开发员在智能手机开发的过程中,运用嵌入式C语言系统开发技术来进行病毒的防范,以及手机应用程序的开发,希望通过以上分析能够使智能手机得到更好地开发。

【参考文献】?:

[1] 陈志强 , 陈旭东 , 江赟 . 地方财经院校非计算机专业嵌入式系统教学方法探讨 [J]. 教育教学论坛 ,2015(1):226-229.

[2] 史媛芳 . 高职机电类专业《C 语言程序设计》课程的教学研究与实践——以安徽国防科技职业学院为例 [J]. 开封教育学院学报 ,2014,34(1):164-165.

[3] 黄东 . 基于嵌入式 internet 技术的北部湾物流过程监控系统的研究与设计 [J]. 计算机光盘软件与应用 ,2012(13):205-206.

作者:李月 张海传

第2篇:面向嵌入式软件开发的C语言程序设计课程改革探索

摘要:从嵌入式系统软件开发的角度出发,探讨在嵌入式系统开发方向上C语言程序设计课程的改进思路,首先阐述嵌入式软件开发对C语言的知识和技能需求,指出现有C语言课程针对嵌入式系统开发存在的不足;在此基础上,从课程设置、教学内容划分、实验设置及教学方法与手段等方面讨论C语言程序设计课程的改革思路。

关键词:嵌入式软件开发;C语言;课程改革

0.引言

C语言程序设计作为程序设计语言的入门基础课程,是各高校理工科专业中计算机程序设计类课程的普遍选择。作为一门理工科通识课程,其目的在于使学生通过对C语言中各种语言成分的学习,初步认识计算机程序设计及进行程序设计的过程,掌握基本的程序设计思想与方法。作为通识类课程,目前各院校通常将该门课程的教学安排在一年级,每周3-4学时(含实验),讲授内容主要包含C语言的数据类型与表达式、程序结构、函数、指针、链表、文件等。在教学实践中,我们发现,由于学时限制或学生接受程度等原因,常常需要对部分教学内容(如多级指针、文件操作、位操作等)进行削减,无形中降低了课程内容的深度与广度。作为通识类课程,这样的削减影响不太大。而对于信息类专业(计算机、电子、自动化等)而言,仅掌握通识教育中所讲授的部分是远远不够的。

嵌入式系统开发是信息类专业的一个主要发展方向。进入21世纪以来,融合先进的计算机技术、半导体技术、电子技术及各行业领域具体应用的嵌入式系统,已在工业控制、交通管理、信息家电、智能家居、环境监测、电子商务、机器人等领域得到了广泛应用。

一般说来,嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可剪裁,适用于心用领域,对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。由于在成本、功耗、体积等方面的限制,对嵌入式系统中的软件开发提出了更高的要求。嵌入式软件开发是在特定的硬件平台上进行,需要使用具有较强硬件操作能力的编程语言。由于C语言是具备了这一特质的高级语言,成为嵌入式系统开发的最佳选择。

调查显示,在信息类专业中,电子类本科专业教学计划与嵌入式系统教学要求相脱节,电子类本科学生的软件基础也较弱。在这样的背景下,对C语言程序设计课程进行相应改革,以适应嵌入式系统开发人才培养的需要是十分必要的。

1.嵌入式软件开发对C语言的需求

在适用于嵌入式系统开发的3类主要语言中,C语言占有超过70%的份额。开发嵌入式软件,除掌握C语言的基础知识和基本技能外,主要还存在以下几方面的要求:

1)指针。

指针作为C语言的主要特点,其使用十分灵活,因而也很难完全掌握。它可用于指向不同类型的普通变量、数组、字符串,甚至函数。在嵌入式软件开发中对各类不同指针(数组指针、指针数组、指向结构体的指针、多级指针)的使用十分普遍。因此,指针相关内容的教学必须足够深入。

2)位操作。

C语言有别于其他高级语言的一个特点是可直接对硬件进行操作。指针和位操作是这一特点得以实现的工具。通过6种位操作符,可直接对内存、寄存器或I/O端口的字节进行测试、置换或移位处理。熟练掌握位操作符的使用,是进行嵌入式软件开发必不可少的重要基础。在一些国内高校普遍选用的经典C语言教材(如文献[4])中,由于定位于普适教育,并未包含位操作部分的内容。

3)文件读写。

嵌入式系统中“一切皆文件”,系统的运行以文件读/写方式进行操作。理解文件系统的构成、掌握基本的文件操作方法也是进行嵌入式软件开发必须掌握的技能。

4)宏定义。

在嵌入式软件中使用宏定义,不仅可防止代码出错,提高可移植性、可读性,而且是产生内嵌代码的唯一方法,可用于替代函数调用,从而达到嵌入式系统性能要求。

以上4个方面的内容,在通识型的C语言课程中,由于课时和学生程度等原因,都不能进行针对性的特别训练。学生在进入嵌入式系统开发阶段后,显然会成为程序设计知识方面的短板。

2.课程改革思路

基于上一节的认识,我们对C语言程序设计课程的教学提出了下面的调整思路。

2.1课程设置

作为通识课程的C语言程序设计通常安排在一年级或二年级上学期完成。信息类专业的学生在大学三年级开始进入嵌入式系统开发相关课程时,不可避免地对已学过的C语言的知识会有一定程度的遗忘。

针对嵌入式系统开发的要求,考虑将C语言程序设计课程划分为2个阶段。第1阶段为c语言程序设计基础,每周3学时,可在大学一年级下学期或二年级上学期开设;第2阶段为嵌入式系统C语言程序设计,每周2学时,作为嵌入式系统开发方向的选修课,可在大学三年级上与其他嵌入式系统相关课程,如嵌入式系统、嵌入式操作系统一起开设。这样设置一方面满足了在低年级完成程序设计类通识课程的要求,使学生不必过早接触C语言中较为深入、复杂的部分;另一方面,通过将与嵌入式软件开发密切相关的知识适当推后,确保了嵌入式系统开发各门课程问的知识联系。

2.2教学内容的划分

由于将课程划分为基础部分和面向嵌入式系统开发的提高部分,则可将C语言的一般基础(基本语句、控制结构、数组、函数、指针、结构体)划人C语言程序设计基础课程中,通过这部分的学习使学生掌握C语言的基本理论知识并具备基本的编程技能,达到程序设计类课程的通识教育水平。

对于与嵌入式开发密切相关的知识,将在嵌入式系统C语言程序设计课程中讲授,主要包括:宏定义、位操作、文件操作和复杂指针运用。这部分内容的教学可围绕嵌入式软件开发实例展开,深入讲解各知识点的应用。通过嵌入式系统C语言程序设计课程的学习,学生应更深入地理解和领会C语言的精华思想,同时具备基于嵌入式平台进行软件开发的能力。

2.3实验内容

作者:杨波 沈承舒

第3篇:基于C、C++等高级编程语言开发电子系统设计自动化系统

摘 要:当前电子系统设计自动化技术已广泛地应用于各个领域,随着科技的发展,对电子系统设计自动化的要求越来越高。针对传统电子系统设计自动化工具存在的一些缺陷,本研究通过高级编程语言实现了VHDL编程等工作的自动化,使用查找表存储所有常用的VHDL关键字,通过特定的函数统一编写所有VHDL程序的库和实体部分,使用线性链表存储系统中各个端口的属性,程序自动编制设计流程图,并将其通过特定的结构存储在计算机内存中,从而实现了VHDL程序的自动编辑。

关键词:电子系统;VHDL;编程自动化;高级编程语言;接口软件

1 引言(Introduction)

EDA(Electronic Design Automation,电子设计自动化)是利用计算机软件进行工作,综合应用计算机技术、电子技术、信息处理和智能化等技术,实现电子产品自动化设计的一项新技术。随着科学技术的高速发展,电子系统的复杂性逐渐增加,对电子系统设计自动化程度的要求也越来越高。如何缩短电子产品设计周期、提高设计效率、提高系统性能、减少人力、物力支出、减少工作量、提高设计自动化水平是当前急需解决的问题。

EDA技术作为现代电子技术的核心,利用QuartusⅡ[1]、Max+PlusⅡ、NiosⅡ[2]、DSP Builder[3]等软件工具通过硬件描述语言进行设计,自动进行逻辑编译、逻辑化简、逻辑综合、仿真测试等,实现所设计的电子系统的功能。用于描述硬件电路的语言有多种,目前以VHDL[4]和Verilog HDL[5]为主。实现电子系统设计自动化要做的工作主要包括编辑输入、综合、适配、功能仿真、时序仿真、编程下载和硬件测试。传统电子系统设计自动化工具主要用文本输入、原理图输入、状态图输入和波形图输入这几种方法实现编辑输入。本文针对电子系统设计的复杂性和传统电子系统设计自动化工具存在的一些缺陷提出了几种新的设计方法,主要通过接口软件实现VHDL等硬件描述语言的自动编程和自动控制软件工具进行操作。

2 电子系统设计自动化的传统方法及其存在的缺

陷(The traditional method of electronic design

automation and its disadvantages)

传统EDA设计的流程如图1所示。开发者采用自顶向下的设计方案。设计时开发者首先要分析项目的设计需求,确定设计方案并进行细化,对各个模块进行功能描述和结构设计,然后用VHDL等硬件描述语言对顶层电路和模块电路进行设计,再通过编译器形成标准的VHDL文件,进行综合产生网络表,最后对产生的网络表进行仿真、适配和编程下载转化为硬件电路并进行测试。

在进行VHDL编程时,除了可以手动输入程序代码, 还可以采用DSP Bulider中的Signal Compiler模块[6]、调用LPM元件或者使用IP核等方法自动编写代码,但这些方法存在一些缺陷。一方面,采用这些方法编写的代码结构复杂而且结构体部分一般没有具体的进程语句,要打开所有被调用的设计实体可能比较困难,不利于分析元器件的工作原理,可能会给后续的设计及硬件测试带来不利影响。另一方面,这些方法不能实现所有的功能模块设计,编程不够灵活。当进行一项新的模块电路设计时,所设计的功能单元的结构可能会因需求的变化发生变化,由于在不同的电路中该模块的工作方式可能不同,其VHDL代码可能有所变化[7]。考虑到在传统的设计软件中存储可变的功能模块设计方案具有一定难度,为了提高这些模块的可重用性,使其适用于不同的系统,需要将这些可变的设计方案包括可变的VHDL程序和各个元件之间的连接电路等以适当的方式存储在文件系统中,用高级编程语言进行编程从文件系统中读取信息并控制电子系统设计软件进行自动设计。除此以外,在进行VHDL编程时很有可能会出现一些重复的程序代码,所有VHDL程序中ENTITY(实体说明)部分的格式几乎都是一致的,而且一般情况下端口的模式和类型仅有“IN std_logic”“IN std_logic_vector”“OUT std_logic”和“OUT std_logic_vector”四种,程序中ARCHITECTURE(结构体)部分中也有可能出现一些重复的代码,举一个简单的例子:用VHDL程序设计一个10位十进制加法计数器,如果采用手动输入的方式进行编程,则需要将IF语句进行10次嵌套,这样做会使时间增加,降低开发效率,而且比较容易出错;如果用C、C++等高级语言编程操作VHDL文件进行自动编程,仅用一个for循环就可以自动编写出这些代码,可以节省时间,从而提高開发效率。另外,在进行VHDL编程时还有可能涉及到一系列数值运算,如果采用手动输入的方式则需要进行多次运算并将每次运算得到的结果写入程序,为了提高编程效率,需要运用高级编程语言自动进行运算并将结果输出到要编辑的程序中。

3 简单的应用实例(A simple example)

3.1 设计需求

(1)设输入系统时钟为1000Hz,利用VHDL语言设计一个分频器CNT1000,输出基准时钟为1Hz。

(2)设计一个四位十进制加法计数器CNT4D,具有同步使能和异步清零功能。

(3)设计一个四位七段数码译码器DECL7S,将四位十进制加法计数器的计数结果用四位七段数码管显示。

(4)将以上三部分内容结合,设计一个每秒加1的四位十进制计数器。

利用Visual Studio 2010开发环境用C语言自动编写VHDL程序并进行电路连接和设计仿真。

3.2 VHDL自动编程的一些基本原理和主要算法

在前面已经提到,VHDL程序中经常含有一些重复的代码。本实验程序用函数void edit Library And Entity(FILE*、Port*、Char*)统一编写所有VHDL程序的库和实体部分。开发VHDL自动编程软件时,需要考虑各个端口的一些属性,包括端口名称、端口类型、输入提示信息等,由于进行自动化编程时端口信息可能需要动态地添加或删除,可以使用一个链表对所有端口的属性进行存储,用结点存储信息,可将端口信息的数据结构定义如下:

3.3 实现VHDL自动编程的具体操作

首先打开QuartusⅡ 6.0软件新建一个项目“Example1”,然后新建一个VHDL文件“CNT1000.vhd”并保存,接下来打开一个已编辑好的实现VHDL编程自动化的程序并运行,如图2所示。

类似的也可以设计出四位七段数码译码器DECL7S,方法不再赘述。

最后新建一个Block Diagram/Schematic File文件,将以上三部分内容组合,如图9所示。

3.4 仿真结果

如图10所示,仿真结果表明所设计的功能与需求完全一致。当rest为高电平时计数清零;当en为高电平且rest为低电平时进行计数,clk每经过1000个上升沿计数器加1。

3.5 实验结论及分析

以上实验结果表明,使用高级语言编程软件可以进行自動化VHDL编程,这种设计方法至少可以自动设计一些简单的功能模块,提高设计的效率。

通常采用手动输入VHDL代码的方式进行编程效率较低,以适当的方式自动编程可提高编程效率,缩短系统开发周期。

4 实现电子系统设计自动化的一些重要方法和编程

技术(The key methods and programming technics

to realize EDA)

4.1 用接口软件自动设计电子系统的一般方法

为了提高电子系统设计的自动化水平,需要用软件自动接口将手工作业部分变为自动,从而省去繁琐的硬件语言编程等工作。用软件自动接口实现电子系统自动化设计的流程如图11所示。

进行系统设计时,首先要分析设计需求,理解设计项目的任务、要求、指标和系统的应用领域、基本功能、工作原理等,然后确定总体设计方案并进行细化[8]。可以用计算机模拟人的思维对设计需求进行分析,确定设计方案并编制顶层和各个模块的设计流程图,需要应用一些机器学习、数据分析等人工智能领域的方法。为了使VHDL编程方便、快捷,需要在VHDL自动化编程系统的定义部分建立一个查找表,用于存储所有常用的VHDL关键字,程序代码如下:

在解析设计流程图中的信息时,可能需要应用一些人工智能技术,可以使用Lex、Yacc等词法分析工具辅助VHDL自动化编程系统对设计流程图中的信息进行分析[9]。在进行VHDL自动化编程之前,需要将设计流程图进行两次扫描。进行第一次扫描时先确定程序的框架结构和要设计的系统的端口信息、实体名、结构体名等信息,第二次扫描时进行VHDL自动化编程。

在VHDL编程结束之后,一般还需要进行图形输入设计,将各个功能单元通过电路进行连接。进行图形输入设计时也可以通过接口软件进行自动化设计,方法与VHDL自动化编程相似,程序自动打开Block Diagram/Schematic File文件修改内容可以按正确的方法将各个功能单元通过电路自动连接。此外,在进行图形输入设计时之前编辑的VHDL程序可能还需要修改,设计时还有可能出现一些功能相似但不完全相同的模块,例如需要进行计数并锁存结果,系统中可能存在多个若干位的十进制计数器和锁存器,这些计数器和锁存器的位数可能因需求的不同而不同。这种情况下如果用传统的设计工具则需要重新打开或新建多个VHDL程序文件,找到需要修改的所有代码进行修改,然后重新编译程序,再重新生成数字电路,操作很不方便。采用接口软件可以做出改进,在接口软件中可以用一个或多个界面模拟电子系统图形输入设计的环境并建立一个控制表,在控制表中显示选中的功能模块的信息,设计电路时可随时进行修改,模拟图形输入设计环境的界面如图12所示。

在模拟图形输入设计环境中,除了可以进行VHDL自动化编程、功能模块之间连接线路等操作外,还可以通过修改控制表中的内容自动修改VHDL程序,自动编译程序并生成数字电路在原来的位置显示。当检测到控制表中的内容发生变化时,调用fopen函数自动打开需要修改的VHDL程序文件,然后根据控制表中内容修改的位置和修改后的内容自动从VHDL程序中找出需要修改的代码并进行修改,再自动执行编译程序等操作。

由于在VHDL语言中有些指令并不常用,可以设计一个功能精简的编译系统进行编译,该系统是QuartusⅡ中VHDL编译系统的子集,设计时使用词法分析器对语法结构进行翻译,可使用哈希技术管理常用的VHDL指令集,并通过动态堆栈维护底层信息,缩小了编译系统的体积并提高了编译效率。

系统电路设计、编译、仿真结束之后,需要将系统的输入输出信号锁定在芯片的引脚上。为了提高开发效率,可将所有设计中常用的芯片及其各个引脚的信息存储在计算机中,锁定引脚时可以根据编译结果自动将信号与芯片引脚对应。

4.2 实现电子系统设计自动化的系统环境及对系统中尚

未实现的功能的讨论

众所周知,进行电子系统自动化设计既可以使用如Windows系列的通用计算机操作系统,也可以使用专用的操作系统。在进行程序编辑或电子系统设计时如果程序或系统的体积较大,可以在计算机上新建一个专用的启动模式,当计算机开机时如果进入专用模式其他进程几乎都不再运行,全部用于对程序进行编译、链接、运行等操作,可提高程序的执行效率。

在以上的电子系统自动化编程系统中还有几个功能尚未实现,例如如何在QuartusⅡ界面之外自动编译VHDL程序并生成数字电路,这将在后续工作中继续开发研究。

5 结论(Conclusion)

当前世界已进入信息化时代,EDA技术[10]已广泛应用于电子、机械、通信、航空航天、化工、矿产、生物、医学、军事等领域,对推动科学技术发展发挥着重要作用。实验证明,通过高级编程语言开发接口软件可以自动完成VHDL编程等工作,改善了硬件描述语言编程的复杂性,提高了电子系统设计的自动化水平。本文对此进行了初步探讨,但该自动化设计软件还存在一些未实现的功能和不完善的地方,需要通过进一步的研究提出一些新的设计方法。

参考文献(References)

[1] LB Yao,XU Yong,M Pan.Design and Implementation of Taxi Billing System Based on FPGA[J].Electronic Design Engineering,

2011,27(6A):104-115.

[2] HJ Liu,et al.Development of Frequency Variable Inverter Based on SOPC and NiosII[J].IEEE Transactions on Industry Applications,2012,49(5):2237-2243.

[3] XL Hu,L Ding,ZG Zhang.The Design of Digital Filter Based on DSP Builder[J].Applied Mechanics & Materials,

2014:602-605;2641-2644.

[4] 夏莉莉.浅议VHDL语言在电子设计自动化中的应用[J].信息安全与技术,2012(7):44-46.

[5] TS Tan,BA Rosdi.Verilog HDL Simulator Technology:A Survey[J].Journal of Electronic Testing,2014,30(3):255-269.

[6] 张志亮,赵刚,齐星刚.从Simulink模型自动生成VHDL代码——基于DSPBuilder的FPGA设计流程[J].现代电子技术,2004,23:4-6.

[7] 王彩凤,李卫兵,卞丽.VHDL语言在电子设计中的应用[J].实验科学与技术,2014(4):65-67.

[8] 朱新宇.电子设计自动化实验系统的开发与应用[D].北京邮电大学工程硕士学位论文,2012.

[9] 齐星刚.VHDL编译器设计研究技术[D].四川大学硕士学位论文,2005.

[10] 宋文斌.并行遗传算法在器件模型参数提取中的应用.软件

工程师,2012(4):45-47.

作者简介:

成 彧(1994-),男,本科,初级工程师.研究领域:軟件开发.

作者:成彧

第4篇:探究C语言编程技巧在C语言学习中的应用

摘 要: 在互聯网与计算机技术高速发展的今天,C语言作为编程语言体系中的重要代表在其中发挥着最为重要的作用。与此同时,为了推动C语言的发展,研究C语言编程技巧在C语言学习中的应用就显得尤为重要。鉴于此,本文将以C语言的概况以及基本优势为切入点,对学习C语言的过程中遭遇困难的引致原因分析,最后则是探析C语言编程技巧在C语言学习中的应用,以供相关人士借鉴与参考。

关键词: C语言;编程技巧;学习;应用研究

众所周知,由于C语言具有高级编程语言形态以及低级编程语言形态的基本特征,所以其在现代计算机编程语言当中具有不可或缺的重要地位。与此同时,鉴于C语言有着极好的通用性,使得C语言获得了广泛的应用空间,从而成为使用最为广泛的中编程语言。此外,对于初学者来讲,C语言的学习是极其枯燥与乏味的,为此,本文将对C语言编程技巧在C语言学习中的应用展开简要的分析论述,以便相关人员可以更快、更有效的学习C语言。

一、C语言的基本概述与优势

现阶段,C语言是全世界的范围内计算机软件编写与开发工作实务领域使用最为广泛,流行和传播速率最快的一种的软件编程语言形态。想要切实在针对C语言编程的理论学习以及实践应用技巧的学习实务过程中顺利取得预期效果,必须对C语言的产生以及历史发展流变路径形成一定程度的初步认知,并以此为后续的学习实践行为打下坚实且有效的基础。C语言最早产生于20世纪60年代,后在20世纪70年代逐步演化成型,经历了将近60年的历史发展之后,现阶段的C语言形态具备如下基本特征:

(1)C语言在外在形制角度具备鲜明的简洁紧凑性,其在实际使用过程中具备着充分的灵活性以及方便性,缘于这一编程语言形态本身在语法限制层次缺乏严格性,给编程技术工作人员的编写工作实务过程创造了充分的自由,实现了高级软件编程语言的结构性特征与低级软件编程语言的实用性特征之间的有效结合,实现了C语言强大使用功能的建设目标。

(2)C语言本身具备着较为广泛的应用范围,较为强大的可植入性,能够同时适用于多种不同形态的计算机操作系统。

(3)C语言的语句表意体系中本身具备着数量丰富且形式多样的运算符号,在使用C语言开展软件编程技术工作的过程中,通过对各式各样的运算符号的运用,可以实现较为众多的其他高级编程语言形态无法实现的功能。

(4)C语言具备着较为丰富的数据结构。

(5)种类多样的数据结构类型的使用使得C语言在完成各式各样的数据运算行为的基础之上,还具备着相对强大的图形元素引入与处理功能。

(6)C语言鲜明而典型的语言建设与应用特征,使得编程代码与数据对象之间能够实现较为有效的相互分割,使得软件编写工作实施程序具备着较为鲜明的清晰性,为技术人员的使用、维护、与调试工作提供了充分的便捷性。

(7)C语言能够直接实现对物理地址的访问。

二、分析引发学习C语言过程中所遇到困难的原因

C语言凭借其本身具备的丰富多样且表现强大的使用功能,获取了当代世人广泛而深切的关注,这一背景使得想要学习和掌握C语言基本知识以及使用技巧。但是,缘于多种主客观因素的共同作用,使得较多的C语言的学习者,往往会在C语言形态的学习爱过程中感受到比较明显的枯燥性,在经历了一段时间的C语言基本知识以及操作技巧的学习实践行为之后,往往不能形成对C语言相关基础性知识内容的学习掌握,并且对C语言往往也不能获取到科学充分的整体认知。出现这种学习困境的引致原因可以简要分析如下:C语言在现存的计算机软件编程语言类型中属于高级语言,这种高级语言与传统概念中的面向对象式的语言形态存在着较为明显的差别,这种差别直接导致C语言编程的学习使用者在实际的学习应用过程中,往往不能直接看到编程语言表达和操作过程中的直观画面,而且只有在编写的软甲语句编写完全并且调试成功之后,学习者才能实际化地对自身在学习实践环节获取的结果形成真切的感知,而且,在实际的软件语句程序的编写过程中,任何技术流程细节中出现偏差现象,都将会直接导致软件程序的实际编程输出结果中出现错误现象。与此同时,缘于C语言的表意元素体系中本身包含着较多数量的算法,以及数据式应用结构,直接给学习者在基本知识以及应用技巧的学习和理解记忆的实践过程造成了比较明显的障碍。由此也会导致部分C语言的学习实践过程过于枯燥而产生厌倦心理,并且在实际学习过程中逐步丧失对相关知识进行深入学习的主观愿望,无法保证自身实际学习效果的不断提升。

三、探究C语言编程技巧在C语言学习中的应用

1、掌握指针的使用技巧

在C语言的学习过程中,有效掌握指针工具的使用技巧具备着重要意义,能够顺利实现软件编写语句的表达目标,并切实解决软件程序编写过程中的部分复杂问题。指针是C语言表意符号元素体系中的一类较为复杂的变量类型,主要由三个基本要素共同构成:第一,指针名;第二,指针类型;第三,指针的参数赋值。在实际的使用过程中,指针的名称与其他的一般变量之间具备相同性,主要的差别主要体现在类型和参数赋值两个方面。

2、掌握C语言表意符号元素体系中的特有函数

在运用C语言开展软件编程实践的过程中,必然要调动C语言表意元素体系中的特有函数,所谓的函数,指涉的就是编程语言体系中的功能性内容,每一个函数都具体的代表了编程语言的某一种特定的功能,在实际开展函数定义的过程中,应当同时包含函数的名称、参数名称及类型、函数的返回值属性类型等描述性指标,在现行的C语言编程技术应用体系中,函数性功能工具都具备着较为稳定且有效的系统定义,在实际编写工作的实务工作过程中,编写者只需完成必要的用操作即可。

四、结语

综上所述,由于C语言具有强大的功能以及技术优势,使得C语言获得了广泛的应用空间。因此,为了降低C语言学习的难度,提升学习兴趣,可以通过C语言编程技巧来提升学习C语言的效果,以便初学者更好的领会C语言的精髓,从而帮助其在工作过程中充分发挥C语言的特点与优势,进而推动计算机信息技术的发展。

参考文献

[1] 阿依吐拉·艾合买提.新形势下C语言编程技术研究[J].无线互联科技.2016(16).

[2] 梁甜.基于C语言的计算机软件编程分析[J].电脑编程技巧与维护.2014(22).

作者:王玉飞

第5篇:C语言教学探讨

摘要:针对C语言教学过程中存在的问题并结合自身教学实践,提出几点具体建议。包括从类型和变量出发,自教学初期就加强对语言中的一些核心问题讲解,并在课程教学前期的语言基础部分对此进行反复强调及紧密联系,后期再专注于程序设计能力及计算思维的培养。

关键词:C语言;类型;指针;函数

Key words: C language; type; porinter; function

C语言高效、灵活且兼具高级和低级语言的特点,使其应用及影响极其广泛,并早已成为各大高校的第一门程序设计课程。该课程信息量大且地位显著但授课时间有限,作为重点和难点的指针等概念也提高了学习门槛,导致教学效果普遍不理想,影响了后期多门专业课程的开展。

1 教学中的问题

C语言教学过程中除了需要平衡语言特性和程序设计能力培养外,还应针对教学对象的特点进行内容的合理编排,加强各个知识点的联系,降低学习曲线的陡峭程度。当前众多教材及教学过程在内容编排上采用类似自顶向下的教学方法,简述变量、常量等基础概念后,在控制结构中开始程序设计能力的初步培养,到数组、指针及函数参数部分转而强化底层概念,最后通过结构体、综合示例及简单数据结构等回归到设计[1]。这样的教学过程可能会使部分学员在对前期语言基本要素掌握不到位的基础上产生一些错误理解,后期再来修正就比较困难。

结合个人教学经验及我校的教学情况,在课程编排上应尽早让学员理解并熟悉底层概念,尽早引入函数概念并持续培养模块化程序设计方法[2]。前期教学重点讲述核心概念及常规用法,加深学员对语言整体的理解,后期重点培养程序设计和计算思维能力①。

2 具体改进

2.1 坚持清晰第一

任何课程,每次课堂的教学都应遵从清晰第一原则,C语言教学也不例外。清晰第一的一个功能是重点突出。对C教学而言,讲解所用的代码表述要保证清晰明了,不要过多讨论i+++j等问题,避免由于写法的技巧性和语法的复杂性加重学员学习负担。有文章列出的一些“有趣C问题”并不能提高大部分初级学员的兴趣,反而可能会使其产生挫败感并导致厌学心态,这样的东西在教学初期应该适度引入。清晰第一的另一个功能是避免了部分的不可移植性问题及潜在的错误。在C语言中存在表达式计算的副作用和顺序点问题,对int i=1;f(i++)+g(i--)没有约定是进行f(1)+g(1)还是f(1)+g(2),利用本原则可以消除由于此类语义表述所埋下的隐患,突出避免编写依赖特定计算顺序表达式的重要性。另外,清晰第一还体现在可读性上,排版、注释、标识符命名及编程风格等方面,需持续培养学员良好的编程习惯,尽力使教学与实际开发保持一致。清晰第一要避免对晦涩用法的讲解和考核但不是简单反对和抛弃惯用的简洁描述,课堂上应该给出习惯用法以体现C语言的灵活性。

2.2 强化类型概念

类型体现了抽象,抽象是人认识客观世界的主要能力。类型作为计算机科学的核心概念在众多C语言教材中阐述并不多,教学过程中理应让学员对此留下深刻印象。讲解中通过整数的补码表示,字符型的ASCII编码等让学员明确计算机对不同信息的分类表示。由此引出,类型约定了表示的形式,进而限制了存储空间的大小和取值范围。初期讲解常量时用printf( )的不同格式描述符验证int和double的编码不同,结合sizeof运算符验证不同类型的存储大小,并在介绍位运算后深入了解整型的补码编码方式。利用求余运算符的两个操作数为整数而非浮点数,验证类型对操作的限定,引出类型在另一方面又约束了其上的相关操作。类型概念应该在课程教学的各个章节进行强化,比如后续讲解指针运算只有加减和比较操作时可再次强调。同类型之间可直接操作,异类间操作需先统一为同种类型,重视了类型问题也就便于掌握类型转换,减少了转换出错的概率。面向对象的程序语言强化了C语言本就具有的这个核心概念,并发展到了一个新高度,C中类型的这两个能力与面向对象的理解基本一致,掌握好该核心概念也有利于后续面向对象程序设计语言的学习。

2.3 深入理解变量与赋值适度引入指针

C语言兼具高级语言和低级语言的特点,其实现与内存关系紧密。变量的功用是保存信息以便后续使用,信息的类型不同变量类型的选择也就不同。讲解时无需简单罗列所有变量类型,建议把整型变量单拿出来细讲,这样学员理解好了一个,也就方便了后续其他类型的学习。让学员理解变量名屏蔽了底层地址信息所带来的使用方便性,以及掌握利用底层地址信息进行间接访问操作的一致性。对整型变量int i;通过printf(“%d,%p”,i,&i)引出%p格式描述符和&取地址运算符以验证变量的存储内容和存储起始地址,并指出变量初始化的重要性。进一步用printf(“%d,%p,%d”,i,&i,*&i)引出用地址求值的间接访问运算符*,为指针的引入建立基础。C语言的赋值并非数学中的相等比较,示例中用i=1与j=i,强调i在等号的左边表示存储位置,在等号的右边表示存储内容,由此引出左值和右值概念,明确左值是能指代存储空间的对象,从而避免i++++此类错误操作。通过赋值操作符设问如何保存地址信息从而完整地引出指针类型,用示例强化指针相关的两个重点操作&,*。再次结合sizeof查看多个同类型变量的内存分布,以引出指针的加减及比较操作,并由不同指针类型间转换引出void *这个类型转换桥梁,以方便后期数组、结构体等教学。至此,完成对指针涉及的所有基础知识讲解,后续课程重点讲其应用即可。有了这些概念后引出scanf以尽快开启交互式程序的设计,提高学习兴趣。

2.4 尽早引入函数

个人认为很多教材将函数放在课程后半部分讲是不合理的。为了便于学员理解到函数及模块化的重要性,尽早接触到结构化程序设计思想,建议在赋值语句和表达式之后就以“命名的语句块”方式初步引出函数概论以熟悉基本框架和使用,并在后续章节逐步深入。在控制结构中结合函数进行基本编程能力的培养,重视函数设计的通用性[3]。讲解函数时,不必按参数、返回值等对函数进行分类,重点应该从主调和被调,从使用和实现的角度出发,对比两者对函数的关注点和关注内容的不同,体现出接口的重要性,并让学员在设计与调用时做到清晰明了。需强调函数参数的值传递方式而无需引入地址传递等其他表述以减轻学习负担。对函数调用栈状态变化的讲解要简明扼要,以清晰值传递的实现基础,并体会语句块内局部变量的概念,为后续变量作用域和存在期讲解打下铺垫。在具有指针的基础概念上对比void func1(int a){a++;}和void func2(int *a){(*a)++;},前者用复印件的类比说明修改不涉及原件,后者用钥匙的类比说明直接修改原件,以及利用2值交换函数理解函数内修改函数外数据时利用指针间接访问所带来的便利性。由于程序运行时存储在内存,其中的所有对象都有地址信息也包括函数,由此引出函数指针及其基本用法。关于递归的讲解涉及的是程序设计方法与机器细节相关不大,重点通过简单示例强调思维方式。对汉诺塔、二叉树遍历等经典例子以及数据结构与算法基础内容等可在课程的后半部分单设常用编程技术章节专门提高程序设计能力。

2.5 清晰数组概念

由于前述教学安排,数组可放到指针及函数之后讲解。对该概念的引入可以提两点,一是便于大量同类型变量的定义及使用,int a[1000]比a1,a2...a1000方便定义,下标操作方便使用;二是内存采用连续地址空间实现数组,存储的空间顺序性保证了元素间关系的顺序性,使得数组成为多种数据结构实现的基础。强调数组名代表整个数组对象从而不具有左值特性,也就无法进行整体赋值和a++等操作。对数组名用sizeof(a)计算整体占用空间,引出sizeof(a)/sizeof(a[0])的习惯用法。强调数组名a的类型类似int *const指针,值为头元素地址,即a等值于&a[0],可对其加减以获得特定指向。结合int (*p)[1000]=&a;指出a,&a二者值相等但类型不,并在示例中利用a+1,&a[0]+1,&a+1结合内存模型进行验证。既然数组名类似指针,也就引出数组表示和指针表示的统一性,即a[2]等价于*(a+2),由加法交换律*(a+2)等价于*(2+a),也就解释了2[a]这种奇怪写法的存在,同理也解释了1[“abc”]是什么。对数组用a[-1],a[-2]示例编译器不进行访问越界的检测,体会不可控越界的危险性。联系到函数参数传递时,用swap(int a[],int b[])与swap(int *a,int *b)完成2值交换的一致性验证数组名退化为指针类型,引出参数传递中一维数组长度信息的丢失问题,总结出函数参数中应该带入数组长度信息func(int a[],int length),并结合二维及多维数组再次强调参数传递忽略最高维的原因。后期涉及结构体讲解时,以struct B{ int i[3];}b1,b2;b2=b1;做对比,突显出结构体整体赋值的特殊性,并以此讨论数组与结构体在进行函数参数传递的成本问题,以体现指针的优势。

3 结语

关于程序设计能力和计算思维的培养是个长期过程,需要在整个培养体系中利用多门课程和实践进行贯穿和深入。实践证明,当前这种教学编排强化了学员对上述重要概念的理解,知识点间联系更紧密,对事物的前因后果更清晰,在一定程度上减少了学习弯路,提高了教学效果。

参考文献:

[1] 谭浩强.C程序设计[M].4版.北京:清华大学出版社,2012.

[2] 裘宗燕.从问题到程序——程序设计与C语言引论[M].2版.北京:机械工业出版社,2011.

[3] 朱安平.一种C语言函数教学的设计与实践[J].计算机工程与科学,2014,36(S1):139-142.

作者:郭亮 郭海智

第6篇:C语言教学探讨

摘??要: 为提高C语言教学质量,针对C语言课程内容和特点,在教学中结合实际应用激发学生的学习兴趣,运用知识点间联系帮助学生建立知识体系,通过实践训练提高学生编程操作能力,注重编程规范使学生养成良好的编程风格,取得了较好的教学效果。

关键词: C语言; 程序设计; 教学方法; 编程规范

On C language teaching

Sha Aijun

(School of Communication Engineering, Nanjing Institute of Technology, Nanjing, Jiangsu 211167, China)

Key words: C language; programming; teaching method; programming norms

0 引言

C语言作为一种计算机程序设计语言,兼具高级语言和汇编语言的优点,在编写系统软件和应用软件方面得到了广泛的使用。因此,通信、计算机、信息等专业往往将其作为第一门专业基础课。C语言教学目标要求学生既掌握C语言的语法、结构、数据类型等内容,又要掌握软件工程思想,掌握常见算法,学会使用C语言编程解决实际问题并形成良好的编程风格,为后续课程及未来工作打下良好基础。

本课程知识点较多、使用灵活、实践性强、难度较大,且大部分学生是第一次接触编程,缺乏相关编程基础和思维,学时又有限(一般为48学时或64学时),如何提高C语言教学质量,是一个值得探讨的问题。本文从几个方面介绍笔者在教学中的一些体会。

1 提高学生学习兴趣

学习兴趣是推动学生积极主动学习的直接动力,是最好的老师。C语言中语法规则较多,而且相对枯燥,要让学生学好C语言,最重要的就是激发其兴趣,让他们在学习中找到乐趣,在快乐中掌握相关知识点。

例如在第一次课程中,当介绍了C语言产生背景、发展历程等知识点之后,可向学生展示一些实用性的小程序,如“推箱子”、“五子棋”、“贪吃蛇”等游戏。通过生动、形象、直观的展示,让学生对C语言产生想学的强大动力。一旦学生产生兴趣,可以先让他们尝试编写输出简单的“Hello world!”程序,在此过程中,顺势让学生了解简单的C语言程序的框架,使得语法、数据类型等知识点不再枯燥,成为程序中有血有肉的必要组成体。

在后续的课程中,也要不断地结合具体知识点的学习,选择具有趣味性、实用性和挑战性的小型案例,采取项目案例教学法,如超市购物系统[1],将其各部分的功能分散到各章去,从简单到复杂,让学生在快乐和兴趣中一步步地去学习和探索新的知识。

同时,还应鼓励学生利用所学知识,设计一些实用的小程序来解决身边的一些小问题。当学生有了目标,投入进去,遇到困难必然会想办法去克服,而当他们尝试到了成功带来的喜悦时,又会促使他们进一步爱上编程。

2 运用联系法,帮助学生建立知识体系框架

C语言知识点很多,包括基本数据类型(整型、字符型、浮点型)、算法、基本的程序结构,数组、函数、指针、结构体和共用体、文件、位运算、预编译等等【2】。根据知识点之间的联系,上述内容可整合成数据类型、算法和程序结构、函数、文件及其他等几大部分,在课堂教学中,可运用联系法,帮助学生实现知识点的迁移,建立知识体系框架。

⑴ 数据类型

数据类型包括基本数据类型、构造类型中的数组、结构体、共用体,此外还有指针类型等。不同的数据类型将决定内存中占据的空间大小以及表示数的范围,可以此为线索,讲解基本数据类型和构造类型的含义和联系,比如同类型的基本类型数据构造在一起就成了数组类型,不同的类型的数据构造在一起,就成了结构体类型等。

再联系到现实中的例子,讲解变量和指针变量的含义和定义,进而讲解指针变量不仅可以存放普通变量的地址和数组元素的地址,还可以存放结构体数组变量的地址和结构体数组元素的地址。

⑵ 算法和结构化程序设计

编制程序的过程就是形成算法、实现算法到结构化代码转化的过程。

首先,针对学生感觉编程难的问题,教学中首先让学生形成正确的思维。当遇到一个问题的时候,让学生去思考一下不用程序是如何解决的[3,4]。例如:先做什么,再做什么;可分几种情况讨论;有没有需要重复做的事情。引导学生进行一题多解,分析算法的步骤和运算量小,探讨算法逻辑严密性等方面的问题。一旦学生有了自己的思路,编程就会变得更容易:只要将上述偏文字化的思路(算法)转化成用流程图描述,并进行结构化编码即可。实际上,在上面的思考和讨论中,程序框架已经体现出来了。

其次,讲解常见典型算法,拓展知识点并建立联系,引导学生悟出其中的规律。讲解迭代法、递归法、穷举法、回溯法以及一些常用的程序段[5]:如求累加、累乘;判断一个数是否为素数;对一个数的各个数位进行分离;求最大公约数和最小公倍数;对数组元素的检索、排序、插值、删除、逆序;求矩阵的转置;对字符数组进行复制、连接、比较;对链表中结点的检索、排序、插值、删除等等,这些都是学生必须要掌握的。讲解上述算法和程序的时候,可以采取阶梯法,循序渐进。例如,先讲解累加、再讲解累乘,分析有何不同;再比如,讲解数组元素的检索、排序、插值、删除操作,当讲到链表时,分析链表中结点的检索、排序、插值、删除等操作和数组中的操作有哪些异同点等。

⑶ 函数部分

函数是模块化程序设计中的基本组成单位。可以用一个小程序来引入,如:求学生平均成绩。在学习函数之前,学生喜欢将所有代码全放在main()中;而现在可以将输入、求平均成绩、输出等功能独立成函数,在main()函数中调用这些函数。让学生从总体格局上把握这两种形式有何不同,体会模块化的作用,了解耦合性和内聚性等概念,形成对模块化的初步印象。

为讲解函数的一些重要概念,可从现实生活中学生比较熟悉的数学中的函数概念入手,帮助学生理解函數名、函数定义和函数调用,理解函数的形参和实参,函数的返回值等概念,并结合已有的程序将这些知识点迁移到C语言中。

在C语言中,函数的实参可以是值或地址,这个知识点至关重要,两者区别如下:①当函数的实参为地址时,被调用时传递给形参(指针变量),若被调用函数中对形参所指向的内容进行了修改,其实质就是修改调用函数中的实参所指向的内容,即修改的结果能带回来;②其他情况,如函数的实参虽为地址,但被调用函数中是对形参(指针变量)进行修改,或者函数的实参为数值,其修改的结果都是不能带回的。上述参数中的地址,可从变量的地址推广至数组元素的地址、数组名、指针变量、结构体变量地址和结构体数组名。

⑷ 文件

文件中应首先让学生明白什么是文件,为什么需要文件,文件存储的位置和先前的变量有什么不同,文件的分类等基本概念。在缓冲文件系统中,对文件访问还要借助 “文件类型指针”, 让学生体会这和先前所学的变量访问等有哪些不同。此外,该文件类型又是一个结构体类型,描述的是打开文件的相关信息,则可以和结构体类型的定义等概念建立联系。

文件的操作主要包括文件的打开、文件的关闭、文件的读写、文件读写位置的定位、文件出错检测等。此处以讲解文件的读写为重点,可让学生明白读写前要打开文件,需提供文件名和读写方式,文件读写完后还要关闭等等;读写的过程中,可根据一个字符、一个数据块等选取不同的函数,还可以让学生将此处的fgetc()和getchar()建立起联系,明白设备文件的概念以及getchar()实质上来自于fgetc(),将前后知识融会贯通。当然,若要实现随机读写又引出fseek()等知识点,学生在联系和区别中建立框架,明白所以然。

⑸ 其他方面

如位操作、预处理等也要讲解,此部分内容相对简单,由于篇幅关系,不再进行探讨。

3 理论联系实践,注重提高学生上机实践操作能力

C语言是一门实践性极强的课程,要让学生真正学会C语言,必须让他们经过大量的实践和编程训练,在实践中提高技能。我们把实践部分分为三大块。

⑴ 课内实验

在本学院教学中,作为64学时课程的一部分(46学时理论+18学时实验),一共有9次实验,对重要知识点,每学完一章内容,就安排一次上机实验课,尽量安排在紧跟理论课之后。

在实验中,我们侧重训练学生对所学知识的理解和掌握。每次实验,在内容上采用典型的案例;在层次和题型上采用循序渐进的方式;既包括验证性等基础性的实验,又包括分析填空、改错、独立设计等提高性的实验。在教学中,充分发挥教师的主导和学生的主体作用,上机前教师讲解算法及注意点;然后让学生动手编写程序、上机调试;教师在学生上机过程中,逐个座位巡视,帮助解决学生遇到的问题;上机结束后,要求学生提交实验报告,进行总结提高。

在实验课程中,一定要让学生掌握程序纠错的方法,“授人以渔”。第一,要引导学生学会纠正语法错误[2]:看懂编译错误的英文提示信息的含义,学会排除错误并进行总结。第二,要引导学生纠正逻辑错误:除学会静态检查外,还要学会调试程序的方法。一旦学生掌握了如何单步跟踪,如何观察数据的存储空间,何时需要在何处打上断点,何时需要进入函数内部跟踪等调试的方法和技巧,程序的运行状态就变得直观、清晰、可控,程序调试将不是难事。当学生能排除错误并调试成功,必定会获得成就感,也必定会加深对语法、数据类型、算法等知识点的理解,促进他们有信心学好这门课程。

⑵ 课外上机训练

课外上机训练,我们布置10道代表性强、综合性高、实用性好的题目,让学生利用课外时间,进行编程和调试,并提交程序和报告使学生的能力得到进一步提高。

⑶ 课程设计(1周时间)

在为期一周的过程课程设计中,我们要求学生将C语言课程中学到的知识综合运用到一个小的项目中,从选题到整体规划、模块划分、详细设计、编码、调试,再到撰写一个类似毕业论文的课程报告,对学生进行一个完整的训练。课程设计的题目可为职工信息管理系统或者通讯录这种类型的题目,鼓励学生用数组或链表两种不同的数据类型来实现,并比较其中的优缺点;学生也可以根据自己的兴趣和能力,经指导老师同意后,选择编程实现一些游戏项目。

4 注重编程规范化训练,养成良好的编程风格

在C语言的教学中,还应从软件工程的角度,按照企业对程序员的要求,注重编程规范的训练,养成良好的编程风格[6]。

⑴ 注意程序书写格式

要注意程序的书写格式,比如,程序中添加必要的空行,一行代码只做一件事,有正常的缩进,{}的匹配,正确的对齐,加必要的注释,使用括号确定表达式的操作顺序,这样可使程序美观、可读性好。此外,一些书写习惯有助于提示一些语法错误,比如,初学者将==经常误写成=,若if(a==1)误写成if(a=1),编译器并不提示出错信息;但若交换运算符两边的运算对象,即改写成if(1==a),此时,若再误写成if(1=a),则编译器就会提示出错信息。

⑵ 提高对内存使用管理方面的意识

C语言是一个可以对内存直接操作的语言,内存的概念在C语言中相当重要。从全局变量、局部变量的内存空间的分配,到利用malloc()等函数申请内存以及指针的运用,处处离不开内存,因此要强化学生对内存使用管理的意识。例如:全局变量、局部变量、malloc()申请的内存所在的区域有何不同,再如内存分配后要检查是否分配成功,在引用内存前要对其初始化、避免出现野指针、避免数组越界、避免内存泄露等。

⑶ 注重程序的出错处理

当程序出错时,应有正常的出错提示信息,有良好的交互性。比如对文件的打开要考虑文件打开失败的处理,比如申请一段内存时,要检查是否分配成功,再比如输入学生的成绩(0~100)时,要考虑误输入的情况等。

⑷ 形成重视软件文档的意识

文档是计算机软件产品的重要组成部分,应该适时的让学生初步形成重视软件文档的意识。比如课程设计中要求学生:学习包含软件需求分析、可行性分析、总体开发计划、概要设计、详细设计、系统测试等文档的标准和编制规范方面的内容。

5 结束语

C语言是一门得到广泛使用的语言,该课程又是一门基础课,掌握该课程对学生学习后续其他课程,以及未来就业都有着十分重要的现实意义。如何让枯燥、难懂的课程学习变成集知识、趣味于一体的学习,如何让学生快速建立起知识体系、掌握重要的知识点,如何让学生动手操作能力得到切实的提高、编写出符合规范化要求的程序,为未来成为一名合格的软件编程工程师打下扎实的基础。本文对这些问题进行了探讨,并在近年的教学实践中加以运用,取得了良好的效果,学生的编程能力和综合素养得到了明显的提高。

参考文献:

[1] 姚海军.C语言教学中的项目设计[J].吉林教育,2011.16:3

[2] 谭浩强.C语言程序设计(第3版)[M].清华大学出版社,2005.

[3] 杨春.初学C语言程序设计的基本方法和技巧[J].人力资源管理,

2010.1:90-91

[4] 张会影.高校C语言教学方法探索研究[J].电脑知识与技术,2010.6

(24):6815-6816

[5] 马丽娟.常用计算机算法简介及C语言举例[J].电脑知识与技术,

2011.6(11):2655-2659,2662

[6] 林锐.高质量程序设计指南——C++/C语言(第3版)[M].电子工业出

版社,2007.

作者:沙爱军

第7篇:五子棋游戏开发总结(C语言版)

五子棋游戏开发总结

一.五子棋游戏概述

二.游戏功能

对弈游戏,自动判断游戏胜负。

采用人机对话模式,界面设计美观友好。

具体玩法:采用任意键开始游戏,此处采用键盘值W、A、S、D控制棋子移动方向,空格键(SPACE)落子,ESC退出游戏。

三.系统开发平台

1) Visual C++ 单纯的Visual C++ 不行,需下载一个EasyX小插件对其进行配置好才可(网上有下的,也有配置方法)。 2) 程序代码必须以.cpp结尾。

3) 最佳分辨率:最佳效果1024*768。 四. 游戏开发详细过程:

五.游戏的完整详细代码:

#include

#include

//图形库 #include

#include #include //宏定义

#define ESC 27

//退出

#define SPACE 32

#define LEFT 65

//向左键 #define RIGHT 68 #define UP 87 #define DOWN 83

int key;

int chess[20][20];

//棋盘坐标位置

int flag=1;//标识要画的棋子的颜色flag=1,棋子为蓝色;其他为红色。 int chessx,chessy;

void start(); void draw_chessboard(); void draw_circle(int x,int y,int color); void play();

int result(int x,int y); //开始游戏 void start() {

outtextxy(200,240,"GAME START!");

outtextxy(200,380,"ESC-exit/press any key to continue "); } //画棋盘

void draw_chessboard() {

int i,j;

setbkcolor(GREEN);//设置背景颜色为绿色

cleardevice();//清屏

for(i=40;i<=440;i+=20)

for(j=40;j<=440;j++)

{

putpixel(i,j,4);

putpixel(j,i,4);

}

setcolor(8);

setlinestyle(1,0,1);

rectangle(32,32,448,448);

outtextxy(10,10,"ESC-exit/SPACE-put a piece"); } //画棋子

void draw_circle(int x,int y,int color) {

setcolor(color);

setlinestyle(1,0,10);

x=(x+2)*20;

y=(y+2)*20;

circle(x,y,4); } //清除棋子

void draw_pixel(int x,int y,int color) {

x=(x+2)*20;

y=(y+2)*20;

{

int a,b,c,d;

for(a=1;a<=8;a++)

putpixel(x+a,y,color);

for(b=8;b>=1;b--)

putpixel(x,y-b,color);

for(c=1;c<=8;c++)

putpixel(x,y+c,color);

for(d=8;d>=1;d--)

putpixel(x-d,y,color);

putpixel(x+9,y,color);

putpixel(x,y-9,color);

putpixel(x,y+9,color);

putpixel(x-9,y,color);

} } //游戏过程 void play() {

int i,j;

switch(key)

{

case LEFT://棋子左移

if(chessx-1<0)

break;

else

{

for(i=chessx-1,j=chessy;i>=1;i--)

if(chess[i][j]==0)

{

draw_circle(chessx,chessy,GREEN);

draw_pixel(chessx,chessy,8);

break;

}

if(i<1)

break;

chessx=i;

if(flag==1)

draw_circle(chessx,chessy,BLUE);

else

draw_circle(chessx,chessy,RED);

}

break;

case RIGHT://棋子右移

if((chessx+1)>19)

break;

else

{

for(i=chessx+1,j=chessy;i<=19;i++)

if(chess[i][j]==0)

{

draw_circle(chessx,chessy,GREEN);

draw_pixel(chessx,chessy,8);

break;

}

if(i>19)

break;

chessx=i;

if(flag==1)

draw_circle(chessx,chessy,BLUE);

else

draw_circle(chessx,chessy,RED);

}

break;

case DOWN://棋子下移

if((chessy+1)>19)

break;

else

{

for(i=chessx,j=chessy+1;j<=19;j++)

if(chess[i][j]==0)

{

draw_circle(chessx,chessy++,GREEN);

draw_pixel(chessx,chessy,8);

break;

}

if(j>19)

break;

chessx=i;

if(flag==1)

draw_circle(chessx,chessy,BLUE);

else

draw_circle(chessx,chessy,RED);

}

break;

case UP://棋子上移

if((chessy-1)<0)

break;

else

{

for(i=chessx,j=chessy-1;j>=1;j--)

if(chess[i][j]==0)

{

draw_circle(chessx,chessy,GREEN);

draw_pixel(chessx,chessy,8);

break;

}

if(j<1)

break;

chessy=j;

if(flag==1)

draw_circle(chessx,chessy,BLUE);

else

draw_circle(chessx,chessy,RED);

}

break;

case ESC://退出游戏

break;

case SPACE://落子

if(chessx>=1&&chessy<=19&&chessx<19&&chessy>=1)

{

if(chess[chessx][chessy]==0)

{

chess[chessx][chessy]=flag;

if(result(chessx,chessy)==1)

{

cleardevice();

if(flag==1)

{

cleardevice();

outtextxy(80,200,"CONGRATIONATIONS,BLUE WIN !");

getch();

closegraph();

exit(0);

}

if(flag==2)

{

cleardevice();

outtextxy(80,200,"CONGRATIONATIONS,RED WIN !");

getch();

closegraph();

exit(0);

}

}

if(flag==1)

flag=2;

else

flag=1;

break;

}

}

else

break;

} } //判断胜负

int result(int x,int y) {

int j,k,n1,n2;

while(1)

{

n1=0;

n2=0;

for(j=x,k=y;j>=1&&k>=1;j--,k--)

{

if(chess[j][k]==flag)

n1++;

else

break;

}

for(j=x,k=y;j<=19&&k<=19;j++,k++)

{

if(chess[j][k]==flag)

n2++;

else

break;

}

if(n1+n2-1>=5)

return(1);

n1=0;

n2=0;

for(j=x,k=y;j<=19&&k>=1;j++,k--)

{

if(chess[j][k]==flag)

n1++;

else

break;

}

for(j=x,k=y;j>=1&&k<=19;j--,k++)

{

if(chess[j][k]==flag)

n2++;

else

break;

}

if(n1+n2-1>=5)

return(1);

n1=0;

n2=0;

for(j=x,k=y;j>=1;j--)

{

if(chess[j][k]==flag)

n1++;

else

break;

}

for(j=x,k=y;j<=19;j++)

{

if(chess[j][k]==flag)

n2++;

else

break;

}

if(n1+n2-1>=5)

return(1);

n1=0;

n2=0;

for(j=x,k=y;k>=1;k--)

{

if(chess[j][k]==flag)

n1++;

else

break;

}

for(j=x,k=y;k<=19;k++)

{

if(chess[j][k]==flag)

n1++;

else

break;

}

if(n1+n2-1>=5)

return(1);

return (0);

} }

//主函数

int main(void) {

initgraph(620,480);

start();

key=getch();

if(key==ESC)

exit(0);

else

{

cleardevice();

flag=1;

draw_chessboard();

do

{

chessx=10;

chessy=10;

if(flag==1)

draw_circle(chessx,chessy,BLUE);

else

draw_circle(chessx,chessy,RED);

do

{

while(getch()==0);

key=getch();

play();

}

while(key!=ESC&&key!=SPACE);

}

while(key!=ESC);

closegraph();

}

return 0; }

作者:flybird 时间:2012/08/18

第8篇:c语言系统开发设计实习报告

信息管理与系统开发设计综合模拟实习

一、实习目的

通过模拟实习,主要要达到两个目的,一是检验和巩固专业知识、二是提高综合素质和能力。信管07级学生的模拟实习主要是复杂程序和简单软件的实现。通过该模拟实习,可以将学生课堂上掌握的理论知识与处理数据的业务相结合,以检验我们同学们掌握知识的宽度、深度及对知识的综合运用能力。

二、实习环境

计算机硬件配置:cpu 内存 硬盘操作系统:windows xp 开发环境:visual c++ 6.0

三、实习内容

内容一:运动会分数统计

任务:参加运动会有n个学校,学校编号为1„„n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1„„m,女子m+1„„m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:

7、

5、

3、

2、1,前三名的积分分别为:

5、

3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)

功能要求:

(1)可以输入各个项目的前三名或前五名的成绩; (2)能统计各学校总分;

(3)可以按学校编号、学校总分、男女团体总分排序输出;

(4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。

规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)

输出形式:有中文提示,各学校分数为整形

1 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 测试数据:要求使用

1、全部合法数据;

2、整体非法数据;

3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

内容二:纸牌游戏

任务:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后„从第4张开始,以4为基数,是4的倍数的牌翻一次, 直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的 直到 以52为基数的 翻过,输出:这时正面向上的牌有哪些?

内容三:设计学生成绩管理系统。该系统中存储学生的学号、姓名、性别、年龄、课程成绩等信息。

要求:(1)浏览学生信息

(2)添加学生信息 (3)删除学生信息 (4)查找学生信息 (5)修改学生信息 (6)对成绩的处理

①求出每个学生各门课程的总成绩、平均成绩、最高分和最低分。 ②求出某一门课程所有学生总成绩、平均成绩、最高分和最低分。 (7)按照学生某门课程的成绩对学生排序

四、算法分析、设计与描述

1.算法分析和设计 内容一:

运动会分数统计是对运动会信息的基本管理与统计,它包括:运动会信息的输入、运动会总体成绩的查询、指定学校成绩的查询、以及各种要求的排列。

使用模块化编程的方法每项功能有一个函数来完成,对应如下: 按学校编号排序void bianhao( )

按学校总分排序void zongfen( ) 按学校男总分排序void malezf( )

按学校女总分排序void femalezf( ) 查询某个学校成绩void cxsch( )

查询某个项目成绩void cxxm( ) 为了把数据封装起来更方便使用,创建了表示项目结构体的struct item和表示学校的结构体struct school。

struct item { char name[15]; int snum[5]; int s; }p[21];

struct school { int num; char name[15]; int score; int mscore; int wscore; }sch[21];

内容二:

此题算法比较简单,按题目要求相当于从第一张牌算起,若这张牌是二的倍数,则翻面,是三的倍数则再翻一次,是四的倍数则再翻一次,循环直到52为止,则此张牌结算完成。翻完第一张牌后,再继续算第二张牌,直到52张牌都结算完成。

3 内容三:

学生信息管理系统是对学生信息的基本管理,它包括:浏览学生信息、添加学生信息、删除学生信息、查找学生信息、修改学生信息、对成绩的处理、按照学生某门课程的成绩对学生排序

使用模块化编程的方法每项功能有一个函数来完成,对应如下:

(1)浏览学生信息以及读取数据 void print(ID *head) (2)添加学生信息以及对成绩的处理ID *insert(ID *head) (3)删除学生信息 ID *delet(ID *head) (4)查找学生信息ID *search(ID *head) (5)修改信息 ID *amend(ID *head) (6)按照学生某门课程的成绩对学生排序ID *sort(ID *head) (7)存储数据以及退出系统ID *breaksys(ID *head) 为了把数据封装起来更方便使用,创建了表示学生信息的结构体struct id struct id { char name[20]; int num; int a; int b; int c; double ave; ID *next; };

2.算法描述 内容一:

开始输入数据选择操作按学校编号排序按学校总分排序按学校男总分排序按学校女总分排序查询某学校成绩查询某个项目成绩退出结束 图4.1 计分系统总体模块流程图

开始N输入学校的个数nYn>=1&&n<=20输入学校的名称输入男子项目数m和女子项目数wYN输入项目的名称m<=20&&m>=1&&w<=20&&w>=1输入项目选取的名次sN输入项目的前s名的学校编号x>=1&&x<=nY储存数据结束

图4.2 数据输入保存流程图

开始i=0isNsch[j];sch[j]=tch[j].numi++i=1i<=nY输出成绩i++N结束图4.3按编号排列流程图

开始i=1Ni<=52Yj=2j<=52Yi%j=0YNNa=-aj++a==1YN输出ii++结束图4.4 流程图

内容二:

内容三:

开始输入zZ=2Z=1Z=3Z=4Z=5Z=6Z=7Z=8浏览学生信息添加学生信息删除学生信息查找学生信息修改学生信息对成绩的处理按照学生某门课程的成绩对学生排序退出结束 图4.5总体模块流程图

开始输入删除的学号p1=headnum!=p1->num && p1!=NULLNYp2=p1p1=p1->nextYhead==NULLN输出没有记录结束num==p1->numYp1==headNhead=p1->nextYp2->next=p1->nextpc--结束

图4.6 删除数据流程图

五、程序设计

1.程序设计的基本思路 内容一:

(1)主函数的程序设计

首先输入运动会成绩,进入菜单,然后选择操作(运用swith语句),调用各子函数,同时保存文件。最后选择退出程序。

(2)各子函数的程序设计 保存信息:

fp=fopen("运动会分数统计.txt","wb"); fprintf(fp,"编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++) {

fprintf(fp," %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); } fclose(fp);

按学校编号排序

for(i=0;i

} for(j=i;j

if(sch[i].num>sch[j].num) { } t=sch[i];sch[i]=sch[j];sch[j]=t; 按学校总分排序

for(i=1;i

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

if(sch[i].score

} t=sch[i]; sch[i]=sch[j]; sch[j]=t; 8 }

按学校男总分排序

school t; for(i=1;i

} for(j=i;j<=n;j++)

{ if(sch[i].mscore

for(i=1;i

} for(j=i;j<=n;j++)

if(sch[i].wscore

for(i=1;i<=n;i++) {

} if(sch[i].num==s) {

} printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name, sch[i].score,sch[i].mscore,sch[i].wscore); break; 查询某个项目成绩

for(i=1;i<=5;i++) printf(" %d%6d%10s ",i,p[s].snum[i],sch[ p[s].snum[i] ].name); printf(" ");

9 内容二:

主要算法是两次for循环

for(i=1;i<=52;i++) {

} a=1; for(j=2;j<=52;j++) {

} if(a==1) printf("%d ",i); if(i%j==0) a=-a;

内容三:

(1)主函数的程序设计

首先,进入菜单,然后选择操作(运用swith语句),调用各子函数,调用完后自动返回主菜单。在退出程序时自动保存文件。

(2)各子函数的程序设计 显示信息:

fp=fopen("学生成绩管理.txt","a+"); printf("显示结果是: "); printf("学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); while(p!=NULL) { &p->min); } fclose(fp); if(head!=NULL) {

fscanf(fp,"%3d%5s%5s%5d%5d%5d%5d%5d%5d%5d%5d ",&p->num, &p->name,&p->sex, &p->age,&p->a,&p->b,&p->c,&p->sum,&p->ave,&p->max, p++; do {

}

10 printf("%3d%5s%5s%5d%5d%5d%5d%6d%9.2f%7d%7d ",p->num, p=p->next; p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max,p->min); } while(p!=NULL); printf("总体成绩: "); printf("语文的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",asum,aave,amax,amin); printf("数学的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",bsum,bave,bmax,bmin); printf("英语的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",csum,cave,cmax,cmin);

添加记录

printf("插入操作开始!!! "); temp=(ID *)malloc(sizeof(ID)); printf("请输入学生的学号: ");scanf("%d",&temp->num); printf("请输入学生的姓名: ");scanf("%s",&temp->name); printf("请输入学生的性别: ");scanf("%s",&temp->sex); printf("请输入学生的年龄: ");scanf("%d",&temp->age); printf("请输入学生的语文成绩: ");scanf("%d",&temp->a); printf("请输入学生的数学成绩: ");scanf("%d",&temp->b); printf("请输入学生的英语成绩: ");scanf("%d",&temp->c);

查找记录

查找记录中需要看记录中是否有与输入数据匹配的数据。有则输出数据,没有则提示没有找到数据。

while(str!=p1->num && p1!=NULL) {

} p2=p1; p1=p1->next; 保存记录

fp=fopen("学生成绩管理.txt","a+"); fprintf(fp,"学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); while(p->next!=NULL) {

} fclose(fp);

11 fprintf(fp,"%3d%5s%5s%5d%5d%5d%5d%5d%5d%5d%5d ", p++; p->num,p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max, p->min);

2.程序代码 内容一:

#include #include int n,m,w; FILE *fp; struct item { char name[15]; int snum[5]; int s; }p[21]; struct school { int num; char name[15]; int score; int mscore; int wscore; }sch[21]; int integral1[5]={7,5,3,2,1};//前五名得分 int integral2[3]={5,3,2};//前三名得分 void input() { int i,j=0,y,x; printf("请输入学校个数:"); while(1) {

} for(i=1;i<=n;i++) {

scanf("%d",&n); if(n>=1&&n<=20)y=1; if(y)break; else printf("输入错误,请重新输入: "); printf("请输入第%d个学校的名称:",i); scanf("%s",&sch[i].name); sch[i].score=0; sch[i].wscore=0; sch[i].mscore=0; sch[i].num=i;

12 } printf("请输入男子项目数和女子项目数: "); y=0; while(1) {

} for(i=1;i<=m+w;i++) {

scanf("%d%d",&m,&w); if(m<=20&&m>=1&&w<=20&&w>=1)y=1; if(y)break; else printf("输入错误,请重新输入: "); printf("请输入第%d个项目的名称:",i); scanf("%s",& p[i].name); while(1) {

} printf("请输入第%d个项目的前%d名的学校编号: ",i,p[i].s); if(p[i].s==5) {

} else { for(j=1;j<=5&&j<=n;j++)

13 printf("请输入第%d个项目选取的名次:",i); scanf("%d",& p[i].s); if(p[i].s==3||p[i].s==5)break; else printf("输入错误,请重新输入: "); for(j=1;j<=5&&j<=n;j++) {

} y=0; while(1) {

} p[i].snum[j]=x; sch[x].score+=integral1[j-1]; if(i<=m)sch[x].mscore+=integral1[j-1]; else sch[x].wscore+=integral1[j-1];

scanf("%d",&x); if(x>=1&&x<=n)y=1; if(y)break;

else printf("输入错误,请重新输入: ");

}

} {

} y=0; while(1) {

} p[i].snum[j]=x; sch[x].score+=integral2[j-1]; if(i<=m)sch[x].mscore+=integral2[j-1]; else sch[x].wscore+=integral2[j-1];

scanf("%d",&x); if(x>=1&&x<=n)y=1; if(y)break;

else printf("输入错误,请重新输入: "); fp=fopen("运动会分数统计.txt","wb"); fprintf(fp,"编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++) {

fprintf(fp," %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); } fclose(fp); } void bianhao() //按编号排序 { int i,j; school t; for(i=0;i

} printf(" 按编号排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore);

14 for(j=i;j

if(sch[i].num>sch[j].num) { } t=sch[i];sch[i]=sch[j];sch[j]=t; } void zongfen() //按学校总分排序 { int i,j; school t; for(i=1;i

} printf(" 按学校总分排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); }

void malezf() //按学校男总分排序 { int i,j; school t; for(i=1;i

} printf(" 按学校男子总分排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); } void femalezf() //按学校女总分排序 {

15 for(j=i;j<=n;j++)

if(sch[i].score

} t=sch[i]; sch[i]=sch[j]; sch[j]=t; for(j=i;j<=n;j++)

if(sch[i].mscore

} printf(" 按学校女子总分排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); printf(" "); } void cxsch() //查询某个学校成绩 { int i,y,s; printf("输入需要查询的学校编号:"); y=0; while(1) {

} printf("该学校相关信息: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++) {

} printf(" "); }

16 for(j=i;j<=n;j++)

if(sch[i].wscore=1&&s<=n)y=1; if(y)break; else printf("输入数据有误,请重新输入:"); if(sch[i].num==s) {

} printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name, sch[i].score,sch[i].mscore,sch[i].wscore); break;

void cxxm() //查询某个项目成绩 { int i,y,s; printf("输入需要查询的项目编号:"); y=0; while(1) {

} printf("%s前5名学校编号及名称为 ",p[s].name); printf("名次 编号 学校名称 "); for(i=1;i<=5;i++)

}

void main() { input(); int z; while(1) {

scanf("%d",&s); if(s>=1&&s<=n)y=1; if(y)break; else printf("输入数据有误,请重新输入:"); printf(" %d%6d%10s ",i,p[s].snum[i],sch[ p[s].snum[i] ].name); printf(" "); printf(" 请选择: "); printf("1.按学校编号排序 "); printf("2.按学校总分排序 "); printf("3.按学校男总分排序 "); printf("4.按学校女总分排序 "); printf("5.查询某个学校成绩 "); printf("6.查询某个项目成绩 "); printf("7.退出 "); scanf("%d",&z); switch(z) { case 1: bianhao(); break; case 2:zongfen(); break; case 3:malezf(); break; case 4:femalezf(); break; case 5:cxsch(); break; case 6:cxxm(); break;

case 7: exit(0); break; default :printf("输入错误,请重新输入! ");

} } }

内容二:

#include void main() { int i,j,a; printf("正面向上的牌有: "); for(i=1;i<=52;i++) {

a=1;

for(j=2;j<=52;j++)

{

if(i%j==0)

a=-a;

}

if(a==1)

{

printf("%d ",i);

} } }

内容三:

#include #include #include #include #define ID struct id struct id { char name[20]; int num; char sex[2]; int age; int a; int b; int c; int sum;

18 double ave; int min; int max; ID *next; }stu[100]; int pc=1; FILE *fp; int asum=0,bsum=0,csum=0; int amax=0,bmax=0,cmax=0; int amin=100,bmin=100,cmin=100; float aave,bave,cave;

void print(ID *head)//显示记录 { ID *p; p=head; int temp; printf("显示结果是: "); printf("学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); if(head!=NULL) {

} printf("总体成绩: "); printf("语文的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",asum,aave,amax,amin); printf("数学的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",bsum,bave,bmax,bmin); printf("英语的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",csum,cave,cmax,cmin); }

ID *insert(ID *head) //添加记录 { ID *sort(ID *head); ID *temp,*p1,*p2,*p;

19 do {

} while(p!=NULL); printf("%3d%5s%5s%5d%5d%5d%5d%6d%9.2f%7d%7d ",p->num, p=p->next; p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max,p->min); int t; p=head; printf("插入操作开始!!! "); temp=(ID *)malloc(sizeof(ID)); printf("请输入学生的学号: ");scanf("%d",&temp->num); printf("请输入学生的姓名: ");scanf("%s",&temp->name); printf("请输入学生的性别: ");scanf("%s",&temp->sex); printf("请输入学生的年龄: ");scanf("%d",&temp->age); printf("请输入学生的语文成绩: ");scanf("%d",&temp->a); printf("请输入学生的数学成绩: ");scanf("%d",&temp->b); printf("请输入学生的英语成绩: ");scanf("%d",&temp->c); temp->sum=temp->a+temp->b+temp->c; temp->ave=(temp->sum)/3.0; temp->min=((temp->ab)?temp->a:temp->b)c?((temp->ab)?temp->a:temp->b):temp->c; temp->max=((temp->a>temp->b)?temp->a:temp->b)>temp->c?((temp->a>temp->b)?temp->a:temp->b):temp->c;

if (head==NULL) {

} else {

head=temp; temp->next=NULL; p1=head; p2=p1; p1=p1->next; p2->next=temp; temp->next=p1; p=head; do {

asum=asum+p->a; bsum=bsum+p->b; csum=csum+p->c; if(amin > p->a) {

} if(amax < p->a) {

20 t=amin; amin=p->a;

}

} t=amax; amax=p->a; if(bmin > p->b) {

} if(bmax < p->b) {

} if(cmin > p->c) {

} if(cmax < p->c) {

} p=p->next; t=cmax; cmax=p->c; t=cmin; cmin=p->c; t=bmax; bmax=p->b; t=bmin; bmin=p->b; while(p!=NULL); aave=float(asum/pc); bave=float(bsum/pc); cave=float(csum/pc); } printf("添加成功!!"); pc++; return (head); }

ID *search(ID *head) //查找记录 { ID *p1,*p2; int str; printf("请输入要查找的学生的学号:"); scanf("%d",&str); p1=head; while(str!=p1->num && p1!=NULL)

21 {

} if(str==p1->num) {

} else

}

ID *sort(ID *head)//排序 { int temp; char str[100]; double dbl; ID *p1,*p2; for(p1=head;p1!=NULL;p1=p1->next) {

p2=p1; p1=p1->next; printf("学生的学号:%d ",p1->num); printf("学生的姓名:%s ",p1->name); printf("学生的性别:%s ",p1->sex); printf("学生的年龄:%d ",p1->age); printf("学生的语文成绩:%d ",p1->a); printf("学生的数学成绩:%d ",p1->b); printf("学生的外语成绩:%d ",p1->c); printf("学生的总成绩:%d ",p1->sum); printf("学生的平均成绩:%.2lf ",p1->ave); printf("学生的最高分:%d ",p1->max); printf("学生的最低分:%d ",p1->min); printf("没有找到记录"); return head; for(p2=p1->next;p2!=NULL;p2=p2->next) {

if(p1->aveave) {

temp=p1->num; p1->num=p2->num; p2->num=temp; strcpy(str,p1->name); strcpy(p1->name,p2->name); strcpy(p2->name,str); temp=p1->a; p1->a=p2->a;

22

}

}

} p2->a=temp; temp=p1->b; p1->b=p2->b; p2->b=temp; temp=p1->c; p1->c=p2->c; p2->c=temp; dbl=p1->ave; p1->ave=p2->ave; p2->ave=dbl; printf("排序成功!!! "); return (head); }

ID *delet(ID *head) //删除记录 { ID *p1,*p2; int num; printf("请输入要删除的学生的学号:"); scanf("%d",&num); p1=head; if (head==NULL) {

} while(num!=p1->num && p1!=NULL) {

} if(num==p1->num) {

}

23 printf("没有记录 "); goto end; p2=p1; p1=p1->next; if (p1==head) head=p1->next; p2->next=p1->next; else printf("删除成功!!! "); pc--; else

}

ID *amend(ID *head)//修改信息 { ID *p; p=head; int findmess; if(!head) {

} printf("请你输入要修改的学生学号:"); scanf("%d",&findmess); while(findmess!=p->num) {

} if(p) {

printf("请你输入新学号(原来是%d):",p->num); scanf("%d",&p->num); printf("请你输入新姓名(原来是%s):",p->name); scanf("%s",&p->name); getchar(); printf("请你输入新性别(原来是%s):",p->sex); scanf("%s",&p->sex); printf("请你输入新年龄(原来是%d):",p->age); scanf("%d",&p->age); printf("请你输入新的语文成绩(原来是%d分):",p->a); scanf("%d",&p->a); getchar(); printf("请你输入新的数学成绩(原来是%d分):",p->b); scanf("%d",&p->b); getchar(); printf("请你输入新的英语成绩(原来是%d分):",p->c); scanf("%d",&p->c); p->sum=(p->a+p->b+p->c); p->ave=p->sum/3.0; p++; printf(" =====>提示:没有资料可以修改! "); exit(0); printf("没有这个记录"); end:return head; p->min=((p->ab)?p->a:p->b)c?((p->ab)?p->a:p->b):p->c;

24 p->max=((p->a>p->b)?p->a:p->b)>p->c?((p->a>p->b)?p->a:p->b):p->c;

} else {

} }

ID *breaksys(ID *head) { ID *p; p=head; fp=fopen("学生成绩管理.txt","a+"); fprintf(fp,"学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); while(p->next!=NULL) {

} fclose(fp); return(head); } void main() { ID *head=NULL; int choise; printf(" * * * * * 信息管理与系统开发设计综合模拟实习 * * * * * "); printf(" "); while(1) {

printf(" 提示:资料修改成功! "); return (head); printf("没有这个学号!"); fprintf(fp,"%3d%5s%5s%5d%5d%5d%5d%5d%5d%5d%5d ",p->num, p++; p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max,p->min); printf(" 学生信息管理系统 "); printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "); printf(" 1 . 浏 览 学 生 信 息 "); printf(" 2 . 添 加 学 生 信 息 "); printf(" 3 . 删 除 学 生 信 息 "); printf(" 4 . 查 找 学 生 信 息 "); printf(" 5 . 修 改 学 生 信 息 "); printf(" 6 . 学 生 成 绩 排 序 "); printf(" 0 . 退 出 系 统 ");

25

} } printf(" "); printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "); printf("请选择(0-6):"); scanf("%d",&choise); switch(choise) { case 1: print(head); break; case 2: head=insert(head); break; case 3: head=delet(head); break; case 4: head=search(head); break; case 5: head=amend(head);break; case 6: head=sort(head); break; case 0: breaksys(head);exit(0); break; default :printf("输入错误,请重新输入! "); }

六、程序运行、调试和结果分析

1.程序运行中出现的问题及调试手段

在调试过程中出现了比较多的错误,也耗费了大量的时间和精力修改。 在运行程序一是出现了图6.1问题。经过检查发现问题出现在代码printf("%d%s%d%d%d",sch[i].num,sch[i].name,sch[i].score,sch[i].male,sch[i]. female)上,并且是sch[i].name出现了问题。由此发现了在结构体中name定义为string name,改为char name[15]后,程序可以正常运行。

26

图6.1 应用程序错误

在运行程序三时,储存的文件中出现乱码,经过检查发现储存的数据的格式不对导致出现乱码。修改以后,这个问题就解决了。

2.程序运行结果分析 内容一 (1)输入数据

27

图6.2输入数据

(2)选择操作

28

图6.3主界面

图6.4 按编号排列

29

图6.5 按学校总分排列

图6.6按学校男子总分排列

30

图6.6按学校查询

图6.7按项目查询

31

储存文件中的数据如下

图6.8 存储的数据

内容二

图6.9 运行结果

内容三

(1)程序主界面

图6.10 程序主界面

32

(2)选择操作

图6.11 添加学生信息

图6.12 浏览学生信息

图6.13 删除学生信息

图6.14 删除3号信息后的结果

33

图6.15 查找学生信息

图6.16 删除学生信息

图6.17 学生排序

图6.18排序后的学生信息

图6.19退出系统

34

七、实习总结

通过这次模拟实习,我的C语言编程的能力有了很大的提高,特别是在指针、数组、函数和结构体方面,还学习了课本没有讲到的知识,学会了使用模块化编程的简单方法,另外在对话框的编程要求美观、方面也有了体会。

指针是C语言的灵魂,它在本次实习也起到了非常大的作用,本次实习在使用指针过程中对指针进行了简化也是一个“亮点”,它使程序变得通俗易懂,也降低了程序的难度。以后要对这种方法进行深刻的体会。

数组在程序中有着很重要的作用,对数据的贮存、输入、读取起着很重要的作用,本程序几乎所有数据都以数组进行输入、贮存、读取方便了对数据的处理和输入,数组的的使用在本程序中有很大的好处。

函数是实现模块化编程的基础,它使程序变得方面易懂,对修改起了很大作用,也降低了编程的难度,一个函数就是一个功能,它使各个功能之间有了一定的独立性,一个函数的错误,不会导致整个程序的失败(主函数除外),对函数的良好应用时在本程序中又以深刻的体会。也有了很大提高。

结构体的使用,为本次实习提供了很大方便,同时提高了本程序的可读性,结构数组方便了对数据的管理。

文件的读取与存贮使数据可以保存下来,这也是在以前的学习过程中没有掌握的内容,在开始时遇到了不小的困难。

另外,感觉到自己能编写的程序都非常的简短,系统性也不强。我还需要在编程方面进一步提高。

从这次编程序的过程中,我学到了编程所必须具备的专业技能,更领会编译程序所需要的细心和耐心。同时也提高了自己对编程的兴趣,使自己对编程有了更深的理解,体会到编程的乐趣。

35

上一篇:次级抵押贷款下一篇:并联电阻