第一篇:《C程序设计》实验教案
《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 第一次试验 1.编写一个程序,求出给定半径r的圆的面积和周长,并且输出计算结果。其中: r的值由用户输入,用浮点型数据处理。 2.给一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上 为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。 3.输入两个正整数m和n,求其最大公约数和最小公倍数。 4.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 5.求sn=a+aa+aaa+…+aa...a(n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222 (此时n=5),n由键盘输入。 第二次试验 1.有一分数序列:,,23581321,...求出这个数列的前20项之和。1235813 2.求一个33矩阵对角线元素之和。 3.将一个数组中的值按逆序重新存放,例如原来的顺序为:8,6,5,4,1。要求改 为:1,4,5,6,8。 4.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格、以及其他字符的个数。 第三次实验 1.将字符串computer赋给一个字符数组,然后从第一个字母开始输出该串。请用指针实 现。 2.将无符号八进制数字字符串转换为十进制整数。例如,输入的字符串为556,则输出十 进制整数366。用指针实现。 3.编程输入一行文字,找出其中的大写字母,小写字母,空格,数字,及其他字符的个数,用指针实现。 第四次实验 1.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。 2.写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。 3.写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个 数,在主函数中输入字符串及输出上述的结果。 4.写一函数,使给定的一个二维数组(3×3)转置,即行列互换。 实验 6 字符数组和字符串函数一、二、实验学时:2课时 实验目标 1.熟悉掌握字符数组的使用。2.掌握与数组有关的算法。 三、实验要求: 1.在上实验课之前,每一个同学必须将实验的题目、程序编写完毕,做好充分的准备。 2.所有实验环节均由每位同学独立完成,严禁抄袭他人实验结果,若发现有结果雷同者,按实验课考核办法处理。 四、实验步骤和内容 【启动Visual C++】 【新建工程】 选中【C++ Source File】项,【新建源程序文件】 编辑程序 执行程序 【例5.7】gets读取字符串与puts输出字符串。/* 源文件名:Li5_7.c 功能:gets读取字符串与puts输出字符串。*/ #include /*定义s字符数组的初值*/ printf(“输入字符串”);gets(s); /*读取字符串*/ puts(s); /*输出字符串*/ printf(“读取的字符串是”%s“n”,s); /*输出s字符数组的值*/ } 1)观查执行结果,是否与教材相同。 2)思考gets()和scanf()、puts()和printf()函数在输出字符串的异同点 【例5.8】输入一组字符串,以输入空串结束输入,找出最大的字符串(设串长不超过80字符)。 /* 源文件名:Li5_8.c 功能:输入一组字符串,找出最大的字符串。*/ 可以用gets函数读取字符串,设置一个最大字符串数组smax,第一次设置smax为空串,每读一个字符串s就把它与保存在smax中的字符串比较,如s>smax则用s替换smax,不然smax保持不变,这样当所有的字符串输入完毕后,smax中存储的就是最大字符串。 #include /*定义s数组和smax数组*/ strcpy(smax, “ ”); /*设置smax数组为空,也可以设置smax[0]=‘ ‘*/ do { printf(“输入字符串:”);gets(s); /*读取字符串*/ if(strcmp(s,smax)>0) strcpy(smax,s); /*s数组比smax数组大的话,把s数组赋值个smax数组*/ }while(s[0]!=‘ ‘ puts(“最大的字符串是”);puts(smax);} 1)观查执行结果,是否与教材相同。2)重新输入不同的字符串,再查看结果 五、思考题 1)【例5.7】思考gets()和scanf()、puts()和printf()函数在输出字符串的异同点。2)【例5.5】若要找出最小字符串,该如何实现? 六、实验小结: 实验 12 位运算一、二、实验学时:2课时 实验目标 1.掌握按位运算的概念和方法,学会使用位运算符。2.学会通过位运算实现对某些位的操作。 三、实验要求: 1.在上实验课之前,每一个同学必须将实验的题目、程序编写完毕,做好充分的准备。 2.所有实验环节均由每位同学独立完成,严禁抄袭他人实验结果,若发现有结果雷同者,按实验课考核办法处理。 四、实验步骤和内容 【启动Visual C++】 【新建工程】 选中【C++ Source File】项,【新建源程序文件】 编辑程序 执行程序 1、编写一程序,检查所用的计算机系统的C编译在执行右移时是按照逻辑右移的原则,还是按照算术右移的原则进行操作。如果是逻辑右移,请编一个函数实现算术右移;如果是算术右移,请编一个函数实现逻辑右移。输入如下代码: #include “stdio.h” short ljyy(short x)//逻辑右移 { x=x>>1;x=x&(0x7fff);//最高位补零,其余保持不变 return x;} void main(){ short y;short x=-4;y=x;x=x>>1;if(x<0){ printf(“x=%dn”,x); printf(“该编译系统为算术右移!n”);} else { printf(“x=%dn”,x); printf(“该编译系统为逻辑右移!n”);} printf(“逻辑右移的结果为:”);y=ljyy(y);printf(“y=%dn”,y);} 1)编译、连接、和运行程序。程序运行后,观查屏幕显示结果。 2、编一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位为0)。函数调用形式为: getbits(value,n1,n2)value为该16位数的值,nl为欲取出的起始位,n2为欲取出的结束位。如: getbits(0101675,5,8) 表示对八进制数101675,取出其从左面起的第5位到第8位。要求把这几位数用八进制数打印出来。注意,应当将这几位数右移到最右端,然后用八进制形式输出。 【启动Visual C++】|【新建工程】|【新建源程序文件】:选中【C++ Source File】项 输入如下代码: #include “stdio.h” short getbits(short value,int n1,int n2){ short result;short temp;int k;int i;k=16-n2;result=(0x0000);value=value>>k;for(i=0;i<=(n2-n1);i++){ temp=value&(0x0001); temp=temp< result=result|temp; value=value>>1; } return result;} void main(){ short x;short y;x=0101675;y=getbits(x,5,8);printf(“y=0%on”,y);} 1)编译、连接、和运行程序。程序运行后,观查屏幕显示结果。 3、设计一个函数,使给出一个数的原码,能得到该数的补码。 要求用八进制形式输入和输出。 【启动Visual C++】|【新建工程】|【新建源程序文件】:选中【C++ Source File】项 输入如下代码: #include “stdio.h” short buma(short x){ if(x>0) return x;else { x=-x; x=~x+(0x0001); x=x|(0x8000);} return x;} void main(){ short x;printf(“请用八进制的形式输入变量x的值:”);scanf(“%o”,&x);printf(“补码为:%on”,buma(x));} 1)编译、连接、和运行程序。程序运行后,观查屏幕显示结果。 五、思考题 1)用程序实现原码,反码和补码的相互转化 六、实验小结: 实验10 字符串的指针和函数的指针一、二、实验学时:2课时 实验目标 1.学会使用字符串的指针和指向字符串的指针变量; 2.学会使用指向函数的指针变量; 3.了解指向指针的指针的概念及其使用方法。 三、实验要求: 1.在实验课前,每位同学必须将预习有关数组与函数的内容,了解他们的关系; 2.在上实验课之前,每一个同学必须将实验的题目、程序编写完毕,做好充分的准备。 3.所有实验环节均由每位同学独立完成,严禁抄袭他人实验结果,若发现有结果雷同者,按实验课考核办法处理。 四、实验步骤和内容 1.分析下列程序的运行结果,并上机验证。1)int ff(char *x){ char *p=x, *q;int i, k=1;q = p+strlen(x)-1;for(i=1;i<=strlen(x)/2;i++)if(*p==*q){ p++;q--;} else { k=0;break;} return k;} 若从键盘输入asdfghgfdsa则输出结果为:______________________ 若从键盘输入aweftfew 则输出结果为:______________________ void main(){ char a[80];gets(a);if(ff(a)==1)printf(“*****n”);else printf(“%%%n”);} 用户自定义函数的功能是:___________ 2.以下是求三个数中的最大数的程序,试完成程序。void cut(int *p, int *q){ int t;t=*p;___________;*q=t;} void main(){ int a, b, c;scanf(“%d%d%d”, &a, &b, &c);if(a第二篇:C语言程序设计实验
第三篇:C程序设计教案(第5章 实验6)
第四篇:C程序设计教案(第9章 实验 12次)
第五篇:C程序设计教案(第7章 实验10)