C语言程序设计报告.docx
《C语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告.docx(21页珍藏版)》请在冰豆网上搜索。
C语言程序设计报告
科目:
C语言程序设计
老师:
姓名:
学号:
专业:
化学工程与工艺
实验二
(1)输入下面的程序,进行编译,记录编译时出现的信息,分析出现这些错误信息的原因;按照自己的分析改正错误后,再进行编译,链接和运行。
/*****test1.c*****/
main()
(
printf("thisisaerroneousprogram");
)
编译时出现的信息:
Compiling...
yang.cpp
d:
\杨洪棋c++练习\test\yang.cpp(4):
errorC2065:
'printf':
undeclaredidentifier
d:
\杨洪棋c++练习\test\yang.cpp(4):
errorC2143:
syntaxerror:
missing')'before';'
d:
\杨洪棋c++练习\test\yang.cpp(4):
errorC2072:
'main':
initializationofafunction
d:
\杨洪棋c++练习\test\yang.cpp(5):
errorC2059:
syntaxerror:
')'
执行cl.exe时出错.
yang.obj-1error(s),0warning(s)
出现这些错误信息的原因:
该程序缺少命令行,还有函数体要用“{}”括起来,而不是“()”
改正
/*****test1.c*****/
#include
main()
{
printf("thisisaerroneousprogram.");
}
运行结果
thisisaerroneousprogram.
(2)下面程序的目的是计算两个整数的积。
请输入下面的程序,进行编译,记录编译时出现的信息,分析出现这些信息的原因。
按照自己的分析改正错误后,再进行编译。
链接和运行。
/*****test2.c*****/
#include
main()
{
a=3,b=5;
c=a*b;
printf("Theproductis:
",c)
}
编译时出现的信息:
--------------------Configuration:
test1-Win32Debug--------------------
Compiling...
hong.cpp
d:
\杨洪棋c++练习\test1\hong.cpp(5):
errorC2065:
'a':
undeclaredidentifier
d:
\杨洪棋c++练习\test1\hong.cpp(5):
errorC2065:
'b':
undeclaredidentifier
d:
\杨洪棋c++练习\test1\hong.cpp(6):
errorC2065:
'c':
undeclaredidentifier
d:
\杨洪棋c++练习\test1\hong.cpp(8):
errorC2143:
syntaxerror:
missing';'before'}'
d:
\杨洪棋c++练习\test1\hong.cpp(8):
warningC4508:
'main':
functionshouldreturnavalue;'void'returntypeassumed
执行cl.exe时出错.
hong.obj-1error(s),0warning(s)
出现这些错误信息的原因:
该程序没有对啊,不a,b,c定义,还有程序执行部分缺少输出格式,printf结束时缺少一个“;”
改正后
/*****test2.c*****/
#include
main()
{
inta,b,c;
a=3;
b=5;
c=a*b;
printf("Theproductis:
%d\n",c);
}
编译时出现的信息
--------------------Configuration:
test1-Win32Debug--------------------
Linking...
test1.exe-0error(s),0warning(s)
运行结果
Theproductis:
15
实验三
(1)分析下面字符的功能
分析它们是否可以用在变量名中,并编译程序上机测试之。
!
#%……&*(
)—+=;“`
\|?
><,.
/[]{}:
~
测试程序如下
intmain(void)
{
Inta?
b,c/d;
}
同理得出:
所有的都不能用在变量名中。
因为C语言规定只有合法的标识符才可以作为变量名。
(2)分析下面的程序
找出其中的错误,分析错误原因,将其与实验过程中出现的信息进行对比。
#include
intmain()
{
inta=3,b=5,c=7,x=1,y,z;
a=b=c;
x+2=5;
z=y+3;
return0;
}
编译时出现的信息:
--------------------Configuration:
test-Win32Debug--------------------
Compiling...
yang.cpp
D:
\杨洪棋c++练习\test\test\yang.cpp(6):
errorC2106:
'=':
leftoperandmustbel-value
执行cl.exe时出错.
yang.obj-1error(s),0warning(s)
出现这些错误信息的原因:
x+2不能出现在等式的左边,还有y一个没有赋值的变量。
改正后
#include
main()
{
inta,b,c,x,y,z;
a=3;
b=5;
c=7;
x=1;
a=b=c;
x=5-2;
y=b;
z=y+3;
return0;
}
编译时出现的信息:
--------------------Configuration:
test-Win32Debug--------------------
Linking...
test.exe-0error(s),0warning(s)
实验四
(1)整除的危险性
#include
main()
{
inta=5,b=7,c=100,d,e,f;
d=a/b*c;
e=a*c/d;
f=c/a*b;
printf("d=%d,e=%d,f=%d\n",d,e,f);
}
整除的危险性:
使程序无法输出正确的结果,因为d=a/b*c的输出结果为0,而0不可以作为分母,所以程序不能输出正确的结果。
(2)分析下面的程序:
试比较x++与++x之间的区别。
#include
main()
{
inta=5,b=8;
printf("a++=%d\n",a++);
printf("a=%d\n",a);
printf("++b=%d\n",++b);
printf("b=%d\n",b);
}
得出结果:
x++是先进行计算后在加,++x是先加后计算。
(3)分析下列表达式的值
编写测试程序对这些表达式的值进行比较,并使各表达式在相同的初始条件下执行。
b+a+++a=18
b+(a++)+a=18
b+a+(++a)=19
b+a+++a++=18
程序为:
#include
intadd1(inta,intb)
{
intf;
f=b+a+++a;
returnf;
}
intadd2(inta,intb)
{
inth;
h=b+(a++)+a;
returnh;
}
intadd3(inta,intb)
{
intg;
g=b+a+(++a);
returng;
}
intadd4(inta,intb)
{
intm;
m=b+a+++a++;
returnm;
}
main()
{
inta=5,b=8,i,j,k,l;
i=add1(a,b);
j=add2(a,b);
k=add3(a,b);
l=add4(a,b);
printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);
}
表达式的值:
b+a+++a=18
b+(a++)+a=18
b+a+(++a)=19
b+a+++a++=18
(4)分析下列表达式哪些是错误的,为了验证自己的判断,编写一个测试程序。
i,ji+1,j+1i++,j++++i,++ji+++++j
只有i+++++j是错误的。
#include
main()
{
inti,j;
i=5;
j=6;
printf("%d,%d\n",i,j);
printf("%d,%d\n",i+1,j+1);
printf("%d,%d\n",i++,j++);
printf("%d,%d\n",++i,++j);
printf("%d\n",i+++++j);
}
--------------------Configuration:
sdsds-Win32Debug--------------------
Compiling...
dsds.cpp
D:
\杨洪棋c++练习\test\sdsds\dsds.cpp(11):
errorC2105:
'++'needsl-value
D:
\杨洪棋c++练习\test\sdsds\dsds.cpp(12):
warningC4508:
'main':
functionshouldreturnavalue;'void'returntypeassumed
执行cl.exe时出错.
dsds.obj-1error(s),0warning(s)
实验5
(1),编写一个用于测试所使用系统中的基本数据类型所占内存宽度的程序。
#include
main()
{
printf("&d=%d\n",sizeof(int));
}
Int所占内存的宽度为4
(2).编写程序来测试基本数据类型的取值范围。
#include
main()
{
charc0,c1,c2,c4,c5,c6;
inta,b,c,d,e,f;
printf("c0=%d,c1=%d,c4=%d,c5=%d,c6=%d\n",a,b,c,d,e,f);
}
(3).编写一个程序来测试数据类型的有效数字长度和精度。
#include
main()
{
floatd1,d2;
d1=0.123456789;
d2=12345678901234567890.123456789;
printf("%lf,%lf\n",d1,d2);
}
(4)编写程序来测试不同类型数据之间转换所出现的截去高位、丢失精度和变得不可知等问题
#include
main()
{
doublef1,f2;
f1=2.1234567;
f2=12345678901234567.123456789;
inti1,i2;
i1=(int)f1;
i2=(int)f2;
printf("%d,%d\n",i1,i2);
}
(5)编写程序来测试字符型数据的算术特征
#include
main()
{
charc1=35,c2='A',c3;
c3=c1+c2;
printf("%d,%c\n",c3,c3);
}
(6)编写程序来测试转义字符的用法
#include
main()
{
printf("\t,\t,\t");
}
实验6
(1).设计一个程序测试printf()函数中数据参数被引用的顺序。
#include
main()
{
inta=1;
printf("%d,%d,%d\n",++a,++a,++a);
}
可以看出数据参数是从后面被引用的。
输出结果:
4,3,2
(2).设计一个程序来测试printf()函数中格式符的意义
#include
main()
{
doubled=123456789.234567;
printf("%e\n",d);
}
输出结果:
1.234568e+008
(3)设计一个程序来测试printf()函数定义域宽与精度的方法所设计的程序要能证明以下内容。
A,域宽小于实际宽度时的情况。
B,默认的域宽与精度各是多少。
C,精度说明大于或小于实际精度时的处理。
D,float与double的最大精度。
E,符号位的处理方式。
F,多余的小数位被截断还是舍入。
(4).设计一个程序来测试scanf()函数中格式符的意义
#include
main()
{
doublex,y;
scanf("%lf,%lf\n",&x,&y);
printf("%f,%lf\n",&x,&x);
printf("%f,%lf\n",&y,&y);
}
输出结果:
3.03.0
0.0000000.000000
0.0000000.000000
(5)设计一个程序来测试用scanf()输入含有字符型数据的多个项时,数据项之间的分隔问题。
#include
main()
{
charc1,c2,c3;
inta1,a2,a3;
scanf("%d%d%d",&a1,&a2,&a3);
printf("%d%d%d\t",a1,a2,a3);
scanf("%c%c%c",&c1,&c2,&c3);
printf("%c%c%c\t",c1,c2,c3);
scanf("%c%c%c",&c1,&c2,&c3);
printf("%c%c%c\n",c1,c2,c3);
}
输入结果:
333adcadc
输出结果:
333adcadc
(6)编写一个程序来测试getchar()和putchar()的用法
#include
main()
{
charc;
while((c=getchar())!
='\n')
{
if(c>='a'&&c<='z')
c=c-'a'+'A';
putchar(c);
}
putchar('\n');
}
实验7
(1).编写一个用于测试关系表达式意义和取值的程序
分析结果:
0,0,1,10,0,1,1,1,1
#include
main()
{
inta=3,b=5,c=5;
printf("%d,%d,%d,%d\t",a==b,a==c,a!
=b,a!
=c);
printf("%d,%d,%d,%d,%d,%d\t",a>=b,a>=c,a<=b,a<=c,a
}
输出结果:
0,0,1,10,0,1,1,1,1
(2)阅读下面的程序并分析其运行结果
讲运行结果与上机结果进行比较
分析结果:
1.23OK!
#include
main()
{
floatx;
scanf("%lf",&x);/*从键盘上输入数据1.23*/
if(x=1.23)
printf("OK!
\n");
}
输出结果:
1.23
OK!
(3)编写一个用于测试逻辑表达式的意义和取值的程序
程序的执行结果:
0,1,0,11,1,1,0
#include
main()
{
inta=3,b=5,c=5;
printf("%d,%d,%d,%d\t",a==b&&a==c,a!
=b&&a!
=c,a>=b&&a>=c,a<=b&&a<=c);
printf("%d,%d,%d,%d\n",!
(a==b),!
(a>=b),!
(a>=c),!
(a<=b));
}
输出结果:
0,1,0,11,1,1,0
(4)编写程序来测试下例逻辑表达式的值
0&&a==01||a==10||a==a1&&a==a1&&a==aa||!
a==1a||a==a
a&&a==a!
(a||b)==!
a&&!
b!
(a&&b)==!
a||!
b!
(!
a)==a
程序的执行结果:
0,1,1,1,1,1,1,0
#include
main()
{
inta,b,c,d,e,f,g,h,i,j;
c=0&&a==0;
d=1||a==1;
e=0||a==a;
f=1&&a==a;
g=a||!
a==1;
h=a||a==a;
i=a&&a==a;
j=!
(a||b)==!
a&&!
b;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",c,d,e,f,g,h,i,j);
}
输出结果:
0,1,1,1,1,1,1,0
(5)分析下面程序段的执行结果并编写验证自己所做推断的程序
程序执行的结果:
10
#include
main()
{
inta=3,b=5,c=5;
printf("%d\t",a<5||(a==b&&b")));
printf("%d\n",a>5&&(a==b||b")));
}
输出结果:
10
实验9
#include
intmain(void)
{
doublee=1.0,x=1.0,y,detax;
inti=1;
printf("\npleaseenteraerror:
");
scanf("%lf",&detax);
y=1/x;
while(y>=detax)
{
x=x*i;
y=1/x;
e=e+y;++i;
}
printf("%12.10lf\n",e);
}
(1)设计一组detax,使程序能分别按照下面的要求运行。
不进入循环:
y>detax;
只循环一次:
y=detax;
只循环两次:
y<=detax;
进入死循环:
y如果把原程序while语句之前的y=1/x语句去掉,观察程序的运行结果将发生什么变化
答:
去掉之后将不执行while语句,直接输出结果。
输入的detax<=y就可以测试出缺少了上述语句。
若把原程序的++i换成i++,观察程序的运行结果发生这样的变化
答:
没有发生什么变化。
把原程序中的while结构改成do-while结构,
#include
intmain(void)
{
doublee=1.0,x=1.0,y,detax;
inti=1,n=0;
printf("\npleaseenteraerror:
");
scanf("%lf",&detax);
y=1/x;
do
{
x=x*i;
y=1/x;
e=e+y;++i;
n++;
}
while(y>detax);
printf("%12.10lf,%d\n",e,n);
}
讲y=1/x去掉,讲没有输出结果。
其他的没有什么变化。
实验10
阅读下面程序,画出程序流程图或N-S图,指出程序的功能。
#include
main()
{
inti,j,k;
longsum=0;
for(i=19;i<=20;i++)
for(j=2;j<=3;j++)
sum+=(i+1)*(i+1)*(j+2);
printf("sumis:
%d\n",sum);
}
(1)按照上面所设计的测试用例,分别使程序运行所规定的次数,记录运行结果并与实验准备时估计的结果进行比较。
A.不循环。
i=20;j=3.输出结果为2205
B.外循环1次,不进行内循环。
I=19,j>3,输出结果为0
C.外循环,内循环各1次,i=19,j=2;输出结果:
7569
D..外循环1次,内循环2次;i=19,j=1;输出结果:
10092
E.外循环2次,内循环1次;i=18,j=2;输出结果:
10018
F.外循环19次,内循环3次,i=2,j=0;输出结果:
46284
G.外循环20次,内循环2次;i=1,j=1;输出结果:
39720
H.外循环21次,内循环3次;i=0,j=0输出结果:
46354
(2)为了了解每循环一次时循环体中变量的变化。
#include
main()
{
inti,j,k;
longsum=0;
for(i=0;i<=20;i++)
for(j=0;j<=3;j++)
printf("%d,%d\n",i,j);
sum+=(i+1)*(i+1)*(j+2);
printf("sumis:
%d\n",sum);
}
(3)将内/外循环的控制表达式对换,观察程序的执行结果是否有变化,并计算内/外循环共执行多少次。
与对换之前相比,有何变化。
#include
main()
{
inti,j,k=0,m=0;
longsum=0;
for(j=1;j<=3;j++)
k++;
for(i=1;i<=20;i++)
m++;
sum+=(i+1)*(i+1)*(j+2);
printf("sumis:
%d\n",sum);
printf("%d,%d\n",k,m);
}
程序执行的结果没有发生变化。
外循环循环了3次,内循环循环了20次。
(4)将程序修改如下
#include
main()
{
inti,j,k;
longsum=0;
for(j=2;j<=3;j++)
{
k=j+2;
for(i=19;i<=20;i++)
sum+=(i+1)*(i+1)*k;
}
printf("sumis:
%d\n",sum);
}
观察程序的执行结果没有发生变化。
(5)将程序修改如下
#include
main()
{
inti,j,m,n;
longsum=0;
for(j=1;j<=3;j++)
{
m=j+2;
for(i=1;i<=20;i++)
{
n=i+1;