1、如果在windows下使用命令行编译C++?
为了简化程序编写编译运行流程,决定不使用电脑里的Visual Studio 2010,而是借用里面的cl.exe使用命令行编译。方法如下:
(1)将cl.exe所在的目录加入环境变量,我这里是:D:\Program Files\Microsoft Visual Studio 10.0\VC\bin;
(2)在D:\Program Files\Microsoft Visual Studio 10.0\VC\bin目录下创建一个run.bat的文件用于运行cmd并配置准备环境,内容:@cmd /k vcvars32.bat;
(3)运行里面或者命令行下输入run,启动带有VS tools开发环境的命令行界面,进入代码目录,开始使用cl命令:cl /EHsc test1.cpp;
2、使用模版函数简化仅参数类型不同函数的编写:
// 传值参数
#include <iostream>
using namespace std;
template<class T>
T add(T num1, T num2) {
return num1 + num2;
}
int main(int argc, char* argv[]) {
int intNum = add(3, 5);
cout << intNum << endl; // 8
float floatNum = add(3.1f, 5.0f); // 8.1
cout << floatNum << endl;
return 0;
}
// 引用参数
#include <iostream>
using namespace std;
template<class T>
T add(T &num1, T &num2) {
num1 += 10, num2 += 10;
return num1 + num2;
}
int main(int argc, char* argv[]) {
int num1 = 5, num2 = 8;
add(num1, num2);
cout << "num1 = " << num1 << endl; // num1 = 15
cout << "num2 = " << num2 << endl; // num2 = 18
return 0;
}
// 常量参数
#include <iostream>
using namespace std;
template<class T>
T add(const T& num1, const T& num2) {
// num1 += 10, num2 += 10; // 错误,不能给常量赋值
return num1 + num2;
}
int main(int argc, char* argv[]) {
int num1 = 5, num2 = 8;
add(num1, num2);
cout << "num1 = " << num1 << endl; // num1 = 15
cout << "num2 = " << num2 << endl; // num2 = 18
return 0;
}
上面的函数add的两个参数类型必需相同,比如add(3, 5.0)会报错,第一个参数是int型,第二个参数是double型,这两个类型不同,不符合单个T的定义,不过可以采用下面的方法解决:
#include <iostream>
using namespace std;
template<class Ta, class Tb>
Tb add(const Ta& num1, const Tb& num2) {
return num1 + num2;
}
int main(int argc, char* argv[]) {
int num1 = 5;
float num2 = 8.0f;
float num = add(num1, num2);
cout << num << endl; // 13
return 0;
}
// 返回引用/常量应用
#include <iostream>
using namespace std;
template<class T>
const T& add(const T num1,T& num2) {
num2 += num1;
return num2;
}
int main(int argc, char* argv[]) {
int num1 = 5, num2 = 8;
cout << "add(num1, num2) = " << add(num1, num2) << endl;
cout << "num2 = " << num2 << endl; // num2 = 13
// add(num1, num2)++; // 错误,不能给常量赋值
return 0;
}
3、几种常见的递归函数编写:
(1)斐波那契数列(兔子数列,黄金分割数列);
(2)大衍数列(来源于《乾坤谱》中对易传“大衍之数五十”的推论);
(3)阶乘;
// 递归
#include <iostream>
using namespace std;
int fabonacci(int n);
int dayan(int n);
int factorial(int n);
int main(int argc, char* argv[]) {
for(int i=1; i<13; i++) {
cout << fabonacci(i) << endl;
}
cout << "=====================" << endl;
for(int i=1; i<13; i++) {
cout << dayan(i) << endl;
}
cout << "=====================" << endl;
cout << factorial(12) << endl;
cout << "=====================" << endl;
return 0;
}
int fabonacci(int n) {
if(n == 1) {
return 0;
}
if(n == 2) {
return 1;
}
return fabonacci(n-1) + fabonacci(n-2);
}
int dayan(int n) {
if(n % 2 == 1) {
return (n*n-1)/2;
}
return n*n/2;
}
int factorial(int n) {
if(n <= 1) {
return 1;
}
return n * factorial(n-1);
}