c语言实验报告.docx
《c语言实验报告.docx》由会员分享,可在线阅读,更多相关《c语言实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
c语言实验报告
北京联合大学
C语言综合实验设计报告
设计名称C语言综合实验设计
姓名
专业
班级
完成时间
1、实验名称:
C语言综合实验设计-----实用小工具
2、程序功能:
(1)输出任何字符组成的任意行菱形图案。
(2)求解任意一个二元一次方程。
(3)判断任意一个自然数是否为质数。
(4)可以对输入的任意多个数进行排序(运用指针的方法给一列数排序)。
(5)输入任意一个自然数可以求其阶乘。
(6)对在D盘根下的a.txt中的数据进行排序,并且在相同路径下的b.txt输出已经排列好的一列数。
(文件的读写,冒泡法排序)
3、程序的运行截图。
开始运行的界面如图
(1)
图1
菜单界面如图
(2)
图
(2)
功能1打印菱形块如图3
图(3)
功能2求任意一个二元一次方程的根如图4
图(4)
功能3判断一个数是否为质数如图5
图(5)
功能4给输入的几个数排序如图6
图(6)
功能5求一个自然数的阶乘如图(7)
图(7)
功能6
对在D盘根下的a.txt中的数据进行排序,并且在相同路径下的b.txt输出已经排列好的一列数。
如图(8)(9)(10)
图(8)[d盘根下的a.txt中的数据]
图(9)[在相同路径下b.txt中的数据]
图(10)运行时的窗口
退出功能如图(11)
图(11)
2代码分析
(1)程序的结构:
本程序主要是利用一个菜单函数,switch函数进行各种功能,而菜单下的函数是该程序的精髓。
其中为了更好的实现人机对话,还选择性的利用了清屏函数等等。
(2)各函数的功能分析:
1、打印菱形,该函数主要利用for循环语句实现打印多个相同的图形,其关键代码为
for(i=1;i<=m;i+=2){printStar((m-i)/2,'');printStar(i,'*');printf("\n");}
for(i=m-2;i>=1;i-=2){printStar((m-i)/2,'');printStar(i,'*');printf("\n");}
for(i=1;i<=n;i++)printf("%c",c);前两个循环主要实现打印图形和空格。
而最后一个主要实现打印多少个指定的图形。
最终二者结合实现打印出的具有菱形的大图形。
2、求任意一个一元二次方程的根。
该程序主要利用一些简单的运算,从而求出方程的根。
其主要代码为:
{
floata,b,c;
floatx1,x2;
floatd;
printf("Pleaseinputa,b,c:
");
scanf("%f%f%f",&a,&b,&c);
d=b*b-4*a*c;
if(d<0){printf("Norealroot.\n");}/*判断是否能有实根*/
elseif(d==0){
x1=x2=-b/2./a;
printf("x1=x2=%f\n",x1);
}
else{
x1=(-b+sqrt(d))/2./a;
x2=(-b-sqrt(d))/2./a;
printf("x1=%f,x2=%f\n",x1,x2);
}
改代码的核心部分是语句:
if(d<0){printf("Norealroot.\n");}/*判断是否能有实根*/
elseif(d==0){
x1=x2=-b/2./a;
printf("x1=x2=%f\n",x1);
}
else{
x1=(-b+sqrt(d))/2./a;
x2=(-b-sqrt(d))/2./a;
if函数的运用使方程是否有实根的判断变得简单。
4、判断一个自然数是否为质数
程序的主要代码为:
{inti=0,a=0;
printf("inputanumber");
scanf("%d",&a);
for(i=2;i<=a-1;i++)
if(a%i==0)break;
if(i>a-1)
printf("%disaprimenumber\n",a);
else
printf("%disnotaprimenumber\n",a);
}
判断输入的自然数是否为质数主要由语句
for(i=2;i<=a-1;i++)
if(a%i==0)break;
if(i>a-1)
printf("%disaprimenumber\n",a);
else
printf("%disnotaprimenumber\n",a);
该程序仍由for语句完成质数的判断。
由此也可以看出for语句在c语言中的重要性。
5、给输入的任意一列自然数排序。
程序主要代码:
{
inta[100],n,i,j,k,*p;
printf("howmanynumbersdoyouwantinput\n");
scanf("%d",&n);
printf("inputthenumberyouwant\n");
for(i=0;iscanf("%d",&a[i]);
printf("before:
");
for(i=0;iprintf("\n");
for(i=0;ifor(j=0;j{k=a[j];a[j]=a[j+1];a[j+1]=k;}
p=a;
printf("after:
");
for(j=0;jprintf("\n");}
代码分析:
要实现该程序预期的功能,必须解决两个问题1、任意多个数的输入问题。
2、给这些数排序。
而数组可以解决任意数的输入问题,冒泡法可以解决任意多个数的排序问题。
关键代码为程序主要代码:
{
inta[100],n,i,j,k,*p;
printf("howmanynumbersdoyouwantinput\n");
scanf("%d",&n);
printf("inputthenumberyouwant\n");
for(i=0;iscanf("%d",&a[i]);
冒泡法排序:
for(i=0;ifor(j=0;j{k=a[j];a[j]=a[j+1];a[j+1]=k;}
6、阶乘问题;程序中的主要代码;
scanf("%d",&n);
sum=1;
for(i=1;i<=n;i++)
sum=sum*i;
该程序的编写较为简单,主要运用了累乘的方法。
因此不多介绍。
7、文件的输入输出问题。
该程序的代码为
{FILE*fin,*fout;
inta[1000];
inti,j,k;
fin=fopen("d:
a.txt","r");/*打开D盘根下的名为a.txt的文件*/
for(i=0;ifscanf(fin,"%d",&a[i]);
fclose(fin);
for(i=0;ifor(i=0;ifor(j=0;jif(a[j]>a[j+1])
{k=a[j];a[j]=a[j+1];a[j+1]=k;}
for(i=0;ifout=fopen("d:
b.txt","w");/*将所得的结果放在D盘根下的名为b.txt的文件*/
for(i=0;ifprintf(fout,"%6d",a[i]);
fclose(fout);
}
主要涉及文件的读写问题,读文件主要代码为
fin=fopen("d:
a.txt","r");/*打开D盘根下的名为a.txt的文件*/
for(i=0;ifscanf(fin,"%d",&a[i]);
fclose(fin);
写文件的主要代码为;fout=fopen("d:
b.txt","w");/*将所得的结果放在D盘根下的名为b.txt的文件*/
for(i=0;ifprintf(fout,"%6d",a[i]);
fclose(fout);
文件中数字的排序在前边已经介绍过,故不多做说明。
其中程序的源代码见附件一。
附件一(源代码)
/*Note:
YourchoiceisCIDE*/
#include
#include
#include
#definet10
voidmymenu();
voidprintStar(int,char);
voidprintDiamond();
voidfangcheng();
voidzhishu();
voidpaixu();
voidjiecheng();
voidmyfile();
main()
{inta;
while(-1)
{
printf("myclanguagehomework\n");
mymenu();
printf("makeachoicefrom1--7\n");
scanf("%d",&a);
switch(a)
{
case1:
printDiamond();break;
case2:
fangcheng();break;
case3:
zhishu();break;
case4:
paixu();break;
case5:
jiecheng();break;
case6:
myfile();break;
default:
printf("error\n");break;
case7:
exit(0);
}
}
}
voidmymenu()
{printf("pressanykeytocleanthewindow");
getch();
clrscr();
printf("ifyouwanttochoose6,youmustbuildafilewhosenameis\"a.txt\"inddisk!
!
");/*程序说明,建立相应的文件夹*/
printf("andtheninput10numbers,youshouldalsobuildanotherfile\"b.txt\"inddisk!
!
\n");
printf("|whatdoyouwanttodo?
|\n");
printf("|-------------------------|\n");
printf("|inputanumber|\n");
printf("|-------------------------|\n");
printf("|1:
printDiamond||\n");
printf("|2:
fangcheng||\n");
printf("|3:
zhishu||\n");
printf("|4:
paixu||\n");
printf("|5:
jiecheng||\n");
printf("|6:
myfile||\n");
printf("|7:
exit||\n");
printf("|-------------------------|\n");
}
voidprintDiamond()/*打印菱形块*/
{
intm;
inti;
printf("howmanyrowsdoyouwant\n");
scanf("%d",&m);
for(i=1;i<=m;i+=2){printStar((m-i)/2,'');printStar(i,'*');printf("\n");}
for(i=m-2;i>=1;i-=2){printStar((m-i)/2,'');printStar(i,'*');printf("\n");}
}
voidprintStar(intn,charc){
inti;
for(i=1;i<=n;i++)printf("%c",c);
return;
}
voidfangcheng()
{
floata,b,c;
floatx1,x2;
floatd;
printf("Pleaseinputa,b,c:
");
scanf("%f%f%f",&a,&b,&c);
d=b*b-4*a*c;
if(d<0){printf("Norealroot.\n");}/*判断是否能有实根*/
elseif(d==0){
x1=x2=-b/2./a;
printf("x1=x2=%f\n",x1);
}
else{
x1=(-b+sqrt(d))/2./a;
x2=(-b-sqrt(d))/2./a;
printf("x1=%f,x2=%f\n",x1,x2);
}
}
voidzhishu()
{inti=0,a=0;
printf("inputanumber");
scanf("%d",&a);
for(i=2;i<=a-1;i++)
if(a%i==0)break;
if(i>a-1)
printf("%disaprimenumber\n",a);
else
printf("%disnotaprimenumber\n",a);
}
voidpaixu()
{
inta[100],n,i,j,k,*p;
printf("howmanynumbersdoyouwantinput\n");
scanf("%d",&n);
printf("inputthenumberyouwant\n");
for(i=0;iscanf("%d",&a[i]);
printf("before:
");
for(i=0;iprintf("\n");
for(i=0;ifor(j=0;j{k=a[j];a[j]=a[j+1];a[j+1]=k;}
p=a;
printf("after:
");
for(j=0;jprintf("\n");
}
voidjiecheng()
{intn,i;
longsum;
printf("inputanumber");
scanf("%d",&n);
sum=1;
for(i=1;i<=n;i++)
sum=sum*i;
printf("%ld",sum);
}
voidmyfile()
{FILE*fin,*fout;
inta[1000];
inti,j,k;
fin=fopen("d:
a.txt","r");/*打开D盘根下的名为a.txt的文件*/
for(i=0;ifscanf(fin,"%d",&a[i]);
fclose(fin);
for(i=0;ifor(i=0;ifor(j=0;jif(a[j]>a[j+1])
{k=a[j];a[j]=a[j+1];a[j+1]=k;}
for(i=0;ifout=fopen("d:
b.txt","w");/*将所得的结果放在D盘根下的名为b.txt的文件*/
for(i=0;ifprintf(fout,"%6d",a[i]);
fclose(fout);
}
评分标准
评分项目
满分(100分)
实际得分
完成基本内容
30
程序运行效果
20
创新能力
20
实验报告
30
合计
100
指导教师评语:
指导教师
2012年月日
总评成绩