华中科技大学c语言实验与课程设计上机实验报告汇总18全部.docx
- 文档编号:29450318
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:97
- 大小:528.53KB
华中科技大学c语言实验与课程设计上机实验报告汇总18全部.docx
《华中科技大学c语言实验与课程设计上机实验报告汇总18全部.docx》由会员分享,可在线阅读,更多相关《华中科技大学c语言实验与课程设计上机实验报告汇总18全部.docx(97页珍藏版)》请在冰豆网上搜索。
华中科技大学c语言实验与课程设计上机实验报告汇总18全部
华中科技大学
C语言实验与课程设计
实验报告
计算机科学与技术学院
指导老师:
1表达式和标准输入输出实验········3
2流程控制实验··············11
3函数程序与构造实验···········20
4编译预处理实验·············28
5数组实验················35
6指针实验················42
7构造与结合实验·············52
8文件实验················61
1表达式和标准输入与输出实验
1.1实验目的
(1)纯熟掌握各种运算符的运算功能,操作数的类型,运算结果的类型及运算过程中的类型转换,重点是C语言特有的运算符,例如位运算符,问号运算符,逗号运算符等;熟记运算符的优先级和结合性。
〔2〕掌握scanf和printf函数的用法。
〔3〕掌握简单C程序〔顺序构造程序〕的编写方法。
1.2实验内容及结果
源程序改错
下面给出了一个简单C语言程序例程,用来完成以下工作:
〔1〕输入华氏温度f,将它转换成摄氏温度C后输出;
〔2〕输入圆的半径值r,计算并输出圆的面积s;
〔3〕输入短整数k、p,将k的高字节作为结果的低字节,p的高字节作为结果的高字节,拼成一个新的整数,然后输出;
在这个例子程序中存在假设干语法和逻辑错误。
要求参照和的步骤对下面程序进展调试修改,使之可以正确完成指定任务。
程序代码:
#include
#definePI3.14159;
voidmain(void)
{
intf;
shortp,k;
doublec,r,s;
/*fortask1*/
printf(“InputFahrenheit:
〞);
scanf(“%d〞,f);
c=5/9*(f-32);
printf(“\n%d(F)=%.2f(C)\n\n〞,f,c);
/*fortask2*/
printf("inputtheradiusr:
");
scanf("%f",&r);
s=PI*r*r;
printf("\nTheacreageis%.2f\n\n",&s);
/*fortask3*/
printf("inputhexintk,p:
");
scanf("%x%x",&k,&p);
newint=(p&0xff00)|(k&0xff00)<<8;
printf("newint=%x\n\n",newint);
}
【分析及改正】本程序共存在9处错误,分析如下:
〔1〕;
错误原因:
宏定义在预处理时会将后续程序中的标示符展开为对应全部字符串,而PI不需要分号。
改正:
去掉其后分号
〔2〕voidmain(void){
错误原因:
函数返回值与函数名之间应加空格,C90标准建议main函数应返回一个int作为状态值
改正:
intmain(void){
〔3〕shortp,k;
错误原因:
后续用到了newint变量但并未声明
改正:
shortp,k,newint;
〔4〕scanf(“%d〞,f);
错误原因:
应该把要读入的变量的地址传递给scanf才能正确写入
改正:
scanf("%d",&f);
〔5〕c=5/9*(f-32);
错误原因:
5和9是整型常数,相除会截断小数部分,应该将其中任意一个输表示为或转换为浮点数类型
改正:
c=/9*(f-32);
〔6〕scanf("%f",&r);
错误原因:
double类型对应的占位符是%lf
改正:
scanf("%lf",&r);
〔7〕printf("\nTheacreageis%.2f\n\n",&s);
错误原因:
要输出s的值应该将s作为参数传递给printf,不应传递其地址
改正:
printf("\nTheacreageis%.2f\n\n",s);
〔8〕scanf("%x%x",&k,&p);
printf("newint=%x\n\n",newint);
错误原因:
k,p为short类型,对应十六进制占位符应为%hx
改正:
scanf("%hx%hx",&k,&p);
printf("newint=%hx\n\n",newint);
〔9〕newint=(p&0xff00)|(k&0xff00)<<8;
错误原因:
要求将k的高字节作为结果的低字节,应该将k的高字节提取出后右移至低字节
改正:
newint=(p&0xff00)|(((k&0xff00)>>8)&0x00ff);
源程序修改交换
下面的程序利用常用的中间变量法实现两数交换,请改用不使用第3个变量的方法实现。
该程序中t是中间变量,要求将定义语句中的t删除,修改下划线处的语句,使之实现两数对调的操作。
程序代码:
#include
voidmain()
{
inta,b,t;
printf(“Inputtwointegers:
〞);
scanf(“%d%d〞,&a,&b);
t=a;a=b;b=t;
prinf(“\na=%d,b=%d〞,a,b);
}
【分析】将a,b中的任何一个看做原码,另一个当做密钥进展加密,再将加密过的内容与密钥做加密运算即得到原码。
由此使用异或运算进展交换。
流程图如下:
【程序】
#include
#include
intmain(){
inta,b;
printf("inputtwointegers:
");
scanf("%d%d",&a,&b);
a^=b;
b^=a;
a^=b;
printf("\na=%d,b=%d",a,b);
return0;
}
【测试】假设输入a=1,b=7,应该输出:
a=7,b=1,程序运行结果如下,程序正确。
程序设计
1、编写一个程序,输入字符c,假设c是大写字母,那么将c转换成对应的小写,否那么c的值不变,最后输出c。
【分析】因为同一个字母的大小写字母的ASCII码值相差32,假设ch为大写字母,那么ch+32为对应的小写字母。
流程图如下:
【程序】
#include
intmain()
{
printf("Inputyourcharx:
\n");
charx;
scanf("%c",&x);
if(x>='a'&&x<='z')
{
printf("%c\n",x);
}
elseif(x>='A'&&x<='Z')
{
printf("%c\n",x-'0'+32+'0');
}
else{
printf("Pleaseinputtherightchar.");
}
return0;
}
【测试】
〔1〕测试大写变小写。
假设输入D,应输出d,程序运行结果如下,程序正确。
〔2〕测试其他字符。
假设输入a,应输出a,程序运行结果如下,程序正确。
2、编写一个程序,输入无符号短整数x,m,n〔0≤m≤15,1≤n≤16-m〕,取出x从第m位开始向左的n位〔m从右至左编号为0~15〕,并使其向左端〔第15位〕靠齐。
【分析】将x首先右移m位,再左移(16-n)位,那么末尾会补0,即可将第m位开始向左的n位且向最高位靠齐
流程图如下:
【程序】
#include
intmain(){
unsignedshortx,m,n;
puts("Pleaseinputx,m,n:
");
scanf("%hu%hu%hu",&x,&m,&n);
x>>=m;
x<<=(16-n);
printf("%hx\n",x);
return0;
}
【测试】假设x=58207,m=4,n=4,因为(58207)10=(1110001101011111)2,处理后为(101000000000000)2=(5000)16,程序应该输出十六进制数:
5000,运行结果如下,程序正确。
3、IP地址通常是4个用句点分隔的小整数〔即点分十进制〕,如。
这些地址在机器中用无符号长整形表示。
编写一个程序,以机器存储的形式读入一个互联网IP地址,对其译码,然后用常见的句点分隔的4部分的形式输出。
例如,整形676879571二进制表示就是:
00101000010110000101110011010011,按照8位一组可表示为:
408892211,由于CPU处理数据的差异,它的顺序是颠倒的,所有最终格式为。
【分析】分别利用逻辑尺取出读入的长整形数的四部分,从最低位起每8位〔1个字节〕为一个部分,然后按照正常顺序输出其对应的十进制IP地址。
程序框图如下:
【程序】
#include
intmain(){
unsignedlongIP;
unsignedshortfirst,second,third,fourth;
puts("InputtheIPinunsignedlongintform:
");
scanf("%lu",&IP);
first=(IP&0xFF000000)>>24;
second=(IP&0xFF0000)>>16;
third=(IP&0xFF00)>>8;
fourth=IP&0xFF;
printf("%hu.%hu.%hu.%hu",fourth,third,second,first);
}
【测试】假设输入676879571,应输出。
运行结果如下,说明程序正确。
1.3实验体会
在做改错题时,先阅读一遍,找出明显的错误,然后将初步修改后的代码输入编译器并编译,再根据编译器的警告与错误提示修改程序至完全正确,这个过程很需要细心和耐心,这个过程可以很好的帮助我再今后不犯类似错误。
源程序修改与交换题锻炼我们举一反三的才能,我们在平时写程序时就应该考虑对于一个问题有没有多钟解决方案,不使用中间变量交换两个整数是很常见的问题,我利用一个数异或自身等于0,0异或任意位保存原位的原理来交换。
程序设计题进步了我们对所学知识的纯熟度和理解程度,只有理论才能学会C语言,在亲手编写代码的过程中发现问题,理解概念。
2流程控制实验
实验目的
〔1〕掌握复合语句、if语句、switch语句的使用,纯熟掌握for、while、do-while三种根本的循环控制语句的使用,掌握重复循环技术,理解转移语句与标号语句。
〔2〕纯熟运用for、while、do-while语句来编写程序。
〔3〕练习转移语句和标号语句的使用。
〔4〕使用集成开发环境中的调试功能:
单步执行、设置断点、观察变量值。
2.2.1.源程序改错
下面是计算s=n!
的源程序,在这个源程序中存在假设干语法和逻辑错误。
要求在计算机上对这个例子源程序进展调试修改,使之可以正确完成指定任务,例如,8!
=40320。
程序代码:
#include
intmain()
{
inti,n,s=1;
printf("Pleaseentern:
");
scanf("%d",n);
for(i=1;i<=n;i++)
s=s*i;
printf("%d!
=%d",n,s);
return0;
}
【分析及改正】本程序共存在3处错误,分析如下:
〔1〕ints=1;
错误原因:
在计算阶乘的时候,由于阶乘值会上升很快,所以不建议使用int类型,可以改为long或者double型。
改正:
改为long型变量。
〔2〕scanf(“%d〞,n);
错误原因:
scanf函数获取输入值时,引用的是一个变量地址,而不是变量本身。
改正:
scanf(“%d〞,&n);
〔3〕}return0;
错误原因:
return返回值应该在main函数内部
改正:
return0;}
2.2.2源程序修改交换
〔1〕修改上述计算s=n!
的源程序,要求分别用while和do-while语句交换for语句。
〔2〕修改上述计算s=n!
的源程序,要求输入改为“整数S〞,输出改为“满足n!
>=s的最小整数n〞。
例如,输入整数40310,输出结果为n=8.
【分析】〔1〕一样循环内容利用不同循环构造实现,需要注意不同语句的格式及根据循环方式对循环体做些许变动。
流程图如下:
while型do-while型
〔2〕同样计算n!
并将n!
赋值给不是s的值〔比方说m〕,然后令m和s比较大小,找到符合条件的第一个m值,并返回n值。
流程图如下:
【程序】〔1〕while型
#include
intmain()
{
inti=1,n,s=1;
printf("Pleaseentern:
");
scanf("%d",&n);
while(i<=n){
s=s*i;
i++;}
printf("%d!
=%d",n,s);
return0;
}
do-while型
#include
intmain()
{
inti=1,n,s=1;
printf("Pleaseentern:
");
scanf("%d",&n);
do{
s=s*i;
i++;
}
while(i<=n);
printf("%d!
=%d",n,s);
return0;
}
〔2〕
#include
intmain()
{
inti,n=0,s,m=1;
printf("Pleaseenters:
");
scanf("%d",&s);
for(i=1;;i++){
m=m*i;
n++;
if(m>=s){
printf("n=%d",n);
break;
}
}
return0;
}
【测试】〔1〕假设输入8,应该输出:
40320,程序运行结果如下,程序正确。
〔2〕假设输入40310,应该输出:
8,程序运行结果如下,程序正确。
2.2.3程序设计
编写并上机调试运行能实现以下功能的程序:
〔1〕假设工资税金按以下方法计算:
x<1000元,不收取税金;1000<=x<2000,收取5%的税金;2000<=x<3000,收取10%的税金;3000<=x<4000,收取15%的税金;4000<=x<5000,收取20%税金;x>5000,收取25%的税金。
编写一个程序,输入工资金额,输出应收取税金额度,要求分别用if语句呵switch语句来实现。
〔2〕编写一个程序,将输入的一行字符复制到输出,复制过程中将一个以上的空格字符用一个空格代替。
〔3〕编写一个程序,打印如下的杨辉三角形。
1
11
121
1331
14641
15101051
1615201561
172135352171
18285670562881
193684126126843691
〔4〕编写一个程序,将用户输入的任意正整数逆转。
例如,输入1234,输出4321。
【分析】
〔1〕数学中的分段函数问题,可以用if-else-if构造进展控制。
在应用switch语句的时候,结合分段区间的特点设置适宜的连续点。
流程图分别如下:
if型
switch型
〔2〕使用状态机通过判断空格的个数选择不同状态,从而实现消去空格的作用。
流程图如下:
〔3〕根据所给公式利用循环实现杨辉三角数的计算,注意题目中特别提到的输出格式,将每个数字设置为四个字符位,并循环输出空格符,实现金字塔效果。
〔4〕屡次除10取余,每次都分别输出余数,然后除以10并赋给原数重复计算,流程图如下:
【程序】
〔1〕if型
#include
floattax(floatx);
intmain()
{
floatx;
printf("Pleaseinputyoursalary:
");
scanf("%f",&x);
printf("Youshouldpay%fyuan.\n",tax(abs(x)));
return0;
}
floattax(floatx){
floatn;
if(x<1000){n=0;}
elseif(x<2000){n=0.05;}
elseif(x<3000){n=0.1;}
elseif(x<4000){n=0.15;}
elseif(x<5000){n=0.2;}
else{n=0.25;}
returnn*x;
}
switch型
#include
floattax(floatx);
intmain()
{
floatx;
printf("Pleaseinputyoursalary:
");
scanf("%f",&x);
printf("Youshouldpay%fyuan.\n",tax(abs(x)));
return0;
}
floattax(floatx){
floatn;
switch((int)(x/1000)){
case0:
n=0;break;
case1:
n=0.05;break;
case2:
n=0.1;break;
case3:
n=0.15;break;
case4:
n=0.2;break;
default:
n=0.25;
}
returnn*x;
}
〔2〕
#include
enum{COPY,START,SPACE};
intmain()
{
charc;
intstate=COPY;
printf("Pleaseinputachar:
\n");
while((c=getchar())!
='\n'){
switch(state){
caseCOPY:
if(c=='')state=START;
elseputchar(c);
break;
caseSTART:
putchar('');
if(c=='')state=SPACE;
else{state=COPY;putchar(c);}
break;
caseSPACE:
if(c!
=''){
state=COPY;
putchar(c);
}
elsestate=SPACE;
break;
}
}
return0;
}
〔3〕
#include
#definen10
intmain(void)
{
inti,j,k,c,m;
for(i=0;i { for(m=0;m<=n-i;m++){ printf(""); } for(j=0;j<=i;j++) { if(j==0)c=1; else c=c*(i+1-j)/j; printf("%4d",c); } printf("\n"); } return0; } 〔4〕 #include intmain() { longn,m; printf("Pleaseinputanintegern(n>0): "); scanf("%ld",&n); printf("\nThenewintegeris: "); while(n>=10){ m=n%10; printf("%ld",m); n/=10; } printf("%ld",n); return0; } 【测试】 〔1〕 〔2〕 〔3〕 〔4〕 2.3实验体会 源程序改错中,依赖于平时良好的输入习惯,在输入过程中已经可以检查出大多数语法错误,或者拼写错误。 接下来再检查一下逻辑是否有误,无误那么进展多组数据的编译检验,确认最终无误。 源程序修改与交换题锻炼我们举一反三触类旁通的才能,在平时写程序时就应该考虑对于一个问题有没有多钟解决方案,使用不同的逻辑构造多种尝试寻求最优解。 程序设计题那么是自主的设计理论,在练习中获得进一步提升,增强对于所学知识的纯熟度和理解程度,锻炼才能。 3函数与程序构造实验 实验目的 〔1〕熟悉和掌握函数的定义、声明,函数调用与参数传递方法,以及函数返回值类型的定义和返回值使用。 〔2〕熟悉和掌握不同存储类型变量的使用。 〔3〕熟悉多文件编译技术。 〔4〕使用集成开发环境中的调试功能: 单步执行、设置断点、观察变量值。 2.2.1.源程序改错 下面是计算s=1! +2! +3! +…+n! 的源程序,在这个源程序中存在假设干语法和逻辑错误。 要求在计算机上对这个例子源程序进展调试修改,使之可以正确完成指定任务。 程序代码: #include intmain(void) { intk; for(k=1;k<6;k++) printf("k=%d\tthesumis%ld\n",k,sum_fac(k)); } return0; longsum_fac(intn) { longs=0; inti; longfac; for(i=1;i<=n;i++)fac*=i; s+=fac; returns; } 【分析及改正】本程序共存在3处错误,分析如下: 〔1〕}return0; 错误原因: return返回值应该在main函数内部 改正: return0;} 〔2〕longfac; 错误原因: fac未赋予初始值,会导致接下来计算错误。 改正: longfac=1; 〔3〕s+=fac; 错误原因: 语句s+=fac;不在函数for内部,逻辑出错。 改正: for(i=1;i<=n;i++){ fac*=i; s+=fac;} 2.2.2源程序修改交换 〔1〕修改上术源程序中的sum_fac函数,使其计算量最小。 〔2〕修改上述源程序中的sum_fac函数,计算s=1+1/(2! )+1/(3! )+……+1/(n! ) 【分析】〔1〕利用static变量类型对循环进展化简,保存上一个值,防止屡次重复循环。 流程图如下: 〔2〕相比较于源程序,变动之处在于求的是阶乘的倒数和,那么在循环中多一步求倒数的过程,并
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华中科技大学 语言 实验 课程设计 上机 报告 汇总 18 全部
![提示](https://static.bdocx.com/images/bang_tan.gif)