实验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; }