c语言程序设计实验指导(学生用).doc
下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
2.下载的文档,不会出现我们的网址水印。
3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
文档包含非法信息?点此举报后获取现金奖励!
下载文档到电脑,查找使用更方便
20
积分
还剩页未读,继续阅读
关 键 词:语言程序设计
实验
指导
学生
资源描述:
C语言程序设计
实验指导
(学生用)
计算机基础教研室
《C语言程序设计》课程组
2012年9月
前 言
《C语言程序设计》是计算机科学技术系面向全校理工科开设的一门专业平台课程。通过这门课程的学习,可以让学生了解程序设计的思想和方法,掌握高级语言程序设计的基本知识,提高问题求解和程序语言的应用能力。
《C语言程序设计实验指导书》是《C语言程序设计》的配套指导书。本指导书本着“厚基础,重实践,以专业为导向”的原则,其中程序设计基础、数组、函数这三个实验项目是所有学科专业都必须掌握的,其他实验项目根据专业特点,设计了不同的要求:对于普通专业侧重循环、数组、函数、结构体等,生化类专业包含数据文件的处理,机械电子类专业包含位运算,数理类专业包含数值计算等内容。每个实验本着循序渐进的原则,由简到难,逐步深化,另外配有相应的实验练习,学生可根据自己的情况选择完成。本指导书所有程序代码均在Visual C++环境下调试通过。
本指导书在编写过程中得到了系领导的大力支持,王海燕主任在百忙中多次参加我们的课程研讨,庄波老师、宫锋老师在大纲编写、指导书任务设计方面给出了切实可行的意见和建议,在此深表感谢。
本指导书由计算机基础教研室《C语言程序设计》课程组全体人员共同编写,谢玉华老师负责统筹安排,实验一、实验二、实验三、实验七由张志芬老师编写,实验四、实验六由陈春华、薛红芳老师编写,实验五由陈庆燕老师编写,最后由张志芬老师统稿,在此一并感谢。
由于水平有限,本指导书难免存在疏漏和不足之处,望各位老师在使用过程中多提宝贵意见,有利于我们进一步改进。
《C语言程序设计》课程组
2012年9月
目 录
实验一 基本控制结构的应用1
1.1 熟悉编程环境1
1.2 顺序结构程序设计1
1.3 选择结构程序设计2
1.4 循环结构程序设计4
实验二 数组的应用7
2.1 一维数组的应用7
2.2 二维数组的应用10
2.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+b>c,b+c>a,a+c>b则能构成三角形;否则不能构成三角形;
2.若能构成三角形时,计算三角形的面积。再判断三角形的类型,如果三边都相等时等边三角形;如果任意两边相等则为等腰三角形;如果两边平方之和等于第三边平方则为直角三角形;其他为一般三角形。
四、算法描述
1.定义三个边长a,b,c为float型,从键盘输入三个边长值;
2.判断三边是否能构成三角形,条件是a,b,c三条边大于0,并且a+b>c,b+c>a,a+c>b,不满足条件则不能构成三角形;
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<=x<20
sinx+cosx 20<=x<40
y= ex-1 40<=x<60
ln(x+1) 60<=x<80
0 其他值
4.输入一个字符,如果这个字符是小写字母将这个字符转换成大写字母输出,否则输出原字符。
5.编程实现如下功能的简单计算器:从键盘输入两个运算数及算术运算符,最后输出计算结果。
6.求解方程ax2+bx+c=0的解。
1.4 循环结构程序设计
一、实验目的
1.掌握while语句;
2.掌握do-while语句;
3.掌握for语句;
4.能够利用循环结构进行程序设计;
5.能够综合利用顺序结构、选择结构及循环结构进行程序设计。
二、实验内容
根据输入的三角形的三条边,判断是否能组成三角形,若不能则重新输入三边,直到能构成三角形为止;若能则计算三角形的面积,并判断三角形的类型,重复输入三角形的边长,使每种类型的三角形都出现一次。
三、分析
1.首先判断是否能构成三角形,如果满足a,b,c三条边大于0,并且满足a+b>c,b+c>a,a+c>b则能构成三角形;否则不能构成三角形;
2.若能构成三角形时,计算三角形的面积。再判断三角形的类型,如果三边都相等时等边三角形;如果任意两边相等则为等腰三角形;如果两边平方之和等于第三边平方则为直角三角形;其他为一般三角形。当为某一类型,其计数加1,若有没出现过的类型,再循环输入各边,直到每种类型都出现过。
四、算法描述
1.定义三个边长a,b,c为float型,从键盘输入三个边长值;
2.判断三边是否能构成三角形,条件是a,b,c三条边大于0,并且a+b>c,b+c>a,a+c>b,不满足条件则不能构成三角形;
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=81
11.从键盘输入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 10
main()
{
/*定义数组*/
/*通过循环输入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 6
main()
{
/*定义数组*/
/*先输入一个数*/
/*就一个数时必是有序的,直接存到数组第零个元素中*/
/*通过循环利用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 10
main()
{
/*定义数组*/
/*通过循环输入n个成绩,保存在数组中*/
/*变量i用来控制比较的趟数*/
/*依次比较相邻的两个数,共比较n-i个*/
/*如果逆序则交换*/
printf(“排序后的成绩:\n”);
/*通过循环输出排好序的数组中的元素*/
}
六、实验练习
1.从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩。
2.从键盘输入n个数到数组中,统计其中的正数个数,并计算它们的和。
3.将整型数组中的所有元素镜像对调(第一个与最后一个对调,第二个与倒数第二个对调),按对调后的结果输出。
2.2 二维数组的应用
一、实验目的
1.掌握二维数组的定义及初始化;
2.掌握二维数组元素的引用;
3.能够利用二维数组进行程序设计。
二、实验内容
从键盘输入10个学生的三门课程的成绩,求每个学生各门课程的平均分,并按平均分从高到低的顺序输出每个学生各门课程的成绩和平均成绩。
三、分析
要存储10个学生三门课程的成绩需要定义二维数组,要存储10个学生的平均成绩需要定义一维数组,利用循环输入成绩、计算平均分,再利用循环选用一种排序方法按平均成绩进行排序,最后利用循环按要求输出。
四、算法描述
1.定义数组int s[N][3]存储N=10个学生三门课程的成绩,数组float a[N]存储10个学生的平均成绩;
2.用for循环从键盘按行输入每个学生三门课的成绩;
3.用for循环计算出每个学生的平均成绩并存入数组a中;
4.按照平均成绩从高到底的顺序排序(可选用选择排序、冒泡排序、插入排序、快速排序等多种排序方法用选择排序);
5.按要求输出。
五、程序
#include #include #define N 10
main()
{
/*定义二维数组用来保存n个学生的3门成绩*/
/*定义一维数组用来保存n个学生的平均成绩*/
/*通过循环输入n学生的三门课成绩*/
/*通过循环计算n个学生的平均成绩*/
for(i=0;i#include #define N 10
main()
{
/*定义二维数组保存n个学生的姓名*/
/*定义一维数组保存在交换时一个学生的姓名*/
/*通过循环输入n个学生姓名*/
/*通过选择排序对n个学生姓名进行排序*/
for(j=i+1;j#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;i<100;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_P[i]/*定义P2_i,通过对P2_0、P2_1、P2_2等的操作模拟对P2的各个引脚的操作,如果想完成单独对某个P2_i操作,可以通过如下宏定义来实现*/
#define P2_0 bit_P[0] #define P2_1 bit_P[1] #define P2_2 bit_P[2]
#define P2_3 bit_P[3] #define P2_4 bit_P[4] #define P2_5 bit_P[5]
#define P2_6 bit_P[6] #define P2_7 bit_P[7] */
typedef unsigned char uchar;
int bit_P[8];
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("\n\n\n\t\t\t流水灯模拟效果与相应位的真实移动的展示");
printf("\n\t\t\t--------------------------------------");
getBit(P2);
printf("\n\n\t\t\t");
printf(" 模拟流水灯效果:");
display_P_LED();
printf("\n\t\t\t");
printf(" P2实际循环右移:");
display_P_bits();
printf("\n\n\n");
delay(20000,50000);
putchar(7);//灯光变换前声音提示
//在此处自己完成实现P2的循环右移,清屏后进行下一轮的输出
}
}
最终效果如下图所示,图中各个字符代表相应的灯亮或灭,并实现循环亮灭的功能。
在设计时,可以对功能进行扩展,比如输出选择菜单,通过选择不同的流水灯效果,实现不同的效果展示。
注:1、由于算法效率的原因,在程序执行过程中没有直接把P2的各个位输出到相应引脚上,而是先存入了一个数组bit_P中,然后再从该数组中输出,但是在程序中通过P2_i与bit_P[i]的对应模拟了输出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 200
typedef unsigned char uchar;
struct Scon
{
unsigned 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 buffer[8];
main()
{
char data[MAX];//用以存储要发送的完整信息
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(i=e)
{
h=h/2;T1=T2;flag=1;
}
else flag=0;
}while(flag);
return T2;
}
3.数学猜想近似证明
哥德巴赫猜想:任何一个大于2的偶数都能表示成为两个素数之和。
在哥德巴赫猜想中,对于任何大于2的偶数都成立,而我们证明时不可能一一证明,但是可以编程实现在一定范围内偶数的验证。
算法分析:一个正偶数a,可以成为:a=1+(a-1)=2+(a-2) =3+(a-3)=……=a/2+a/2共a/2种组合,后面还有另外的a/2-1种,但是它们的形式与前面a/2种形式中的a/2-1种完全相同。因此,在这a/2种正整数相加的形式中,只要存在一种形式a=i+j,其中i和j均为素数,就可断定该偶数a满足哥德巴赫猜想。
主要代码:
int isGB(long int a)
{
long int i;
for(i=2;i<=a/2;i++)
{
//当i和a-i都是素数时,输出a=a+(a-i)
}
int isPreme(long int i)
{//判断i是否为素数,如果是函数返回值1,否则,返回值0
}
int Test_Range(long int low,long int high)
{
long int i,j;
int flag;
for(i=low;i<=high;i++)
//如果i为偶数,则调用函数isGB检测i是否满足哥德巴赫猜想
}
四、实验练习
1.编程求两个数的最大公约数与最小公倍数;
2.编写程序利用公式:求e的近似值,精确到小数后6位;
3.对角谷猜想进行近似证明,角谷猜想的内容为:任意给定一个自然数,若它为偶数则除以2,若它为奇数则乘以3加1,按照中央的计算方法计算下去,若干次后得到的结果必为1;
4.对四方定理进行近似证明,四方地理的内容为:所有自然数最多只要四个数的平方和就可以表示出来;
5.编程实现:应用牛顿法解方程:。
实验七 简单学生成绩管理系统
一、实验目的
1.掌握综合应用程序开发的基本过程;
2.理解掌握模块化设计理念;
3.综合运用前面所学知识进行程序设计,提高其对所学知识的应用能力;
4.使学生养成良好的编码风格。
二、实验内容
利用C语言相关基础知识、函数、结构体、数组等综合知识设计一个简单的学生成绩管理系统,主要功能包括:学生信息(学号、姓名、性别、几门课程成绩及总分)的录入、查找(指定学号)、添加、修改等,可根据自己的能力适当添加一些功能,使其更加完善。
学生信息输入
系统功能选择
输出学生信息
按学号排序
查询学生信息
三、分析
1.定义学生结构体类型,主要成员包括:学生的学号、姓名、性别、几门课程成绩及总分;
2.定义学生结构体类型的一维数组,用来存储多条学生记录;
3.输入多个学生的学号、姓名、性别及几门课程成绩,计算总分;
4.按学号进行排序;
5.输出学生的信息;
6.查找指定学号的学生信息;
7.对学生信息可进行增加、删除、修改等操作(选作其中一个即可)。
四、算法描述
1.定义学生结构体类型,主要成员包括:学生的学号、姓名、性别、三门课程成绩及总分;
2.定义学生结构体类型的一维数组,用来存储多条学生记录;
3.定义input子函数,完成学生学号、姓名、性别及课程成绩成绩的输入并计算总分;
4.定义selectsort子函数,完成按学号进行排序(可选用选择排序、冒泡排序、插入排序、快速排序等多种排序方法);
5.定义output子函数,完成学生的信息的输出;
6.定义select子函数,完成指定学号学生信息的查找;
7.对学生信息可进行增加、删除、修改等操作(选作其中一个即可);
8.定义主函数main,调用各个子函数,完成该系统的主要功能。
五、程序
#include #include #define N 10
#define M 3
/*定义结构体*/
struct student
{
/*整型学号*/
/*字符数组姓名*/
/*字符型性别*/
/*整型数组三门成绩*/;
/*整型总分*/
展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:c语言程序设计实验指导(学生用).doc
链接地址:https://www.renrendoc.com/p-60136394.html