C语言程序设计实验指导书.docx
《C语言程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验指导书.docx(34页珍藏版)》请在冰豆网上搜索。
![C语言程序设计实验指导书.docx](https://file1.bdocx.com/fileroot1/2023-2/5/b9b0a885-be04-46f6-b5e9-d14d6b582669/b9b0a885-be04-46f6-b5e9-d14d6b5826691.gif)
C语言程序设计实验指导书
C语言程序设计指导书
目 录
实验一 C语言的运行环境和运行过程
实验二 数据类型及顺序结构
实验三 选择结构程序设计
实验四 循环控制
实验五 数组
实验六 函数
实验七 指针
实验八 编译预处理
实验九 结构体和共用体
实验十 位运算
实验十一 文件
实验一 C语言的运行环境和运行过程
一、实验目的
1、了解Windows环境下C语言的运行环境,了解所用的计算机系统的基本操作方法,学会独立使用该系统。
2、了解在该系统上如何编辑、编译、连接和运行一个C程序。
3、通过运行简单的C程序,初步了解C源程序的特点。
二、实验要求
上机实验应一人一组,独立实验。
上机过程中出现的问题,除了是系统的问题以外,不要轻易举手问老师。
尤其对“出错信息”,应善于分析判断,找出出错的行,然后检查该行或其上一行。
三、实验内容
1、VisualC++的启动以及工作环境介绍。
2、在VisualC++环境中运行C语言源程序。
四、实验的步骤
1.双击桌面VisualC++快捷方式进入VisualC++,或通过执行“开始=>程序=>
MicrosoftVisualStudio6.0=>MicrosoftVisualC++6.0”。
2.单击“文件”菜单的“新建”命令。
3.在打开的“新建”对话框中选择“文件”标签。
4.选择C++SourceFile,选择文件保存位置,然后在文件输入栏中输入文件名。
如图所示:
5.输入源程序。
输入下面的程序,注意区分大小写。
#include
voidmain()
{
printf("ThisisaCprogram.\n");
}
6.编译程序:
按“Ctrl+F7”或通过“编译”菜单中的“编译”命令,或使用工具栏中的相应工具进行编译 编译 连接 运行
若程序有错则找到出错行修改程序。
7.连接:
若程序没有语法错误,则可按功能键F7或执行“编译”菜单中的“构件”命令或通过工具栏中的相关工具(编译工具右边工具),进行连接生成可执行文件。
8.运行程序:
按组合键“Ctrl+F5”,或通过“编译”菜单中的执行命令,或通过工具栏中的“!
”工具运行程序。
9.关闭工作区,新建一个程序,然后输入并运行一个需要在运行时输入数据的程序
#include
voidmain()
{
inta,b,c;
intmax(intx,inty);
printf("inputaandb:
");
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("\nmax=%d",c);
}
intmax(intx,inty)
{
intz;
if(x>y)z=x;
else z=y;
return(z);
}
(1)运行程序,若程序有错,则修改错误后继续运行程序,当没有错误信息时输入:
2,5并按Enter键,查看运行结果。
(2)将程序的第三行改为:
inta;b;c;然后按F9看结果如何,将其修改为inta,b,c;将子程序max的第3,4行合并为一行,运行程序,看结果是否相同。
实验二 数据类型及顺序结构
一、实验目的
1.掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。
2.掌握不同数据类型之间赋值的规律。
3.学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。
4.编写顺序结构程序并运行。
二、实验内容和步骤
1.输入并运行下面的程序
#include
voidmain()
{char c1,c2;
c1='a';
c2='b';
printf("%c%c",c1,c2);
}
(1)运行此程序
(2)加入下面的一个语句作为“}”前的最后一个语句:
printf("%d,%d\n",c1,c2);
(3)将第3行改为:
int c1,c2;
然后再运行程序,并观察结果是否相同。
(4)将第3行改为int c1,c2;将第4,5行依次改为:
c1=a;c2=b;
c1="a";c2="b"
c1=300;c2=400;
每改为一次后运行程序,观察结果。
2.输入并运行下面的程序
#include
voidmain()
{inta,b;
unsignedc,d;
longe,f;
a=100;
b=-100;
e=50000;
f=32767;
c=a;
d=b;
printf("%d,%d\n",a,b);
printf("%u,%u\n",a,b);
printf("%u,%u\n",c,d);
c=a=e;
d=b=f;
printf("%d,%d\n",a,b);
printf("%u,%u\n",c,d);
}
请对照程序和运行结果分析:
(1)将一个负整数赋给一个无符号的变量,会得到什么结果。
画出它们在内存中的表示形式。
(2)将一个大于32767的长整数赋给一个整型变量,会得到什么结果。
画出它们在内存中的表示形式。
(3)将一个长整数赋给无符号的变量,会得到什么结果。
画出它们在内存中的表示形式。
3.输入三角形三边长,求三角形面积。
#include“math.h”
main()
{
floata,b,c,s,area;
scanf(“%f,%f,%f”,&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“area=%f”,area);
}
4.已知圆半径,圆柱高,求圆周长,圆柱体积。
main()
{
floatr,h,l,v,pi;
pi=3.1415926;
scanf(“%f,%f”,&r,&h);
l=2*pi*r;
v=pi*r*r*h;
printf(“圆周长为:
%6.2f\n”,l);
printf(“%圆柱体积为:
6.2f”,v);
}
5.输入一个摄氏温度,要求输出华氏温度。
公式为f=5/9*c+32.
main()
{
float c,f;
scanf(“%f”,&c);
f=5.0/9*c+32;
printf(“%5.2f\n”,c);
}
实验三 选择结构程序设计
一、实验目的
1.了解C语言表示逻辑值的方法。
2.学会正确使用逻辑运算符和逻辑表达式的方法。
3.熟悉if语句和switch语句。
4.结合程序掌握一些简单的算法。
5.学习调试程序的方法。
二、实验内容
本实验要求编程解决以下问题,然后上机调试运行程序。
1.
用scanf函数输入x的值,求y的值。
程序提示:
main函数结构如下:
定义实型变量x与y
使用scanf函数输入x的值
ifx<1
y=x
else
if x<10
y=2x-1
else
y=3x-11
输出x的值与y的值
2.给出一个百分制的成绩,要求输出成绩等级A,B,C,D,E。
90分及以上为A,80-89为B,70-79为C,60-69为D,60分以下为E。
要求从键盘输入成绩,然后输出相应等级,分别用if语句和switch语句实现。
程序提示:
(1)使用if语句的main函数结构如下:
定义float型变量score,char型变量grade
输入百分制成绩赋给score
if score>=90
grade='A'
else if score>=80
grade='B'
else if score>=70
grade='C'
else if score>=60
grade='D'
else grade='E'
输出百分制成绩和等级。
(2)使用switch语句的main函数结构如下:
定义float型变量score,char型变量grade
输入百分制成绩赋给score
switch(int(score/10))
{
case 10:
case 9:
grade='A';break;
case 8:
grade='B';break;
case 7:
grade='C';break;
case 6:
grade='D';break;
default:
grade='E';break;
}
输出百分制成绩和等级
3.编程实现:
输入一个不多于5位的正整数,要求:
(1)输出它是几位数,
(2)分别输出每一位数字,(3)按逆序输出各位数字,如原数为321,则应输出123。
应准备以下测试数据
要处理的数为1位正整数;
要处理的数为2位正整数;
要处理的数为3位正整数;
要处理的数为4位正整数;
要处理的数为5位正整数;
除此之外,程序还应当对不合法的输出作必要的处理。
例如:
输入负数;
输入的数超过5位;
程序提示:
main函数结构如下:
定义long型变量num,int型变量c1,c2,c3,c4,c5
输入一个不超过5位的正整数赋给num
if num>99999
输出:
输入的数超过5位
elseif num<0
输出:
输入的数是一个负数
else
{
求得num的各位数分别赋给C1,C2,C3,C4,C5
c1=num/10000;
c2=(num-c1*10000)/1000;
c3=(num/100);
c4=(num/10);
c5=num;
if(c1>0)
{printf("\n%ld是一个5位数\n",num);
printf("其各位分别为:
,,,\n",c1,c2,c3,c4,c5);
printf("逆序输出为:
\n",c5,c4,c3,c2,c1);
}
elseif(c2>0)是4位数,输出其各位,格式与5位数类似
elseif(c3>0)是3位数,输出其各位,格式与5位数类似
elseif(c4>0)是2位数,输出其各位,格式与5位数类似
elseif(c5>0)是1位数,输出其各位,格式与5位数类似
}
4.编程实现:
输入4个整数,要求按由小到大的顺序输出。
得到正确结果后,修改程序使之按由大到小的顺序输出。
main函数结构如下:
inta,b,c,d,t;
输入4个整数:
赋给a,b,c,d;
if(a>b)交换a,b
if(a>c)交换a,c
if(a>d)交换a,d
if(b>c)交换b,c
if(b>d)交换b,d
if(c>d)交换c,d
输出a,b,c,d
实验四 循环控制
一、实验目的
熟悉使用while语句,do-while语句和for语句实现循环的方法。
掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。
二、实验内容
1.输入两个正整数m和n,求出它们的最大公约数和最小公倍数。
输入时,使m再输入时使m>n,观察结果是否正确;
修改程序使对任何的整数都能得到正确的结果。
程序提示:
main结构如下:
intm,n,r,tm,tn;
输入两个正整数赋给m,n
tm=m;tn=n;
if(m r=m%n;
while(r)
{
m=n;
n=r;
r=m%n;
}
输出最大公约数n和最小公倍数m*tn/n;
2.编写程序利用公式:
求e的近似值,精确到小数后6位
程序提示:
main函数算法为:
定义int型变量n,i,double型变量e,p,t
输入n的值
e=1;t=1;p=1;i=1
while(t>=1e-7)
{e=e+t;
i++;
p=p*i;
t=1.0/p;
}
输出e的值
3.编程求1到n中能被3或7整除的数之和。
分别用for循环语句和while循环语句完成本题。
程序提示:
for循环语句的主要算法如下:
for(i=1;i<=n;i++)
ifi能被3或7整除
sum=sum+i
while循环语句的主要算法如下:
while(i<=n)
ifi能被3或7整除
sum=sum+i++;
4.猴子吃桃问题。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少桃子。
在得到正确结果后,修改题目,改为每天早上都吃了前一天剩下的一半加二个,请修改程序,并运行,检查运行结果是否正确。
程序提示:
使用以下循环结构
x=1
for(i=9;i>=1;i--)
x=2*x+1
实验五 数组
一、实验目的
1.掌握一维数组与二维数组的定义、赋值及输入输出方法。
2.掌握字符数组和字符串函数的使用。
3.掌握与数组有关的算法(特别是排序算法)
二、实验内容
1.用选择法对10个整数排序。
10个整数用scanf函数输入。
程序提示:
输入10个整数存放到数组a的a[1]到a[10]中
输出10个数
for(i=1;i<10;i++)
{
min=i;
for(j=i+1;j<=10;j++)
if(a[min]>a[j])min=j;
交换a[i]与a[min]
}
输出排序后的10个数
2.有15个数存放在一个数组中,输入一个数要求用折半查找法找出该数是数组中的第几个元素的值,如果该数不在数组中,则输出无此数,要找的数用scanf函数输入。
程序提示:
用循环语句输入15个数
调用排序算法对其进行排序
while(flag)
{
输入要查找的数
loca=0;
top=0;
bott=N-1;
if(numbera[N-1])loca=-1;
while(sign==1&&top<=bott&&loca>=0)
{
mid=(bott+top)/2;
if(number==a[mid])
{loca=mid;
printf("找到了,数%d在数组的第%d位、\n",number,loca+1);
sign=0;}
elseif(number elsetop=mid+1;
}
if(sign==1||loca==-1)printf("\n查无此数\n");
printf("\n是否继续查找?
(Y/N)");
scanf("%c",&c);getchar();
printf("\n");
if(c=='N'||c=='n')flag=0;
}
3.将两个串连接起来,不要用strcat函数。
程序提示:
分别输入二个串字符
i指向第一个数组的最后一个空数组元素
while(s2[j]!
='\0')
s1[i++]=s2[j++];
s1[i]='\0';
输出连接后的字符串
4.找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。
也可能没有鞍点。
至少准备两组测试数据:
(1)二维数组有鞍点
9 80 205 40
90 -60 96 1
210 -3 101 89
(2)二维数组没有鞍点
9 80 205 40
90 -60 96 1
210 -3 101 89
45 54 156 7
用scanf函数从键盘输入数组的各元素的值,检查结果是否正确,题目未指定二维数组的行数和列数,程序应能处理任意行数和列数的数组。
程序提示:
输入矩阵
flag2=0;//矩阵中无鞍点
for(i=0;i {
max=a[i][0];maxj=0;
用for循环语句找第i行的最大值存放在max中,其下标j保存到maxj中
for(k=0,flag1=1;k if(max>a[k][maxj])flag1=0;//max不是该列的最小元素
if(flag1)
{
printf("\n第%d行第%d列的%d是鞍点\n",i+1,maxj+1,max);
flag2=1;
}
}//endfori
if(!
flag2)printf("\n矩阵中无鞍点\n");
实验六 函数
一、实验目的
1.掌握定义函数的方法。
2.掌握函数实参及形参的对应关系以及“值传递”方式。
3.掌握函数的嵌套调用和递归调用的方法。
4.掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法。
5.学会对多文件程序的编译和运行。
二、实验内容
1.写出一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。
本程序应准备以下测试数据:
17,34,2,1,0,分别输入数据,运行程序并检查结果是否正确。
程序提示:
求素数函数如下:
intprime(intn)
{ifn<2 return0
for(i=2;i if n能被i整除 return0;
return1;
}
main函数中输入一个整数赋给变量n,通过prime(n)判断其是否素数,若函数值为1则是素数否则不是素数。
2.用一个函数来实现将一行字符串中最长的单词输出。
此行字符从主函数传递给该函数。
(1)把两个函数放在同一个程序文件中。
(2)将两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。
程序提示:
寻找最长单词的起始位置函数:
intlongest(charstring[])
//n为字符串的长度,len为每个单词的长度
//length为最长单词的长度,point为最长单词的起始位置
//函数返回最长单词的起始位置
{
intlen=0,i,n,length=0,flag=,place=0,point;
n=strlen(string);
for(i=0;i<=n;i++)
if string[i]为英文字母
if(flag){point=i;flag=0;}
elselen++;
else
{
flag=1;
if(len>=length)
{
length=len;
place=point;
len=0;
}
}
returnplace;
}
在main函数中输入一行字符,然后调用上面函数取得最长字符的开始位置,从该位置开始输入数组元素,直到输出的数组元素不是英文字母时止。
3.用递归法将一个整数n转换成字符串。
例如输入483.应输出字符串“483”。
n的位数不确定,可以是任意的整数。
程序提示:
voidconvert(intn)
{
inti;
if((i=n/10)!
=0)
convert(i);
putchar(n+'0');
}
在main函数中输入一个整数,然后先输出该数的符号,然后调用函数convert(n)。
4.求两个整数的最大公约数和最小公倍数。
用一个函数求最大公约数用另一个函数根据求出的最大公约数求最小公倍数。
分别用下面的两种方法编程。
(1)不用全局变量,在主函数中输入两个数和输出结果。
(2)用全部变量的方法,数据的传递通过全部变量的方法。
程序提示:
使用下面函数求最大公因子,其中v为最大公因子,若将v设为外部变量,则可不使用return语句。
inthcf(intu,intv)//求最大公因子
{
intt,r;
if(v>u){t=u;u=v;v=t;}
while((r=u%v)!
=0)//余数r不为0时继续作辗转相除法
{u=v;v=r;}
return(v);
}
5.写一个函数,输入一个十六进制数,输出相应的十进制数。
程序提示:
输入时将十六进制数作为一个字符串输入,然后将其每一个字符转换成十进制数并累加,转换方法如下:
if(s[i]>'0'&&s[i]<='9')