




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计实验指导(学生用)计算机基础教研室C语言程序设计课程组2012年9月前 言C语言程序设计是计算机科学技术系面向全校理工科开设的一门专业平台课程。通过这门课程的学习,可以让学生了解程序设计的思想和方法,掌握高级语言程序设计的基本知识,提高问题求解和程序语言的应用能力。C语言程序设计实验指导书是C语言程序设计的配套指导书。本指导书本着“厚基础,重实践,以专业为导向”的原则,其中程序设计基础、数组、函数这三个实验项目是所有学科专业都必须掌握的,其他实验项目根据专业特点,设计了不同的要求:对于普通专业侧重循环、数组、函数、结构体等,生化类专业包含数据文件的处理,机械电子类专业包含位运算,数理类专业包含数值计算等内容。每个实验本着循序渐进的原则,由简到难,逐步深化,另外配有相应的实验练习,学生可根据自己的情况选择完成。本指导书所有程序代码均在Visual C+环境下调试通过。本指导书在编写过程中得到了系领导的大力支持,王海燕主任在百忙中多次参加我们的课程研讨,庄波老师、宫锋老师在大纲编写、指导书任务设计方面给出了切实可行的意见和建议,在此深表感谢。本指导书由计算机基础教研室C语言程序设计课程组全体人员共同编写,谢玉华老师负责统筹安排,实验一、实验二、实验三、实验七由张志芬老师编写,实验四、实验六由陈春华、薛红芳老师编写,实验五由陈庆燕老师编写,最后由张志芬老师统稿,在此一并感谢。由于水平有限,本指导书难免存在疏漏和不足之处,望各位老师在使用过程中多提宝贵意见,有利于我们进一步改进。C语言程序设计课程组2012年9月目 录实验一 基本控制结构的应用11.1 熟悉编程环境11.2 顺序结构程序设计11.3 选择结构程序设计21.4 循环结构程序设计4实验二 数组的应用72.1 一维数组的应用72.2 二维数组的应用102.3 字符数组的应用12实验三 函数的应用13实验四 位运算的综合应用15实验五 数据文件的处理22实验六 数值计算25实验七 简单学生成绩管理系统30实验一 基本控制结构的应用1.1 熟悉编程环境一、实验目的1.了解C语言程序的开发环境,掌握C语言源程序的编辑、编译、连接及运行过程;2.通过运行简单的C程序,初步了解C语言源程序的特点及基本结构。二、实验内容1.在TC或VC+环境下,编辑如下所示的简单C语言程序:#include main()printf(“hello world!n”);对其进行编译、连接及运行,观察程序的运行结果。2.编程在显示器上输出如下信息:*How Are You!*三、实验练习1.编程在显示器上输出如下信息: * * *2.求一个三位数的各位上数字之和并输出该和。1.2 顺序结构程序设计一、实验目的1.掌握运算符的使用;2.正确定义程序中的变量;3.掌握C语言中数学公式的表示;4.熟练使用输入、输出语句;5.能够利用顺序结构进行程序设计。二、实验内容已知三角形的三边长分别为3,4,4,求三角形的面积。三、分析三角形三边边长已知,根据公式:面积=s(s-a)(s-b)(s-c),其中s=(a+b+c)/2即可求得面积。四、算法描述1.定义三个边长a,b,c为float型,其初值为3,4,4;2.计算s=(a+b+c)/2;3.计算area=sqrt(s*(s-a)*(s-b)*(s-c)),求得三角形的面积并输出。五、程序#include #include main() /*定义变量*/ /*计算面积*/ /*输出面积*/六、实验练习:1.从键盘上输入一个大写字母,将其转换成相应的小写字母并输出。2.把560分钟换算成小时和分钟表示并输出。3.求解方程2x2+3x+1=0的解。1.3 选择结构程序设计一、实验目的1.掌握关系运算及逻辑运算;2.掌握if语句;3.掌握switch语句;4.能够利用选择结构进行程序设计。二、实验内容根据输入的三角形的三条边,判断是否能组成三角形,若可以则输出它的面积及三角形的类型。三、分析1.首先判断是否能构成三角形,如果满足a,b,c三条边大于0,并且满足a+bc,b+ca,a+cb则能构成三角形;否则不能构成三角形;2.若能构成三角形时,计算三角形的面积。再判断三角形的类型,如果三边都相等时等边三角形;如果任意两边相等则为等腰三角形;如果两边平方之和等于第三边平方则为直角三角形;其他为一般三角形。四、算法描述1.定义三个边长a,b,c为float型,从键盘输入三个边长值;2.判断三边是否能构成三角形,条件是a,b,c三条边大于0,并且a+bc,b+ca,a+cb,不满足条件则不能构成三角形;3.如果能构成三角形时,计算三角形的面积(面积= sqrt(s(s-a)(s-b)(s-c),s=(a+b+c)/2);再判断三角形的类型,如果三边都相等时等边三角形;如果任意两边相等则为等腰三角形;如果两边平方之和等于第三边平方则为直角三角形;其他为一般三角形。五、程序#include #include main() /*定义变量*/ /*输入边长*/ /*判断能否构成三角形,能则计算面积判断类型*/ /*计算三角形的面积*/ /*输出三角形的面积*/ /*判断三角形的类型(等边、等腰、直角或一般三角形)*/ else printf(“三边不合适,不能构成三角形!n”);六、实验练习1.编程实现从键盘输入四个整数,把这四个数由小到大输出。2.编程判断从键盘输入的整数的正负性及奇偶性。3.根据键盘输入x的值求y值,其公式如下: 5x+11 0=x20 sinx+cosx 20=x40y= ex-1 40=x60 ln(x+1) 60=xc,b+ca,a+cb则能构成三角形;否则不能构成三角形;2.若能构成三角形时,计算三角形的面积。再判断三角形的类型,如果三边都相等时等边三角形;如果任意两边相等则为等腰三角形;如果两边平方之和等于第三边平方则为直角三角形;其他为一般三角形。当为某一类型,其计数加1,若有没出现过的类型,再循环输入各边,直到每种类型都出现过。四、算法描述1.定义三个边长a,b,c为float型,从键盘输入三个边长值;2.判断三边是否能构成三角形,条件是a,b,c三条边大于0,并且a+bc,b+ca,a+cb,不满足条件则不能构成三角形;3.如果能构成三角形时,计算三角形的面积(面积=sqrt(s(s-a)(s-b)(s-c)),s=(a+b+c)/2);再判断三角形的类型,如果三边都相等时等边三角形;如果任意两边相等则为等腰三角形;如果两边平方之和等于第三边平方则为直角三角形;其他为一般三角形。4.当为某一类型的三角形时,其计数加1,若有没出现过的类型,再循环输入各边,直到每种类型都出现过。其中输入各种类型三角形边长为外循环,输入合适边长为内循环。五、程序#include #include main() float a,b,c,s,area; int i=0,j=0,k=0,l=0; /*i,j,k,l分别用来统计每种类型的三角形出现的次数*/ do /*输入三角形的边长*/ while( ) /*循环输入三边直到能构成三角形*/ /*计算三角形的面积*/ /*判断三角形的类型(等边、等腰、直角或一般三角形),并统计各种类型三角形出现的次数*/ while(i&j&k&l)=0);六、实验练习1.鸡兔问题:假设鸡兔共有30只,脚数共有90只,利用循环编写一个程序求出鸡和兔各有多少只。2.从键盘输入若干学生某门课程的成绩,计算出平均成绩并输出低于60分的学生成绩,当输入负数时结束输入。3.判断从键盘输入的数m是否为素数(素数:只能被1和本身整除的数)。4.利用循环从键盘输入100个数,找出其中的最小值。5.编程求1-+-+-的值。6.编程求s=1+(1+2)+(1+2+3)+(1+2+3+n)的值。7.输入n个整数,求这n个数之中的偶数平均值,并输出。8.编程打印一下图形(行n的值由键盘输入)。* * * * * *9.输出100-999之间的所有水仙花数,每行输出5个(水仙花数:三位数的各位数字的立方之和等于这个三位数本身,如153=1*1*1+5*5*5+3*3*3)。10.编写一个程序,打印如下乘法“九九表”。1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*6=36 6*7=42 6*8=48 6*9=54 7*7=49 7*8=56 7*9=63 8*8=64 8*9=72 9*9=8111.从键盘输入6名学生的5门成绩,分别统计出每个学生的平均成绩。实验二 数组的应用2.1 一维数组的应用一、实验目的1.掌握一维数组的定义及初始化;2.掌握一维数组元素的引用;3.掌握几种常见的排序方法;4.能够利用一维数组进行程序设计。二、实验内容从键盘输入10个学生的一门课程的成绩,从高到低排序后输出每个学生的成绩。方法1:选择排序三、分析选择排序方法通过选择最大值的方法,依次将最大、第2大、第3大的数挑选出来,顺序调换到数组的第1个、第2个、第3个元素中。四、算法描述1.定义n个长度的数组用来存放n个元素;2.第1趟将第1个元素和它后面的元素逐个进行比较,有更大的则与第1个元素进行交换,再继续和后面的元素比较。经过若干次比较和交换,从n个元素中找出了最大数并交换到第1个元素中;3.第2趟用同样的方法,在剩下的n-1个元素中找出第2大的数,并把它调换到第2个元素中;4.第i趟再用同样的方法,在剩下的n-i+1个元素中找出第i大的数,并把它调换到第i个元素中。i不断增加,一趟趟重复此过程,直到i=n-1最后一趟比较完为止;5.程序用双重循环实现,外循环用i控制趟数,找第i个元素。内循环让第i个元素和它后面的元素逐个进行比较,有更大的则交换到第i个元素。五、程序#include #define N 10main() /*定义数组*/ /*通过循环输入n个成绩,保存在数组中*/ /*变量i用来控制比较的趟数,需进行N-1趟*/ /*第i个元素和其后各元素进行N-(i+1)次比较,变量j用来控制其后元素*/ /*如果逆序则交换*/ printf(“排序后的成绩:n”); /*通过循环输出排好序的数组中的元素*/方法2:插入排序三、分析插入排序方法通过将要插入的元素从有序数组的最后元素开始逐个进行比较,如果逆序则后移数组元素,直到找到合适为止插入。如正序则直接插入。四、算法描述1.定义n个长度的数组用来存放n个元素;2.第1个数直接存在数组第1个位置,再输入新数m;3.从数组最后一个元素开始,逐个将数组元素与数m进行比较,如果逆序则将数组元素后移一个单元,直到找到合适正序位置并插入;如果第一次比较正序,则将数m插入到数组最后。再输入新数m;4.重复第3步,直到n个数全部有序插入。五、程序#include #define N 6main() /*定义数组*/ /*先输入一个数*/ /*就一个数时必是有序的,直接存到数组第零个元素中*/ /*通过循环利用i控制输入的元素个数*/ /*再输入一个新数,和数组中已有元素进行比较*/ /*利用循环从现有数组的最后一个元素开始往前逐个比较*/ /*如果逆序,则把数组中元素逐个后移*/ /*如果正序,则退出循环*/ /*把该数放在数组中第j个元素之后*/ printf(排序后的成绩:n); /*通过循环输出排好序的数组中的元素*/方法3:冒泡排序三、分析冒泡排序方法每趟顺序比较相邻的两个数,如果两数逆序,则交换两数,最多进行n-1趟,即完成n个数由高到低顺序排列。四、算法描述1.定义n个长度的数组用来存放n个元素;2.第1趟比较第1个和第2个元素,逆序则交换,再依次比较第2个和第3个、第3个和第4个,每次比较中若是逆序则交换。经过这趟比较和交换,最小的数到最后一个元素中;3.第2趟用同样的方法,在前面n-1个元素中依次进行比较和交换,第2小的数到倒数第2个元素中;4.第i趟再用同样的方法,在剩下的n-i+1个元素中依次进行比较和交换,第i小的数到倒数第i个元素中。一趟趟重复此过程,直到i=n-1最后一趟比较完为止;5.程序用双重循环实现,外循环用i控制趟数,找第i个元素。内循环j比较两个相邻元素,若逆序则交换。五、程序#include #define N 10main() /*定义数组*/ /*通过循环输入n个成绩,保存在数组中*/ /*变量i用来控制比较的趟数*/ /*依次比较相邻的两个数,共比较n-i个*/ /*如果逆序则交换*/ printf(“排序后的成绩:n”); /*通过循环输出排好序的数组中的元素*/六、实验练习1.从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩。2.从键盘输入n个数到数组中,统计其中的正数个数,并计算它们的和。3.将整型数组中的所有元素镜像对调(第一个与最后一个对调,第二个与倒数第二个对调),按对调后的结果输出。2.2 二维数组的应用一、实验目的1.掌握二维数组的定义及初始化;2.掌握二维数组元素的引用;3.能够利用二维数组进行程序设计。二、实验内容从键盘输入10个学生的三门课程的成绩,求每个学生各门课程的平均分,并按平均分从高到低的顺序输出每个学生各门课程的成绩和平均成绩。三、分析要存储10个学生三门课程的成绩需要定义二维数组,要存储10个学生的平均成绩需要定义一维数组,利用循环输入成绩、计算平均分,再利用循环选用一种排序方法按平均成绩进行排序,最后利用循环按要求输出。四、算法描述1.定义数组int sN3存储N=10个学生三门课程的成绩,数组float aN存储10个学生的平均成绩;2.用for循环从键盘按行输入每个学生三门课的成绩;3.用for循环计算出每个学生的平均成绩并存入数组a中;4.按照平均成绩从高到底的顺序排序(可选用选择排序、冒泡排序、插入排序、快速排序等多种排序方法用选择排序);5.按要求输出。五、程序#include #include #define N 10main() /*定义二维数组用来保存n个学生的3门成绩*/ /*定义一维数组用来保存n个学生的平均成绩*/ /*通过循环输入n学生的三门课成绩*/ /*通过循环计算n个学生的平均成绩*/ for(i=0;iN-1;i+) for(j=i+1;jN;j+) /*比较平均成绩,高则平均成绩高者进行交换*/ /*通过循环交换三门课的成绩*/ /*交换平均成绩*/ printf(按平均分排序后的成绩为:n); printf(课程一 课程二 课程三 平均分n,i+1); /*通过循环输出排好序的n个学生的三门课成绩及平均成绩*/六、实验练习1.从键盘输入矩阵A的值,将A的转置矩阵存入矩阵B,输出矩阵B。2.找出6*6矩阵每列绝对值最大的元素,并与同列对角线元素交换。3.输出杨辉三角形(行数由键盘输入)。11 11 2 11 3 3 11 4 6 4 14.矩阵求积。2.3 字符数组的应用一、实验目的1.掌握字符数组的定义及初始化;2.掌握字符数组元素的引用;3.掌握字符串处理函数;4.能利用字符数组及字符串处理函数进行程序设计。二、实验内容从键盘输入N个学生的姓名存储在字符数组中,并按字典顺序输出。三、分析因为姓名为字符串,要存储N个学生姓名需要定义二维字符数组,每行存储一个学生的姓名,用选择排序法按字典顺序比较大小时用strcmp()函数,交换时赋值用strcpy()函数。四、算法描述1.定义数组int sN12存储N个学生的姓名,数组strN用于交换时的中间变量;2.用for循环从键盘按行输入每个学生三门课的成绩;3.用for循环计算出每个学生的平均成绩并存入数组a中;4.按照平均成绩从高到底的顺序排序(可选用选择排序、冒泡排序、插入排序、快速排序等多种排序方法用选择排序);5.按要求输出。五、程序#include #include #define N 10main() /*定义二维数组保存n个学生的姓名*/ /*定义一维数组保存在交换时一个学生的姓名*/ /*通过循环输入n个学生姓名*/ /*通过选择排序对n个学生姓名进行排序*/ for(j=i+1;jN;j+) /*调用strcmp函数进行比较*/ /*交换时调用strcpy函数进行赋值*/ printf(“排好序的成绩为:n”); /*通过循环输出排好序的姓名*/六、实验练习1.输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。2.输入一行字符,删除字符串中的空格。实验三 函数的应用一、实验目的1.掌握函数的定义;2.掌握函数的调用方法;3.掌握函数之间的值传递方式;4.能够利用函数进行综合程序设计。二、实验内容求两位的所有绝对素数,并输出(一个素数经过任意次调换位,仍然为素数,则为绝对素数,例如:13(31)就是一个绝对素数)。三、分析求所有两位数的绝对素数,可定义一个判断这个数是否为绝对素数的函数,在实现该函数时需要判断该数是否为素数及换位后是否为素数,所以还应定义一个函数判断一个数是否为素数的函数。四、算法描述1.定义素数函数判断一个数是否为素数,判断时需考虑数小于2、等于2及大于2的情况,大于2时需用循环进行判断。是素数返回1,不是则返回0;2.定义绝对素数函数判断一个数是否为绝对素数,判断时需调用已定义的素数函数来判断原数及换位后的数是否为素数。是绝对素数返回1,不是则返回0;3.在main函数中对10至99的数调用绝对素数函数,如果是绝对素数则输出这个数。五、程序#include #include /*定义sushu函数用来判断一个数是否为素数*/int sushu(int n) /*如果小于2,不是素数返回0*/ /*如果是2,是素数返回1*/ /*大于2的需要判断是不是素数,是则返回1,不是返回0*/*定义jueduisushu函数用来判断一个数是否为绝对素数*/int jueduisushu(int m) /*得到m各位交换后的数*/ /*调用sushu()判断原数和交换后的数是否为素数,是则返回1,不是返回0*/main() int i; for(i=10;i100;i+) /*判断10到99的数是否为绝对素数*/ /*调用jueduisushu()判断是否为绝对素数,是则输出*/六、实验练习1.编写一个程序,已知一个圆筒的半径、外径和高,计算该圆筒的体积。2.编写一个判断某数是否为水仙花数的函数,在main函数中求100到999之间的全部水仙花数。3.编写一个函数,输入整数m的全部素数因子(例如:m=120,因子为:2,2,2,3,5。)。4.编写一个函数,求10000以内所有的完数(完数是指一个数正好是它的所有约数之和。例如6就是一个完数,6的因子有1,2,3,并且6=1+2+3)。5.编写一个函数,求10000以内的所有互满数(如果有两个数,每一个数的所有约数(除它本身以外)的和正好等于对方,则称这两个数为互满数)。实验四 位运算的综合应用一、实验目的单片机又称为微控制器,由于其具有集成度高、功能强、速度快、体积小、功耗低、使用方便、性能可靠、价格低廉等特点,因此在工业控制、智能仪器仪表、数据采集和处理、通信系统、汽车工业、国防工业、家用电器等领域有着十分广泛的应用。位运算在单片机、ARM等硬件程序设计中有着较为广泛的应用,通过设计C语言程序,模拟单片机操纵相关器件,实现流水灯、串行通信等效果,激发学生学习C语言课程的热情,使其熟练掌握位运算知识,提高其分析问题与解决问题的能力,以及将C语言程序设计技能运用于专业领域的意识,为学生后续相关专业课程的学习打下坚实的基础。同时,通过实验,培养学生的算法描述能力以及养成良好的编码风格。二、实验内容1.流水灯效果模拟2.串行通信模拟三、项目分析1.流水灯效果模拟1)背景知识根据单片机的型号以及任务要求的不同,线路接法会有所不同,下面以AT89S52单片机为例进行说明。图中,将8个LED灯接在了P2口上,P2口的每个引脚对应着一个LED灯,当P2口有低电平输出时,就会点亮相应的LED灯,而将低电平转为高电平后,相应的灯会熄灭。利用这个特点,就很容易操纵图中的8个LED灯,如向P2口输送01100011(即0x63)时,P2_0= P2_3= P2_4= P2_5=0,就会点亮D1、D4、D5、D6。如果在暂停一段时间后,令P2的各个位向左或向右移位,再点亮相应的灯,就会给人一种灯在流动的感觉,即所谓的流水灯效果。开始给P2赋值取得P2的位存入bit_P按位输出灯光效果延时P2按位循环移动一位2.算法分析1)定义一数组bit用于存放P2的各位值;2)通过宏定义定义一组P2_i,用于指向bit_P的各个元素,将来通过对P2_i的操作,模拟对P2口的各个引脚的操作;3)定义函数void getBit(uchar P),用于取得P的各个位存入缓存buffer,然后再逆序存入bit_P;4)定义函数void display_P_bit(),通过对P2的各个引脚的操作,输出不同的字符,以模拟当前各个灯光的明暗效果;5)定义函数delay(),用以延时;6)在主函数中,对P2进行循环移位,实现流水效果。3、程序框架及部分代码typedef unsigned char uchar;#define P2_i bit_Pi/*定义P2_i,通过对P2_0、P2_1、P2_2等的操作模拟对P2的各个引脚的操作,如果想完成单独对某个P2_i操作,可以通过如下宏定义来实现*/#define P2_0 bit_P0 #define P2_1 bit_P1 #define P2_2 bit_P2#define P2_3 bit_P3 #define P2_4 bit_P4 #define P2_5 bit_P5#define P2_6 bit_P6 #define P2_7 bit_P7 */typedef unsigned char uchar;int bit_P8;void delay(int n,int m)/延时函数void getBit(uchar P) /取得P的位,逆序存入缓存buffer,然后再逆序转存入bit_P中void display_P_LED()/通过对P2_i的操作,将P的各位对应的灯光效果输出到屏幕上void display_P_bits()/将P的各个位的值输出到屏幕上main()uchar P2=0xc6,P2_temp;/P2的值可以修改为其他的值while(1)printf(nnnttt流水灯模拟效果与相应位的真实移动的展示);printf(nttt-);getBit(P2);printf(nnttt);printf( 模拟流水灯效果:);display_P_LED();printf(nttt);printf( P2实际循环右移:);display_P_bits();printf(nnn);delay(20000,50000);putchar(7);/灯光变换前声音提示/在此处自己完成实现P2的循环右移,清屏后进行下一轮的输出最终效果如下图所示,图中各个字符代表相应的灯亮或灭,并实现循环亮灭的功能。在设计时,可以对功能进行扩展,比如输出选择菜单,通过选择不同的流水灯效果,实现不同的效果展示。注:1、由于算法效率的原因,在程序执行过程中没有直接把P2的各个位输出到相应引脚上,而是先存入了一个数组bit_P中,然后再从该数组中输出,但是在程序中通过P2_i与bit_Pi的对应模拟了输出P2口的各个“引脚”(各个P2_i)。2、程序中的一些功能需自己实现。2、串行通信模拟背景知识:一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。与单片机串行通信相关的寄存器介绍:SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。串行口控制寄存器SCON(见表1) 。表中各位(从左至右为从高位到低位)含义如下。SM0 和SM1 :串行口工作方式控制位。SM2 :多机通信控制位。 REN :串行接收允许位:REN =0 时,禁止接收;REN =1 时,允许接收。TB8 :在方式2、3 中,TB8是发送机要发送的第9位数据。在多机通信中它代表传输的地址或数据,TB8=0 为数据,TB8=1 时为地址。RB8 :在方式2、3中,RB8是接收机接收到的第9位数据,该数据正好来自发送机的TB8,从而识别接收到的数据特征。TI :串行口发送中断请求标志。当CPU 发送完一串行数据后,此时SBUF 寄存器为空,硬件使TI 置1,请求中断。CPU 响应中断后,由软件对TI 清零。RI :串行口接收中断请求标志。当串行口接收完一帧串行数据时,此时SBUF 寄存器为满,硬件使RI 置1,请求中断。CPU 响应中断后,用软件对RI 清零。算法分析:我们在模拟串行通信时,定义位段 SCON,将其各位与上述寄存器各位对应(也可以通过定义一变量unsigned char 并赋值来实现),当输入要传输的数据时,如果发送信息为空,则不允许发送并提示重新输入,否则将SCON.RI置1,允许将数据按位发送到缓存,当读取到8位后,将SCON.RI置零,然后把SCON.TI置1,系统检测到SCON.TI为1后将数据从缓存中按位取出,读满8位后,将结果按位取出并转成相应字符并输出,直到读到最后一个字符,同时将SCON.TI置零,停止发送,进入读取下一个字符并发送的过程中。效果图如下图所示:信息发送过程中示意图信息发送完成示意图注:1、这一项目的目的主要是为了让同学们进一步熟悉掌握位运算的应用,以及对串行通信的大致过程产生初步印象。由于复杂性原因,该模拟过程只是进行了部分模拟,其中的:TI、RI应由硬件置1,软件置0,都改为了由软件设置;发送和接收使用了同一个缓存;没有设置数据的开始位与停止位以及奇偶校验等位;移位脉冲SHIFT电平的变化过程对读取数据的控制没有体现等。2、程序中的部分代码需自己实现Y程序框架及部分代码如下:#include#include#define MAX 200typedef unsigned char uchar;struct Sconunsigned SMO:1;unsigned SM1:1;unsigned SM2:1;unsigned REN:1;unsigned TB8:1;unsigned RB8:1;unsigned TI:1;unsigned RI:1;SCON;void Initial();void recive();void send(char *string);void delay(int n,int m);int buffer8;main()char dataMAX;/用以存储要发送的完整信息char ch;Initial();printf(请输入要发送的数据:);while(1)gets(data);fflush(stdin);/*如果输入的信息为空,则不允许发送,否则软件设置SCON.RI=1接收开始,接收完成后设置SCON.RI=0,以停止接收*/*发送完毕后询问是否发送,如果是则继续输入信息并发送,否则退出程序*/void send(char *string)/*诸位发送信息,对于string的每个字符采取诸位发送的方式(诸位存入buffer),当发送完8位后,软件设置SCON.TI=1允许接收,当接收完该字符的8个位后设置SCON.TI为0停止接收*/void recive()/将读取信息并最终将明文输出到屏幕上void delay(int n,int m)/延时void Initial()/模拟初始化SCON寄存器的各个位SCON.SMO=0;SCON.SM1=1;SCON.SM2=0;SCON.REN=1;SCON.RB8=0;SCON.TB8=0;SCON.RI=0;SCON.TI=0;四、实验练习1.编程实现取一个整数Number从右端开始的第2-5位。例如Number=217,其二进制形式为11011001,其2-5位为1100即十进制的12;2.定义unsigned int data ,修改其指定的某几位,其余位保持不变;3.对于上题中的data,程序随机产生一随机数temp,接下来程序修改data的第temp位,其余不变,然后将修改后的结果输出;4.编程模拟实现八个中的一个LED灯点亮,然后左循环四次后右循环三次;5.编程模拟实现一个LED亮,闪烁三次,再循环到下个灯再闪烁三次,依此下去;6. 通过对P2赋值,实现点亮八个LED灯中的左数第2、4、7三个,然后这三个灯熄灭,其余五个灯点亮,如此重复若干次;(提示:利用按位取反进行操作)7.串行通信项目中的接收信息是在send函数里面调用recive实现的,修改上面的程序,实现将所有信息按位发送出去后,再由函数recive按位接收并输出结果。即在主函数中的调用顺序为:send(); recive();实验五 数据文件的处理一、实验目的1.掌握文件和文件指针的概念以及文件的定义方法;2.掌握文件打开、关闭、读、写等文件操作函数;3.掌握对文件的建立,以及对文件的基本操作。二、实验内容建立一个班级的学生情况表,表中数据项应该包括学号、姓名、百分制记分的三门课程的成绩(离散数学、数据结构、程序设计语言)。具体内容包括:(1)从键盘输入以上数据,计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stu_list”中;(2)将文件“stu_list”中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件“stu_sort”中;(3)向文件“stu_sort”中插入一个学生的3门课成绩,先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。三、分析1.定义学生结构体;2.定义学生数组;3.从键盘输入一组学生信息到数组中;4.将学生数组保存到文件“stu_list”文件中;5.将文件“stu_list”中的数据读取到数组中;6.按平均分对学生数组进行排序,将排序后的学生数组保存到文件“stu_sort”文件中;7.添加一个学生到数组末尾;8.调用排序函数根据平均分进行重新排序,将排序后的数组保存到“stu_sort2”文件中;四、算法描述1.学生结构体的定义,主要成员包括:学生的学号、姓名、三门课程成绩及平均分。2.定义学生结构体类型的一维数组,用来存储多条学生记录;3.定义input()子函数,完成学生学号、姓名、课程成绩的输入并计算平均分。4.定义save(char*fileName)子函数,保存学生数组到文件中。5.定义read(char*fileName)子函数,读取文件到学生数组中。6.定义print()子函数,输出所有学生。7.定义sort()子函数,对学生数组按平均分进行排序。8.定义add()子函数,添加一个学生到数组末尾。五、程序#include /*定义结构体*/*定义结构体学生数组*/*函数原型*/void input();void save(char*fileName);void read(char*fileName);void print();void sort();void add();void main()input();save(stu_list.dat);printf(文件保存成功n);read(stu_list.dat);printf(文件读取成功,以下为读取的内容:n);print();printf(将要进行排序n);sort();printf(排序结结束,排序后的结果如下:n);print();save(stu_sort.dat);printf(排序后的数据已经保存到文件n);/*添加学生,然后再排序*/*从键盘输入一个学生*/void inputOne(struct Student * s)/*输入一组学生信息到数组中*/void input()/*保存学生数组到文件中*/void save(char*fileName)/*读取文件到学生数组中*/void read(char*fileName)/*输出一个学生*/void printOne(struct Student * s)/*输出所有学生*/void print()/*对学生数组排序*/void sort()/*添加一个学生到数组末尾*/void add()实验六 数值计算一、实验目的通过C语言程序设计,结合数学专业相关知识,实现一些数值计算问题的求解,提高学生分析问题与解决问题的能力,以及将C语言程序设计技能运用于专业领域的意识。通过实验过程,培养学生的算法描述能力以及养成良好的编码风格。二、实验内容1.利用数值概率算法进行求值:1)求圆周率的近似值;2)求在积分区间上的定积分。2.利用递推化梯形等方法求定积分;3.哥德巴赫猜想的近似证明。三、算法思想1.利用数值概率算法进行求值1)求圆周率的近似值背景知识:向第一象限内的正方形内任意投点,随机点落入1/4圆中的概率为1/4圆与第一象限内正方形面积之比,因此概率的四倍即为的近似值。主要代码:double getPI(long int n)long int count=0;float x,y;int i=0;while(in)x=random(101);y=random(101);if(x2+y2=10000)cont+;i+;return 4.0*cont/n;2)求在积分区间上的定积分背景知识:如果被积函数在积分区间上不小于0,则向矩形内随机投点,点落入曲边梯形的概率即为曲边梯形的面积与矩形的面积之比。由此得到所以:其中,矩形的面积通过求被积函数在积分区间上的最大值(利用微分中值定理相关理论)来求得;如果被积函数在积分区间上有的部分小于0,则求其绝对值后再求解。主要代码:double Put_point(long int n)double x,y;long int i,count=0;srand(unsigned)time(NULL);for(i=0;in;i+)/*随机投点,如果点落入曲边梯形内就累加count*/return (double)count/n;ab2利用递推化梯形等方法求定积分知识背景:根据定积分的几何意义(右图)知,函数的定积分的值等于图中曲边梯形的面积。连接函数曲线的两个端点,得到梯形,其面积ab,用它近似代替误差较大,将区间a,b等分为2,分别为a, ,b,在两区间上分别使用计算两相应梯形面积得到两梯形面积之和:将a,bn等分,共有n+1个分点,其中h=,k=0,1,2,n。用表示等分后梯形面积的总和,则有: 在求积分时,当时结束,其中e为积分精度。主要代码:double fun_Result(double x)/被积函数求值函数double sum_Result(double a,double b,double e)/a、b为积分上、下限,e为精度double T1=0,T2=0,s=0,h,x;int flag;h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务安全库存管理办法
- 聊城城景观管理办法
- 东莞幼托机构管理办法
- 仓储保管收费管理办法
- 不同性格人员管理办法
- 血防林工程管理办法
- 街道拆迁工作管理办法
- 街区管理办法运营机制
- iris配置管理办法
- 虫害防治实施管理办法
- 施工项目部会议管理制度
- 2024-2025学年安徽省八年级语文上册第一次月考试卷04
- 欢迎一年级新生入学课件
- 译林版七年级上册英语阅读理解专项练习题100篇含答案
- 单位委托员工办理水表业务委托书
- 矿山生态修复监理工作资料编制内容和要求、施工监理主要工作程序框图、工程施工与监理表式
- 夫妻婚内财产协议书(2024版)
- 小菜园租赁合同范本
- DL-T1342-2014电气接地工程用材料及连接件
- 血管内超声在冠状动脉疾病中应用的中国专家共识(全文)
- (正式版)JTT 1495-2024 公路水运危险性较大工程安全专项施工方案审查规程
评论
0/150
提交评论