C语言程序设计课程实验报告2.docx
《C语言程序设计课程实验报告2.docx》由会员分享,可在线阅读,更多相关《C语言程序设计课程实验报告2.docx(108页珍藏版)》请在冰豆网上搜索。
![C语言程序设计课程实验报告2.docx](https://file1.bdocx.com/fileroot1/2023-4/20/54394f60-2795-442c-a91b-38c3ed2d8ff5/54394f60-2795-442c-a91b-38c3ed2d8ff51.gif)
C语言程序设计课程实验报告2
课程实验报告
课程名称:
C语言程序设计
专业班级:
信息安全201302班
学号:
姓名:
指导教师:
报告日期:
2014年6月16日
计算机科学与技术学院
1实验概述
C语言是美国的DennisRitchie在1972年设计发明的。
它由早期的编程语言BCPL(BasicCombinedProgrammingLanguage)发展演变而来。
C语言之所以发展迅速,成为最受欢迎的语言之一,主要因为它具有强大的功能。
归纳起来,C语言具有下列特点:
1.C语言是“中级语言”
它把高级语言的基本结构和语句与低级语言的实用性结合起来。
C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
2.C语言是结构式语言
所谓结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。
这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
C语言是以函数形式提供给用户的,这些函数可方便地调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
3.C语言功能齐全
C语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。
另外C语言也具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。
4.C语言适用范围广
C语言还有一个突出的优点就是适合多种操作系统,如DOS、Windows、UNIX,也适用于多种机型。
所以作为计算机科学与技术学院的学生,学好C语言绝对是我们义不容辞的责任。
在本学期的学习中,为了更好的消化吸收所学知识,共进行了七次上机实验,将这七次的上机所做实验整合汇编到一起,便写出这册实验报告。
本实验报告共包含九章60个实验任务。
其中第二至第八章为实验的内容,第一次为熟悉C语言程序的开发环境及表达式的标准输入与输出实验,第二次为流程控制实验,第三次也为流程控制实验,第四次为函数与程序结构实验,第五次为编译预处理实验,第六次为数组实验,第七次为指针实验,结构与联合实验及文件实验。
每章又包括实验目的、实验内容和实验小结三部分,实验内容中前半部分为word补充题目,后半部分为实验教材第二章必做题。
每个实验内容中都包含实验任务内容,源程序及运行结果,部分实验还有亮点,过程记录,及一些程序的解说。
所有程序都尽量配有提示性的语句,在运行时能清楚地知道要输入什么。
报告中所有图表都按照标准标有编号,图名和表名,排版也比较整齐,整体看起来比较舒服。
总之,上机实验是进一步深刻了解C语言的语法、语义,掌握用C语言进行初步程序设计所需要的方法和技能的一个重要环节。
优秀的程序员毫无例外地都是在机器上“摸爬滚打”出来的。
C语言创始人DennisRitchie是如此,C++的创始人BjarneStroustrup也是如此。
这些语言大师都是在机器上使用当时流行的计算机语言遇到巨大障碍的情况下,才产生了发明新的计算机语言的灵感和动力。
DennisRitchie直到20世纪90年代还在他的360机器上编程。
因此,作为C
语言的初学者,我很重视实验。
这是我编程生涯的开始,觉得对编程很感兴趣,衷心希望我将来能够成为编程高手,成为计算机领域的优秀人才,为祖国的信息安全方面做出我的贡献!
编者著
2014年6月于华中科技大学
2第一次实验
2.1实验目的
1.掌握C程序的编辑、链接、和运行方法。
2.通过运行简单的C程序,学会在集成开发环境中调试程序的方法。
3.熟练掌握各种运算符的运算功能,操作数的类型,运算结果的类型及运算过程中的类型转换,重点是C语言特有的运算符,例如位运算符,问号运算符,逗号运算符等等;熟记运算符的优先级和结合型。
4.掌握getchar,putchar,scanf和printf函数的用法。
5.掌握简单的C程序的编写方法。
2.2实验内容
(一)设计一个程序,在字符模式下,以某个字符拼出“王”汉字图形,显示输出。
【源程序2.1】
#include
intmain(void)
{
puts("oooooooo");
puts("oo");
puts("oo");
puts("oooooooo");
puts("oo");
puts("oo");
puts("oooooooo");
return0;
}
运行结果:
在显示屏上以字符o的形式输出“王”,如图2.1所示。
图2.1程序2.1运行结果
(二)输入一个华氏温度,要求输出摄氏温度。
公式为c=5/9*(f-32)。
【源程序2.2】
#include
intmain(void)
{
floatf,c;
printf("InputtheFahrenheit:
");
scanf("%f",&f);
c=(f-32)*5/9;
printf("TheCelsiusis%f.",c);
return0;
}
运行结果如表2.1所示。
表2.1程序2.2测试数据
输入
输出
理论值
-13
-25.000000
-25.000000
0
-17.777778
-17.777778
32
0.000000
0.000000
49.9
9.944445
9.944445
过程记录:
刚开始时“c=(f-32)*5/9;”这个语句写的是“c=5/9*(f-32);”,发现结果都是0,原来根据运算顺序最先计算5/9,取整后变为0,故需调整一下顺序。
(三)设计3种算法,完成交换整型两个变量值的程序。
【源程序
#include
intmain(void)
{
inta,b,t;
printf("Inputtwointegers:
");
scanf("%d%d",&a,&b);
t=a,a=b,b=t;
printf("%d,%d",a,b);
return0;
}
运行结果如表
表2.2.1程序
输入
输出
理论值
0-1
-1,0
-1,0
-90
0,-9
0,-9
-107
7,-10
7,-10
【源程序
#include
intmain(void)
{
inta,b;
printf("Inputtwointegers:
");
scanf("%d%d",&a,&b);
a=a+b;
b=a-b;
a=a-b;
printf("%d,%d",a,b);
return0;
}
运行结果如表
表2.2.2程序
输入
输出
理论值
89
9,8
9,8
90
0,9
0,9
-3-8
-8,-3
-8,-3
【源程序
#include
intmain(void)
{
inta,b;
printf("Inputtwointegers:
");
scanf("%d%d",&a,&b);
a=a^b;
b=a^b;
a=a^b;
printf("%d,%d",a,b);
return0;
}
运行结果如表
表2.2.3程序
输入
输出
理论值
0-7
-7,0
-7,0
8-9
-9,8
-9,8
99
9,9
9,9
本实验中分别用中间变量、算术运算和位运算三种方法实现了交换两个整型变量的值。
(四)设计一个程序,完成如下功能:
输出一个三位数,将它反向输出。
如输入127,输出721。
【源程序2.4】
#include
intmain(void)
{
inta,b,c,x;
printf("Inputthreefiguresplease!
\n");
scanf("%d",&x);
a=x/100;
b=(x-a*100)/10;
c=x%10;
printf("%d%d%d",c,b,a);
return0;
}
运行结果如表2.3所示
表2.3程序2.4的测试数据
输入
输出
理论值
127
721
721
999
999
999
979
979
979
(五)设计2种完成计算MAX{x,y,z}的程序。
【源程序
#include
intmain(void)
{
floata,b,c,max;
printf("Inputthreeintegers:
");
scanf("%f%f%f",&a,&b,&c);
if(a>=b&&a>=c)max=a;
if(b>=a&&b>=c)max=b;
if(c>=a&&c>=b)max=c;
printf("max=%f",max);
return0;
}
运行结果如表
表2.4.1程序
输入
输出
理论值
-9-1-5
-1.000000
-1.000000
90-7
9.000000
9.000000
-998
9.000000
9.000000
【源程序
#include
intmain(void)
{
floata,b,c,max;
printf("Inputthreeintegers:
");
scanf("%f%f%f",&a,&b,&c);
max=a>b?
(a>c?
a:
c):
(b>c?
b:
c);
printf("max=%f",max);
return0;
}
运行结果如表
表2.4.2程序
输入
输出
理论值
-9.9-6-563846
-6.000000
-6.000000
79.088.9
88.900000
88.900000
-9-8-7
-7.000000
-7.000000
本实验中分别用if语句和条件运算符实现了求三个数中最大值。
(六)设计一个程序,完成计算3个数的居中数。
【源程序2.6】
#include
intmain(void)
{
floata,b,c,m;
printf("Inputthreeintegers:
");
scanf("%f%f%f",&a,&b,&c);
m=a>b?
((a>c)?
(b>c?
b:
c):
a):
(a>c?
a:
(b>c?
c:
b));
printf("middle=%f",m);
return0;
}
运行结果如表2.5所示
表2.5程序2.6的测试数据
输入
输出
理论值
123
2.000000
2.000000
-80-7
-7.000000
-7.000000
099.9
9.000000
9.000000
(七)设计计算一元二次方程的根的程序。
【源程序2.7】
#include
#include
intmain(void)
{
floata,b,c;
doublex,y,m;
printf("Inputa,b,cplease!
\n");
scanf("%f%f%f",&a,&b,&c);
m=b*b-4*a*c;
if(a!
=0)
if(m>=0)
{
x=(sqrt(m)-b)/2/a;
y=(-sqrt(m)-b)/2/a;
printf("x=%lf,y=%lf\n",x,y);
}
else
printf("Noanswer!
");
else
printf("Theequationisn'tquadratic.\n");
return0;
}
运行结果如表2.6所示
表2.6程序2.7的测试数据
输入
输出
理论值
056
Theequationisn'tquadratic.
Theequationisn'tquadratic.
132
x=-1.000000,y=-2.000000
x=-1.000000,y=-2.000000
256
Noanswer!
Noanswer!
121
x=-1.000000,y=-1.000000
x=-1.000000,y=-1.000000
亮点:
能够判断方程是否为二次方程,也能判断有无实根。
(八)根据任意三角形的面积公式(海伦公式):
S=√p(p-a)(p-b)(p-c),其中,p=(a+b+c)/2,,设计一个程序计算任意三角形的面积。
【源程序2.8】
#include
#include
intmain(void)
{
floata,b,c,s,t;
doublearea;
printf("Inputthreeedgeofthetriangle\n");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c&&a-b{
s=(a+b+c)/2;
t=s*(s-a)*(s-b)*(s-c);
area=sqrt(t);
printf("area=%f\n",area);
}
else
printf("Thetriangleisn'tlegal!
\n");
return0;
}
运行结果如表2.7所示
表2.7程序2.8的测试数据
输入
输出
理论值
345
6.000000
6.000000
126
Thetriangleisn'tlegal!
Thetriangleisn'tlegal!
789
26.832816
26.832816
亮点:
能够判断输入的三角形是不是合法的。
(九)编写一个程序,输入字符c。
如果c是大写字母,则将c转换成对应的小写,否则c的值不变,最后输出c。
【源程序2.9】
#include
intmain(void)
{
charc;
printf("Inputaletter:
");
c=getchar();
c=(c>='A'&&c<='Z')?
(c+'a'-'A'):
c;
putchar(c);
return0;
}
运行结果:
输入‘a’时输出‘a’,输入‘A’时输出‘a’。
(十)编写一个程序,输入无符号短整数x,m,n(0≤m≤15,1≤n≤16-m),取出x从第m位开始向左的n位(m从右至左编号为0~15),并使其向左端(第15位)靠齐。
【源程序2.10】
#include
intmain(void)
{
unsignedshortx,m,n,y;
printf("Inputx,mandnplease!
\n");
scanf("%hu%hu%hu",&x,&m,&n);
if(m>=0&&m<=15&&n>=1&&n<=16-m)
{
y=(x<<16-m-n)&(0xffff<<16-n);
printf("0x%x",y);
}
else
printf("error");
return0;
}
运行结果如表2.8所示
表2.8程序2.10的测试数据
输入
输出
理论值
x
m
n
255
3
4
0xf000
0xf000
15236
4
6
0xe000
0xe000
45462
9
8
error
error
亮点:
能够判断m,n输入是否合法,若不合法输出提示信息“error”。
(十一)IP地址通常是4个用句点分隔得小整数(即点分十进制),如,以及其存储的形式的形式是读入一个互联网IP地址对其译码,然后用常见的句点分隔的4部分的形式输出。
【源程序2.11】
#include
intmain(void)
{
unsignedlongx,a,b,c,d;
scanf("%d",&x);
d=x&0xff;
c=(x&0xff00)>>8;
b=(x&0xff0000)>>16;
a=(x&0xff000000)>>24;
printf("%lu.%lu.%lu.%lu\n",d,c,b,a);
return0;
}
运行结果:
输入1,输出
2.3实验小结
第一次编程,感觉是挺新奇的,不过毕竟是第一次实践,总是有这样或那样的问题,比如总是忘记在scanf语句中加“&”表示变量的内存地址,时不时少个“;”或“}”,这种小毛病还真要上机才能改过来。
算法方面也总是有这样那样的问题,不过经过自己的检查和与同学的讨论总算是都解决了,最后看着自己编的程序一个个都能运行时那种欣喜的感觉,我想就像母亲看到孩子成才了一样吧。
这是我编程生涯的开始,希望以后能越做越好!
3第二次实验
3.1实验目的
1.掌握复合语句、if语句、switch语句的使用;
2.熟练运用for、while、do-while语句来编写程序;
3.掌握重复循环技术。
3.2实验内容
(一)设计一个计算个人所得税的程序。
【源程序3.1】
#include
intmain(void)
{
doublex,y;
do{
printf("Inputtheamountofyourincome:
");
scanf("%lf",&x);
y=x-3500;
}while(y<-3500);
if(y<0)
y=0;
elseif(y<1500)
y=y*0.03;
elseif(y<4500)
y=y*0.1-105;
elseif(y<9000)
y=y*0.2-555;
elseif(y<35000)
y=y*0.25-1005;
elseif(y<55000)
y=y*0.3-2755;
elseif(y<80000)
y=y*0.35-5505;
elsey=y*0.45-13505;
printf("Theindividualincometaxis%lf",y);
return0;
}
运行结果如表3.1所示。
表3.1程序3.1测试数据
输入
实际输出
理论输出
-4000
Inputtheamountofyourincome:
Inputtheamountofyourincome:
2000
Theindividualincometaxis0.000000
Theindividualincometaxis0.000000
4000
Theindividualincometaxis15.000000
Theindividualincometaxis15.000000
6000
Theindividualincometaxis145.0000000
Theindividualincometaxis145.0000000
9999
Theindividualincometaxis744.800000
Theindividualincometaxis744.800000
20000
Theindividualincometaxis3120.000000
Theindividualincometaxis3120.000000
46578
Theindividualincometaxis10168.400000
Theindividualincometaxis10168.400000
79868.8
Theindividualincometaxis21224.080000
Theindividualincometaxis21224.080000
100000
Theindividualincometaxis29920.000000
Theindividualincometaxis29920.000000
亮点:
如果输入收入为负值,则会要求再次输入。
(二)计算两个自然数的最大公约数和最小公倍数。
【源程序3.2】
#include
intmain(void)
{
intm,n,i,j,x,y,a,b;
printf("Inputtwonaturalnumbers:
");
scanf("%d%d",&m,&n);
if(m<=0||n<=0)
printf("Inputerror!
\n");
else{
i=(m>n)?
n:
m;
j=(m>n)?
m:
n;
for(;x||y;--i){
x=m%i;
y=n%i;
}
for(;a||b;++j){
a=j%m;
b=j%n;
}
printf("%dand%d'sGCDis%dandLCMis%d\n",m,n,i+1,j-1);
}
return0;
}
运行结果如表3.2所示。
表3.2程序3.2测试数据
输入
实际输出
理论输出
-32
Inputerror!
Inputerror!
03
Inputerror!
Inputerror!
10060
100and60'sGCDis20andLCMis300
100and60'sGCDis20andLCMis300
3.57
Inputerror!
Inputerror!
亮点:
能够判断输入的是否是自然数。
(三)输入一个数n(≥2),判定n是否为素数。
【源程序3.3】
#include
in