《C语言程序设计》实验指导书Word下载.docx
《《C语言程序设计》实验指导书Word下载.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》实验指导书Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
实验一:
C语言运行环境的认识与简单的C程序
【目的与要求】
1、了解TC环境下C语言的运行环境,熟悉编译系统的操作环境。
2、了解在该系统上如何编辑、编译、连接和运行一个C程序。
3、通过运行简单的C程序,初步了解C源程序的特点。
4、掌握和理解C程序中最基本的C语句。
【实验内容】
1、题目:
由键盘输入两个整数,计算并输出两个数之和。
2、程序如下:
#include“stdio.h”
voidmain()
{inta,b,sum;
printf(“Pleaseinputtwointegernumbers:
\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>
【实验分析与讨论】
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)不是一元二次方程elsed=b2-4ac
根据d的取值,输出方程根的情况:
if(b2-4ac==0)x1=x2=-b/(2*a)
elseif(b2-4ac>
0)x1=(-b+sqrt(d))/(2*a)x2=(-b-sqrt(d))/(2*a)
elsex1=(-b+sqrt(-d)i)/(2*a)x2=(-b-sqrt(-d)i)/(2*a)
2、程序代码:
#include“stdio.h”
#include“math.h”
voidmain()
{floata,b,c,x1,x2,d;
printf(“请输入ax2+bx+c=0方程三系数值:
”);
scanf(“%f%f%f”,&
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));
elseif(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<
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语句,编写分支结构。
{inti;
printf(“\n\n\n========主菜单========\n”);
printf(“(中国)”)
printf(“1------汉字\n”);
printf(“2------拼音\n”);
printf(“3------英文\n”);
printf(“请选择:
scanf(“%d”,&
i);
switch(i)
{case1:
printf(“中国\n”);
break;
case2:
printf(“China\n”);
case3:
printf(“Zhongguo\n”);
【课后练习】
1、判断一年份是不是闰年。
2、从键盘上输入1-7之间的数字,输出表示一个星期中对应某一天的英文单词。
1、总结分支选择结构的设计方法与技巧。
2、掌握简单菜单的设计。
实验四:
循环结构的程序设计
1、掌握三种循环语句在编程中的使用。
2、理解break语句和continue语句在循环结构中的不同作用。
3、了解循环的嵌套,学会穷举算法与迭代算法。
一、输入两个正整数,求出它们的最大公约数与最小公倍数。
[辗转相除法]对于两个数m和n,将大数放在m中,小数放在n中,用n去除m,若余数为0,则n为最大公约数,否则将n作为m,余数作为n,再用n去除m,直到余数为0,则n为最大公约数。
{intm,n,t,max,min;
printf(“请输入两个正整数:
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元票子。
#include"
stdio.h"
{intTencount,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个数的有序序列中,确保插入后其仍然有序,。
①将待插入的数与序列中的每个数进行比较,找到其插入的具体位置i;
②将从第i个数组元素开始,一直到原数组中的最后一个元素,整体往后移,空出一空间来存储待插入的整数。
2、程序代码:
{inta[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请输入待插入的整数:
m);
i++)
if(m<
=a[i])break;
//查找待插入的位置
for(k=9;
k>
=i;
k--)
a[k]=a[k-1];
//移位,准备插入新的整数
a[i]=m;
printf(“新数组为:
10;
二、编程实现:
将字符串str2连接到字符串str1后,构成新的字符串str1。
本程序即实现字符串处理函数strcat()的功能。
两字符串str1和str2进行连接,要注意的是字符串的结束标志。
string.h"
{charstr1[40],str2[20],i,j,len1,len2;
请输入字符串str1:
"
);
gets(str1);
len1=strlen(str1);
请输入字符串str2:
gets(str2);
len2=strlen(str2);
for(i=len1,j=0;
j<
len2;
i++,j++)
str1[i]=str2[j];
str1[i]='
\0'
;
新的字符串str1为:
puts(str1);
1、判断一方阵是不是对称矩阵。
2、实现两个字符串拷贝的功能。
3、运行折半查找法,在一个有序序列中查找某一特定的数。
1、分析两种基本排序算法的核心与两者的不同之处。
2、在实现字符串处理函数时的一些注意事宜及其实现方法。
3、讨论二维数组解决矩阵与行列式。
实验六:
函数及其应用
1、掌握C中函数的定义、调用及设计。
2、掌握函数嵌套调用、递归调用的设计。
3、掌握变量、函数的作用域及存储类。
一、设计一个子函数对n个整数进行排序,由主函数从键盘接收若干个数,调用子函数进行排序,并在主函数中进行输出显示。
①子函数的设计以两个参数来实现,一个是接收主函数传来的数组首地址,另一个是持排序的整数个数,如fun(inta[],intn);
②主函数的实现定义一整型数组,从键盘上接收若干个整数,调用子函数fun,再将最后的结果输出。
#include"
voidfun(inta[],intn)//选择排序算法
{inti,j,t;
n-1;
for(j=i+1;
n;
j++)
if(a[i]>
a[j]){t=a[i];
a[i]=a[j];
a[j]=t;
{inta[10],i;
i++)scanf("
%d"
&
a[i]);
输入的数值序列为:
i++)printf("
%4d"
a[i]);
\n"
fun(a,10);
二、输入任意两数m,n的值,输出下列表达式的值。
S=
1、算法分析
1编写一函数fac(n),返回n!
的值。
2编写主函数,从键盘输入m,n的值,调用上述fac()函数,计算表达式的值,并将其输出。
2、程序代码
longfac(intn)
{if(n==1)return1;
elsereturnn*fac(n-1);
{intm,n,t;
floats;
printf(“pleaseinput2integernumbers:
”);
if(m<
n){t=m;
printf(“s=%f”,fac(m)/(fac(m-n)fac(n)));
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)编写一个函数swap(int*p,int*q),交换两个参数指针所指的数据。
(2)编写主函数,调用函数swap,将两个变量的值进行交换。
2、程序代码:
voidswap(int*p,int*q);
{inta,b;
printf(“请输入两个整数:
printf(“两个数交换前顺序为:
a=%d,b=%d”,a,b);
swap(&
printf(“两个数交换后顺序为:
voidswap(int*p,int*q)
{intt;
t=*p;
*p=*q;
*q=t;
运用指针将字符串str2连接到字符串str1后,构成新的字符串str1。
两字符串str1和str2进行连接,要注意的是字符串的结束标志,并运用指向字符串的指针来实现。
{charstr1[20],str2[10],*p=str1,*q=str2,j,len1,len2;
p=p+len1-1;
for(j=0;
j++)
*(++p)=*(q++);
str1[len1+len2]='
1、运用指向数组的指针,求一数组中所有元素之和。
2、
实验八:
结构体及其应用
1、了解结构体类型的定义。
2、掌握结构体类型变量的使用。
有10个学生,每个学生包括学号、姓名、三门课的成绩,从键盘输入10个学生数据,要求输出三门课中每一门课的平均成绩,以及最高分学生的数据。
定义一个结构体类型,其中含有学号、姓名、三门课的成绩、总分数据;
先后根据要求解决上述问题。
typedefstructstu
{intnumber;
charname[4];
floatlen1,len2,len3;
floatscore;
}student;
{studentstu[10];
inti,flag;
floatave[3],sum[3]={0,0,0},max=0;
printf("
请输入10位同学的所有信息:
for(i=0;
{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;
3;
i++)
ave[i]=sum[i]/3;
三门课的平均成绩分别为"
%6.2f"
ave[i]);
\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、掌握单向键表的创建、编历、插入、删除等简单处理。
【内容】
创建一个链表。
stdlib.h"
typedefstructlist
{intdata;
structlist*next;
}list;
{list*head,*ptr;
intnum,i;
ptr=(list*)malloc(sizeof(list));
head=ptr;
Pleaseinput5numbers:
5;
num);
ptr->
data=num;
next=(list*)malloc(sizeof(list));
if(i==4)ptr->
next=NULL;
elseptr=ptr->
next;
ptr=head;
Thevalueis:
while(ptr!
=NULL)
{printf("
->
ptr->
data);
ptr=ptr->
getchar();
实验十:
文件及其应用
1、了解运用于文件操作的库函数。
2、掌握对文件进行简单的处理。
有5个学生,每个学生包括学号、姓名、三门课的成绩,从键盘输入5个学生数据,计算每个人的平均成绩,并将原有数据及平均成绩存放于磁盘文件“stud.txt”中。
先将5个学生的相关信息从键盘上输入,并求出各自的平均成绩;
再次以写方式打开一个文件“stud.txt”,将5个学生的信息全存入文件中。
floatlen[3],ave;
{studentstu[5];
FILE*fp;
inti;
printf(