资源描述
《C语言程序设计》试验指导书
课程编号: 课程名称:C语言程序设计 试验课时: 44
一、本试验课性质、任务和目标
本试验课目标是使学生掌握C语言编程常见方法,熟悉该语言中语法、词法规则,为以后进行软件开发和学习后继专业课程打下基础。经过学习能够利用C语言中各个知识点编写能完成一定功效程序。训练学生进行复杂程序设计技能和培养良好程序设计习惯,其关键程度决不亚于知识传授。把高级语言学习和程序设计、上机实践紧密地结合起来,以提升学生能灵活利用新知识分析问题和处理问题能力。
二、本试验课所依据课程基础理论
本试验课基于C语言语法和词法规则、数据表示及算法处理,而语法及算法正是高级语言程序设计关键研究对象。《C语言程序设计》关键任务是:C 语言是一个应用广泛结构化程序设计语言,本课程介绍C语言基础概念、基础语法和编程方法,关键描述C语言结构化特征,并经过本课程学习,使学生掌握一定结构化程序设计知识,和用C语言编写程序能力。
三、试验类型和要求
在做每个试验之前,让学生对此次试验相关内容进行预习、算法设计、步骤图设计、编写程序,做好试验准备工作;写出预习汇报,画出步骤图,要求独立完成。
说明:1、试验类型:设计性;
2、试验要求:必做。
四、每组人数和试验课时数
每组1人,试验课时数44课时。
五、考评方法和评分措施
试验总成绩=出勤情况*10%+试验汇报*20%+平时*30%+试验表现*40%
六、本试验课配套教材或试验指导书
谭浩强. C程序设计. 北京:清华大学出版社 ,3月第3版
谭浩强. C程序设计题解和上机指导. 北京:清华大学出版社 ,3月第3版
谭浩强. C程序设计试题汇编. 北京:清华大学出版社 ,3月第2版
夏宽理. C语言程序设计. 北京:中国铁道出版社,2月第1版
夏宽理. C语言程序设计上机指导和习题解答. 北京:中国铁道出版社,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”中。
展开阅读全文