资源描述
《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”
void main()
{int a,b,sum;
printf(“Please input two integer numbers:\n”);
scanf(“%d%d”,&a,&b);
sum=a+b;
printf(“%d+%d=%d”,a,b,sum);
}
3、具体操作:
(1)输入程序,然后进行编译连接。若在编译中有词法或语法错误,则根据提示进行修改,再进行调试,直到没有语法错误。
(2)运行程序,依下列不同的方式输入数据,查看程序执行结果。
① 12_ 34 ↙
② 12 ↙
34 ↙
③ 12<Tab>34 ↙
【实验分析与讨论】
1、总结C程序的基本结构和书写规则。
2、分析调试过程中常见的错误提示和解决策略。
实验二:C语言程序的单步调试
实验三:选择结构的程序设计
【目的与要求】
1、了解三种基本数据类型的定义。
2、掌握各种不同运算符及其对应的表达式的使用。
3、熟练掌握if语句和switch语句的使用
【实验内容】
一、判断方程ax2+bx+c=0有几个解,若有,则输出其解。
1、算法分析:
对于方程ax2+bx+c=0的解,存在以下情况:①a=0,不是一元二次方程;②b2-4ac=0,有两个相等的实根;③b2-4ac>0,有两个不等的实根;④b2-4ac<0,有两个共轭复根。
(1)定义变量:a,b,c,x1,x2,d
(2)输入a,b,c
(3)if(a==0) 不是一元二次方程 else d= b2-4ac
根据d的取值,输出方程根的情况:
if(b2-4ac==0) x1=x2=-b/(2*a)
else if(b2-4ac>0) 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方程三系数值:”);
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) // sqr(b)-4*a*c ==0
printf(“该方程的两个相等实根为:x1,x2=%4.2f”,-b/(2*a));
else 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*c<0
printf(“该方程的两个复数根为:x1=%4.2f+%4.2fi,x2=%4.2f-%4.2fi” ,
-b/(2*a),sqrt(-d)/(2*a), -b/(2*a),sqrt(-d)/(2*a));
}
}
二、简单的菜单程序设计。
假设要求设计一菜单如下:
主 菜 单
1--------汉字
2--------拼音
3--------英文
1、算法分析:
(1) 根据要求使用输出语句将上述菜单输出,提示按要求选择。
(2) 运用if语句或switch语句,编写分支结构。
2、程序代码:
#include “stdio.h”
void main()
{int i;
printf(“\n\n\n========主 菜 单========\n”);
printf(“ (中 国)”)
printf(“ 1------汉字\n”);
printf(“ 2------拼音\n”);
printf(“ 3------英文\n”);
printf(“请选择:”);
scanf(“%d”,&i);
switch(i)
{case 1:printf(“ 中 国\n”);break;
case 2:printf(“ China\n”);break;
case 3:printf(“ Zhong guo\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”
void main()
{int m,n,t,max,min;
printf(“请输入两个正整数:”);
scanf(“%d%d”,&m,&n); min=m*n;
if (m<n) {t=n;n=m;m=t;}
while(n!=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、程序代码:
#include "stdio.h"
void main()
{int Tencount,Twecount,Fifcount,i=0;
for(Tencount=0;Tencount<=10;Tencount++)
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、求1—100之间,能被5整除的数之和。 * * *
2、判断任一个数是否是质数。 * * * * *
3、输出一有规则的图形,如右图。 * * *
*
【实验分析与讨论】
1、分析总结for语句,while语句,do-while语句的用法。
2、巧用break语句和continue语句。
实验五: 数组及其应用
【目的与要求】
1、掌握一维数组与二维数组的使用。
2、掌握字符数组与字符串的区别与使用。
3、熟练掌握与数组有关的算法(选择排序与冒泡排序、查找与插入)。
【实验内容】
一、输入一个整数,将其插入一含有9个数的有序序列中,确保插入后其仍然有序,。
1、算法分析:①将待插入的数与序列中的每个数进行比较,找到其插入的具体位置i;
②将从第i个数组元素开始,一直到原数组中的最后一个元素,整体往后移,空出一空间来存储待插入的整数。
2、程序代码:
#include "stdio.h"
void main()
{int a[10]={2,5,7,11,14,19,21,33,67},i,k,m;
printf(“原数组为:”);
for(i=0;i<9;i++) printf(“%4d”,a[i]);
printf(“\n请输入待插入的整数:”);
scanf(“%d”,&m);
for(i=0;i<9;i++)
if (m<=a[i]) break;//查找待插入的位置
for(k=9;k>=i;k--)
a[k]=a[k-1]; //移位,准备插入新的整数
a[i]=m; printf(“新数组为:”);
for(i=0;i<10;i++) printf(“%4d”,a[i]);
}
二、编程实现:将字符串str2连接到字符串str1 后,构成新的字符串str1。
1、算法分析:
本程序即实现字符串处理函数strcat()的功能。两字符串str1和str2进行连接,要注意的是字符串的结束标志。
2、程序代码:
#include "stdio.h"
#include "string.h"
void main()
{char str1[40],str2[20],i,j,len1,len2;
printf("请输入字符串str1:"); gets(str1);
len1=strlen(str1);
printf("请输入字符串str2:"); gets(str2);
len2=strlen(str2);
for(i=len1,j=0;j<len2;i++,j++)
str1[i]=str2[j];str1[i]='\0';
printf("新的字符串str1为:"); puts(str1);
}
【课后练习】
1、 判断一方阵是不是对称矩阵。
2、 实现两个字符串拷贝的功能。
3、 运行折半查找法,在一个有序序列中查找某一特定的数。
【实验分析与讨论】
1、 分析两种基本排序算法的核心与两者的不同之处。
2、 在实现字符串处理函数时的一些注意事宜及其实现方法。
3、 讨论二维数组解决矩阵与行列式。
实验六: 函数及其应用
【目的与要求】
1、掌握C中函数的定义、调用及设计。
2、掌握函数嵌套调用、递归调用的设计。
3、掌握变量、函数的作用域及存储类。
【实验内容】
一、设计一个子函数对n个整数进行排序,由主函数从键盘接收若干个数,调用子函数进行排序,并在主函数中进行输出显示。
1、算法分析:
①子函数的设计 以两个参数来实现,一个是接收主函数传来的数组首地址,另一个是持排序的整数个数,如fun(int a[],int n);
②主函数的实现 定义一整型数组,从键盘上接收若干个整数,调用子函数fun,再将最后的结果输出。
2、程序代码:
#include "stdio.h"
void fun(int a[],int n) // 选择排序算法
{int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}
}
void main()
{ int a[10],i;
for(i=0;i<10;i++) scanf("%d",&a[i]);
printf("输入的数值序列为:");
for(i=0;i<10;i++) printf("%4d",a[i]);
printf("\n"); fun(a,10);
printf("输入的数值序列为:");
for(i=0;i<10;i++) printf("%4d",a[i]);
}
二、输入任意两数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 input 2 integer numbers:”);
scanf(“%d%d”,&m,&n);
if(m<n) {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、 被调函数的实现及调用过程。
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(“请输入两个整数:”);
scanf(“%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 "string.h"
void main()
{char str1[20] ,str2[10],*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;j<len2; j++)
*(++p)=*(q++);str1[len1+len2]='\0';
printf("新的字符串str1为:"); puts(str1);
}
【课后练习】
1、运用指向数组的指针,求一数组中所有元素之和。
2、
【实验分析与讨论】
实验八:结构体及其应用
【目的与要求】
1、了解结构体类型的定义。
2、掌握结构体类型变量的使用。
【实验内容】
有10个学生,每个学生包括学号、姓名、三门课的成绩,从键盘输入10个学生数据,要求输出三门课中每一门课的平均成绩,以及最高分学生的数据。
1、算法分析:
定义一个结构体类型,其中含有学号、姓名、三门课的成绩、总分数据;先后根据要求解决上述问题。
2、程序代码:
#include "stdio.h"
typedef struct stu
{int number;
char name[4];
float len1,len2,len3;
float score;}student;
void main()
{student stu[10];
int i,flag;
float ave[3],sum[3]={0,0,0},max=0;
printf("请输入10位同学的所有信息:");
for(i=0;i<10;i++)
{scanf("%d%s%f%f%f",&stu[i].number, stu[i].name,
&stu[i].len1,&stu[i].len2,&stu[i].len3);
stu[i].score= stu[i].len1+stu[i].len2+stu[i].len3;
if(stu[i].score>=max) {max=stu[i].score; flag=i;}
sum[0]+=stu[i].len1; sum[1]+=stu[i].len2; sum[2]+=stu[i].len3;
}
for(i=0;i<3;i++)
ave[i]=sum[i]/3;printf("三门课的平均成绩分别为");
for(i=0;i<3;i++)
printf("%6.2f",ave[i]);
printf("\n最高分是:%d %s %6.2f %6.2f %6.2f",
stu[flag].number,stu[flag].name,stu[flag].len1,
stu[flag].len2, stu[flag].len3);
}
【实验分析与讨论】
13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子,找出最后留在圈子中的人原来的序号。
实验九: 链表的处理
【目的与要求】
1、了解键表的相关概念。
2、掌握单向键表的创建、编历、插入、删除等简单处理。
【内容】
创建一个链表。
#include "stdio.h"
#include "stdlib.h"
typedef struct list
{int data;struct list *next;}list;
void main()
{list *head,*ptr;
int num,i;
ptr=(list *)malloc(sizeof(list)); head=ptr;
printf("Please input 5 numbers:");
for(i=0;i<5;i++)
{scanf("%d",&num);
ptr->data=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、掌握对文件进行简单的处理。
【实验内容】
有5个学生,每个学生包括学号、姓名、三门课的成绩,从键盘输入5个学生数据,计算每个人的平均成绩,并将原有数据及平均成绩存放于磁盘文件“stud.txt”中。
1、算法分析:
先将5个学生的相关信息从键盘上输入,并求出各自的平均成绩;再次以写方式打开一个文件“stud.txt”,将5个学生的信息全存入文件中。
2、程序代码:
#include "stdio.h"
typedef struct stu
{int number;
char name[4];
float len[3],ave;}student;
void main()
{student stu[5]; FILE *fp;
int i ;
printf("请输入5位同学的所有信息:");
for(i=0;i<5;i++)
{ scanf("%d%s",&stu[i].number, stu[i].name); stu[i].ave=0;
for(int j=0;j<3;j++)
{ scanf("%f",&stu[i].len[j]); stu[i].ave+=stu[i].len[j];}
stu[i].ave/=3;}
fp=fopen("stud.txt","w+");
for(i=0;i<5;i++)
fprintf(fp,"%d %s %5.2f %5.2f %5.2f %5.2f",
stu[i].number, stu[i].name,
stu[i].len[0],stu[i].len[1],stu[i].len[2],stu[i].ave);
fclose(fp);
}
【实验分析与讨论】
将上述问题中“stud.txt”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一新文件“stu.txt”中。
其中专业理论知识内容包括:保安理论知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防技能、军事技能。
二.培训的及要求培训目的
安全生产目标责任书
为了进一步落实安全生产责任制,做到“责、权、利”相结合,根据我公司2015年度安全生产目标的内容,现与财务部签订如下安全生产目标:
一、目标值:
1、全年人身死亡事故为零,重伤事故为零,轻伤人数为零。
2、现金安全保管,不发生盗窃事故。
3、每月足额提取安全生产费用,保障安全生产投入资金的到位。
4、安全培训合格率为100%。
二、本单位安全工作上必须做到以下内容:
1、对本单位的安全生产负直接领导责任,必须模范遵守公司的各项安全管理制度,不发布与公司安全管理制度相抵触的指令,严格履行本人的安全职责,确保安全责任制在本单位全面落实,并全力支持安全工作。
2、保证公司各项安全管理制度和管理办法在本单位内全面实施,并自觉接受公司安全部门的监督和管理。
3、在确保安全的前提下组织生产,始终把安全工作放在首位,当“安全与交货期、质量”发生矛盾时,坚持安全第一的原则。
4、参加生产碰头会时,首先汇报本单位的安全生产情况和安全问题落实情况;在安排本单位生产任务时,必须安排安全工作内容,并写入记录。
5、在公司及政府的安全检查中杜绝各类违章现象。
6、组织本部门积极参加安全检查,做到有检查、有整改,记录全。
7、以身作则,不违章指挥、不违章操作。对发现的各类违章现象负有查禁的责任,同时要予以查处。
8、虚心接受员工提出的问题,杜绝不接受或盲目指挥;
9、发生事故,应立即报告主管领导,按照“四不放过”的原则召开事故分析会,提出整改措施和对责任者的处理意见,并填写事故登记表,严禁隐瞒不报或降低对责任者的处罚标准。
10、必须按规定对单位员工进行培训和新员工上岗教育;
11、严格执行公司安全生产十六项禁令,保证本单位所有人员不违章作业。
三、 安全奖惩:
1、对于全年实现安全目标的按照公司生产现场管理规定和工作说明书进行考核奖励;对于未实现安全目标的按照公司规定进行处罚。
2、每月接受主管领导指派人员对安全生产责任状的落
展开阅读全文