第一篇:C程序设计教案(第7章 实验9)专题
实验9
指针使用和数组的指针一、二、1.2.3.4.实验学时:2课时 实验目标
掌握指针的概念、指针变量的定义和使用指针变量;
掌握指针变量的运算(取地址运算&、取内容运算*、指针移动的运算等)学会使用数组的指针和指向数组的指针变量; 掌握指针与数组的关系;
实验要求:
三、1.在上实验课之前,每个同学必须预习指针变量的定义、赋值和取地址运算&、取内容运算*、指针移动的运算等操作,数组元素的多种便是方法; 2.每个同学必须将实验的题目、程序编写完毕,做好充分的准备。3.所有实验环节均由每位同学独立完成,严禁抄袭他人实验结果,若发现有结果雷同者,按实验课考核办法处理。
四、实验步骤和内容
1.分析下列程序的运行结果,并上机验证。1)void main(){
int i, j, *pi, *pj;pi=&i;pj=&j;i=5;j=7;
printf(“%dt%dt%dt%d”, i, j, pi, pj);
printf(“n%dt%dt%dt%dn”, &i, *&i, &j, *&j);}
程序的运行结果是:______________________ 2)void main(){
int a[ ]={ 1, 2, 3 };int *p, i;p=a;
for(i=0;i<3;i++)
printf(“%d %d %d %dn”, a[i], p[i], *(p+i), *(a+i));} 程序的运行结果是:______________________ 3)void main(){
int a[ ]={ 2, 5, 3, 6, 8 };int *p, i=1, s=0;
for(p=a;p 1)用地址法输入输出二维数组各元素。2)用指针法输入输出二维数组各元素。 五、思考题 1.数组的指针和指向数组的指针变量的区别 2.分析指针与数组的关系 六、实验小结: 实验9 多分支程序设计 1、实验内容 用P1.0、P1.1控制流水灯的变化 P1.0、P1.1=00灯全灭 P1.0、P1.1=01单灯亮左循环 P1.0、P1.1=10单灯亮右循环 P1.0、P1.1=11双灯亮左循环 灯亮的时时为1秒。用软件延时实现。*用T0定时选作。 2、实验步骤 1)打开PV32编程序。汇编正确进入调试界面。否则修改程序重新汇编直到通过。 2)打开P0、P1窗口给 3)调试灯全灭、单灯亮左循环、单灯亮右循环、双灯亮左循环程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现问题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。 4)设断点调试主程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现问题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。 首先将P1.0、P1.1置00观察P2窗口灯是否全灭,然后改变P1.0、1.1的设置观察流水灯运行是否正确。 5)流水灯运行中改变P1.0、1.1看流灯能否随之变化。若执行正确程序通过。否则在每个流水子程序中加入读P1口散转子程序。 3.实验报告 1.写出主程序流程图、子程序流程图、程序清单 2.根据记渌数据给程序加注解 3.调试心得 《C程序设计》实验教案 一、实验的目的与任务: 《C程序设计》是一门实践性很强的课程。通过实验使学生加深对课堂讲授的概念、语法、算法、编程技术的理解;熟悉C程序设计的开发环境;掌握程序设计和调试的基本技能。并通过实践激发学生进一步学习的积极性,培养学生的学习兴趣和创新思维。通过8个实验,使学生经过一定数量的上机训练,了解和掌握C程序设计的环境、程序的数据表示、程序的执行流程控制、程序的整体结构等C程序设计的基本概念和应用技术。 二、实验项目与要求 实验一:C程序的运行环境和运行一个C程序的方法(2学时) 实验性质:验证性实验 一、实验目的 1.了解所用的计算机系统的基本操作方法,学会独立使用该系统。2.了解在该系统上如何编辑、编译、连接和运行一个C程序。3.通过运行简单的C程序,初步了解C源程序的特点。 二、实验内容 1.调用编辑程序,输入教材第一章习题1.1程序,并进行编译和运行。应了解所用的系统是用什么命令进行编译和连接运行的。编译和连接后所得到的目标程序的后缀是什么形式的? 2.输入并运行教材第一章中习题1.4。 3.输入并运行教材第一章中习题1.9,了解如何在运行时向程序变量输入数据。 实验二 数据类型、运算符和表达式(2学时) 实验性质:验证性实验 一、实验目的 1.掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用格式转换符。 2.学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用。 3.进一步熟悉C程序的编辑、编译、连接和运行的过程。 二、实验内容 1.输入并运行教材第三章例3.6.即: #include printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); } 在此基础上 ①将第二行改为: int c1,c2;再使之运行,分析结果。②再将第三行、第四行改为: c1=300;c2=400;再使之运行,分析其运行结果。 2.输入并运行教材第三章习题3.6,在上机前先用人工分析程序写出应得结果,上机后将二者对照。 3.输入并运行习题3.10。即: #include printf(“%d,%d,%d,%d”,i,j, i++,j++);⑤程序改为: main(){int i,j,m=0,n=0;;i=8;j=10;m+=i++;n-=--j;printf(“i=%d,j=%d,m=%d,n=%d”,i,j,m,n);} 实验三 最简单的C程序设计(2学时) 实验性质:验证性实验 一、实验目的 1.掌握C语言中使用最多的一种语句—赋值语句的使用。2.掌握数据的输入输出的方法,能正确使用各种格式转换符。 二、实验内容 1.输入并运行以下程序: #include void main(){int a,b; float d,e; char c1,c2; double f,g; long m,n; unsigned int p,q; a=61;b=62; c1=’a’;c2=’b’; d=3.56;e=-6.87; f=3157.890121;g=0.123456789; m=50000;n=-60000; p=32768;q=40000; printf(“a=%d,b=%dn c1=%c,c2=%cnd=%6.2f,e=%6.2fn”,a,b,c1,c2,d,e); printf(“f=%15.6f,g=%15.12fnm=%ld,n=%ldnp=%u,q=%un”,f,g,m,m,p,q); } 在此基础上,做以下改动: ① 将程序第8-13行改为: a=61;b=62; c1=a;c2=b; f=3157.890121;g=0.123456789; d=f;e=g; p=a=m=50000;q=b=n=-60000; 运行程序,分析结果。 ② 在①的基础上将printf语句改为: printf(“a=%d,b=%dn c1=%c,c2=%cnd=%15.6f,e=%15.12fn”,a,b,c1,c2,d,e); printf(“f=%f,g=%fn m=%ld,n=%ldn p=%d,q=%dn”,f,g,m,n,p,q); 运行程序。 2.编写程序,用getchar函数读入两个字符c1、c2,然后分别用putchar函数和printf函数输出这两个字符。 上机运行程序,比较用printf和putchar函数输出字符的特点。 实验四 选择结构程序设计(2学时) 实验性质:设计性实验 一、实验目的 1.了解C语言表示逻辑量的方法(以0代表“假”,以1代表“真”); 2.学会正确使用逻辑运算符和逻辑表达式; 3.熟练掌握if语句和switch语句。 二、实验内容 先编程序,解决以下问题,然后上机调试运行程序。1.有一个函数 xy2x13x11x11x10 x10用scanf函数输入x的值(分别为x<1、1~ 10、≥10三种情况),求y值。2.给出一个百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。 实验五 循环控制(4学时) 实验性质:设计性实验 一、实验目的 1.熟悉用while语句,do-while语句和for语句实现循环的方法。2.掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等)。 二、实验内容 编程序并上机调试运行。 1.输入两个正整数,求其中最大公约数和最小公倍数。2.用牛顿迭代法求方程2x-4x+3x-6=0在1.5附近的根。 32实验六 数组(4学时) 实验性质:设计性实验 一、实验目的 1.掌握一维数组和二维数组的定义、赋值和输入输出的方法; 2.掌握字符数组和字符串函数的使用。3.掌握与数组有关的算法(特别是排序算法)。 二、实验内容 编程序并上机调试运行。 1.用选择法对10个整数排序。10个整数用scanf函数输入。2.将两个字符串连接起来,不要用strcat函数。 实验七 函数(4学时) 实验性质:设计性实验 一、实验目的 1.掌握定义函数的方法; 2.掌握函数实参与形参的对应关系,以及“值传递”的方式; 3.掌握函数的嵌套调用和递归调用的方法; 4.掌握全局变量和局部变量,动态变量和静态变量的概念和使用方法。 二、实验内容 编程序并上机调试运行。 1.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。2.求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数。用另一函数根据求出的最大公约数求最小公倍数。 (1)用全局变量的方法。将两个整数的最大公约数、最小公倍数都设为全局变 量。 (2)不用全局变量,两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后再与两个整数一起作为实参传递给函数2,以求出最小公倍数,返回到主函数输出最大公约数和最小公倍数。 实验八 预处理命令(2学时) 实验性质:设计性实验 一、实验目的 1.掌握宏定义的方法; 2.掌握文件包含处理方法; 3.掌握条件编译的方法。 二、实验内容 编程序并上机调试运行。 1.定义一个带参数的宏,使两个参数的值互换。在主函数中输入两个数作为使用宏的实参,输出已交换后的两个值。 说明:在程序主函数使用宏时只能用两个实参,如SWAP(a,b),不能用三个参数。2.用条件编译方法实现以下功能: 输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下字母(如‘a’变成‘b’,„,‘z’变成‘a’。其它字符不变)。用#define命令来控制是否要译成密码。例如: #define CHANGE 1 则输出密码。若 #define CHANGE 0 则不译成密码,按原码输出。用条件编译方法来处理。 实验九 指针(4学时) 实验性质:设计性实验 一、实验目的 1.掌握指针的概念,会定义和使用指针变量; 2.学会使用数组的指针和指向数组的指针变量; 3.学会使用字符串的指针和指向字符串的指针变量; 4.学会使用指向函数的指针变量; 二、实验内容 编程序并上机调试运行程序(都要求用指针处理)。1.输入三个整数,按由小到大的顺序输出。 2.将一个3*3的矩阵转置,用一函数实现之。在主函数中用scanf函数输入以下矩阵元素: 17 133915511 19将数组名作为函数实参。函数调用后在主函数中输出已转置的矩阵。3.用一个函数实现两个字符串的比较,即自己写一个strcmp函数: strcmp(s1,s2)如果s1=s2,则函数返回值为0;如果s1≠s2,返回它们二者第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二个字母不同,“O”与“A”之差为79-65=14);如果s1>s2,则输出正值;如s1 两个字符串s1,s2由main函数输入,strcmp函数的返回值也在main函数输出。 实验十 结构体和共用体(4学时) 实验性质:设计性实验 一、实验目的 1.掌握结构体类型变量的定义和使用; 2.掌握结构体类型数组的概念和应用; 3.掌握共用体的概念与使用。 二、实验内容 编程序,然后上机调试运行。 1.有5个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入5 8 个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、三门课的成绩、平均分数)。 要求用一个input函数输入5个学生数据;用一个average函数求总平均分;用max函数找出最高分学生数据;总平均分和最高分的学生的数据都在主函数中输出。 2.输入和运行以下程序: #include union data {int i[2]; float a; long b; char c[4]; }; void main(){union data u; scanf(“%d,%d”,&u.i[0],&u.i[1]); printf(“i[0]=%d,i[1]=%dna=%fnb=%ldnc[0]=%c,c[1]=%c,c[2]=%c,c[3]=%cn”,u.i[0],u.i[1],u.a,u.b,u.c[0],u.c[1],u.c[2],u.c[3]);} 输入两个整数10000、20000给u.i[0]和u.i[1]。分析运行结果。 然后将scanf语句改为: scanf(“%ld”,&u.b); 输入60000给b。分析运行结果。 实验十一 文件(2学时) 实验性质:设计性实验 一、实验目的 1.掌握文件以及缓冲文件系统、文件指针的概念; 2.学会使用文件打开、关闭、读、写等文件操作函数。3.学会用缓冲文件系统对文件进行简单的操作。 二、实验内容 1.从键盘输入一个字符,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符以“!”结束。 实验十二 学生成绩管理(4学时) 实验性质:综合性设计性实验 一、实验目的 1.综合运用C程序设计知识,解决实际问题。 二、实验内容 1.有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。 2.将上题“stud”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件“stu-sort”中。 3.将上题已排序的学生成绩文件进行插入处理。插入一个学生的三门课成绩。程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。 学生的原有数据为: 91101 Wang 89,98,67.5 91103 Li 60,80,90 91106 Fun 75.5,91.5,99 91110 Ling 100,50,62.5 91113 Yuan 58,68,71 要插入的学生数据为: 91108 Xin 90,95,60 10 C语言程序设计实验教案 目 录 实验一visual c++编译环境的使用..............................................................................2 实验二 顺序程序设计...............................................................................................6 实验三 选择结构程序设计........................................................................................9 实验四 循环结构程序设计......................................................................................13 实验五 函数...........................................................................................................17 实验六 指针...........................................................................................................22 实验七 数组...........................................................................................................25 实验八 结构体........................................................................................................32 实验一visual c++编译环境的使用 实验目的: 1.掌握c程序设计编程环境visual c++,掌握运行一个c程序设计的基本步骤,包括编辑、编译、连接和运行。 2.掌握c语言程序设计的基本框架,能够编写简单的c程序。3.了解程序调试的思想,能找出并改正c程序中的语法错误。实验内容: 1.在“我的电脑”上新建一个文件夹,用于存放c程序,文件夹名字可以是学号姓名。2.调试示例,在屏幕上显示一个短句“Hello World!”。 源程序 #include Hello World!基本步骤:(要求熟练掌握)1)启动VC++ “开始”->“程序”->“Microsoft Visual Studio 6.0”->“Microsoft Visual C++6.0”进入VC++编程环境。2)新建文件(*.cpp) “文件”->“新建”,单击“文件”选项卡,选择“C++Source Files”,修改文件保存“目录”和“文件”(文件名),单击“确定”。 3)编辑和保存(注意:源程序一定要在英文状态下输入,即字符标点都要在半角状态下,同时注意大小写,一般都用小写) 在编辑窗口输入源程序,然后执行“文件”->“保存”或“文件”->“另存为” 4)编译(*.obj) 用来检查语法错误 “编译”->“编译”或Ctrl+F7,在产生的工作区队话框中,选择“是”。5)连接(*.exe)“编译”->“构件”或F7 6)运行 “编译”->“执行”或Ctrl+F5 7)关闭程序工作区 “文件”->“关闭工作区” 8)打开文件 “文件”->“打开” 9)查看C源文件、目标文件和可执行文件的存放位置。 源文件在保存目录下,目标文件和可执行文件在“保存目录Debug”中 3.编程,在屏幕上显示一个短句“this is my first c program.”。4.调试示例,在屏幕上显示一个短句“welcome to you!”。源程序(有错误的程序)#include 1)按照实验2中介绍的步骤1)~3)输入上述源程序并保存。 2)编译,“编译”->“编译”(Ctrl+F7),信息窗口中显示编译出错信息,如下图所示。3)找出错误,在信息窗口中依次双击出错信息,编辑窗口就会出现一个箭头指向程序出错的位置,一般在箭头的当前行或上一行,可以找到出错语句。 第4行,出错信息:Welcome是一个未定义的变量,但Welcome并不是变量,出错的原因是Welcome前少了一个双引号。 4)改正错误,重新编译,得下如下图所示出错信息。 出错信息:“}”前少了分号。 5)再次改正错误,在“}”前即printf()后加上“;”(英文状态),生新编译,显示正确 6)连接,“编译”->“构件”(F7),出现如下出错信息。 出错信息:缺少主函数。 7)改正错误,即把“mian”改为“main”后,重新连接,信息窗口显示连接正确。8)运行,“编译”->“执行”(Ctrl+F5),观察结果是否与要求一致。5.改错,改正下列程序中的错误,在屏幕上显示以下3行信息。 **************** Welcome **************** 源程序(有错误的程序)#include } 实验报告要求 将以上各题的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 Printf(“ Welcome”)Printf(“****************n”); 实验二 顺序程序设计 【实验目的】 1.学会顺序程序设计的思想 2.进一步熟悉Turbo C集成编译环境的使用,达到熟练使用的目的 3.熟练掌握各种数据类型的输入输出格式,并学会使用输入输出函数 4.学会使用表达式 【实验内容】 1.在屏幕中输出一行文字“Hello,Welcome!” 说明: (1)只需要在屏幕中显示一行文字即可 参考程序如下: #include printf(“Hello,Welcome!n”);} 2. 输入一个华氏温度,要求输出摄氏温度。公式为 输出要求有文字说明,取两位小数 说明: (1)摄氏温度F和华氏温度c都应用float类型变量存储(2)注意表达式书写中的各变量的顺序问题(3)输出时只需输出两位小数 参考程序如下: #include float F,c; printf(“input F:”); scanf(“%f”,&F); c=5*(F-32)/9; printf(“c=%.2fn”,c);} 3.输入三角形三边长a、b、c,求三角形周长和l面积s。用scanf输入数据,输出计算结果,输出时要求有文字说明,取消书店后两位小数。说明: (1)程序设计中使用的所有变量均为float类型 c59F32(2)三角形周长公式:labc abc2(3)三角形面积公式;sp(pa)(pb)(pc),其中 p (4)注意应保证输入数据能够构成三角形 (5)需要使用开根号函数sqrt,在程序顶部加上#include #include float a,b,c,l,s; float p; printf(“input a,b,c:”); scanf(“%f,%f,%f”,&a,&b,&c); l=a+b+c; p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c)); printf(“l=%.2fn”,l);printf(“s=%.2fn”,s);} 4.设圆半径r1.5,圆柱高h3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取消书店后两位小数。说明: (1)程序设计中使用的所有变量均为float类型(2)圆周长公式:l2r(3)圆面积公式:S1r(4)圆球表面积公式:S24r V14322(5)圆球体积公式: r3 (6)圆柱体积公式:V2rh 参考程序如下: #include 2main(){ float r=1.5,h=3; float l,s1,s2,v1,v2; l=2*PI*r; s1=PI*r*r; s2=4*PI*r*r; v1=4*PI*r*r*r/3; v2=PI*r*r*h; printf(“l=%.2fn”,l);printf(“s1=%.2fn”,s1);printf(“s2=%.2fn”,s2);printf(“v1=%.2fn”,v1);printf(“v2=%.2fn”,v2);} 实验三 选择结构程序设计 【实验目的】 1.了解C语言的逻辑运算 2.学会使用if语句和switch语句 3.熟练掌握选择结构程序设计方法 【实验内容】 1.有一函数 y x x1 1x10 2x 13x11 x10 写一程序,输入x,输出y值 说明: (1)根据输入x的不同求y的值,使用if语句 (2)分别输入三个分段中的三个数,判断输出结果是否正确,测试程序正确与否 参考程序如下: #include float x,y; printf(“input x:”); scanf(“%f”,&x); if(x<1) y=x; if(x>=1 && x<10) y=2*x-1; if(x>=10) y=3*x-11;printf(“y=%fn”,y);} 2.从键盘输入一个字符,可以是数字、字母、或是标点符号,对输入的字符进行判断,如果是数字则输出“* is a number!”,如果是字母则输出“* is a letter!”,如果是其他的字符怎输出“* is the other!”(*为输入的字符)说明: (1)从键盘输入一个字符,用char类型变量存储(2)使用if语句作判断(3)判断条件根据输入字符的ASCII码值的范围,具体的ASCII码值参看书后的ASCII码表 参考程序如下: #include char c; printf(“input a char:”); scanf(“%c”,&c); if(c>=48 && c<=57) printf(“%c is a number!n”,c); else if((c>=65 && c<=90)||(c>=97 && c<=122)) printf(“%c is a letter!n”,c); else printf(“%c is the other!n”,c);} 3.输入两个实数a、b,保证变量a中存储的是较大的数,变量b中存储的实较小的数,并按照由大到小的顺序输出。说明: (1)需要对输入的两个数进行比较,判断是否需要交换两个数(2)按照从大到小的顺序输出两个数 参考程序如下: #include float a,b; float temp; printf(“input a,b:”); scanf(“%f,%f”,&a,&b); if(a { temp=a; } printf(“%f,%fn”,a,b);} 4.输入一年份,判断该年是否是闰年。说明: (1)判断闰年的条件:能够被4整除,但不能被100整除或者能被100整除,又能被400整除 (2)使用一个变量来代表是否是闰年 a=b;b=temp;10(3)如果是闰年则输出“* is a leap year!”,否则输出“* is not a leap year!”。*代表输入的年份 参考程序如下: #include int year; int flag=0; printf(“input a year:”); scanf(“%d”,&year); if((year%4==0 && year%100!=0)||(year%100==0 && year%400==0)) flag=1; if(flag==1) printf(“%d is a leap year!n”,year); else printf(“%d is not a leap year!n”,year);} 5.从键盘输入一个月号,显示输出该月号的英文名称 说明: (1)使用if语句较为麻烦,因为需要做12次比较(2)使用switch语句 (3)如果输入月份超出范围,则应当输出错误信息 参考程序如下: #include int month; printf(“input a month:”); scanf(“%d”,&month); switch(month) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: printf(“January!n”);printf(“February!n”);break;break;printf(“March!n”);break;printf(“April!n”);break;printf(“May!n”);break;printf(“June!n”);break;printf(“July!n”);break;printf(“August!n”);break;printf(“September!n”);break;case 10: printf(“October!n”);break;case 11: printf(“November!n”);break;case 12: printf(“December!n”);break; } } default: printf(“input error!n”);12 实验四 循环结构程序设计 【实验目的】 1.学会使用while、do-while、for语句 2.熟练掌握循环结构程序设计方法 3.掌握选择结构与循环结构的嵌套 【实验内容】 201.求和说明: n!n1(即求1!+2!+„„+20!) (1)首先要求出每一项的n!的值 (2)然后把各项相加得到所求的值 (3)存储求和运算结果的变量的初始值应为0(4)存储求积运算结果的变量的初始值应为1 参考程序如下: ①使用while循环 #include float sum=0; float mid=1; int n=1; while(n!=21) { mid=mid*n; } printf(“sum=%fn”,sum);} ②使用for循环 #include float sum=0; float mid=1; int n; for(n=1;n<=20;n++) { mid=mid*n;n++;sum=sum+mid; sum=sum+mid;} printf(“sum=%fn”,sum);} 2.求出100到200以内最大的素数和最小的素数,并求出两者的差值 说明: (1)素数的概念:只能被1和自身整除的正整数 (2)分别求出这个两个素数,并输出,输出格式为: big one:* small one:* 最小的素数正序找出 最大的素数倒序找出 (3)求出两者的差,并输出,输出格式为: result:* 参考程序如下: #include int big,small; int result; } for(i=200;i>=100;i--){ int i,j;int flag;for(i=100;i<200;i++){ flag=0;for(j=2;j } if(i%j==0){ } flag=1;break;if(flag==0){ } small=i;break;flag=0;for(j=2;j { } if(flag==0){ } big=i;break;if(i%j==0){ flag=1;break;} } result=big-small;printf(“big:%dn”,big);printf(“small:%dn”,small);printf(“reslut:%dn”,result);} 3.输入两个正整数m和n,求其最大公约数和最小公倍数 说明: (1)最大公约数:能够被m和n同时整除的最大正整数(2)最小公倍数:m和n相乘的积除以最大公约数 (3)使用for循环,将m和n同时除以1到m(m为m和n两者中较小者),直到找出最大的正整数即为最大公约数(4)输出格式如下: The greatest common divisor is *! The least common multiple is *!参考程序如下: #include printf(“input m,n:”); scanf(“%d,%d”,&m,&n);if(m>n){ temp=m;m=n; n=temp;} for(i=1;i<=m;i++){ if(n%i==0 && m%i==0) great=i;} least=m*n/great;printf(“The greatest common divisor is %dn”,great);printf(“The least common multiple is %dn”,least);} 4.打印出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本书。例如,153是一水仙花数,因为153153 说明:(1)“水仙花数”是三位数,所以范围是从100到999(2)使用for循环 (3)循环中需要把数字的每一位都分离出来,然后求和,同原数字比较,进行判断 参考程序如下: #include int i;int temp;for(i=100;i<1000;i++){ a=i/100;b=(i-a*100)/10;c=i%10;temp=a*a*a+b*b*b+c*c*c;if(i==temp)printf(“%dn”,i); 33} } 实验五 函数 【实验目的】 1.掌握C语言函数的定义、声明以及函数的调用方法 2.了解主调函数和被调函数之间的参数传递方式 3.熟练掌握数组作为函数参数的用法 【实验内容】 1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。说明: (1)判断素数的函数名为Prime(2)传递参数为int类型的变量(3)输出格式为: * is a prime!或者* is not a prime!参考程序如下: #include if(num%i==0) { } flag=1;break;} if(flag==0)printf(“%d is a prime!n”,num);else printf(“%d is not a prime!n”,num);} main(){ int num;printf(“input a num:”);scanf(“%d”,&num);Prime(num);} 2.写一个函数,用“冒泡法”对输入的10个数字由小到大顺序排列,并输出。说明: (1)排序的函数名为Sort(2)排序前后的输入输出都应在主函数中完成(3)使用数组作为函数参数(4)使用“冒泡法”排序 参考程序如下: #include } } main(){ int num[10];int i;printf(“input 10 numbers:”);for(i=0;i<10;i++) scanf(“%d”,&num[i]);Sort(num);printf(“the sorted numbers:”);for(i=0;i<10;i++) printf(“%d ”,num[i]);} 3.写一函数,使给定的一个二维数组(5×5)转置,即行列互换。说明: (1)使用5×5的二维数组存放数据 (2)矩阵转置的函数名为Turn(2)转置前后的输入输出都应在主函数中完成(3)使用数组作为函数参数 for(j=0;j<9-i;j++){ } if(num[j]>num[j+1]){ temp=num[j]; } num[j]=num[j+1];num[j+1]=temp;18 参考程序如下: #include } } main(){ int num[5][5]={{1,2,3,4,5},{6,7,8,9,0},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}}; int i,j;printf(“Before array be turned:n”);for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%2d ”,num[i][j]);for(j=i;j<5;j++){ } temp=num[i][j];num[i][j]=num[j][i];num[j][i]=temp; printf(“n”);} Turn(num);printf(“After array be turned:n”);for(i=0;i<5;i++){ } } 4.写一函数,使输入的字符串反序存放,在主函数中输入和输出字符串。说明: (1)字符串反序的函数名为Reverse(2)反序前后的输入输出都应在主函数中完成(3)使用数组作为函数参数 for(j=0;j<5;j++)printf(“%2d ”,num[i][j]);printf(“n”);19(4)需要使用strlen函数得到字符串长度,需要在源文件头部加入#include #include } } main(){ char str[50];printf(“input a string:”);scanf(“%s”,str);Reverse(str);printf(“After reversed is %sn”,str);} 5.写一函数,将两个字符串连接。 说明: (1)连接两个字符串的函数名为:Connect(2)将连个字符串存入两个字符串数组中,要保证第一个字符串的长度能够容纳两个字符串之和 (3)连接两个字符串主要是找到第一个字符串的结尾,然后将第二个字符串连接到第二个字符串的后边 (4)输出格式为: The connected string is *!(5)使用数组作为函数参数 (6)连接前后的字符串输出都要在主函数中完成,自定义函数只完成连接功能 参考程序如下: #include str1[i]=str2[j];str1[i]=' ';} main(){ char str1[50],str2[20];int i,j;printf(“input string1:”);scanf(“%s”,str1);getchar();printf(“input string2:”);scanf(“%s”,str2);Connect(str1,str2);printf(“The connected string is %sn”,str1);} 6.写一函数,求字符串的长度,并编写主函数。说明: (1)求字符串长度的函数名为:Count(2)字符串结束的标志是’ ’(3)输出格式为: The length of string is *!(4)使用数组作为函数参数 参考程序如下: #include 实验六 指针 【实验目的】 1.掌握C语言指针变量的定义、声明和赋值 2.学会使用指针变量的程序设计 3.掌握指针作为函数参数的用法 【实验内容】 1.使用指针作为函数参数,写一交换两个数的函数 说明: (1)交换两个数的函数名为:Swap(2)使用指针变量作为函数参数 (3)在主函数中输入输出,自定义函数只完成交换功能 参考程序如下: #include 2.使用指针作为函数参数,写一求数组中最大值和最小值的函数。说明: (1)函数名为:MaxAndMin(2)使用指针指向一维数组 (3)最大值和最小值的输出必须要在主函数中 参考程序如下: #include *max=array[0];*min=array[0];for(i=0;i<10;i++){ if(*max } } main(){ int array[10]={0,1,2,3,4,5,6,7,8,9};int max,min;int *p1,*p2;p1=&max;p2=&min;MaxAndMin(array,p1,p2);printf(“max=%dnmin=%dn”,max,min);} 3.找出以下程序的错误,并加以修改。①交换两个数 #include temp=p1; p1=p2; p2=temp;} main(){ int a,b;int *pointer_1,*pointer_2; scanf(“%d,%d”,&a,&b); pointer_1=&a;pointer_2=&b;Swap(pointer_1,pointer_2); } ②输出数组重点全部元素 #include *p++=i; for(i=0;i<10;i++) printf(“a[%d]=%dn”,i,*p++);} 4.写一函数,求出矩阵中的最大值和最小值,要求使用指针作为函数参数。说明: (1)使用二维数组存放矩阵元素(2)只用指针变量指向数组(3)函数名为:ArrayMaxAndMin 参考程序如下: #include *min=*(array+i*n+j);for(i=0;i } if(*max<*(array+i*n+j))*max=*(array+i*n+j);if(*min>*(array+i*n+j))*min=*(array+i*n+j); } } main(){ int array[3][3]={1,2,3,4,5,6,7,8,9};int max,min;int *p,*p1,*p2;p=array;p1=&max;p2=&min;ArrayMaxAndMin(p,p1,p2,3);printf(“max=%dnmin=%dn”,max,min);} 实验七 数组 【实验目的】 1.掌握一维数组和二维数组的定义、赋值和初始化的方法 2.掌握字符数组的使用 3.熟练掌握与数组相关的各种算法 【实验内容】 1.从键盘输入10个整数,对这个十个数进行排序,并输出 说明: (1)将这10个整数存入一个含有10个元素的一维数组中 (2)冒泡法:从第一个数开始依次让相邻的两个数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍比较后,最大的数已放在最后,第二遍只需考虑剩下的数,以此类推直到最后两个数比较后就可以完成排序。(3)比较完成后将数组中元素依次输出 参考程序如下: #include scanf(“%d”,&num[i]);for(i=0;i<=8;i++){ for(j=0;j<9-i;j++){ if(num[j]>num[j+1]){ temp=num[j];num[j]=num[j+1];num[j+1]=temp; } } } printf(“the sorted numbers:”);printf(“%d ”,num[i]);for(i=0;i<10;i++) } 2.从键盘输入一串字符串,统计字符串中特定字符的个数(特定字符也需要从键盘输入),并输出个数 说明: (1)输入时需要用到的输入格式控制字是%s(2)字符串存入一个足够大的字符数组中,保证输入的字符个数不要超过最大个数(3)使用循环控制语句,需要了解字符数组的结束标志是’ ’,作为循环的结束标志(4)输出格式如下: The number of * is *!参考程序如下: #include { if(str[i]==ch)count++;i++;} printf(“The number of %c is %d!n”,ch,count);} 注意: 程序中多了一行getchar(),这并不是多余的,而是因为在输入完字符串后,键入的回车被放入到内存的输入缓冲区中,在输入特殊字符的时候ch得到了上一个回车,而无法得到我们要输入的字符,因此需要使用一行getchar()将缓冲区中的回车读出,相当于清除缓冲区的作用。 3.青年歌手参加歌曲大奖赛,有10个评委进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。 说明: (1)将10位评委的打分放入一个含有10个元素的一维数组中(2)程序设计重点是排序 (3)排序后只要用中间的8个元素即可(4)输出格式为: The average is *!参考程序如下: #include scanf(“%f”,&score[i]);for(i=0;i<=8;i++){ for(j=0;j<9-i;j++){ if(score[j]>score[j+1]){ } temp=score[j];score[j]=score[j+1];score[j+1]=temp;} } for(i=1;i<=8;i++){ sum=sum+score[i]; } average=sum/8;printf(“The average is %f!n”,average);} 4.将两个字符串连接起来,不要使用strcat函数。 说明: (1)将连个字符串存入两个字符串数组中,要保证第一个字符串的长度能够容纳两个字符串之和 (2)连接两个字符串主要是找到第一个字符串的结尾,然后将第二个字符串连接到第二个字符串的后边 (3)输出格式为: The connected string is *!参考程序如下: #include printf(“input string1:”);scanf(“%s”,str1);getchar();printf(“input string2:”);scanf(“%s”,str2);for(i=0;str1[i]!=' ';i++);for(j=0;str2[j]!=' ';j++,i++) str1[i]=str2[j];str1[i]=' ';printf(“The connected string is %sn”,str1);} 5.已有一个已排好序的数组,从键盘输入一个数,要求按原来排序的规律将它插入数组中。说明: (1)需要保证数组的元素据个数比插入前多1(2)需要找到在数组中插入的位置 (3)可倒序查找:假设从小到大排序,从最后一个开始查找,如果要插入元素比当前数组元素小则将该数组元素赋予后边一个元素,继续比较;否则将要插入元素赋予该数组元素的下一个元素,然后break结束循环(4)输入该数组即可 参考程序如下: #include if(a[i]>b)a[i+1]=a[i];else { } a[i+1]=b;break;} printf(“The new sorted array is ”);for(i=0;i<10;i++) } printf(“%d ”,a[i]);6.将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1,要求改为1,4,5,6,8。说明: (1)只要将原来数组中的值以中间值为中心交换 n1(2)交换次数为2次 (3)注意此时的n是数组最后一个元素的下标 参考程序如下: #include temp=num1[i]; num1[i]=num1[9-i];num1[9-i]=temp;} for(i=0;i<(8+1)/2;i++){ temp=num2[i];num2[i]=num2[8-i];num2[8-i]=temp; } printf(“The converted array1 is ”);for(i=0;i<10;i++) printf(“%d ”,num1[i]);printf(“nThe converted array2 is ”);for(i=0;i<9;i++) printf(“%d ”,num2[i]);} 7.求一个3×3矩阵的对角线元素之和 说明: (1)使用3×3的二维数组存储数据 (2)使用for循环嵌套,判断数组中元素是否是对角线元素,如果是则相加(3)对角线元素的特点是行号和列号相同 参考程序如下: #include int array[3][3]={1,2,3,4,5,6,7,8,9};int sum=0;int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++){ } if(i==j)sum=sum+array[i][j];{ } printf(“summary is %dn”,sum);} 8.设计一个较为复杂的一维数组操作程序,实现对一维数组的基本操作 说明: (1)通过输入函数实现对一维数组的输入,可以将数组定义为100个整型元素,输入其中的10个元素 (2)在屏幕上将数组中的10个元素输出 (3)往数组中插入一个元素,并将插入后的11个元素输出(4)从数组中删除一个元素,并将删除后的10个元素输出 (5)从数组中查找一个元素,并将查找后的元素下标输出,如果元素不存在,给出提示 参考程序如下: #include int a[100],i,j;int ins,del,find,pos;printf(“input the data: ”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“The array is ”);for(i=0;i<10;i++)printf(“%d ”,a[i]);printf(“ninsert a data: ”);scanf(“%d”,&ins);for(i=0;i<10;i++){ if(ins for(j=9;j>=i;j--)a[j+1]=a[j];a[i]=ins;break; } } if(i==10) a[i]=ins;printf(“nAfter insert: ”);for(i=0;i<11;i++)printf(“%d ”,a[i]);printf(“ndelete a data: ”);scanf(“%d”,&del);for(i=0;i<11;i++){ if(del==a[i]) { for(j=i;j<10;j++) a[j]=a[j+1];break; } } if(i==11) printf(“nnot foundn”);else { printf(“nAfter delte: ”); for(i=0;i<10;i++)printf(“%d ”,a[i]);} printf(“nfind a data: ”);scanf(“%d”,&find);for(i=0;i<10;i++){ if(find==a[i]) { pos=i; break; } } if(i==10) printf(“nnot foundn”);else printf(“npos=%dn”,pos+1);} 实验八 结构体 【实验目的】 1.掌握C语言结构体变量的定义和使用 2.学会设计简单的结构体程序 【实验内容】 1.有一学生信息包含学号、姓名、性别、年龄、电话等信息,要求设以一个结构体用于存储该学生信息,实现学生信息的输入和显示。说明: (1)使用结构体实现学生信息的存储(2)按照序号顺序排列学生信息(3)实现按照序号查找学生信息 参考程序如下: #include if(i==0)printf(“The first onen”);if(i==1)printf(“The second onen”);if(i==2)printf(“The third onen”);printf(“ input number:”);scanf(“%s”,stu[i].num);printf(“ input name:”);scanf(“%s”,stu[i].name);printf(“ input sex:”);scanf(“%s”,stu[i].sex);printf(“ input age:”);scanf(“%d”,&stu[i].age); } printf(“Which one do you want to see?(1,2,3)”);scanf(“%d”,&choice);choice--;printf(“ The number is %sn”,stu[choice].num);printf(“ The name is %sn”,stu[choice].name);printf(“ The sex is %sn”,stu[choice].sex);printf(“ The age is %dn”,stu[choice].age);} 一、实验目的学会使用单片机定时器产生定时中断,并利用定时中断产生更长时间延时。 二、实验设备及器件 IBM PC机 一台 DP-51PRO.NET单片机仿真器、编程器、实验仪三合一综合开发平台 三、实验内容 1.实验二 定时器程序设计 2.编写程序,使P10端口来控制LED闪烁 3.C语言程序 //1ms定时中断实现100ms发光管闪烁 #include“REG51.h” sbit LED=P1^0;void main(void){ TMOD = 0x01;//设置定时器模式 16位定时器 TL0 = 0x18;//设置定时初值 TH0 = 0xFC;//设置定时初值 TR0 = 1;//定时器T0开始计时 ET0=1;//开定时器中断 EA=1; //开总中断 while(1);} //******************** //1ms void pit0(void)interrupt 1(中断程序){ static unsigned char ms_cnt=0;//16 ffff TL0 = 0x18;//设置定时初值 TH0 = 0xFC;//设置定时初值 if(++ms_cnt==100){ ms_cnt=0; LED=!LED;} } 定时器的由程序 直接汇编语言 ORG 0 AJMP MAIN ORG 0BH AJMP PIT0 MAIN: MOV TMOD,#01H MOV TH0,#18H MOV TL0,#0FCH SETB TR0 SETB ET0 SETB EA SJMP $ 生成;********************************** PIT0: MOV TH0,#18H MOV TL0,#0FCH INC R7 CJNE R7,#100,PIT0_R MOV R7,#0 CPL P1.0 PIT0_R: RETI END 四 实验要求 学会使用并掌握单片机定时器中断来实现LED100ms闪烁。 五 实验步骤 1.调试运行本节实验程序。若程序无错误,编译并进行二进制转换,下载程序。 2.连接线路,将A2区的P10端口连接到D1区的任意LED接口。3.观察LED灯闪烁情况第二篇:单片机实验9 多分支程序设计
第三篇:《C程序设计》实验教案
第四篇:C语言程序设计实验教案
第五篇:实验二 定时器程序设计121