您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
第40讲-命名空间和模块化编程2
发布时间:2021-05-22 20:45:21编辑:雪饮阅读()
使用头文件:
在创建了头文件之后,只要把它的文件名用双引号括起来写在如下所示的指令里就可以导入它:#include "test.h"
如果没有给出路径名,编译器将到当前子目录以及当前开发环境中的其他逻辑子目录里去寻找头文件。为了消除这种猜测,在导入自己的头文件时可以使用相对路径。如果头文件与主程序文件在同一个子目录里,则可以这么写:#include "./test.h",Windows下则为#include ".\\test.h"。
如果头文件位于某个下级子目录里,那么以下级子自录的名字开头:#include "下级子自录的名字/fishc.h"
最后,如果头文件位于某个与当前子目录平行的"兄弟"子目录里,则需要这么写:#include "../兄弟子目录名字/test.h"
请务必注意,Windows通常使用反斜朽作为路径名里的分隔符。反斜杠在字符串里表示转义符,表示一个反斜杠则需要用双反斜杠表示。
请看演示:Example
test.h:
//只声明了下函数
void call_love_baidu();
main.cpp:
#include <iostream>
#include "test.h"
void call_love_baidu()
{
int i, j;
int n = 10;
//n>>相當於n/2
for(i = 1 - (n >> 1); i <= n; i++)
{
std::cout<< "I love BAIDU.com i:"<<i<<",n-i:"<<(n-i);
if( i >= 0)
{
//心形下半部分是倒立三角
//左邊每行的空格數量逐漸遞增,空格多少根據j的最值決定,在這裏i+1挺合適的,具體環境具體調整
for(j = 0; j < i+1; j++){
std::cout << " ";
}
//心形下半部分是倒立三角左邊每行的空格數量逐漸遞增
for(j = 0; j < 2*(n-i); j++){
std::cout << " *";
}
std::cout << std::endl;
}
else{
for(j = i; j < 0; j++)
std::cout << " ";
for(j = 1; j <= n+2*i+1; j++)
std::cout<<" *";
for(j = 1; j <= -1-2*i; j++)
std::cout<<" ";
for(j = 1; j <= n+2*i+1; j++)
std::cout<<" *";
std::cout << std::endl;
}
}
}
int main()
{
call_love_baidu();
return 0;
}
這裏test.h和main.cpp在同一個路徑内
編譯並運行效果如:

這裏畫心,只需要瞭解到原理是心的頂部是兩個等邊三角,下部是一個大的倒立的等邊三角。至於算法這裏可以不用懂,自己看著也能寫的。
创建实现文件
這次我們要實現的目標是將邏輯代碼拆分,不僅僅是頭文件和主程序文件的拆分
在上篇中最後我們頭文件中定義了函數,在程序文件中實現了函數于main函數之前。
這次我們的目標則是定義兩個程序文件一個是入口程序main.cpp另外一個是rational.cpp
用以單獨實現上篇中頭文件所定義的那些函數,然後主程序只需要把這個rational.cpp直接引入就行,main.cpp自己不需要再實現了。
則具體實現如:
rational.h:
/*
由於main.cpp和rational.cpp都需要引入本頭文件,這樣可能會導致如Rational類重複定義類似錯誤,所以這裏需要判斷一下,選擇性定義Rational類
*/
#include <iostream>
//作为一种固定模式,这里使用的常量名通常与相应的文件名保持一致,把句点替换为下划线。
#ifndef RATIONAL_H
#define RATIONAL_H
class Rational
{
public:
Rational(int num, int denom); // num = 分子, denom = 分母
Rational operator+(Rational rhs); // rhs == right hand side
Rational operator-(Rational rhs);
Rational operator*(Rational rhs);
Rational operator/(Rational rhs);
void print();
private:
void normalize(); // 负责对分数的简化处理
int numerator; // 分子
int denominator; // 分母
};
#endif
rational.cpp:
#include <iostream>
#include <string>
#include "Rational.h"
using namespace std;
// num = 分子, denom = 分母
Rational::Rational(int num,int denomi)
{
numerator=num;
denominator=denomi;
normalize();
}
void Rational::normalize()
{
if(denominator<0)
{
numerator=-numerator;
denominator=-denominator;
}
//欧几里得算法
int a = abs(numerator);
int b = abs(denominator);
//求两个数的最大公约数
while(b>0)
{
int t=a%b;
a=b;
b=t;
}
//分子,分母分别除以最大公约数,得到最简式子
numerator/=a;
denominator/=a;
}
//a c a*d+b*c
//— + — = ——————
//b d b*d
Rational Rational::operator+(Rational x)
{
int a=numerator;
int b=denominator;
int c=x.numerator;
int d=x.denominator;
int e=a*d+c*b;
int f=b*d;
return Rational(e,f);
}
Rational Rational::operator-(Rational x)
{
x.numerator=-x.numerator;//减相当于加负数
return operator+(x);
}
//a c a*c
//— * — = ——————
//b d b*d
Rational Rational::operator*(Rational x)
{
int a=numerator;
int b=denominator;
int c=x.numerator;
int d=x.denominator;
int e=a*c;
int f=b*d;
return Rational(e,f);
}
/*
分数除法的计算法则为:甲数除以乙数(0除外),等于甲数乘乙数的倒数。
a c a*d
— / — = ——————
b d b*c
*/
Rational Rational::operator/(Rational x)
{
int a=numerator;
int b=denominator;
int c=x.numerator;
int d=x.denominator;
int e=a*d;
int f=b*c;
return Rational(e,f);
}
void Rational::print()
{
if(numerator%denominator==0)
cout<<numerator/denominator;
else
cout<<numerator<<'/'<<denominator;
}
main.cpp:
#include <iostream>
#include <string>
#include "Rational.h"
//不知道爲什麽小甲魚這裏不用include也能成功編譯,可能是他的環境比較老吧
//這裏實測是需要include這個cpp的
#include"rational.cpp"
using namespace std;
int main()
{
Rational f1(2,16);
Rational f2(7,8);
//加法
Rational resadd=f1+f2;
f1.print();
cout<<'+';
f2.print();
cout<<'=';
resadd.print();
cout<<'\n';
//减法
Rational ressub=f1-f2;
f1.print();
cout<<'-';
f2.print();
cout<<'=';
ressub.print();
cout<<'\n';
//乘法
Rational resmul=f1*f2;
f1.print();
cout<<'*';
f2.print();
cout<<'=';
resmul.print();
cout<<'\n';
//除法
Rational resc=f1/f2;
f1.print();
cout<<'/';
f2.print();
cout<<'=';
resc.print();
cout<<'\n';
return 0;
}
最後編譯運行如:
1/8+7/8=1
1/8-7/8=-3/4
1/8*7/8=7/64
1/8/7/8=1/7
Process returned 0 (0x0) execution time : 0.029 s
Press any key to continue.
关键字词:多文件編譯
上一篇:第39讲-命名空间和模块化编程
下一篇:小甲魚c++快速入門教程學習筆記
相关文章
-
无相关信息