1、C语言程序设计试验指导书课程编号: 课程名称:C语言程序设计 试验课时: 44 一、本试验课性质、任务和目标本试验课目标是使学生掌握C语言编程常见方法,熟悉该语言中语法、词法规则,为以后进行软件开发和学习后继专业课程打下基础。经过学习能够利用C语言中各个知识点编写能完成一定功效程序。训练学生进行复杂程序设计技能和培养良好程序设计习惯,其关键程度决不亚于知识传授。把高级语言学习和程序设计、上机实践紧密地结合起来,以提升学生能灵活利用新知识分析问题和处理问题能力。二、本试验课所依据课程基础理论本试验课基于C语言语法和词法规则、数据表示及算法处理,而语法及算法正是高级语言程序设计关键研究对象。C语言
2、程序设计关键任务是:C 语言是一个应用广泛结构化程序设计语言,本课程介绍C语言基础概念、基础语法和编程方法,关键描述C语言结构化特征,并经过本课程学习,使学生掌握一定结构化程序设计知识,和用C语言编写程序能力。三、试验类型和要求在做每个试验之前,让学生对此次试验相关内容进行预习、算法设计、步骤图设计、编写程序,做好试验准备工作;写出预习汇报,画出步骤图,要求独立完成。说明:1、试验类型:设计性; 2、试验要求:必做。四、每组人数和试验课时数每组1人,试验课时数44课时。五、考评方法和评分措施 试验总成绩=出勤情况*10%+试验汇报*20%+平时*30%+试验表现*40%六、本试验课配套教材或试
3、验指导书谭浩强. C程序设计. 北京:清华大学出版社 ,3月第3版谭浩强. C程序设计题解和上机指导. 北京:清华大学出版社 ,3月第3版谭浩强. C程序设计试题汇编. 北京:清华大学出版社 ,3月第2版夏宽理. C语言程序设计. 北京:中国铁道出版社,2月第1版夏宽理. C语言程序设计上机指导和习题解答. 北京:中国铁道出版社,2月第1版王士元. C高级实用程序设计. 北京:清华大学出版社,1996年1月第1版七、试验汇报要求在机器上交作业,每次试验成绩分为优、良、及格、不及格,未参与为0分。要求认真书写试验汇报。试验汇报编写要求:1试验题目2试验要求3程序步骤图4调试过程(试验过程出现问题
4、、处理方法)5程序代码及运行结果。八、试验内容试验一:C语言运行环境认识和简单C程序【目标和要求】 1、了解TC环境下C语言运行环境,熟悉编译系统操作环境。2、了解在该系统上怎样编辑、编译、连接和运行一个C程序。3、经过运行简单C程序,初步了解C源程序特点。4、掌握和了解C程序中最基础C语句。【试验内容】1、题目:由键盘输入两个整数,计算并输出两个数之和。2、程序以下: #include “stdio.h” void main() int a,b,sum;printf(“Please input two integer numbers:n”);scanf(“%d%d”,&a,&b);sum=a
5、+b;printf(“%d+%d=%d”,a,b,sum); 3、具体操作: (1)输入程序,然后进行编译连接。若在编译中有词法或语法错误,则依据提醒进行修改,再进行调试,直到没有语法错误。 (2)运行程序,依下列不一样方法输入数据,查看程序实施结果。 12_ 34 12 34 1234 【试验分析和讨论】 1、总结C程序基础结构和书写规则。2、分析调试过程中常见错误提醒和处理策略。试验二:C语言程序单步调试试验三:选择结构程序设计【目标和要求】 1、了解三种基础数据类型定义。2、掌握多种不一样运算符及其对应表示式使用。3、熟练掌握if语句和switch语句使用【试验内容】一、判定方程ax2+
6、bx+c=0有多个解,若有,则输出其解。 1、算法分析:对于方程ax2+bx+c=0解,存在以下情况:a=0,不是一元二次方程;b2-4ac=0,有两个相等实根;b2-4ac0,有两个不等实根;b2-4ac0) x1=(-b+sqrt(d)/(2*a) x2=(-b-sqrt(d)/(2*a) else x1=(-b+sqrt(-d)i)/(2*a) x2=(-b-sqrt(-d)i)/(2*a)2、程序代码:#include “stdio.h” #include “math.h”void main() float a,b,c,x1,x2,d; printf(“请输入ax2+bx+c=0方程三
7、系数值:”); scanf(“%f%f%f”,&a,&b,&c); if (abs(a)=1e-6) /a=0 printf(“该方程非一元二次方程.n”); else d=sqr(b)-4*a*c;if (abs(d)1e-6) x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a);printf(“该方程两个不等实根为:x1=%4.2f,x2=%4.2f”,x1,x2);else / sqr(b)-4*a*c0 printf(“该方程两个复数根为:x1=%4.2f+%4.2fi,x2=%4.2f-%4.2fi” ,-b/(2*a),sqrt(-d)/(2*a),
8、 -b/(2*a),sqrt(-d)/(2*a); 二、简单菜单程序设计。假设要求设计一菜单以下: 主 菜 单 1-汉字 2-拼音 3-英文1、算法分析:(1) 依据要求使用输出语句将上述菜单输出,提醒按要求选择。(2) 利用if语句或switch语句,编写分支结构。2、程序代码:#include “stdio.h”void main() int i; printf(“nnn=主 菜 单=n”); printf(“ (中 国)”) printf(“ 1-汉字n”); printf(“ 2-拼音n”); printf(“ 3-英文n”); printf(“请选择:”); scanf(“%d”,&
9、i); switch(i) case 1:printf(“ 中 国n”);break;case 2:printf(“ Chinan”);break;case 3:printf(“ Zhong guon”);break; 【课后练习】1、判定十二个月份是不是闰年。2、从键盘上输入1-7之间数字,输出表示一个星期中对应某一天英文单词。【试验分析和讨论】 1、总结分支选择结构设计方法和技巧。2、掌握简单菜单设计。试验四:循环结构程序设计【目标和要求】 1、掌握三种循环语句在编程中使用。2、了解break语句和continue语句在循环结构中不一样作用。3、了解循环嵌套,学会穷举算法和迭代算法。【试验
10、内容】一、输入两个正整数,求出它们最大条约数和最小公倍数。1、算法分析: 辗转相除法对于两个数m和n,将大数放在m中,小数放在n中,用n去除m,若余数为0,则n为最大条约数,不然将n作为m,余数作为n,再用n去除m,直到余数为0,则n为最大条约数。2、程序代码: #include “stdio.h” #include “math.h” void main() int m,n,t,max,min;printf(“请输入两个正整数:”);scanf(“%d%d”,&m,&n); min=m*n;if (mn) t=n;n=m;m=t;while(n!=0)t=m%n;m=n;n=t;printf(
11、“最大条约数为:%dn”,m);printf(“最小公倍数为:%dn”,min/m);二、将一张100元钱,换成10元,20元,50元零钱,问有多少种不一样换法(假设三种零钱每种全部可不出现)。1、算法分析 利用穷举算法实现:考虑到三种零钱多种能够不出现,则各自张数范围以下: 10元-0张 到 10张 20元-0张 到 5张 50元-0张 到 2张 而且要考虑到共数只有一张100元票子。2、程序代码: #include stdio.h void main() int Tencount,Twecount,Fifcount,i=0; for(Tencount=0;Tencount=10;Tenco
12、unt+) for(Twecount=0;Twecount=5;Twecount+) for(Fifcount=0;Fifcount=2;Fifcount+) if (Tencount*10+Twecount*20+Fifcount*50=100) printf(第%d种换法为:10元 %d张 20元 %d张 50元 %d张n,+i,Tencount,Twecount,Fifcount); 【课后练习】 *1、求1100之间,能被5整除数之和。 * * *2、判定任一个数是否是质数。 * * * * *3、输出一有规则图形,如右图。 * * * *【试验分析和讨论】 1、分析总结for语句,w
13、hile语句,do-while语句使用方法。2、巧用break语句和continue语句。试验五: 数组及其应用【目标和要求】 1、掌握一维数组和二维数组使用。2、掌握字符数组和字符串区分和使用。3、熟练掌握和数组相关算法(选择排序和冒泡排序、查找和插入)。【试验内容】一、输入一个整数,将其插入一含有9个数有序序列中,确保插入后其仍然有序,。 1、算法分析:将待插入数和序列中每个数进行比较,找到其插入具体位置i; 将从第i个数组元素开始,一直到原数组中最终一个元素,整体往后移,空出一空间来存放待插入整数。 2、程序代码: #include stdio.h void main() int a10
14、=2,5,7,11,14,19,21,33,67,i,k,m; printf(“原数组为:”); for(i=0;i9;i+) printf(“%4d”,ai); printf(“n请输入待插入整数:”); scanf(“%d”,&m); for(i=0;i9;i+) if (m=i;k-) ak=ak-1; /移位,准备插入新整数ai=m; printf(“新数组为:”); for(i=0;i10;i+) printf(“%4d”,ai);二、编程实现:将字符串str2连接到字符串str1 后,组成新字符串str1。 1、算法分析: 本程序即实现字符串处理函数strcat()功效。两字符串s
15、tr1和str2进行连接,要注意是字符串结束标志。 2、程序代码: #include stdio.h #include string.h void main() char str140,str220,i,j,len1,len2; printf(请输入字符串str1:); gets(str1); len1=strlen(str1); printf(请输入字符串str2:); gets(str2); len2=strlen(str2); for(i=len1,j=0;jlen2;i+,j+) str1i=str2j;str1i=0; printf(新字符串str1为:); puts(str1);
16、【课后练习】1、 判定一方阵是不是对称矩阵。2、 实现两个字符串拷贝功效。3、 运行折半查找法,在一个有序序列中查找某一特定数。【试验分析和讨论】1、 分析两种基础排序算法关键和二者不一样之处。2、 在实现字符串处理函数时部分注意事宜及其实现方法。3、 讨论二维数组处理矩阵和行列式。试验六: 函数及其应用【目标和要求】 1、掌握C中函数定义、调用及设计。2、掌握函数嵌套调用、递归调用设计。3、掌握变量、函数作用域及存放类。【试验内容】一、设计一个子函数对n个整数进行排序,由主函数从键盘接收若干个数,调用子函数进行排序,并在主函数中进行输出显示。1、算法分析: 子函数设计 以两个参数来实现,一个
17、是接收主函数传来数组首地址,另一个是持排序整数个数,如fun(int a,int n); 主函数实现 定义一整型数组,从键盘上接收若干个整数,调用子函数fun,再将最终结果输出。2、程序代码:#include stdio.hvoid fun(int a,int n) / 选择排序算法 int i,j,t; for(i=0;in-1;i+) for(j=i+1;jaj) t=ai;ai=aj;aj=t;void main() int a10,i; for(i=0;i10;i+) scanf(%d,&ai); printf(输入数值序列为:); for(i=0;i10;i+) printf(%4d
18、,ai); printf(n); fun(a,10); printf(输入数值序列为:); for(i=0;i10;i+) printf(%4d,ai); 二、输入任意两数m,n值,输出下列表示式值。 S= 1、算法分析 编写一函数fac(n), 返回n!值。 编写主函数,从键盘输入m,n值,调用上述fac()函数,计算表示式值,并将其输出。 2、程序代码 #include “stdio.h” long fac(int n)if (n=1) return 1; else return n*fac(n-1);void main()int m,n,t; float s;printf(“please
19、 input 2 integer numbers:”);scanf(“%d%d”,&m,&n);if(mn) t=m;m=n;n=t;printf(“s=%f”,fac(m)/(fac(m-n)fac(n);【课后练习】1、 若正整数A恰好出现在其平方数右侧,则称A为一个同构数。如:5,6,76。求100以内全部同构数。要求:(1)编写一子函数int fun(int n),判定给定正整数n是不是同构数,若是,返回1,不然,返回0。(2)编写主函数,调用函数fun(),寻求并输出100以内全部同构数。(3)在输出同构数同时,要输出其平方值。2、 利用递归,求任一个字符串长度。【试验分析和讨论】1
20、、 被调函数实现及调用过程。2、 简单递归问题实现。试验七:指针及其应用 【目标和要求】 1、了解指针定义和应用。2、掌握使用指针变量程序设计。3、 了解使用函数指针程序设计。4、 了解使用指针数组程序设计。【实现内容】一、设计一程序,将两个变量值进行交换。1、 算法分析:(1)编写一个函数swap(int *p,int *q),交换两个参数指针所指数据。(2)编写主函数,调用函数swap,将两个变量值进行交换。2、 程序代码:#include “stdio.h”void swap(int *p,int *q);void main()int a,b;printf(“请输入两个整数:”);sca
21、nf(“%d%d”,&a,&b);printf(“两个数交换前次序为:a=%d,b=%d”,a,b);swap(&a,&b);printf(“两个数交换后次序为:a=%d,b=%d”,a,b);void swap(int *p,int *q)int t;t=*p;*p=*q;*q=t;二、编程实现:利用指针将字符串str2连接到字符串str1 后,组成新字符串str1。 1、算法分析: 本程序即实现字符串处理函数strcat()功效。两字符串str1和str2进行连接,要注意是字符串结束标志,并利用指向字符串指针来实现。 2、程序代码: #include stdio.h #include st
22、ring.h void main() char str120 ,str210,*p=str1,*q=str2 ,j,len1,len2; printf(请输入字符串str1:); gets(str1); len1=strlen(str1); p=p+len1-1; printf(请输入字符串str2:); gets(str2); len2=strlen(str2); for( j=0;jlen2; j+) *(+p)=*(q+);str1len1+len2=0; printf(新字符串str1为:); puts(str1); 【课后练习】1、利用指向数组指针,求一数组中全部元素之和。2、【试验
23、分析和讨论】试验八:结构体及其应用 【目标和要求】 1、了解结构体类型定义。2、掌握结构体类型变量使用。【试验内容】有10个学生,每个学生包含学号、姓名、三门课成绩,从键盘输入10个学生数据,要求输出三门课中每一门课平均成绩,和最高分学生数据。1、算法分析: 定义一个结构体类型,其中含有学号、姓名、三门课成绩、总分数据;前后依据要求处理上述问题。2、程序代码:#include stdio.htypedef struct stuint number;char name4;float len1,len2,len3;float score;student; void main() student s
24、tu10;int i,flag;float ave3,sum3=0,0,0,max=0;printf(请输入10位同学全部信息:);for(i=0;i=max) max=stui.score; flag=i; sum0+=stui.len1; sum1+=stui.len2; sum2+=stui.len3; for(i=0;i3;i+) avei=sumi/3;printf(三门课平均成绩分别为); for(i=0;i3;i+) printf(%6.2f,avei); printf(n最高分是:%d %s %6.2f %6.2f %6.2f,stuflag.number,stuflag.na
25、me,stuflag.len1, stuflag.len2, stuflag.len3);【试验分析和讨论】 13个人围成一圈,从第1个人开始次序报号1、2、3。凡报到“3”者退出圈子,找出最终留在圈子中人原来序号。试验九: 链表处理【目标和要求】 1、了解键表相关概念。2、掌握单向键表创建、编历、插入、删除等简单处理。【内容】创建一个链表。#include stdio.h#include stdlib.htypedef struct list int data;struct list *next;list;void main()list *head,*ptr;int num,i;ptr=(l
26、ist *)malloc(sizeof(list); head=ptr;printf(Please input 5 numbers:);for(i=0;idata=num;ptr-next=(list *)malloc(sizeof(list);if(i=4) ptr-next=NULL; else ptr=ptr-next;ptr=head;printf(The value is:);while(ptr!=NULL)printf(-%d,ptr-data);ptr=ptr-next;getchar();【试验分析和讨论】试验十:文件及其应用【目标和要求】 1、了解利用于文件操作库函数。2、掌
27、握对文件进行简单处理。【试验内容】有5个学生,每个学生包含学号、姓名、三门课成绩,从键盘输入5个学生数据,计算每个人平均成绩,并将原有数据及平均成绩存放于磁盘文件“stud.txt”中。1、算法分析: 先将5个学生相关信息从键盘上输入,并求出各自平均成绩;再次以写方法打开一个文件“stud.txt”,将5个学生信息全存入文件中。 2、程序代码: #include stdio.htypedef struct stuint number;char name4;float len3,ave;student; void main() student stu5; FILE *fp;int i ;prin
28、tf(请输入5位同学全部信息:);for(i=0;i5;i+) scanf(%d%s,&stui.number, stui.name); stui.ave=0; for(int j=0;j3;j+) scanf(%f,&stui.lenj); stui.ave+=stui.lenj;stui.ave/=3;fp=fopen(stud.txt,w+);for(i=0;i5;i+)fprintf(fp,%d %s %5.2f %5.2f %5.2f %5.2f, stui.number, stui.name, stui.len0,stui.len1,stui.len2,stui.ave);fclose(fp);【试验分析和讨论】 将上述问题中“stud.txt”文件中学生数据,按平均分进行排序处理,将已排序学生数据存入一新文件“stu.txt”中。