C语言实验报告.docx
《C语言实验报告.docx》由会员分享,可在线阅读,更多相关《C语言实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
C语言实验报告
实验一C程序的运行环境和运行C程序的办法
1.实验目的
(1)了解所用的计算机系统的基本操作方法,学会独立使用该系统。
(2)了解在该系统上如何编辑、编译、连接和运行一个C程序。
(3)通过运行简单的C程序,初步了解C源程序的特点。
2.实验内
(1)检查所用计算机系统是否已安装了C编译系统并确定它所在的子目录。
(2)进入所用的集成环境。
(3)熟悉集成环境的界面和有关菜单的使用方法。
(4)输入并运行一个简单的、正确的程序。
①根据本书介绍的方法对源程序进行编译,观察屏幕上显示的编译信息。
若出错则返回修改,无错则连接。
2编译连接无错,运行程序,观察分析运行结果。
(5)输入并编译一个有错误的C程序。
(6)输入并运行一个需要在运行时输入数据的程序。
(7)运行一个自己编写的程序
心得体会:
了解了C程序的运行环境和运行C程序的办法。
在学校机房选用的是TurboC。
实验二数据类型、运算符和表达式
1.实验目的
(1)掌握C语言数据类型、熟悉如何定义一个整型、字符型和实型的变量,以及对他们的赋值方法。
(2)掌握不同数据类型之间的赋值规律。
(3)学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用。
(4)进一步熟悉C程序的编辑、编译、连接和运行的过程。
2.实验内容和步骤
(1)输入并运行下面程序:
#include
voidmain()
{charc1,c2;
c1='a';
c2='b';
printf("%c%c\n",c1,c2);
}
①运行此程序,结果为:
ab
②在上面printf语句下面再增加一个printf语句:
printf("%d%d\n",c1,c2);
再运行,并分析结果,结果为9798
③将第三行改为
intc1,c2;
再使之运行,并观察结果,结果为9798
④再将第4、5行改为;
c1=a;
c2=b;
再使之运行,并观察结果,结果为运行出错。
⑤再将第4、5行改为:
c1=”a”;
c2=”b”;
再使之运行,并观察结果,结果为404406
⑥再将第4、5行改为:
c1=300;
c2=400;
再使之运行,并观察结果,结果为300400;
心得体会:
在编写C程序时,有些细小的错误会影响结果的正确性。
所以编写的时候要仔细小心。
初步编写完成要回过头来再检查一遍
实验三最简单的C程序设计
1.实验目的
(1)掌握C语言中使用最多的一种语句——赋值语句的使用方法。
(2)掌握各种类型数据的输入输出方法,能正确使用各种格式转换符。
2.实验内容和步骤
(1)通过下面的程序掌握各种格式转换符的正确使用方法。
①输入以下程序
#include
voidmain()
{int‘a’,’b’;
floatd,e;
charc1,c2;
doublef,g;
longm,n;
unsignedintp,q;
a=61,b=62
c1=a,c2=b
d=3.56,e=-6.87
f=3157.890121,g=0.123456789000
m=50000,n=-60000
p=32768,q=40000
printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%6.2f,e=%6.2f\n",a,b,c1,c2,d,e);
printf("f=%15.6f,g=%15.12f\nm=%ld,n=%ld\np=%u,q=%u\n",f,g,m,n,p,q);
getch();
}
②运行此程序并分析结果
a=61,b=62
c1=a,c2=b
d=3.56,e=-6.87
f=3157.890121,g=0.123456789000
m=50000,n=-60000
p=32768,q=40000
③在此结果上,将程序9~14行改为:
a=61,b=62
c1=a,c2=b
d=3.56,e=-6.87
f=3157.890121,g=0.123456789000
m=50000,n=-60000
p=32768,q=40000
运行程序,分析结果a=-15536,b=5536
c1==,c2=>
d=3157.89,e=0.12
f=3157.890121,g=0.123456789000
m=50000,n=-60000
p=50000,q=5536
④改用scanf函数输入程序而不用赋值语句,scanf函数如下
scanf("%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u",&a,&b,&c1,&c2,&d,&e,&f,&g,&m,&n,&p,&q)
输入的数据如下:
61,62,a,b,3.56,-6.87,3157,89.121,0.123456789,50000,-60000,37678,40000
运行结果如下:
61,62,a,b,3.56,-6.87,3157.890121,0.123456789,50000,-60000,37678,40000
a=61,b=62
c1=a,c2=b
d=3.56,e=-6.87
f=3157.890121,g=0.123456789000
m=50000,n=-60000
p=37678,q=40000
⑤在④的基础上将printf改为:
printf("a=%d,b=%d\nc1=%c,c2=%c\nd=%15.6f,e=%15.12f\n",a,b,c1,c2,d,e);
printf("f=%f,g=%f\nm=%d,n=%d\np=%d,q=%\n",f,g,m,n,p,q);
a=61,b=62
c1=a,c2=b
d=3.560000,e=-6.869999885559
f=3157.890121,g=0.123457
m=-15536,n=0
p=5536,q=-1
⑥将p,q改用%o格式符输出a=61,b=62
c1=a,c2=b
d=3.560000,e=-6.869999885559
f=3157.890121,g=0.123457
m=-15536,n=0
p=12640,q=177777
⑦将scanf函数中的%lf和%ld改为%f和%d,运行程序分析结果:
c1=a,c2=b
d=3.560000,e=-6.869999885559
f=0.000000,g=0.000000
m=-15536,n=1824
p=5536,q=1983
(2)按习题4.8要求编写程序,并上机运行。
题目为:
设半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
用scanf输入数据,输出结果。
输出时要有文字说明,取小数点后两位数字。
#include
main()
{
floatr,h,L,S,S1,V,V1,pi=3.1415926;
printf("r=");
scanf("%f",&r);
printf("h=");
scanf("%f",&h);
L=2*pi*r;
S=pi*r*r;
S1=4*pi*r*r;
V=4/3*(pi*r*r*r);
V1=S*h;
printf("L=%6.2f\nS=%6.2f\nS1=%6.2f\nV=%6.2f\nV1=%6.2f\n",L,S,S1,V,V1);
printf("*********\n");
printf("copyright\n");
printf("*********\n");
getch();
结果:
L=9.42S=7.07S1=28.26V=14.13V1=21.20
(3)编程序,用getchar函数读入两个字符c1,c2,然后分别用putchar函数和printf函数输出这两个字符。
上机运行程序,比较用printf和putchar函数输出字符的特点。
代码:
#include
voidmain()
{charc1,c2;
c1=getchar();
c2=getchar();
putchar(c1);
putchar(c2);
printf("%c,%c",c1,c2);
getch();
}
结果:
ab
aba,b
比较,一个putchar函数只可以输出一个字符,而一个print函数可以输出多个字符,并可以用符号连接。
心得体会:
如何在代码中使用不同的函数从而简化代码,优化代码需要我们多加练习,多加体会。
实验四逻辑结构程序设计
1.实验目的
(1)了解C语言表示逻辑量的方法(以0代表“假”,以非0代表“真”)。
(2)学会正确使用逻辑运算符和逻辑表达式。
(3)熟练掌握if语句和switch语句。
(4)结合程序掌握一些简单的算法。
(5)学习调试程序。
2.实验内容
(1)习题5.5。
有一函数:
y=x(x<1)
y=2x-1(1≦x<10)
y=3x-11(x≥10)
用scanf函数输入x的值,求y的值。
运行程序,输入的x(分别为x<1,1~10,x≥10这3中情况),检查输出值的准确性。
#include
voidmain()
{intx,y;
printf("x:
");
scanf("%d",&x);
if(x<1)
{y=x;
printf("x=%3d,y=x=%d\n",x,y);
}
elseif(x<10)
{y=2*x-1;
printf("x=%3d,y=2*x-1=%d\n",x,y);
}
else
{y=3*x-11;
printf("x=%3d,y=3*x-11=%d\n",x,y);
}
}
运行结果:
x:
⑵给出一个百分制绩,要求输入成绩ABCDE。
90分以上的为A,81~89分为B,70~79分为C,60~69分为D,60分以下的为E。
1实现编号程序,要求分别用IF和switch语句来实现。
运行结果,并检查结果。
2在运行一次,输入值为负值,这显然时输入错误,修改程序,是只能正确处理结果,当输入数据>100或<0是,通知用户输入错误,程序结束。
#include
voidmain()
{floatscore;
chargrade;
printf("inputstudent'sscore:
");
scanf("%f",&score);
switch((int)(score))
{case100:
case90:
grade='A';break;
case80:
grade='B';break;
case70:
grade='C';break;
case60:
grade='D';break;
case50:
case40:
case30:
case20:
case10:
case00:
grade='E';break;
}
printf("scoreis%5.1fthegradeis%c\n",score,grade);
getch();
}
(3)给一个不多于5为的正整数,要求1:
起哦出他是几位数,2:
粉笔输出每一位数字3;按逆顺序输出各个数字,例如原数321,应输出123,
·要处理的数为1位正整数;
·要处理的数为2位正整数;
·要处理的数为3位正整数;
·要处理的数为4位正整数;
·要处理的数为5位正整数。
除此之外,程序还应当对不合法的输入作必要的处理,例如:
·输入负数;
·输入的数超过5位(如123456)
代码:
#include
voidmain()
{longx;inta,b,c,d,e;
scanf("%ld",&x);
if(x>=100000||x<0)
{printf("输入错误");}
elseif(x>=0&&x<10)
{printf("它是一位数,数字为:
%d",x);}
elseif(x>=10&&x<100)
{a=x%10;b=x/10;
printf("它是二位数,数字为:
%d,%d",a,b);}
elseif(x>=100&&x<1000)
{a=x%10;b=x/10%10;c=x/100;
printf("它是三位数,数字为:
%d,%d,%d",a,b,c);}
elseif(x>=1000&&x<10000)
{a=x%10;b=x/10%10;c=x/100%10;d=x/1000;
printf("它是四位数,数字为:
%d,%d,%d,%d",a,b,c,d);}
elseif(x>=10000&&x<100000)
{a=x%10;b=x/10%10;c=x/100%10;d=x/1000%10;e=x/10000;
printf("它是五位数,数字为:
%d,%d,%d,%d,%d",a,b,c,d,e);}
getch();
}
结果:
与预期相符。
(4)输入4个整数,要求按由小到大顺序输出。
在得到正确结果后,修改程序使之按由大到小顺序输出。
代码1:
#include
voidmain()
{inta,b,c,d,t;
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(a>d)
{t=a;a=d;d=t;}
if(b>c)
{t=b;b=c;c=t;}
if(b>d)
{t=b;b=d;d=t;}
if(c>d)
{t=c;c=d;d=t;}
printf("%d,%d,%d,%d",a,b,c,d);
getch();
}
代码2:
#include
voidmain()
{inta,b,c,d,t;
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
if(a
{t=a;a=b;b=t;}
if(a{t=a;a=c;c=t;}
if(a{t=a;a=d;d=t;}
if(b{t=b;b=c;c=t;}
if(b{t=b;b=d;d=t;}
if(c{t=c;c=d;d=t;}
printf("%d,%d,%d,%d",a,b,c,d);
getch();
心得体会:
循环语句比较复杂,我还要多加练习。
实验五循环控制
1.实验目的
(1)熟悉掌握用while语句、do-while语句和for语句实现循环的方法。
(2)掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。
(3)进一步学习调试程序。
2.实验内容
编程序并上机调试运行。
(1)输入两个正整数m和n,求他们的最大公约数和最小公倍数
在运行时,输入的值m>n,观察结果是否正确。
再输入时,使m修改程序,不论m和n为何值,都能得到正确结果。
代码:
#include
#include
voidmain()
{intm,n,i;
scanf("%d,%d",&m,&n);
for(i=fabs(n);i>=1;i--)
{if(n%i==0&&m%i==0)
break;}
printf("%d\n",i);
for(i=1;i<=fabs(m*n);i++)
{if(i%n==0&&i%m==0)
break;}
if(m*n<0)
printf("%d\n",-i);
elseprintf("%d",i);
getch();
}
结果:
与预期结果相符。
(2)输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。
在得到正确结果后,请修改程序使之能分别统计大小写字母、空格、数字和其他字符的个数。
代码:
#include
voidmain()
{chars;
inta,b,c,d,e;
a=0;b=0;c=0;d=0;e=0;
while((s=getchar())!
='\n')
{if(s>='A'&&s<='Z')
a++;
elseif(s>='0'&&s<='9')
b++;
elseif(s=='')
c++;
elseif(s>='a'&&s<='z')
e++;
else
d++;
}
printf("%d,%d,%d,%d,%d",a,b,c,d,e);
getch();
}
结果:
与预期结果相符
(3)用牛顿迭代法求方程2x3-4x2+3x=6在1.5附近的根。
在得到正确结果后。
请修改程序使所设的x初始值由1.5改变为100、1000、10000,在运行,观察结果,分析不同的x处置对结果有没有影响,为什么?
修改程序,使之能输出迭代的次数和每次迭代的结果,分析不同的x初始值对迭代的次数有无影响。
代码:
#include
#include
voidmain()
{floatx1,x0,f,f1;
scanf("%f",&x1);
do
{x0=x1;
f=((2*x0-4)*x0+3)*x0-6;
f1=(6*x0-8)*x0+3;
x1=x0-f/f1;
}
while(fabs(x1-x0)>=1e-5);
printf("%5.2f\n",x1);
getch();
}
结果:
与预期结果相符,x的初始值对于迭代没有影响。
(4)猴子吃桃问题。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。
以后每天早上都吃了前天剩下的一半零一个。
到第10天早上再想吃时,见只剩一个桃子了。
求第一天共摘了多少桃子。
在得到正确结果后,修改题目,改为猴子每天吃了前一天的一半后,再吃两个。
请修改程序并运行,检查结果是否正确。
代码:
#include
voidmain()
{ints,i;
s=1;
for(i=1;i<10;i++)
s=2*(s+1);
printf("%d",s);
getch();
}
结果1534
代码:
#include
voidmain()
{ints,i;
s=1;
for(i=1;i<10;i++)
s=2*(s+2);
printf("%d",s);
getch();
}
结果2556
心得体会:
循环控制也很难,还要多加练习。
实验六数组
1.实验目的
(1)掌握一维数组和二维数组的定义、赋值和输入输出的方法;
(2)掌握字符数组和字符串函数的使用;
(3)掌握与数组有关的算法(特别是排序算法)。
2.实验内容
编程序并上机调试运行
(1)用选择法对10个整数排序。
10个整数用scanf函数输入
代码:
#include
voidmain()
{inta[11],i,j,min,t;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf("%d",a[i]);
for(i=0;i<9;i++)
{min=i;
for(j=i+1;j<10;j++)
if(a[j]min=j;
t=a[i];
a[i]=a[min];
a[min]=t;}
for(i=0;i<10;i++)
printf("%3d",a[i]);
getch();
}
结果:
与预期结果相符
(1)有15个数存放在一个数组中,输入一个数,要求用折半查找法找出该数组是数组中第几个元素的值。
如果该数不在数组中,则输出“无此数”。
以15个数用赋初值的方法在程序中给出。
要找的数用scanf函数输入。
代码:
#include
voidmain()
{inta[15],i,x,min,max,sign,loca,mid;
for(i=0;i<15;i++)
scanf("%d",&a[i]);
for(i=0;i<15;i++)
printf("%3d",a[i]);
scanf("%d",&x);
max=14;
min=0;
sign=0;
if(xa[14])
loca=-1;
while((!
sign)&&(min<=max))
{mid=(max+min)/2;
if(x==a[mid])
{loca=mid;
printf("%d",loca+1);
sign=1;}
elseif(xmax=mid-1;
else
min=mid+1;}
if(!
sign||loca==-1)
printf("error");
getch();
}
结果:
与预期结果相符。
(2)将两个字符串连接起来,不要用strcat函数。
代码:
#include
voidmain()
{charstr1[40],str2[40];
inti,j;
i=0;
j=0;
scanf("%s",str1);
scanf("%s",str2);
while(str1[i]!
='\0')
i++;
while(str2[j]!
='\0')
str1[i++]=str2[j++];
str1[i]='\0';
printf("%s",str1);
getch();
}
结果:
与预期结果相符。
(2)找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。
也可能没有鞍点。
应至少准备两组测试数据:
1二维数组有鞍点,例如:
2二维数组没有鞍点,例如:
用scanf函数从键盘输入数组各元素的值,检查结果是否正确。
题目并未指定二维数组的行数和列数,程序应能处理任意行数和列数的数组。
因此,从理论上来说,应当准备许多不同行数和列数的数组数据,但这样的工作量太大,一般来说不需要这样做,只需准备典型的数据即可。
如果已指定了数组的行数和列数,可以在程序中对数组元素赋初值,而不必用scanf函数。
代码:
#include
voidmain()
{inta[4][5],i,j,k,max,maxj,flag;
for(i=0;i<4;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
for(i=0;i<4;i++)
{max=a[i][0];
maxj=0;
for(j=0;j<5;j++)
if(a[i][j]>max)
{max=a[i][j];
maxj=j;}
flag=1;
for(k=0;k<4;k++)
if(max>a[k][maxj])
{flag=0;continue;}
if(flag)
{printf("%d",max);
break;}}
if(!