还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《C语言程序设计》实验指导书课程编号课程名称C语言程序设计实验学时44
一、本实验课的性质、任务与目的本实验课目的是使学生掌握C语言编程的常用方法,熟悉该语言中的语法、词法规则,为以后进行软件开发和学习后继专业课程打下基础通过学习能够运用C语言中的各个知识点编写能完成一定功能的程序训练学生进行复杂程序设计的技能和培养良好程序设计的习惯,其重要程度决不亚于知识的传授把高级语言的学习与程序设计、上机实践紧密地结合起来,以提高学生能灵活运用新的知识分析问题和解决问题的能力
二、本实验课所依据的课程基本理论本实验课基于C语言的语法和词法规则、数据的表示及算法的处理,而语法及算法正是高级语言程序设计的主要研究对象《C语言程序设计》的主要任务是C语言是一种应用广泛结构化程序设计语言,本课程介绍C语言的基本概念、基本语法和编程方法,重点描述C语言的结构化的特征,并通过本课程的学习,使学生掌握一定的结构化程序设计的知识,以及用C语言编写程序的能力
三、实验类型与要求在做每个实验之前,让学生对本次实验相关的内容进行预习、算法设计、流程图的设计、编写程序,做好实验的准备工作;写出预习报告,画出流程图,要求独立完成说明
1、实验类型设计性;
2、实验要求必做
四、每组人数与实验学时数每组1人,实验学时数44学时
五、考核方式与评分办法实验总成绩=出勤情况*10%+实验报告*20%+平时*30%+实验表现*40%
六、本实验课配套教材或实验指导书谭浩强.C程序设计.北京清华大学出版社,2006年3月第3版谭浩强.C程序设计题解与上机指导.北京清华大学出版社,2006年3月第3版谭浩强.C程序设计试题汇编.北京清华大学出版社,2006年3月第2版夏宽理.C语言程序设计.北京中国铁道出版社,2006年2月第1版夏宽理.C语言程序设计上机指导与习题解答.北京中国铁道出版社,2006年2月第1版王士元.C高级实用程序设计.北京清华大学出版社,1996年1月第1版
七、实验报告要求在机器上交作业,每次实验成绩分为优、良、及格、不及格,未参加的为0分要求认真书写实验报告实验报告编写要求1.实验题目2.实验要求3.程序流程图4.调试过程(实验过程出现的问题、解决的方法)5.程序代码及运行结果
八、实验内容实验一C语言运行环境的认识与简单的C程序【目的与要求】
1、了解TC环境下C语言的运行环境,熟悉编译系统的操作环境
2、了解在该系统上如何编辑、编译、连接和运行一个C程序
3、通过运行简单的C程序,初步了解C源程序的特点
4、掌握和理解C程序中最基本的C语句【实验内容】
1、题目由键盘输入两个整数,计算并输出两个数之和
2、程序如下#include“stdio.h”voidmain{intabsum;printf“Pleaseinputtwointegernumbers:\n”;scanf“%d%d”ab;sum=a+b;printf“%d+%d=%d”absum;}
3、具体操作
(1)输入程序,然后进行编译连接若在编译中有词法或语法错误,则根据提示进行修改,再进行调试,直到没有语法错误
(2)运行程序,依下列不同的方式输入数据,查看程序执行结果
①12_34↙
②12↙34↙
③12Tab34↙【实验分析与讨论】
1、总结C程序的基本结构和书写规则
2、分析调试过程中常见的错误提示和解决策略实验二C语言程序的单步调试实验三选择结构的程序设计【目的与要求】
1、了解三种基本数据类型的定义
2、掌握各种不同运算符及其对应的表达式的使用
3、熟练掌握if语句和switch语句的使用【实验内容】
一、判断方程ax2+bx+c=0有几个解,若有,则输出其解
1、算法分析对于方程ax2+bx+c=0的解,存在以下情况
①a=0不是一元二次方程;
②b2-4ac=0有两个相等的实根;
③b2-4ac0有两个不等的实根;
④b2-4ac0有两个共轭复根1定义变量abcx1x2d2输入abc3ifa==0不是一元二次方程elsed=b2-4ac根据d的取值,输出方程根的情况ifb2-4ac==0x1=x2=-b/2*aelseifb2-4ac0x1=-b+sqrtd/2*ax2=-b-sqrtd/2*aelsex1=-b+sqrt-di/2*ax2=-b-sqrt-di/2*a
2、程序代码#include“stdio.h”#include“math.h”voidmain{floatabcx1x2d;printf“请输入ax2+bx+c=0方程三系数值”;scanf“%f%f%f”abc;ifabsa=1e-6//a==0printf“该方程非一元二次方程.\n”;else{d=sqrb-4*a*c;ifabsd=1e-6//sqrb-4*a*c==0printf“该方程的两个相等实根为x1x2=%
4.2f”-b/2*a;elseifabsd1e-6{x1=-b+sqrtd/2*a;x2=-b-sqrtd/2*a;printf“该方程的两个不等实根为x1=%
4.2fx2=%
4.2f”x1x2;}else//sqrb-4*a*c0printf“该方程的两个复数根为x1=%
4.2f+%
4.2fix2=%
4.2f-%
4.2fi”-b/2*asqrt-d/2*a-b/2*asqrt-d/2*a;}}
二、简单的菜单程序设计假设要求设计一菜单如下主菜单1--------汉字2--------拼音3--------英文
1、算法分析
(1)根据要求使用输出语句将上述菜单输出,提示按要求选择
(2)运用if语句或switch语句,编写分支结构
2、程序代码#include“stdio.h”voidmain{inti;printf“\n\n\n========主菜单========\n”;printf“中国”printf“1------汉字\n”;printf“2------拼音\n”;printf“3------英文\n”;printf“请选择”;scanf“%d”i;switchi{case1:printf“中国\n”;break;case2:printf“China\n”;break;case3:printf“Zhongguo\n”;break;}}【课后练习】
1、判断一年份是不是闰年
2、从键盘上输入1-7之间的数字,输出表示一个星期中对应某一天的英文单词【实验分析与讨论】
1、总结分支选择结构的设计方法与技巧
2、掌握简单菜单的设计实验四循环结构的程序设计【目的与要求】
1、掌握三种循环语句在编程中的使用
2、理解break语句和continue语句在循环结构中的不同作用
3、了解循环的嵌套,学会穷举算法与迭代算法【实验内容】
一、输入两个正整数,求出它们的最大公约数与最小公倍数
1、算法分析[辗转相除法]对于两个数m和n,将大数放在m中,小数放在n中,用n去除m,若余数为0,则n为最大公约数,否则将n作为m,余数作为n,再用n去除m,直到余数为0,则n为最大公约数
2、程序代码#include“stdio.h”#include“math.h”voidmain{intmntmaxmin;printf“请输入两个正整数”;scanf“%d%d”mn;min=m*n;ifmn{t=n;n=m;m=t;}whilen!=0{t=m%n;m=n;n=t;}printf“最大公约数为%d\n”m;printf“最小公倍数为%d\n”min/m;}
二、将一张100元钱,换成10元,20元,50元零钱,问有多少种不同的换法(假设三种零钱每种都可不出现)
1、算法分析运用穷举算法实现考虑到三种零钱各种可以不出现,则各自的张数范围如下10元--------0张到10张20元--------0张到5张50元--------0张到2张并且要考虑到共数只有一张100元票子
2、程序代码#includestdio.hvoidmain{intTencountTwecountFifcounti=0;forTencount=0;Tencount=10;Tencount++forTwecount=0;Twecount=5;Twecount++forFifcount=0;Fifcount=2;Fifcount++ifTencount*10+Twecount*20+Fifcount*50==100printf第%d种换法为10元%d张20元%d张50元%d张\n++iTencountTwecountFifcount;}【课后练习】*
1、求1—100之间,能被5整除的数之和***
2、判断任一个数是否是质数*****
3、输出一有规则的图形,如右图****【实验分析与讨论】
1、分析总结for语句,while语句,do-while语句的用法
2、巧用break语句和continue语句实验五数组及其应用【目的与要求】
1、掌握一维数组与二维数组的使用
2、掌握字符数组与字符串的区别与使用
3、熟练掌握与数组有关的算法(选择排序与冒泡排序、查找与插入)【实验内容】
一、输入一个整数,将其插入一含有9个数的有序序列中,确保插入后其仍然有序,
1、算法分析
①将待插入的数与序列中的每个数进行比较,找到其插入的具体位置i;
②将从第i个数组元素开始,一直到原数组中的最后一个元素,整体往后移,空出一空间来存储待插入的整数
2、程序代码#includestdio.hvoidmain{inta
[10]={257111419213367}ikm;printf“原数组为”;fori=0;i9;i++printf“%4d”a[i];printf“\n请输入待插入的整数”;scanf“%d”m;fori=0;i9;i++ifm=a[i]break;//查找待插入的位置fork=9;k=i;k--a[k]=a[k-1];//移位,准备插入新的整数a[i]=m;printf“新数组为”;fori=0;i10;i++printf“%4d”a[i];}
二、编程实现将字符串str2连接到字符串str1后,构成新的字符串str
11、算法分析本程序即实现字符串处理函数strcat()的功能两字符串str1和str2进行连接,要注意的是字符串的结束标志
2、程序代码#includestdio.h#includestring.hvoidmain{charstr1
[40]str2
[20]ijlen1len2;printf请输入字符串str1:;getsstr1;len1=strlenstr1;printf请输入字符串str2:;getsstr2;len2=strlenstr2;fori=len1j=0;jlen2;i++j++str1[i]=str2[j];str1[i]=\0;printf新的字符串str1为;putsstr1;}【课后练习】
1、判断一方阵是不是对称矩阵
2、实现两个字符串拷贝的功能
3、运行折半查找法,在一个有序序列中查找某一特定的数【实验分析与讨论】
1、分析两种基本排序算法的核心与两者的不同之处
2、在实现字符串处理函数时的一些注意事宜及其实现方法
3、讨论二维数组解决矩阵与行列式实验六函数及其应用【目的与要求】
1、掌握C中函数的定义、调用及设计
2、掌握函数嵌套调用、递归调用的设计
3、掌握变量、函数的作用域及存储类【实验内容】
一、设计一个子函数对n个整数进行排序,由主函数从键盘接收若干个数,调用子函数进行排序,并在主函数中进行输出显示
1、算法分析
①子函数的设计以两个参数来实现,一个是接收主函数传来的数组首地址,另一个是持排序的整数个数,如funinta[]intn;
②主函数的实现定义一整型数组,从键盘上接收若干个整数,调用子函数fun,再将最后的结果输出
2、程序代码#includestdio.hvoidfuninta[]intn//选择排序算法{intijt;fori=0;in-1;i++forj=i+1;jn;j++ifa[i]a[j]{t=a[i];a[i]=a[j];a[j]=t;}}voidmain{inta
[10]i;fori=0;i10;i++scanf%da[i];printf输入的数值序列为;fori=0;i10;i++printf%4da[i];printf\n;funa10;printf输入的数值序列为;fori=0;i10;i++printf%4da[i];}
二、输入任意两数mn的值,输出下列表达式的值S=
1、算法分析1编写一函数facn返回n!的值2编写主函数,从键盘输入mn的值,调用上述fac函数,计算表达式的值,并将其输出
2、程序代码#include“stdio.h”longfacintn{ifn==1return1;elsereturnn*facn-1;}voidmain{intmnt;floats;printf“pleaseinput2integernumbers:”;scanf“%d%d”mn;ifmn{t=m;m=n;n=t;}printf“s=%f”facm/facm-nfacn;}【课后练习】
1、若正整数A恰好出现在其平方数的右侧,则称A为一个同构数如5,6,76求100以内的所有同构数要求
(1)编写一子函数intfun(intn),判断给定正整数n是不是同构数,若是,返回1,否则,返回0
(2)编写主函数,调用函数fun,寻找并输出100以内的所有同构数
(3)在输出同构数的同时,要输出其平方的值
2、运用递归,求任一个字符串的长度【实验分析与讨论】
1、被调函数的实现及调用过程
2、简单递归问题的实现实验七指针及其应用【目的与要求】
1、了解指针的定义与应用
2、掌握使用指针变量的程序设计
3、了解使用函数指针的程序设计
4、了解使用指针数组的程序设计【实现内容】
一、设计一程序,将两个变量的值进行交换
1、算法分析
(1)编写一个函数swapint*pint*q交换两个参数指针所指的数据
(2)编写主函数,调用函数swap将两个变量的值进行交换
2、程序代码#include“stdio.h”voidswapint*pint*q;voidmain{intab;printf“请输入两个整数”;scanf“%d%d”ab;printf“两个数交换前顺序为a=%db=%d”ab;swapab;printf“两个数交换后顺序为a=%db=%d”ab;}voidswapint*pint*q{intt;t=*p;*p=*q;*q=t;}
二、编程实现运用指针将字符串str2连接到字符串str1后,构成新的字符串str
11、算法分析本程序即实现字符串处理函数strcat()的功能两字符串str1和str2进行连接,要注意的是字符串的结束标志,并运用指向字符串的指针来实现
2、程序代码#includestdio.h#includestring.hvoidmain{charstr1
[20]str2
[10]*p=str1*q=str2jlen1len2;printf请输入字符串str1:;getsstr1;len1=strlenstr1;p=p+len1-1;printf请输入字符串str2:;getsstr2;len2=strlenstr2;forj=0;jlen2;j++*++p=*q++;str1[len1+len2]=\0;printf新的字符串str1为;putsstr1;}【课后练习】
1、运用指向数组的指针,求一数组中所有元素之和
2、【实验分析与讨论】实验八结构体及其应用【目的与要求】
1、了解结构体类型的定义
2、掌握结构体类型变量的使用【实验内容】有10个学生,每个学生包括学号、姓名、三门课的成绩,从键盘输入10个学生数据,要求输出三门课中每一门课的平均成绩,以及最高分学生的数据
1、算法分析定义一个结构体类型,其中含有学号、姓名、三门课的成绩、总分数据;先后根据要求解决上述问题
2、程序代码#includestdio.htypedefstructstu{intnumber;charname
[4];floatlen1len2len3;floatscore;}student;voidmain{studentstu
[10];intiflag;floatave
[3]sum
[3]={000}max=0;printf请输入10位同学的所有信息;fori=0;i10;i++{scanf%d%s%f%f%fstu[i].numberstu[i].namestu[i].len1stu[i].len2stu[i].len3;stu[i].score=stu[i].len1+stu[i].len2+stu[i].len3;ifstu[i].score=max{max=stu[i].score;flag=i;}sum
[0]+=stu[i].len1;sum
[1]+=stu[i].len2;sum
[2]+=stu[i].len3;}fori=0;i3;i++ave[i]=sum[i]/3;printf三门课的平均成绩分别为;fori=0;i3;i++printf%
6.2fave[i];printf\n最高分是%d%s%
6.2f%
6.2f%
6.2fstu[flag].numberstu[flag].namestu[flag].len1stu[flag].len2stu[flag].len3;}【实验分析与讨论】13个人围成一圈,从第1个人开始顺序报号
1、
2、3凡报到“3”者退出圈子,找出最后留在圈子中的人原来的序号实验九链表的处理【目的与要求】
1、了解键表的相关概念
2、掌握单向键表的创建、编历、插入、删除等简单处理【内容】创建一个链表#includestdio.h#includestdlib.htypedefstructlist{intdata;structlist*next;}list;voidmain{list*head*ptr;intnumi;ptr=list*mallocsizeoflist;head=ptr;printfPleaseinput5numbers:;fori=0;i5;i++{scanf%dnum;ptr-data=num;ptr-next=list*mallocsizeoflist;ifi==4ptr-next=NULL;elseptr=ptr-next;}ptr=head;printfThevalueis:;whileptr!=NULL{printf-%dptr-data;ptr=ptr-next;}getchar;}【实验分析与讨论】实验十文件及其应用【目的与要求】
1、了解运用于文件操作的库函数
2、掌握对文件进行简单的处理【实验内容】有5个学生,每个学生包括学号、姓名、三门课的成绩,从键盘输入5个学生数据,计算每个人的平均成绩,并将原有数据及平均成绩存放于磁盘文件“stud.txt”中
1、算法分析先将5个学生的相关信息从键盘上输入,并求出各自的平均成绩;再次以写方式打开一个文件“stud.txt”,将5个学生的信息全存入文件中
2、程序代码#includestdio.htypedefstructstu{intnumber;charname
[4];floatlen
[3]ave;}student;voidmain{studentstu
[5];FILE*fp;inti;printf请输入5位同学的所有信息;fori=0;i5;i++{scanf%d%sstu[i].numberstu[i].name;stu[i].ave=0;forintj=0;j3;j++{scanf%fstu[i].len[j];stu[i].ave+=stu[i].len[j];}stu[i].ave/=3;}fp=fopenstud.txtw+;fori=0;i5;i++fprintffp%d%s%
5.2f%
5.2f%
5.2f%
5.2fstu[i].numberstu[i].namestu[i].len
[0]stu[i].len
[1]stu[i].len
[2]stu[i].ave;fclosefp;}【实验分析与讨论】将上述问题中“stud.txt”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一新文件“stu.txt”中。