实验5 编译预处理和多文件的组织
【实验目的】
1掌握多文件程序的编译与连接。
2掌握宏定义命令。
3了解文件包含命令和条件编译命令。
【实验内容】
⒈用3个文件来求两正整数的最大公约数和最小公倍数,一个文件含主函数,其它两文件分别含求最大公约数和最小公倍数的定义。
//主函数.cpp
#include <stdio.h>
unsigned int yue(unsigned int x,unsigned int y);
unsigned int bei(unsigned int x, unsigned int y);
void main ( )
{ unsigned int m,n,b,y;
scanf ("%u%u",&m,&n);
y=yue(n,m);
b=bei(n,m);
printf ("%u,%u\n",y,b);
}
//最大公约数.cpp
unsigned int yue(unsigned int x, unsigned int y)
{int t;
if (x<y)
{ t=x;
x=y;
y=t;}
while (y!=0)
{t=x%y;
x=y;
y=t;}
return x;}
//最小公倍数.cpp
unsigned int bei(unsigned int x, unsigned int y)
{int t;
if (x<y)
{ t=x;
x=y;
y=t;}
for ( ; ; x+=x)
{ if(x%y==0)
break;}
return x;}
⒉用4个文件来计算二次方程ax2+bx+c=0的根,一个文件含主函数,其它三个文件分别含当b2-4ac>0、b2-4ac=0及b2-4ac<0的求解定义。
//c.cpp
#include <iostream.h>
#include <math.h>
void gz(float,float,float);
void eg(float,float);
void xg(float,float,float);
void main()
{ float a,b,c,d;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
d=b*b-4*a*c;
if (a==0)
cout<<"不是一元二次方程"<<endl;
else if (d>0)
gz(a,b,d);
else if (d==0)
eg(a,b);
else
xg(a,b,d);
}
//c1.cpp
#include <iostream.h>
#include <math.h>
void gz(float a,float b,float d)
{ cout<<"方程有两个实根!"<<endl;
cout<<"x1="<<(-b+sqrt(d))/(2*a)<<endl;
cout<<"x2="<<(-b-sqrt(d))/(2*a)<<endl;
}
//c2.cpp
#include <iostream.h>
void eg(float a,float b)
{ cout<<"方程有一个实根!"<<endl;
cout<<"x1=x2="<<-b/(2*a)<<endl;
}
//c3.cpp
#include <iostream.h>
#include <math.h>
void xg(float a,float b,float d)
{ cout<<"方程有两个虚根根!"<<endl;
float p=-b/(2*a);
float q=sqrt(-d)/(2*a);
cout<<"x1+x2="<<p<<"+"<<q<<"i"<<endl;
cout<<"x1-x2="<<p<<"-"<<q<<"i"<<endl;
}
⒊用一个头文件作为第2题各文件互连的接口。
//head.h
#include <iostream.h>
#include <math.h>
void gz(float,float,float);
void eg(float,float);
void xg(float,float,float);
//c.cpp
#include "hea.h"
void main()
{ …
}
//c1.cpp
#include "h.h"
void gz(float a,float b,float d)
{ …
}
//c2.cpp
#include "head.h"
void eg(float a,float b)
{ …
}
//c3.cpp
#include "head.h"
void eg(float a,float b)
{ …
}
⒋用条件编译命令编写一程序,当“#define?FF”存在时,计算的是圆柱体表面积;当“#define?FF”不存在时,计算的是圆锥体表面积。
#include <iostream.h>
#include <math.h>
#define PI 3.1415926
#define FF
void main()
{ long r,h;
cout<<"r=?";
cin>>r;
cout<<"h=?";
cin>>h;
#ifdef FF
cout<<"圆柱体的表面积为:"<<2*PI*r*h+2*PI*r*r<<endl;
#else
cout<<"圆锥体的的表面积为:" <<PI*r*sqrt(h*h+r*r)+PI*r*r
#endif
}
⒌编一程序输出1~100以内的素数和13的倍数。用3个文件来实现,一个文件含主函数,其它两文件分别含求素数和求13倍数的定义。
//c.cpp文件:
#include <iostream.h>
int fun1(int);
int fun2(int);
void main()
{ int n;
for (n=1;n<=100;n++)
{ if (fun1(n)) cout<<n<<","; }
cout<<endl;
for (n=1;n<=100;n++)
{ if (fun2(n)) cout<<n<<","; }
cout<< endl;
}
//c1.cpp文件:
int fun1(int k)
{ int flag=1;
for(int i=2;i<=k/2;i++)
{ if (k%i==0)
{ flag=0;
break; }
}
return flag;
}
//c3.cpp文件:
int fun2(int k)
{ int flag=0;
if (k%13==0) flag=1;
return flag;
}