课程设计报告要写哪几步,各有什么要求?
、设计过程(方案论证及用EWB模拟分析)。
2、理论分析(公式计算,数据分析)。
3、将理论值与实际值比较,分析误差。
4、电路稳定后测完数据、验收电路板并上交。
以上为电子类课程设计报告内容。
1、设计过程(方案论证及用EWB模拟分析).
2、理论分析(公式计算,数据分析).
3、将理论值与实际值比较,分析误差.
4、电路稳定后测完数据、验收电路板并上交.
以上为电子类课程设计报告内容.
题 目: 数字钟的设计与制作
学 年
学 期:
专 业 班 级:
学 号:姓 名:
指导教师及职称:讲师
时 间:
地点:
设计目的
熟悉集成电路的引脚安排.
掌握各芯片的逻辑功能及使用方法.
了解面包板结构及其接线方法.
了解数字钟的组成及工作原理.
熟悉数字钟的设计与制作.
设计要求
1.设计指标
时间以24小时为一个周期
显示时,分,秒
有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间
计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时
为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号.
2.设计要求
画出电路原理图(或仿真电路图)
元器件及参数选择
电路仿真与调试
PCB文件生成与打印输出.
3.制作要求 自行装配和调试,并能发现问题和解决问题.
4.编写设计报告 写出设计与制作的全过程,附上有关资料和图纸,有心得体会.
设计原理及其框图
1.数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路.由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定.通常使用石英晶体振荡器电路构成数字钟.图 3-1所示为数字钟的一般构成框图.
图3-1 数字钟的组成框图
⑴晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定.不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路.
⑵分频器电路
分频器电路将32768Hz的高频方波信号经32768()次分频后得到1Hz的方波信号供秒计数器进行计数.分频器实际上也就是计数器.
⑶时间计数器电路
时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器.
⑷译码驱动电路
译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流.
⑸数码管
数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管.
2.数字钟的工作原理
1)晶体振荡器电路
晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定.
图3-2所示电路通过CMOS非门构成的输出为方波的数字式晶体振荡电路,这个电路中,CMOS非门U1与晶体,电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波.输出反馈电 阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器.电容C1,C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能.由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确.
晶体XTAL的频率选为32768HZ.该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数.
从有关手册中,可查得C1,C2均为30pF.当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施.
由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为10MΩ.较高的反馈电阻有利于提高振荡频率的稳定性.
非门电路可选74HC00.
图3-2 COMS晶体振荡器
2)分频器电路
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频.
通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现.例如,将32768Hz的振荡信号分频为1HZ的分频倍数为32768(215),即实现该分频功能的计数器相当于15极2进制计数器.常用的2进制计数器有74HC393等.
本实验中采用CD4060来构成分频电路.CD4060在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便.
CD4060计数为14级2进制计数器,可以将32768HZ的信号分频为2HZ,其内部框图如图3-3所示,从图中可以看出,CD4060的时钟输入端两个串接的非门,因此可以直接实现振荡和分频的功能.
图3-3 CD4046内部框图
3)时间计数单元
时间计数单元有时计数,分计数和秒计数等几个部分.
时计数单元一般为12进制计数器计数器,其输出为两位8421BCD码形式分计数和秒计数单元为60进制计数器,其输出也为8421BCD码.
一般采用10进制计数器74HC390来实现时间计数单元的计数功能.为减少器件使用数量,可选74HC390,其内部逻辑框图如图 2.3所示.该器件为双2—5-10异步计数器,并且每一计数器均提供一个异步清零端(高电平有效).
图3-4 74HC390(1/2)内部逻辑框图
秒个位计数单元为10进制计数器,无需进制转换,只需将QA与CPB(下降沿有效)相连即可.CPA(下降没效)与1HZ秒输入信号相连,Q3可作为向上的进位信号与十位计数单元的CPA相连.
秒十位计数单元为6进制计数器,需要进制转换.将10进制计数器转换为6进制计数器的电路连接方法如图3-5所示,其中Q2可作为向上的进位信号与分个位的计数单元的CPA相连.
图3-5 10进制——6进制计数器转换电路
分个位和分十位计数单元电路结构分别与秒个位和秒十位计数单元完全相同,只不过分个位计数单元的Q3作为向上的进位信号应与分十位计数单元的CPA相连,分十位计数单元的Q2作为向上的进位信号应与时个位计数单元的CPA相连.
时个位计数单元电路结构仍与秒或个位计数单元相同,但是要求,整个时计数单元应为12进制计数器,不是10的整数倍,因此需将个位和十位计数单元合并为一个整体才能进行12进制转换.利用1片74HC390实现12进制计数功能的电路如图3-6所示.
另外,图3-6所示电路中,尚余-2进制计数单元,正好可作为分频器2HZ输出信号转化为1HZ信号之用.
图3-6 12进制计数器电路
4)译码驱动及显示单元
计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用CD4511作为显示译码电路,选用LED数码管作为显示单元电路.
5)校时电源电路
当重新接通电源或走时出现误差时都需要对时间进行校正.通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可.
根据要求,数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中.图3-7所示即为带有基本RS触发器的校时电路,
图3-7 带有消抖动电路的校正电路
6)整点报时电路
一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒.其作用方式是发出连续的或有节奏的音频声波,较复杂的也可以是实时语音提示.
根据要求,电路应在整点前10秒钟内开始整点报时,即当时间在59分50秒到59分59秒期间时,报时电路报时控制信号.报时电路选74HC30,选蜂鸣器为电声器件.
元器件
1.实验中所需的器材
5V电源.
面包板1块.
示波器.
万用表.
镊子1把.
剪刀1把.
网络线2米/人.
共阴八段数码管6个.
CD4511集成块6块.
CD4060集成块1块.
74HC390集成块3块.
74HC51集成块1块.
74HC00集成块5块.
74HC30集成块1块.
10MΩ电阻5个.
500Ω电阻14个.
30p电容2个.
32.768k时钟晶体1个.
蜂鸣器.
2.芯片内部结构图及引脚图
图4-1 7400 四2输入与非门 图4-2 CD4511BCD七段译码/驱动器
图4-3 CD4060BD 图4-4 74HC390D
图4-5 74HC51D 图4-6 74HC30
3.面包板内部结构图
面包板右边一列上五组竖的相通,下五组竖的相通,面包板的左边上下分四组,每组中X,Y列(0-15相通,16-40相通,41-55相通,ABCDE相通,FGHIJ相通,E和F之间不相通.
个功能块电路图
一个CD4511和一个LED数码管连接成一个CD4511驱动电路,数码管可从0---9显示,以次来检查数码管的好坏,见附图5-1.
图5-1 4511驱动电路
利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00连接成一个十进制计数器,电路在晶振的作用下数码管从0—9显示,见附图5-2.
图5-2 74390十进制计数器
利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00和一个晶振连接成一个六进制计数器,数码管从0—6显示,见附图5-3.
图5-3 74390六进制计数器
利用一个六进制电路和一个十进制连接成一个六十进制电路,电路可从0—59显示,见附图5-4.
图5-4 六十进制电路
利用两个六十进制的电路合成一个双六十进制电路,两个六十进制之间有进位,见附图5-5.
图5-5 双六十进制电路
利用CD4060,电阻及晶振连接成一个分频——晶振电路,见附图5-6.
图5-6 分频—晶振电路
利用74HC51D和74HC00及电阻连接成一个校时电路,见附图5-7.
图5-7 校时电路
利用74HC30和蜂鸣器连接成整点报时电路.见附图5-8.
图5-8 整点报时电路
利用两个六十进制和一个十二进制连接成一个时,分,秒都会进位的电路总图,见附图5-9.
图5-9 时,分,秒的进位连接图
总接线元件布局简图,见附图6-1
芯片连接图见附图7-1
八,总结
设计过程中遇到的问题及其解决方法.
在检测面包板状况的过程中,出现本该相通的地方却未通的状况,后经检验发现是由于万用表笔尖未与面包板内部垂直接触所至.
在检测CD4511驱动电路的过程中发现数码管不能正常显示的状况,经检验发现主要是由于接触不良的问题,其中包括线的接触不良和芯片的接触不良,在实验过程中,数码管有几段二极管时隐时现,有时会消失.用5V电源对数码管进行检测,一端接地,另一端接触每一段二极管,发现二极管能正常显示的,再用万用表欧姆档检测每一根线是否接触良好,在检测过程中发现有几根线有时能接通,有时不能接通,把接触不好的线重新接过后发现能正常显示了.其次是由于芯片接触不良的问题,用万用表欧姆档检测有几个引脚本该相通的地方却未通,而检测的导线状况良好,其解决方法为把CD4511的芯片拔出,根据面包板孔的的状况重新调整其引脚,使其正对于孔,再用力均匀地将芯片插入面包板中,此后发现能正常显示,本次实验中还发现一块坏的LED数码管和两块坏的CD4511,经更换后均能正常显示.
在连接晶振的过程中,晶振无法起振.在排除线与芯片的接触不良问题后重新对照电路图,发现是由于12脚未接地所至.
在连接六进制的过程中,发现电路只能4,5的跳动,后经发现是由于接到与非门的引脚接错一根所至,经纠正后能正常显示.
在连接校正电路的过程中,出现时和分都能正常校正时,但秒却受到影响,特别时一较分钟的时候秒乱跳,而不校时的时候,秒从40跳到59,然后又跳回40,分和秒之间无进位,电路在时,分,秒进位过程中能正常显示,故可排除芯片和连线的接触不良的问题.经检查,校正电路的连线没有错误,后用万用表的直流电压档带电检测秒十位的QA,QB,QC和QD脚,发现QA脚时有电压时而无电压,再检测秒到分和分到时的进位端,发现是由于秒到分的进位未拔掉所至.
在制作报时电路的过程中,发现蜂鸣器在57分59秒的时候就开始报时,后经检测电路发现是由于把74HC30芯片当16引脚的芯片来接,以至接线都错位,重新接线后能正常报时.
连接分频电路时,把时个位的QD和时十位的1脚断开,然后时十位的1脚接到晶振的3脚,时十位的3脚接到秒个位的1脚,所连接的电路图无法正常工作,时十位从0-9的跳,时个位只能显示一个0,在这个电路中3脚的分频用到两次,故无法正常显示,因此要把12进制接到74HC390的一个逻辑电路空出来用于分频即可,因此把时十位的CD4511的12,6脚接地,7脚改为接74HC390的5脚,74HC390的3,4脚断开,然后4脚接9脚即可,其中空出的74HC390的3脚就可用于2Hz的分频,分频后变为1Hz,整个电路也到此为正常的数字钟计数.
2.设计体会
在此次的数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法.
在连接六进制,十进制,六十进制的进位及十二进制的接法中,要求熟悉逻辑电路及其芯片各引脚的功能,那么在电路出错时便能准确地找出错误所在并及时纠正了.
在设计电路中,往往是先仿真后连接实物图,但有时候仿真和电路连接并不是完全一致的,例如仿真的连接示意图中,往往没有接高电平的16脚或14脚以及接低电平的7脚或8脚,因此在实际的电路连接中往往容易遗漏.又例如74HC390芯片,其本身就是一个十进制计数器,在仿真电路中必须连接反馈线才能正常显示,而在实际电路中无需再连接,因此仿真图和电路连接图还是有一定区别的.
在设计电路的连接图中出错的主要原因都是接线和芯片的接触不良以及接线的错误所引起的.
3.对该设计的建议
此次的数字钟设计重在于仿真和接线,虽然能把电路图接出来,并能正常显示,但对于电路本身的原理并不是十分熟悉.总的来说,通过这次的设计实验更进一步地增强了实验的动手能力.
给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来 。
对有些题目提出算法改进方案,比较不同算法的优缺点。
如果程序不能正常运行,写出实现此算法中遇到的问题,和改进方法;
2 对每个题目要有相应的源程序(可以是一组源程序,即详细设计部分):
源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
程序能够运行,要有基本的容错功能。尽量避免出现操作错误时出现死循环;
3 最后提供的主程序可以象一个应用系统一样有主窗口,通过主菜单和分级菜单调用课程设计中要求完成的各个功能模块,调用后可以返回到主菜单,继续选择其他功能进行其他功能的选择。最好有窗口展示部分。
4 课程设计报告:(保存在word 文档中,文件名要求 按照"姓名-学号-课程设计报告"起名,如文件名为"张三-001-课程设计报告".doc )按照课程设计的具体要求建立的功能模块,每个模块要求按照如下几个内容认真完成;
其中包括:
a)需求分析:
在该部分中叙述,每个模块的功能要求
b)概要设计
在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义。
c)详细设计
各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)
源程序要按照写程序的规则来编写。要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
d)调试分析
测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法的改进设想。
5. 课设总结: (保存在word 文档中)总结可以包括 : 课程设计 过程的收获、遇到问题、遇到问题解决问题过程的思考、程序调试能力的思考、对数据结构这门课程的思考、在课程设计过程中对C课程的认识等内容;
6.实验报告的首页请参考如下格式:
课程设计实验
起止日期:20 -20 学年 学期
系别 班级 学号 姓名
实验题目 □设计性 □综合性
自我评价
教师评语 能够实现实验要求的功能 □全部 □部分算法有新意 □有 □一般程序运行通过 □全部 □部分 算法注释说明 □完善 □仅有功能说明接口参数说明 □有 □无按期上交打印文档资料及源程序 □所有 □部分综合设计说明报告结构 □合理 □不合理用户使用说明 □完整 □不全现场演示操作有准备 □有 □无问题解答流畅 □流畅 □不流畅独立完成实验 □能 □不能体现团队合作精神。 □能够 □不能
成绩
这是张表格,copy过来时没调整好,不过应该看得明白。我们是这样写的,你可以参考一下。
这是我第一次做课程设计,以前都是被动的学书本上的理论知识,这次做课程设计时要求将所学理论知识灵活运用。所以,受益很多。主要有:
①掌握了查阅资料、搜集数据和合理选用公式的能力。
②学会了从多方面考虑问题,比如在设计冷却器时,不仅要考虑设备本身的合理性,还要考虑到应用中的经济性和安全性等因素。
③我的计算能力和对一些软件的熟悉度都有明显的提高。
④学会了运用最简练的语言来表达问题,并且能够用图说明问题。
摘要:又称概要、内容提要。摘要是以提供文献内容梗概为目的,不加评论和补充解释,简明、确切地记述文献重要内容的短文。其基本要素包括研究目的、方法、结果和结论。具体地讲就是研究工作的主要对象和范围,采用的手段和方法,得出的结果和重要的结论,有时也包括具有情报价值的其它重要的信息。
C语言课程设计,应该主要根据你的设计内容,简要地提炼出设计的背景,功能,意义等。最后给出关键字。下面是正文。
例如:
摘要(标题居中)
近年来随着计算机在社会领域的不断发展,程序设计 。。。。。C语言。。。。(这里讲你做的东西的背景。)
本课程设计完成了什么。。。。(功能)
其意义是。。。。(意义)
关键词: C语言,其他
参考资料:http://baike.baidu.com/view/123897.htm
一、题目: 学生成绩管理
二、目的与要求
1. 目的:
(1)基本掌握面向过程程序设计的基本思路和方法;
(2)达到熟练掌握C语言的基本知识和技能;
(3)能够利用所学的基本知识和技能,解决简单的程序设计问题
2. 要求
基本要求:
1. 要求利用C语言面向过程的编程思想来完成系统的设计;
2. 突出C语言的函数特征,以多个函数实现每一个子功能;
3. 画出功能模块图;
4. 进行简单界面设计,能够实现友好的交互;
5. 具有清晰的程序流程图和数据结构的详细定义;
6. 熟练掌握C语言对文件的各种操作。
创新要求:
在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同
三、信息描述
输入一个班10个学生的学号和每个学生考试三门功课(数学、英语、计算机基础)的成绩。编程计算出每个学生的总分和平均分,并按学生成绩优劣排序,最后打印一张按高分到低分名次排序的成绩单。要求:
1)排序用一个函数实现。
2)打印的成绩单表项包括:序号,学号、数学、英语、计算机、总分、平均分。
3)按实验报告电子模板格式填写实验内容。
四、功能描述
1. 学生基本信息及成绩所选科目成绩的录入。
2. 基本信息的查询(分系、班级;分科目)与修改。
3. 对每系或每班各科成绩进行分析(即求单科平均成绩、及格率和优秀率);
4. 对所开课程的成绩分析(求其平均成绩,最高分和最低分);
5. 对学生考试成绩进行排名(单科按系别或班级进行排名,对每一个班级,同一学期学生总体成绩进行排名,并显示各科成绩信息)
五、解决方案
1. 分析程序的功能要求,划分程序功能模块。
2. 画出系统流程图。
3. 代码的编写。定义数据结构和各个功能子函数。
4. 程序的功能调试。
5. 完成系统总结报告以及使用说明书
六、进度安排
此次课程设计时间为两周,分四个阶段完成:
1. 分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。
2. 编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。
3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。
4. 考核阶段。
#include <stdio.h>
#include <stdlib.h>
#define STU_NUM 10
struct student
{
char stu_id[20]
float score[3]
float total
float aver
}
void SortScore(student *stu,int n)
{
student stud
for(int i = 0i <n-1i++)
for(int j = i+1 j <nj++)
{
if(stu[i].total <stu[j].total)
{
stud = stu[i]
stu[i] = stu[j]
stu[j] = stud
}
}
}
int main( )
{
student stu[STU_NUM]
for(int i = 0i<STU_NUMi++)
{
printf("请输入第%d个学生的学号:",i+1)
scanf("%s",&stu[i].stu_id)
printf("输入第%d个学生的数学成绩:",i+1)
scanf("%f",&stu[i].score[0])
printf("输入第%d个学生的英语成绩:",i+1)
scanf("%f",&stu[i].score[1])
printf("输入第%d个学生的计算机成绩:",i+1)
scanf("%f",&stu[i].score[2])
stu[i].total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2]
stu[i].aver = stu[i].total/3
}
printf("\n")
SortScore(stu,STU_NUM)
for(i = 0 i <STU_NUMi++)
{
printf("序号: %d\t",i)
printf("学号:%s\t",stu[i].stu_id)
printf("数学:%f\t",stu[i].score[0])
printf("英语:%f\t",stu[i].score[1])
printf("计算机:%f\t",stu[i].score[2])
printf("平均成绩:%f\t",stu[i].aver)
printf("总分:%f\t",stu[i].total)
printf("\n\n")
}
return 0
}
注:(源程序中主要标识符含义说明)
#define STU_NUM 10
struct student
{
char stu_id[20]
float score[3]
float total
float aver
}
实验结果:
输入 :(只输入后面的数字,前面的文字是自己产生的)。
请输入第1个学生的学号:001
输入第1个学生的数学成绩:1
输入第1个学生的英语成绩:1
输入第1个学生的计算机成绩:1
请输入第2个学生的学号:002
输入第2个学生的数学成绩:2
输入第2个学生的英语成绩:2
输入第2个学生的计算机成绩:2
请输入第3个学生的学号:003
输入第3个学生的数学成绩:3
输入第3个学生的英语成绩:3
输入第3个学生的计算机成绩:3
请输入第4个学生的学号:004
输入第4个学生的数学成绩:4
输入第4个学生的英语成绩:4
输入第4个学生的计算机成绩:4
请输入第5个学生的学号:005
输入第5个学生的数学成绩:5
输入第5个学生的英语成绩:5
输入第5个学生的计算机成绩:5
请输入第6个学生的学号:006
输入第6个学生的数学成绩:6
输入第6个学生的英语成绩:6
输入第6个学生的计算机成绩:6
请输入第7个学生的学号:007
输入第7个学生的数学成绩:7
输入第7个学生的英语成绩:7
输入第7个学生的计算机成绩:7
请输入第8个学生的学号:008
输入第8个学生的数学成绩:8
输入第8个学生的英语成绩:8
输入第8个学生的计算机成绩:8
请输入第9个学生的学号:009
输入第9个学生的数学成绩:9
输入第9个学生的英语成绩:9
输入第9个学生的计算机成绩:9
请输入第10个学生的学号:010
输入第10个学生的数学成绩:10
输入第10个学生的英语成绩:10
输入第10个学生的计算机成绩:10
输出:
序号: 0 学号:010 数学:10.000000 英语:10.000000 计算机:10.000000
平均成绩:10.000000 总分:30.000000
序号: 1 学号:009 数学:9.000000 英语:9.000000 计算机:9.000000
平均成绩:9.000000 总分:27.000000
序号: 2 学号:008 数学:8.000000 英语:8.000000 计算机:8.000000
平均成绩:8.000000 总分:24.000000
序号: 3 学号:007 数学:7.000000 英语:7.000000 计算机:7.000000
平均成绩:7.000000 总分:21.000000
序号: 4 学号:006 数学:6.000000 英语:6.000000 计算机:6.000000
平均成绩:6.000000 总分:18.000000
序号: 5 学号:005 数学:5.000000 英语:5.000000 计算机:5.000000
平均成绩:5.000000 总分:15.000000
序号: 6 学号:004 数学:4.000000 英语:4.000000 计算机:4.000000
平均成绩:4.000000 总分:12.000000
序号: 7 学号:003 数学:3.000000 英语:3.000000 计算机:3.000000
平均成绩:3.000000 总分:9.000000
序号: 8 学号:002 数学:2.000000 英语:2.000000 计算机:2.000000
平均成绩:2.000000 总分:6.000000
序号: 9 学号:001 数学:1.000000 英语:1.000000 计算机:1.000000
平均成绩:1.000000 总分:3.000000
七、撰写课程设计报告或课程设计总结
课程设计报告要求:
总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。
C语言常见错误
书写标识符时,忽略了大小写字母的区别
main()
{
int a=5
printf("%d",A)
}
编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2.忽略了变量的类型,进行了不合法的运算。
main()
{
float a,b
printf("%d",a%b)
}
%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3.将字符常量与字符串常量混淆。
char c
c="a"
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。
4.忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写
if (a=3) then …
但C语言中,“=”是赋值运算符,“==”是关系运算符。如:
if (a==3) a=b
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。
5.忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。
{ z=x+y
t=z/100
printf("%f",t)
}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。
6.多加分号。
对于一个复合语句,如:
{ z=x+y
t=z/100
printf("%f",t)
}
复合语句的花括号后不应再加分号,否则将会画蛇添足。
又如:
if (a%3==0)
I++
本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。
再如:
for (I=0I<5I++)
{scanf("%d",&x)
printf("%d",x)}
本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。
7.输入变量时忘记加地址运算符“&”。
int a,b
scanf("%d%d",a,b)
这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。
8.输入数据的方式与要求不符。①scanf("%d%d",&a,&b)
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
②scanf("%d,%d",&a,&b)
C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:
3,4
此时不用逗号而用空格或其它字符是不对的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b)
输入应如以下形式:
a=3,b=4
9.输入字符的格式与要求不一致。
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
scanf("%c%c%c",&c1,&c2,&c3)
如输入a b c
字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
10.输入输出的数据类型与所用格式说明符不一致。
例如,a已定义为整型,b定义为实型
a=3b=4.5
printf("%f%d\n",a,b)
编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。
11.输入数据时,企图规定精度。
scanf("%7.2f",&a)
这样做是不合法的,输入数据时不能规定精度。
12.switch语句中漏写break语句。
例如:根据考试成绩的等级打印出百分制数段。
switch(grade)
{ case 'A':printf("85~100\n")
case 'B':printf("70~84\n")
case 'C':printf("60~69\n")
case 'D':printf("<60\n")
default:printf("error\n")
由于漏写了break语句,case只起标号的作用,而不起判断作用。因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“break”。例如
case 'A':printf("85~100\n")break
13.忽视了while和do-while语句在细节上的区别。
(1)main()
{int a=0,I
scanf("%d",&I)
while(I<=10)
{a=a+I
I++
}
printf("%d",a)
}
(2)main()
{int a=0,I
scanf("%d",&I)
do
{a=a+I
I++
}while(I<=10)
printf("%d",a)
}
可以看到,当输入I的值小于或等于10时,二者得到的结果相同。而当I>10时,二者结果就不同了。因为while循环是先判断后执行,而do-while循环是先执行后判断。对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体。
14.定义数组时误用变量。
int n
scanf("%d",&n)
int a[n]
数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。即C不允许对数组的大小作动态定义。
15.在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。
main()
printf("%d",a[10])
}
C语言规定:定义时用a[10],表示a数组有10个元素。其下标值由0开始,所以数组元素a[10]是不存在的。
16.初始化数组时,未使用静态存储。
int a[3]=
这样初始化数组是不对的。C语言规定只有静态存储(static)数组和外部存储(exterm)数组才能初始化。应改为:
static int a[3]=
17.在不应加地址运算符&的位置加了地址运算符。
scanf("%s",&str)
C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。应改为:
scanf("%s",str)
18.同时定义了形参和函数中的局部变量。
int max(x,y)
int x,y,z
{z=x>y?x:y
return(z)
}
形参应该在函数体外定义,而局部变量应该在函数体内定义。应改为:
int max(x,y)
int x,y
{int z
z=x>y?x:y
return(z)
}
C语言心得体会
通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C语言这门课程开始,已发现程序设计的乐趣,在学习C语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。
这次实训是老师给了范例程序,经过自己的改写,实现要求。先做简单的输出,一步步的再做其它图案,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的C语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。
通过实际操作,学会 C语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”……的寓意。
计时在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水平。
八、参考资料 :《C语言程序设计教程》
①施工现场实际情况:施工用水源、电源已接至施工现场,施工道路利用原道路作硬化处理,施工区域的障碍物已拆除,施工场地较为平整,施工条件较好。;
②交通运输情况:本工程位于沙坪坝区,交通便捷,运输工程材料可直接从城市主干道进入到施工现场的临时道路。;
③自然地理条件:工程地形平坦
④环境保护要求:由于是在城区施工,必须遵守各级政府的有关环境保护的规定,材料车辆的进场时间,施工占到问题及噪声控制
万年历的设计
二 、设计要求
1、能够显示星期;
2、能够显示年月日;
3、能够修改;
4、当系统时间变动时,能自动跳到相应的时间。
三 、 设计目的
1. 通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固《C语言程序设计》课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!
2. 通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。
四 、设计思想及过程
【一】由于万年历具有以下特点:
1。平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
由于公元1月1日设为星期六,故3月1日为星期三。 ——注意这个“三”
为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
2。每400年整一闰,或每4年且不为百年的一闰。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。但四年加一天又多用了44分56秒,这个数积满400年为三天。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。)
所以百年%4=0闰或(年%4=0并且年<>0)闰。
3。每 4年(3个平年+1个闰年)共208周+5天 ——注意这个“5天”
每百年共100*(208周+5天)-1天=5217周+5天 ——注意这个“5天”(整百年暂设为平年)
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和
“1天”(4个整百年只有一个闰年)
即400年一轮回!(原来万年历400年前是一家)
【二】根据万年历以上特点进行编写:
首先对万年历年、月、日进行编写,编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要定义另一个函数#define Year(x) (x%4==0&&x%100!=0||x%400==0) ? 1:0当为闰年时可得1加上该程序便可得到每月的天数。 具体程序见(五、万年历程序)
再对其中的星期进行编写:由于公元1月1日设为星期六,故3月1日为星期三,可以用万年3月1日星期算法(特别是那个三)
由于其公式为:
某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
或某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
闰4百年3月1日星期算法(百年%4=0)
其公式为:
某年3月1日星期几=(年+年/4+月星期表+日+2天)%7
例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四
2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一
2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六
2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六
平4百年3月1日星期算法(百年%4<>0)
其公式为:
某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
例:1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)
1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)
1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)
1901年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
1918年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
1958年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
1988年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)
2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是闰年)
9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
注:按400年一轮回!(400年前是一家)的说法
1600年,2000年是一样的;
1700年,2100年是一样的;
1800年,2200年是一样的;
1900年,2300年是一样的。
其中万年某日星期算法
其公式为:
某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
通同星期偏差表
闰年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天数 31 29 31 30 31 30 31 31 30 31 30 31
星期 3 6 0 3 5 1 3 6 2 402
平年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天数 31 28 31 30 31 30 31 31 30 31 30 31
星期 4 0 0 3 5 1 3 6 2 402
为对以上的万年历星期的算法是正确的对其进行了以下的计算:
⒈对于二十世纪任意日期可以用公式某日星期几=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7=(19%4*5天+年+年/4+平年月星期表+日+2天)%7=(15天+年+年/4+平年月星期表+日+2天)%7以下就是根据上面对其进行的计算:
1900年元旦 1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4
1月表=4(平年)故 4+4=1 即1900年元旦是星期一
1949年国庆 1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2
10月表=4(平年)故 4+2=6 即1949年国庆是星期六
1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3
12月表=2(平年)故 2+3=5 即1999年12月31日是星期五
⒉对于二十一世纪新前年虫算法(20%4*5=0)可以用公式:某日星期几=(百年%4*5天+年+年/4+闰年月星期表+日+2天)%7 =(20%4*5天+年+年/4+闰年月星期表+日+2天)%7以下就是根据上面对其进行的计算:
2000年元旦 1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3
1月表=3(闰年)故 3+3->6 即2027年元旦是星期六
2018年春节 16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5
2月表=0(平年)故 0+5=5 即2018年春节是星期五
2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2
12月表=2(平年)故 2+2=4 即2099年12月31日是星期四
对于上面的分析以及公式的推论和计算证明可以对万年历中的星期进行了编写具体编写程序见(五 、万年历程序)中。
五 、万年历源程序
#include"stdio.h"
#include"dos.h"
#include"conio.h"
#include"stdlib.h"
#define Year(x) (x%4==0&&x%100!=0||x%400==0) ? 1:0
int numofMonth(int y,int m){
int day,t=28
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
day=31
else if(m==4||m==6||m==9||m==11)
day=30
else{t+=Year(y)
day=t}
return day}
int numofYear(int y){
int t=365
t+=Year(y)
return t}
int numofbeforeDays(int y,int m,int d){
int sum=d,i
for(i=1i<mi++)
sum+=numofMonth(y,i)
return sum}
int numofafterDays(int y,int m,int d){
int sum=0,i
for(i=mi<=12i++)
sum+=numofMonth(y,i)
sum-=d
return sum}
int isDay(int y,int m,int d){
int year=1900,month=1,week=1,i
long sum=0
for(i=yeari<yi++)
sum+=numofYear(i)
for(i=1i<mi++)
sum+=numofMonth(y,i)
i=sum%7
week=(week+i)%7
return week}
void empty(int n){
int i
for(i=0i<ni++)
printf("%*c",6,' ')}
void OutPutCalender(int y,int m,int d){
int week,i,num,t
week=isDay(y,m,1)
printf("%6d/%02d/%02d\n",y,m,d)
printf("%6s%6s%6s%6s%6s%6s%6s\n","Sun","Mon","Tue","Wed","Thu","Fri","Sat")
empty(week)
num=numofMonth(y,m)
for(i=1i<=numi++){
printf("%6d",i)
t=(week+i)%7
if(t==0)
printf("\n")}
printf("\n")}
long numBTDays(int y1,int m1,int d1,int y2,int m2,int d2){
int i
long sum=0
for(i=y1+1i<y2i++)
sum+=numofYear(i)
if(y1==y2){ sum-=d1
for(i=m1i<m2i++)
sum+=numofMonth(y1,i)
sum+=d2}
else{sum+=numofafterDays(y1,m1,d1)
sum+=numofbeforeDays(y2,m2,d2)}
return sum}
int Select_mean(){
int sm
printf("1. OutPut Calender\n")
printf("2. Help\n")
printf("0. Quit\n")
printf("Please enter choose(0--2):")
do
scanf("%d",&sm)
while(sm<0||sm>3)
return sm}
void Help(){
printf(" 1. OutPut Calender\n")
printf(" 2. System Help\n")
printf(" 0. Quit\n")
printf("Page Up: Up year\n")
printf("Page Down: next year\n")
printf(" -->: next month\n")
printf(" <-- : Up month\n")}
main(){
int year=2006,year1=2006,month,day,y1,m1,d1,y2,m2,d2,c,t
int inkeySCAN,inkey
union REGS inregs,outregs
inregs.h.ah=0x2a
intdos(&inregs,&outregs)
month=outregs.h.dh
day=outregs.h.dl
year1=year
printf("%d/%02d/%02d\n",year,month,day)
while(1){
switch(Select_mean()){
case 1:
OutPutCalender(year,month,day)
while(1){
inkey=bioskey(0)
inkeySCAN=(inkey&0xFF00)>>8
if(inkeySCAN==77){
if(month==12){month=1year1++
OutPutCalender(year1,month,day)}
else{month++
OutPutCalender(year1,month,day)
}}
if(inkeySCAN==75){
if(month==1){month=12year1--
OutPutCalender(year1,month,day)}
else{month--OutPutCalender(year1,month,day)}}
if(inkeySCAN==73){
if(year1==1900) year1=year
else{year1--OutPutCalender(year1,month,day)}}
if(inkeySCAN==81){
year1++OutPutCalender(year1,month,day)}
if(inkeySCAN==28)break}
break
case 2:
Help()
break
case 0:
exit(0)
default:
printf("Enter ERROR!\n")
break} }
}
六 运行过程
1.双击TC
1.当对上面的程序进行了调试后运行会出现下面所示:
第一行所显示的就是系统时间!满足了第一条要求“显示年、月、日”。
而当改变系统时间后!再运行该程序上面的日期也随系统时间改变,所以满足第四条“当系统时间变动时,能自动跳到相应的时间。”
2.在光标处按下“1”后回车,将会显示:
以上的显示也证明了条件的第2条可以“显示星期!”
3.在光标处按下“2”后回车,将会显示:
按着帮助所讲进行了运行可知:按“ Page Up ”键其下面接着会显示上一年该月的万年历,按“ Page Down ”键其下面会接着显示下一年该月的万年历;按“ ← ”键下面将会接着显示当年上一个月的万年历,按“ → ”键将会接着在下面显示去下一个月的万年历。
4.
由上所显示键入“0”后将会退去该程序。
由以上运行的结果可知该c语言所设计的万年历满足设计要求!
七、在C语言编程中常见错误
C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给我们留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对我们这些初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。看着有错的程序,不知该如何改起,我通过这次编程,也积累了一些C编程时常犯的错误:
1. 书写标识符时,忽略了大小写字母的区别。
编译程序把a和A认为是两个不同的变量名,而显示出错信息。C语言认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2.忽略了变量的类型,进行了不合法的运算。
%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3.将字符常量与字符串常量混淆。
混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。
4.忽略了“=”与“==”的区别。
在C语言中,“=”是赋值运算符,“==”是关系运算符。如:
if (a==3) a=b
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。
5.忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
a=1 b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。
{ z=x+y
t=z/100
printf("%f",t)
}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。
6.多加分号。
对于一个复合语句,如:
{ z=x+y
t=z/100
printf("%f",t)
}
复合语句的花括号后不应再加分号,否则将会画蛇添足。
又如:
if (a%3==0)
I++
本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。
再如:
for (I=0I<5I++)
{scanf("%d",&x)
printf("%d",x)}
本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。
7.输入变量时忘记加地址运算符“&”。
int a,b
scanf("%d%d",a,b)
这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。
8.输入数据的方式与要求不符。scanf("%d%d",&a,&b)输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
scanf("%d,%d",&a,&b)C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:
3,4
此时不用逗号而用空格或其它字符是不对的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b)
输入应如以下形式:
a=3,b=4
9.输入字符的格式与要求不一致。
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
scanf("%c%c%c",&c1,&c2,&c3)
如输入a b c
字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
10.输入输出的数据类型与所用格式说明符不一致。
例如,a已定义为整型,b定义为实型
a=3b=4.5
printf("%f%d\n",a,b)
语法错
逻辑错 运行错
0.忘记定义变量:
main()
{x=3y=6
printf(“%d\n”,x+y)
11.C语言的变量一定要先定义才能使用
12.输入输出的数据的类型与所用格式说明符不一致
int a=3float b=4.5printf(“%f%d\n”,a,b)
它们并不是按照赋值的规则进行转换(如把4.5转换为4),而是将数据在存储单元中的形式按格式符的要求组织输出(如b占4个字节,只把最后两个字节的数据按%d,作为整数输出)
13.未注意int型数据的数值范围
int型数据的数值范围(-32768~32768)
int num=89101
printf(“%d”,num)
会将超过低16位的数截去从而得到23563
注意:定义了long型,而在输出时仍用”%d”说明符,仍会出现以上错误
14.输入变量时忘记使用地址符
scanf(“%d%d”,a,b)
15.输入时数据的组织与要求不符
对scanf函数中格式字符串中除了格式说明符外,对其他字符必须按原样输入
16.误把”=“作为”等于”比较符
“=“为附值运算符
“==“为比较运算符
17.语句后面漏分号
{
t=a
a=b
b=t
}
它是pascal的语法
18.不该加分号的地方加了分号
if(a>b)
printf(“a is larger than b\n”)
for(i=0i<10i++)
{
scanf(“%d”,&x)
printf(“%d\n”,x*x)
}
19.对应该有花括弧的复合语句,忘记加花括弧
sum=0
i=1
while(i<=100)
sum=sum+1
i++
20.括弧不配对
while((c=getchar()!=‘#’)
putchar(c)
11.在用标识时,忘记了大写字母和小写字母的区别
{
int a,b,c
a=2
b=3
C=A+B
printf(“%d+%d=%D”,A,B,C)
}
12.引用数组元素时误用发圆括弧
{
int i,a(10)
for(i=0i<10i++)
scanf(“%d”,&a(i))
}
13.在定义数组时,将定义的”元素个数”误认为是”可使用的最大下标值
{
int a[10]={1,2,3,4,5,6,7,8,9,10}
int i
for(i=1i<=10i++)
printf(“%d”,a[i])
}
14.对二维或多维数组的定义和引用的方法不对
{
int a[5,4]
…
printf(“%d”,a[1+2,2+2])
…
}
15.误以为数组名代表数组中全部元素
{int a[4]={1,2,3,4}
printf(“%d%d%d%d”,a)
}
16.混淆字符数组与字符指针的区别
main()
{
char str[40]
str=“Computer and c”
printf(“%s\n”,str)
}
17.在引用指针变量之前没有对它赋予确定的值
{
char *p
scanf(“%s”,p)
}
{
char *p,c[20]
p=c
scanf(“%s”,p)
}
18.switch语句的各分支中漏写 break语句
混淆字符和字符串的表示形式
…
char sex
sex=“M”
…
19.使用自加(++)和自减(--)运算符时出的错误
{
int *p,a[5]={1,3,5,7,9}
p=a
printf(“%d”,*p++)
}
注意于*(++p)的区别;
20.所调用的函数在调用语句之后才定义,而又在调用前未加说明
main()
{float x,y,z
x=3.5y=-7.6
z=max(x,y)
printf(“%f”,z)
}
编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。
八、心得体会
1.目前流行的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基础于该程序所开发的各种应用程序中的日历程序。然而,这些程序都千篇一律的局限在一个很短的时间范围内。(Windows各个版本一般都局限在1980年至2099年这一范围内),但是,在很多情况下,特别是在众多的科学研究领域中,一个时间跨度较大的日历程序是很有参考价值的。C程序设计语言充分发挥了其自身无与伦比的优越性,用极短的程序文本填补了这一领域的空白,同时用铁的事实强有力的告诉世人:C程序设计语言作为计算机语言家族的新生事物,其发展前景是极为广阔的。
2.经过上一个学期对《C程序设计》的学习,我们学习了理论知识,了解了C语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。通过课程设计,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。
3.通过对c语言万年历的设计进一步的巩固了用c语言编写程序,并且有利于更好的掌握c语言!
4. 在万年历的编写过程中也体会到了做事情一顶要细心、认真。更加知道了要掌握好基础知识。还有体会到了成功的感觉!在万年历的设计过程中更加体会到了团队合作的重要性,“一个诸葛亮比不上三个臭皮匠。”知道了只有团队合作才会更好的完成设计!也体会到以后在工作中团队合作的必要性和重要性!
5. 通过本项课程设计也培养了我独立思考、 综合运用所学有关相应知识的能力,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
6. 由于C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。通过这次的c语言程序设计更加了解了c语言的好处和其可用性!
7. 在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过大家的努力终于完成了课程设计!完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!也让我懂得了要想成功首先就必须有很强的自信心!懂得了自己以后要在做任何事情时都要自信!当自己都不相信自己能够成功时还可能会获得成功吗?
8. 在C语言程序设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!为以后的工作打下良好的知识基础和技能基础!
九、参考文献
⒈谭浩强编著.C程序设计第二版〔M〕.北京:清华大学出版社,1999
⒉陈朔鹰,陈英编著.C语言趣味程序百例精解〔M〕.北京:北京理工大学出版社,1994
⒊电脑知识与技术学术交流版〔J〕2005.2 (备注:来自网络资源)
⒋Herbert Schildit著. 戴健鹏译. C语言大全 (第二版)〔M〕.北京:电子工业出版社,1994
⒌谭浩强,张基温,唐永炎编著. C语言程序设计教程.〔M〕北京: 高等教育出版社,1992
⒍秦友淑,曹化工编著. C语言程序设计教程. 〔M〕武汉:华中理工大学出版社,1996
⒎曹衍龙,林瑞仲,徐慧 编著.C语言实例解析精粹 〔M〕北京:人民邮电出版社,2005.3
⒏黄明等编著.21世纪进阶辅导C语言程序设计. 〔M〕大连理工大学出版