C++第五章函数
书上的点:
这次直接写写画画了,遇到的bug也就直接敲了,忘记记录了,好在都在书上,所以勾画一下,提一下。发现每一章后面的小结,都蛮有意思的。可以抄一遍。
1、返回值的函数成为返回值函数(value-returning function),不返回值的函数成为void函数 (void function)
2、实际参数(actual parameter) 也称 自变量 argument。
3、参数列表(parameter list)指明了函数的参数类型、次序和数量。函数名和参数列表一起构成了函数签名(function signature)。
4、主函数与其他函数的唯一差别在于,它是由操作系统来调用的,用于启动程序的执行。
5、按值方式(pass-by-value)传递参数。当调用一个带参数的函数时,实参的值被传递给形参,这种参数传递方式称为按值方式。无论函数中形参的值如何改变,实参变量的值都不会受影响。
6、C++提供了一种特殊的变量类型,称为引用变量(reference variable),将函数形参声明为此种类型的变量,形参将成为原变量的一个引用(而不是拷贝)。一个引用变量实质上是另一个变量的的一个别名,任何对引用变量的改变实际上都会作用到原变量上。为声明一个引用变量,应在变量名钱放置一个“与符号”(&)。
7、按值方式和按引用方式是函数参数传递的两种方式。按值方式将实参的值传递给一个无关的变量(形参),而按引用方式中形参与实参共享相同的变量。从语义的角度来看,按引用方式可以理解为按共享方式(pass-by-sharing)。
8、然后是书上的一个应该是编译通不过的,但是书上却给出了结果。。。
大概就是:
void f(double &p){
p++;
}
int main(){
double a = 1.0;
int b = 1;
f(a);
f(b);//这个是跑不了的。
}
9、二义调用:有事,对一个函数调用可能有两个或更多的与之匹配的函数定义,而编译器无法确定那个匹配更为京珠你,这称为二义调用(ambiguous invocation)。
10、在函数调用之前声明一个函数原型(funciton prototype)。一个函数原型就是一个没有函数实现(函数体)的单纯的函数声明,函数的实现在稍后的程序中将会给出。
11、如果函数的参数中,有的设置默认值,有的没有,那么带默认值的参数应该放在参数列表的末尾。
12、变量的作用域(scope of a variable)。一个变量的作用域就是能够引用该变量的程序范围。函数内部定义的变量成为局部变量(local variable)
13、如果一个局部变量与一个全局变量同名,使用::globalVariable可以访问全局变量,::运算符称为一元作用域解析(unary scope resolution)运算符。
14、函数抽象(funciton abstraction)就是将函数的使用和实现分离。
15、信息隐藏(information hiding)或封装(encapsulation)
16、分而治之(divide and conquer) 逐步求精 (stepwise refinement)
17、要编写一个程序,我们应该如何入手?立即开始编码?程序员新手通常会这样做,开始就试图从细节着手求解问题。虽然在最终程序中西街是很重要的,但在开始阶段就考虑西街会阻塞问题的求解进程。为是问题求解流程尽可能顺畅,我们求解这个问题是,使用函数抽象思想将设计和细节分离,最后在实现细节。
18、自顶向下方法top-down approach 自底向上方法bottom-up approach
19、对于还未实现的函数,可用桩函数(stub)代替之。所谓桩函数就是一个简单的但并不完整的函数版本。
20、挡视线一个大型程序时,我们应该使用自顶向下方法或者自底向上方法,不要试图一下子完成整个程序的编码。这两种方法看起来会花费更多的时间编码(因为需要反复的编译和不断地测试程序的渐进版本),但实际上会节省总时间,并且使调试更为容易。
21、内联函数(inline function)总是接触到这个东西,但貌似总也不知道这是啥意思。使用函数来实现程序可以是程序更为易读、易于维护,但是函数调用有额外的运行时开销(即将参数和CPU寄存器亚茹调用栈,以及在函数间切换控制所花费的时间)。C++提懂了内联函数功能,这样可以便面函数调用的开销。内联函数是不会被调用的,实际上,编译器将其代码复制到了每个调用点上。
这些话比较冠冕。
实际上,我们之前写函数都是调用方式的,但是内联函数的本质是,不产生调用关系。而是在编译阶段,就把inline function 的函数体拿出来,代替函数调用。也就是用内联函数函数体,来代替当前函数调用的这行代码,也就是用一大段代码来替换一行代码。因而可以不产生调用。
22、内联函数机制对于短函数而言是值得使用的,但对于在程序中多次被调用的长函数并不合适,因为在此情况下,是用内联函数时,函数代码会被复制到多个位置,从而会急剧增加可执行代码的长度。出于这一原因。C++允许编译器对于过长的函数忽略inline关键字。因此,inline关键字只是对编译器提出了一个要求,至于世界收还是忽略这一请求则有编译器来决定。
习题
5.1 使用函数的好处是什么?如何声明一个函数?如何调用一个函数?
灵活,易读,可扩展,易维护。
返回值类型 函数签名
函数名,参数,参数是可选的。
5.2主函数的返回类型是什么?
整形的数字
5.3 你恩能够用条件运算符简化程序清单5-1中的函数max嘛?
int getMax(int a,int b){
return a>b?a:b;
}
5.4下面叙述是正确的还是错误的?对一个返回类型为void的函数的调用只能作为语句使用,而对一个有返回值的函数的调用只能作为一个表达式的一部分。
错误的。前半句的说法是没有问题的,但是后半句的说法存在问题。同样也可以作为语句使用。
5.5在一个有返回值的函数中没有编写return 语句会造成什么错误?能在一个void函数中使用return语句,如下面程序那样吗?
void p(){
int i;
while(true){
//prompt the user to enter an integer
cout<< “Enter an integer:”;
cin>> i;
if(i==0)
return ;
cout<<” i is “<< i << endl;
}
}
编译都通不过啊!!!必须要写return的。
可以。
5.6解释属于:参数、自变量和 函数签名。
参数 分为两类,实际参数和形式参数。实际参数 是指,在函数调用过程中,调用处需要传入的数据,成为实际参数。形式参数是 被调用的函数中用来接收数据的参数,也称自变量。函数签名,是函数名个由形式参数构成的参数列表共同组成的。所谓的参数列表包括形式参数的个数,数据类型,以及形式参数的顺序。
5.7为下面的函数编写函数头:
给定销售额和佣金率,计算销售佣金。
double getCommission(double saleAmount,double commisionRate);
给定年份和月份,打印该月的日历。
void printCalendar(int year,int month);
计算一个数的*方根
double getRootOfANumber(double number);
检查一个数是否是偶数,若是返回true.
bool isEven(int number);
以指定次数打印一个字符。
void print(int time,char ch);
给定贷款额、贷款年限和年利率,计算每月还款额。
double getPaymentOfAMonth(double loan,double year,double annualRate);
给定一个小写字母,求对应的大写字母。
char getUpperCase(char ch);
5.8找出下面程序中的错误,并改正之。
int xFunction(int n)
{
cout<<n;
}
function1(int n,m)//m需要指定参数类型
{
n+=m;
xFunction(3.4);//没有可以调用的函数修改方式1是,把上面函数签名里的int改成double
}
5.9什么是按值方式?什么是按引用方式?给出下面程序的运行结果。
按值方式,就是在程序调用的过程中传递给形式参数的是实际参数的值,在函数体中对于形式参数的修改,并不会反馈到实际参数上。按引用方式是把实际参数的别名传递给形式参数,本质上参与运算的是实际参数,对形式参数的修改会反馈到实际参数上。所以这种方式也被称作按共享方式传值。常见的例子就是两数互换。如果采用按值方式话,是不会起到效果的,但是如果是按引用方式的话是有效果的。
A:
#include <iostream>
using namespace std;
void maxValue(int value,int value2 ,int max){
if(value1 > value2)
max = value1;
else
max = value2;
}
int main(){
int max = 0;
maxValue(1,2,max);
cout<< “max is “<<max<< endl;
return 0;
}
运行结果:
max is 0
B:
#include <iostream>
using namespace std;
void maxValue(int value1,int value2,int &max)
{
if(value1 > value2)
max = value1;
else
max = value2;
}
int main(){
int max = 0;
maxValue(1,2,max);
cout<< “max is “<<max <<endl;
return 0;
}
运行结果:
max is 2
C:
#include <iostream>
using namespace std;
void f(int i,int num){
for(int j=1;j<=i;j++){
cout<< num<< “ “;
num*=2;
}
cout <<endl;
}
int main(){
int i = 1;
while(i<=6){
f(i,2);
i++;
}
return 0;
}
2
2 4
2 4 6
2 4 6 8
2 4 6 8 10
2 4 6 8 10 12
D:
#include <iostream>
using namespace std;
void f(int &i,int num)
{
for(int j = 1 ; j <= i ; j++)
{
cout<< num << “ “;
num *= 2;
}
cout<<endl;
}
int main(){
int i = 1;
while(i<=6)
{
f(i,2);
i++;
}
return 0;
}
运行结果:
2
2 4
2 4 6
2 4 6 8
2 4 6 8 10
2 4 6 8 10 12
5.10 对于上一题中的程序a,分别给出函数max被调用前、刚刚进入max时,max返回之前以及max刚刚返回后的调用栈的内容。
调用前,没值
进入 1 2 0
返回前 1 2 2
刚刚返回 毛儿都没了。
5.11 给出下面程序的输出结果。
#include <iostream>
using namespace std;
voidf(double &p){
p+=2;
}
int main(){
double x = 10;
int y = 10;
f(x);
f(y);
cout<< “x is “<< x<< endl;
cout<< “y is “<< y << endl;
return 0;
}
编译通不过。
5.12 什么是函数重载?可以定义两个同名但参数类型不同的函数么?可以在一个程序中定义两个同名且参数相同,但返回值类型不同的函数吗?
具有相同函数名但是参数列表不同的函数组,通常完成的功能是相同的,只是在参数列表里面有差别。可以,不可以。
5.13 下面程序有什么错误?
void p(int i){
cout<< i <<endl;
}
int p(int j){
cout<< j << endl;
}
已经定义了一个p(int ) 函数。编译通不过了。
5.14 下面程序中有什么错误?
#include <iostream>
using namespace std;
void p(int &i){
cout << i <<endl;
}
int p(int j){
cout << j<< endl;
}
int main(){
int k = 5;
p(k);
return 0;
}
二义调用,这个时候调用哪个参数都是可以的,这样会出问题。
唉?忽然想到如果这个时候给调用加一个返回值 还会报错么?应该不会了吧。试试
他这样写迷惑性还不大:
我这样写迷惑性就更大了。
#include <iostream>
using namespace std;
void p(int &i){
cout << i << endl;
}
int p(int j){
cout << j << endl;
}
int main(){
int k = 5;
int c = p(k);//在这里依然通不过。
return 0;
}
5.15 下面哪些函数声明是非法的?
void t1(int x,int y =0,int z);//非法
void t2(int x = 0,int y =0,int z);//非法
void t3(int x,int y=0,int z = 0);
void t4(int x = 0,int y = 0,int z = 0);
5.16找出下面程序中的全局变量和局部变量。全局变量有默认值吗?局部变量呢?下面程序的输出结果是什么?
#include <iostream>
using namespace std;
int j;
int main(){
int i;
cout<< “ i is “<< i <<endl;
cout << “ j is “<< j << endl;
}
全局变量有默认值是0,局部变量没有默认值,下面程序的输出结果:
i is -858993460
j is 0
好吧 编译都通不过,但是某一次尝试 确实得到了这个 -858993460
5.17找出下面程序中的全局变量,局部变量和静态局部变量。程序的输出结果是什么?
#include <iostream>
using namespace std;
int j =40;//全局变量
void p(){
int i = 5;//局部变量
static int j = 5;//静态全局变量
i++;
j++;
cout << “i is “<< i << endl;
cout << “ j is “<< j<< endl;
}
int main(){
p();
p();
}
i is 6
j is 6
i is 6
j is 7
5.18 找出下面程序中的错误并改正。
void p(int i){
int i =5;//重名了,把 int去了吧。
cou << “ i is “ << i << endl;
}
5.19下面说法是正确的还是错误的?三角函数的参数表示弧度值。
对的
#include <iostream>
using namespace std;
int main(){
cout<<sin(3.141592 / 2);
system("pause");
return 0;
}
输出 1
5.20编写三个表达式分别生成:34~55之间的随机整数,0~999之间的随机整数;随机小写字母。
int get34To55(){
return 34+rand()%(55-34+1);
}
int get0To999(){
return rand()%1000;//0+rand()%(999-0+1)
}
char getRandomLowerCase(){
return static_cast<int>( ‘a’+rand()%(‘z’-’a’+1));
}
5.21 假设PI的值为3.14159,E的值为2.71828.求下面函数的结果。
A.sqrt(4.0) 2.0
B.sin(2*PI) 0
C.cos(2*PI) 1
D.pow(2,2) 4
E.log(E) 1
F.exp(1.0) 2.71828
G.max(2,min(3,4)) 3
H.fmod(2.5,2.3) 0.2
I.ceil(-2.5) -2
J.floor(-2.5) -3
K.abs(-2.5f) 2.5
L.log10(100.0) 2
M.cos(PI) -1
N.ceil(2.5) 3
O.floor(2.5) 2
P.pow(2.0,4) 16
Q.fmod(4.2,3.5) 0.7
R.Ceil(abs(-2.5)) 3
程序设计练习
5.1将一个大写字母转换为小写字母
#include <iostream>
using namespace std;
char upperCast2LowerCase(char ch){
return static_cast<char>(ch +'a'-'A');
}
int main(){
cout << "thisaprogramabout" << endl;
cout<<upperCast2LowerCase('C');
system("pause");
return 0;
}
5.2计算一个整数的数字之和:
#include <iostream>
using namespace std;
//将一个整数中的所有数字相加 ,范围是0-1000
int getSurfaceSum(int number){
int sum = 0;
while (number>0){
sum += number % 10;
number /= 10;
}
return sum;
}
int main(){
int number = 0;
cout << "请输入一个(0-1000)的整数,计算它的每个数字之和" << endl;
cin >> number;
cout << "数字和为: " << getSurfaceSum(number) << endl;
system("pause");
return 0;
}
5.3编写一个函数逆序显示一个整数,函数头如下:
void reverse(int nuber)
例如,reverse(3456) 应显示6543.
#include <iostream>
using namespace std;
//将一个整数中的所有数字相加 ,范围是0-1000
void reverse(int number){
while (number > 0){
cout << number % 10;
number /= 10;
}
}
int main(){
int number = 0;
cout << "数字逆序显示,输入数字:" << endl;
cin >> number;
//cout << "逆序为: " << reverse(number) << endl;
reverse(number);
system("pause");
return 0;
}
5.4返回一个整数的逆序
int reverse(int number)
#include <iostream>
using namespace std;
//将一个整数中的所有数字相加 ,范围是0-1000
int getBits(int number){
if (number == 0)return 1;
int bit = 0;
while (number>0){
number /= 10;
bit++;
}
return bit;
}
int reverse(int number){
int sum = 0;
int bit = getBits(number);
int stage = pow(10,bit-1);
int currentNumber = 0;
while (number > 0){
currentNumber = number % 10;
sum += currentNumber*stage;
stage /= 10;
number /= 10;
}
return sum;
}
int main(){
int number = 0;
cout << "数字逆序显示,输入数字:" << endl;
cin >> number;
cout << "逆序为: " << reverse(number) << endl;
//cout<<getBits(number);
//reverse(number);
system("pause");
return 0;
}
5.5 对三个整数进行排序:
void sort(double &num1,double &num2,double &num3)
#include <iostream>
using namespace std;
void swap(double &a, double &b){
double temp = a;
a = b;
b = temp;
}
void sort(double &num1, double &num2, double &num3){
if (num1>num2){
swap(num1, num2);
if (num3 < num1)
swap(num1, num3);
else if (num3 < num2)
swap(num2, num3);
}
else{
if (num3 < num1)
swap(num1, num3);
else if (num3 < num2)
swap(num2, num3);
}
}
int main(){
cout << "对三个数字排序" << endl;
double a1, a2, a3;
cout << "输入三个数字" << endl;
cin >> a1 >> a2 >> a3;
sort(a1, a2, a3);
cout << a1<<" "<< a2<<" "<< a3 << endl;
system("pause");
return 0;
}
5.6 输出图案:
#include <iostream>
#include <iomanip>
using namespace std;
void displayPattern(int n){
for (int i = 1; i <= n; i++){
for (int j = 0; j < n - i; j++)
cout << " ";
for (int j = i; j>0;j--){
cout << setw(3)<<j ;
}
cout << endl;
}
}
int main(){
cout << "输出图案" << endl;
displayPattern(5);
system("pause");
return 0;
}
5.7计算投资的未来价值:
#include <iostream>
using namespace std;
double futureInvestmentValue(double investmentAmount, double monthlyInterestRate, double years){//年利率转化成月利率
//输入的是一个 类似于3.25 的数值,/100 得到百分数形式的 /12 得到月利率。
//return pow(investmentAmount*(1 + interestRate / 1200), numberOfYears*12);
return investmentAmount*(pow(1 + monthlyInterestRate / 1200, years * 12));
}
void displayInvestmentTable(double investmentAmount, double monthlyInterestRate){
cout << "年\t未来价值" << endl;
for (int i = 1; i <= 30; i++){
cout << i << "\t" << futureInvestmentValue(investmentAmount, monthlyInterestRate, i) << endl;;
}
}
int main(){
cout << "计算投资未来价值" << endl;
cout << "投资总额,比如1000" << endl;
double money = 0;
cin >> money;
cout << "年利率,比如3.25" << endl;
double rate = 0;
cin >> rate;
//cout << "未来价值: " << futureInvestmentValue(money, rate, year) << endl;
displayInvestmentTable(money,rate);
system("pause");
return 0;
}
练习5.8温度转换表
#include <iostream>
using namespace std;
double celsiusToFahrenheit(double celsius){
return celsius*9.0 / 5 + 32;
}
double fahrenheitToCelsius(double fahrenheit){
return (fahrenheit - 32) * 5 / 9;
}
void displayTemperatureTransformTable(){
double fahrenheit = 120;
cout << "Celsius\tFahrenheit\t|\tFahrenheit\tCelsius" << endl;
for (double celsius = 40; celsius > 30.5;celsius--,fahrenheit-=10){
cout << celsius << "\t" << celsiusToFahrenheit(celsius) << "\t\t|\t" << fahrenheit <<"\t\t"<< fahrenheitToCelsius(fahrenheit) << endl;
}
}
int main(){
cout << "温度转换表" << endl;
//cout << "未来价值: " << futureInvestmentValue(money, rate, year) << endl;
displayTemperatureTransformTable();
system("pause");
return 0;
}
练习5.9编写一个头文件,包含下面两个函数:
double footToMeter(double foot)
double meterToFoot(double meter)
转换公式
meter = 0.305*foot
main.cpp
#include <iostream>
#include "footAndMeter.h"
using namespace std;
void displayFootAndMeterTransformTable(){
cout << "Feet\tMeters\t|\tMeters\tFeet" << endl;
double meters = 20;
for (double feet = 1; feet < 10.5;feet++,meters+=5){
cout << feet << "\t" << footToMeter(feet) << "\t|\t" << meters << "\t" << meterToFoot(meters) << endl;
}
}
int main(){
cout << "英尺和米转换表" << endl;
displayFootAndMeterTransformTable();
system("pause");
return 0;
}
footAndMeter.h
double footToMeter(double foot){
return 0.305*foot;
}
double meterToFoot(double meter){
return meter / 0.305;
}
5.10 编写函数返回两个正整数的最大公约数,函数头如下:
int gcd(int m,int n)
#include <iostream>
int min(int a,int b){
if (a < b)
return a;
return b;
}
int gcd(int a,int b){
int grestestCommonDivisor = 1;
for (int i = min(a, b) / 2; i >1; i--){//有时候在想要抠这一次两次么?他们说抠了好。
//std::cout << i;
if (a%i == 0 && b%i == 0){
grestestCommonDivisor = i;
break;
}
}
return grestestCommonDivisor;
}
5.11 计算佣金
double computeCommission(double salesAmount)
#include <iostream>
using namespace std;
double computeCommission(double salesAmount){
if (salesAmount<5000){
return salesAmount*0.08;
}
else if (salesAmount<10000){
return 5000 * 0.08 + (salesAmount - 5000)*0.1;
}
else {
return 5000 * 0.08 + (10000 - 5000)*0.1 + (salesAmount - 10000)*0.12;
}
}
void displayCommissionTable(){
cout << "SalesAmount\tCommission" << endl;
for (int salesAmount = 10000; salesAmount <= 100000; salesAmount += 5000){
cout << salesAmount << "\t\t" << computeCommission(salesAmount) << endl;
}
}
int main(){
cout << "打印佣金表" << endl;
displayCommissionTable();
system("pause");
return 0;
}
512打印字符
void printChars(char ch1,char ch2,int numberPerLine)
参数 1 Z 10
#include <iostream>
using namespace std;
void printChars(char ch1, char ch2, int perLine){
int count = 0;
for (int i = ch1; i <= ch2; i++){
cout << static_cast<char>(i) << " ";
count++;
if ((count + 1) % perLine == 0)
cout << endl;
}
cout << endl;
}
int main(){
cout << "打印字符表" << endl;
printChars('1','z',10);
system("pause");
return 0;
}
5.13 求级数和
公式:
#include <iostream>
using namespace std;
double getSum(int number){
double sum = 0;
for (double i = 2; i <= number; i++){
sum += (i-1) / i;
}
return sum;
}
void displaySumTable(){
cout << "i\tm(i)" << endl;
for (int i = 2; i <= 20;i++){
cout << i << "\t" << getSum(i) << endl;
}
}
int main(){
cout << "计算级数和" << endl;
displaySumTable();
system("pause");
return 0;
}
5.14 计算级数
编写一个函数计算下面级数:
第四章就写过这个 PI的
#include <iostream>
#include <iomanip>
using namespace std;
double getSumOfPI(int number){
double sum = 0;
for (int i = number * 2 + 1; i >= 1; i -= 4){
sum += 1.0 / i;
}
return sum;
}
double getMinusOfPI(int number){
double sum = 0;
for (int i = number * 2 - 1; i >= 3; i -= 4){
sum += 1.0 / i;
}
return sum;
}
//传递参数不会减小精度。
double getPI(int number){//由于知道,右边开始算比较精确,所以从右边开始计算:
return 4*(getSumOfPI(number) - getMinusOfPI(number));
}
int main(){
cout << "计算级数和" << endl;
cout << setw(20) << fixed << setprecision(20) << getPI(10000) << endl;
cout << setw(20) << fixed << setprecision(20) << getPI(20000) << endl;
cout << setw(20) << fixed << setprecision(20) << getPI(100000) << endl;
cout << setw(20) << fixed << setprecision(20) << getPI(1000000) << endl;
//getPI(20000);
//getPI(100000);
system("pause");
return 0;
}
5.15打印纳税表
#include <iostream>
#pragma warning(disable:4703)
using namespace std;
/* 计算税款,根据美国2002年的数据
说实话连人家的这些例子都觉得特别棒!!!
*/
int singleFilers[5] = { 6000, 27950, 67700, 141250, 307050 };
int marriedFileJointly[5] = { 12000, 46700, 112850, 171950, 307050 };
int marriedFileSeparately[5] = { 6000, 23350, 56425, 85975, 153525 };
int headOfHousehold[5] = { 10000, 37450, 96700, 15600, 307050 };
#define stageOne 10.0
#define stageTwo 15.0
#define stageThree 27.0
#define stageFour 30.0
#define stageFive 35.0
#define stageSix 38.6
double taxStageRate[6] = { stageOne / 100, stageTwo / 100, stageThree / 100, stageFour / 100, stageFive / 100, stageSix / 100 };
//double getTax(double money, int* moneyStage, double* taxRateStage){
//
// return 0;
//
//}
/*
根据这个人的状态和 挣到的钱,来决定纳税金额。
现在的想法就是是不是可以因为这一组数据很有规律,所以想做一个数组,来规范这样的话,只需要根据不同的状态,来分不同的税率阶段就可以了
*/
double getTax(int status, double money){
int* MoneyStage;
if (status == 0){
MoneyStage = singleFilers;
}
else if (status == 1){
MoneyStage = marriedFileJointly;
}
else if (status == 2){
MoneyStage = marriedFileSeparately;
}
else if (status == 3){
MoneyStage = headOfHousehold;
}
double tax = 0;
if (money <= MoneyStage[0]){
tax = (money - 0)*taxStageRate[0];//10
}
else if (money <= MoneyStage[1]){
tax = MoneyStage[0] * taxStageRate[0] + (money - MoneyStage[0]) * taxStageRate[1];//6000*10+(money-6000)*15
}
else if (money <= MoneyStage[2]){
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (money - MoneyStage[1])*taxStageRate[2];
}
else if (money <= MoneyStage[3]){
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (MoneyStage[2] - MoneyStage[1]) * taxStageRate[2] + (money - MoneyStage[2])*taxStageRate[3];
}
else if (money <= MoneyStage[4]){
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (MoneyStage[2] - MoneyStage[1]) * taxStageRate[2] + (MoneyStage[3] - MoneyStage[2]) * taxStageRate[3] + (money - MoneyStage[3])*taxStageRate[4];
}
else{
tax = MoneyStage[0] * taxStageRate[0] + (MoneyStage[1] - MoneyStage[0]) * taxStageRate[1] + (MoneyStage[2] - MoneyStage[1]) * taxStageRate[2] + (MoneyStage[3] - MoneyStage[2]) * taxStageRate[3] + (MoneyStage[4] - MoneyStage[3]) * taxStageRate[4] + (money - MoneyStage[4])*taxStageRate[5];
}
//tax = getTax(money,MoneyStage,taxStageRate);
return tax;
}
void displayTaxTable(){
cout << "可课税收入\t单身纳税者\t夫妻联合纳税者\t夫妻分别纳税者\t户主纳税者" << endl;
for (int i = 50000; i <= 60000; i += 50){
cout << i << "\t\t" << getTax(0, i) << "\t\t" << getTax(1, i) << "\t\t" << getTax(2, i) << "\t\t" << getTax(3, i) << endl;
}
}
int main(){
cout << "打印纳税表" << endl;
displayTaxTable();
system("pause");
return 0;
}
5.16 编写一个函数判断一个整数是否是素数
bool isPrime(int num)
找到1000个宿舍 每行十个。
#include <iostream>
#include <iomanip>
using namespace std;
bool isPrime(int number){
for (int i = 2; i <= number / 2; i++){
if (number%i == 0)
return false;
}
return true;
}
void displayPrimes(){
int count = 0;
for (int i = 2; count < 1000; i++){
if (isPrime(i)){
cout << setw(5) << i;
count++;
if ( count % 10 == 0)
cout << endl;
}
}
}
int main(){
cout << "打印1000个素数" << endl;
displayPrimes();
system("pause");
return 0;
}
5.17 生成矩阵
#include <iostream>
#include <ctime>
using namespace std;
int getRandom0To1(){
return rand() % 2;
}
void printMatrix(int n){
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
cout << getRandom0To1();
}
cout << endl;
}
}
int main(){
cout << "打印n阶矩阵,矩阵元素非0即1随机生成" << endl;
srand(time(0));
printMatrix(3);
system("pause");
return 0;
}
5.18 使用程序清单中的RandomCharacter 打印100个随机大写字母,100个 随机个位数字,每行打印10个字母或者数字。
#include <iostream>
#include <ctime>
#include "RandomChracter.h"
using namespace std;
void print100RandomUpperCase(){
for (int i = 0; i < 100; i++){
cout << getRandomUpperCase() << " ";
if ((i + 1) % 10 == 0)
cout << endl;
}
}
void print100RandomSingleNumber(){
for (int i = 0; i < 100; i++){
cout << getRandomNumber() << " ";
if ((i + 1) % 10 == 0)
cout << endl;
}
}
int main(){
srand(time(0));
print100RandomUpperCase();
cout << endl;
print100RandomSingleNumber();
system("pause");
return 0;
}
5.19 打印*方根表:
#include <iostream>
using namespace std;
void displaySquareRootTable(){
cout << "Number\tSquareRoot" << endl;
for (int i = 0; i <= 20;i+=2){
cout << i << "\t" << sqrt(i) << endl;
}
}
int main(){
displaySquareRootTable();
system("pause");
return 0;
}
5.20 三角形面积:
面积公式:
MyTriangle.h
#include <iostream>
bool isValid(double a, double b, double c){
if (a + b > c&&a + c > b&&b + c > a){
return true;
}
return false;
}
double area(double a, double b, double c){
double s = (a + b + c) / 2;
return sqrt(s*(s - a)*(s - b)*(s - c));
}
main.cpp
#include <iostream>
#include "MyTriangle.h"
using namespace std;
int main(){
cout << "计算三角形面积" << endl;
cout << "输入三角形三边" << endl;
double a, b, c;
cin >> a >> b >> c;
if (!isValid(a, b, c)){
cout << "三角形不合法" << endl;
}
else{
cout << "面积是:" << area(a, b, c) << endl;
}
system("pause");
return 0;
}
5.21 适用三角函数打印sin 和cos 表 角度 从 0°到360°,间隔为10°。结果舍入到小数点后四位。
#include <iostream>
#include <iomanip>
using namespace std;
#define PI 3.14159
void displaySinAndCosTable(){
cout << "Degree\tSin\tCos" << endl;
for (int i = 0; i <= 36; i += 1){
cout <<fixed<<setprecision(4)<< i*10 << "\t" << setw(5) << sin(i*PI /18) << "\t" << setw(5) << cos(i*PI /18) << endl;
}
}
int main(){
displaySinAndCosTable();
system("pause");
return 0;
}
5.22 随机生成10个数,计算*均数,和方差。
方差推到比较容易,应该可以在下一次展示出来的。
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
int getRandomNumber(){
return rand() % 1001;
}
double getAvg(double sum,int count){
return sum / count;
}
double getDeviation(double sumOfSquare,double squareOfSum,int count){//sumOfSquare *方和,squareOfSum 和的*方
//自己推了个公式。。。
return sqrt((sumOfSquare - squareOfSum / count)/count);
}
void getFinalResult(){
double mean = 0;
int sum = 0;
double sumOfSquare = 0;
//double squareOfSum = 0;
int currentNumber = 0;
for (int i = 0; i < 10; i++){
currentNumber = getRandomNumber();
sumOfSquare += currentNumber*currentNumber;
sum += currentNumber;
cout << setw(4) << currentNumber;
if (i == 4)
cout << endl;
}
cout <<"*均数是: "<< getAvg(sum, 10) << endl;
cout << "方差是: " << getDeviation(sumOfSquare,sum*sum,10) << endl;
}
int main(){
srand(time(0));
//cout << getRandomSingleNumber();
getFinalResult();
//cout<<getDeviation(50, 144, 3);
system("pause");
return 0;
}
5.23 逼**方根。实现sqrt函数。
给了这样一个公式
当nextGuess与 lastGuess*似相等的时候,认为nextGuess就是 这个数字的*方根了。
#include <iostream>
#include <iomanip>
using namespace std;
double mySqrt(double num){
double guess = 1;
double nextGuess = 0;
while (1){
nextGuess = (guess + num / guess) / 2;
if (abs(guess - nextGuess) < 0.0001)
return nextGuess;
guess = nextGuess;
}
}
int main(){
cout <<fixed<<setprecision(5)<< mySqrt(30) << endl;
system("pause");
return 0;
}
我也不知道 为啥,感觉挺简单的 想了这么久。。。
还差5个题。。。
5.24显示当前时间日期
#include <iostream>
#include <ctime>
#pragma warning(disable:4244)
using namespace std;
void showTime(void){
int totalSeconds = time(0);//得到从1970年1月1日到现在的秒数。
int currentSecond = totalSeconds % 60;//当前秒=总秒数%60.
int totalMinutes = totalSeconds / 60;//总分钟数 = 当前秒数/60
int currentMinute = totalMinutes % 60;//当前分钟数 = 总分钟数%60
int totalHours = totalMinutes / 60; //总分钟数/60= 当前小时数
int currentHour = (totalHours + 8) % 24;//这个结果几次出来都是2想到时区问题了,但是想的方式不对,没出结果,
//现在是早上10点,几次输出的都是2。百思不得解,这个返回的是0时区的时间,北京也就是现在呆的地方时东8区,应该+2,所以,得到结果了。
cout << currentHour << ":" << currentMinute << ":" << currentSecond << endl;
}
bool isLeapYear(int year){
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return true;
return false;
}
int getMonth(int year, int totaldays){
int currentMonth = 0;
int February = 28;
if (isLeapYear(year)){
February = 29;
}
if (totaldays > 31 * 6 + 30 * 4 + February){
currentMonth = 12;
}
else if (totaldays > 31 * 6 + 30 * 3 + February){
currentMonth = 11;
}
else if (totaldays > 31 * 5 + 30 * 3 + February){
currentMonth = 10;
}
else if (totaldays > 31 * 5 + 30 * 2 + February){
currentMonth = 9;
}
else if (totaldays > 31 * 4 + 30 * 2 + February){
currentMonth = 8;
}
else if (totaldays > 31 * 3 + 30 * 2 + February){
currentMonth = 7;
}
else if (totaldays > 31 * 3 + 30 * 1 + February){
currentMonth = 6;
}
else if (totaldays > 31 * 2 + 30 * 1 + February){
currentMonth = 5;
}
else if (totaldays > 31 * 2 + February){
currentMonth = 4;
}
else if (totaldays > 31 + February){
currentMonth = 3;
}
else if (totaldays > 31){
currentMonth = 2;
}
else
currentMonth = 1;
return currentMonth;
}
int getYear(int totalDays){
//cout << totalDays << endl;
const int unixEpoch = 1970;
int currentYear = unixEpoch;
//int currentMonth = 0;
//放在循环里面一直做这个
while (totalDays>=365){
if (totalDays > 365 * 400 + 24 * 4 + 1){
totalDays -= 365 * 400 + 24 * 4 + 1;
currentYear += 400;
}
else if (totalDays>365*100+25-1){
totalDays -= 365 * 100 + 25 - 1;
currentYear += 100;
}
else if (totalDays>365*4+1){
totalDays -= 365 * 4 + 1;
currentYear += 4;
}
else if (totalDays > 365){
if (isLeapYear(currentYear)){
totalDays -= 366;
}
else
totalDays -= 365;
currentYear++;
}
}
//cout << totalDays << endl;
int currentMonth = 0;
int February = 28;
if (isLeapYear(currentYear)){
February = 29;
}
if (totalDays > 31 * 6 + 30 * 4 + February){
totalDays -= 31 * 6 + 30 * 4 + February;
currentMonth = 12;
}
else if (totalDays > 31 * 6 + 30 * 3 + February){
totalDays -= 31 * 6 + 30 * 3 + February;
currentMonth = 11;
}
else if (totalDays > 31 * 5 + 30 * 3 + February){
totalDays -= 31 * 5 + 30 * 3 + February;
currentMonth = 10;
}
else if (totalDays > 31 * 5 + 30 * 2 + February){
totalDays -= 31 * 5 + 30 * 2 + February;
currentMonth = 9;
}
else if (totalDays > 31 * 4 + 30 * 2 + February){
totalDays -= 31 * 4 + 30 * 2 + February;
currentMonth = 8;
}
else if (totalDays > 31 * 3 + 30 * 2 + February){
totalDays -= 31 * 3 + 30 * 2 + February;
currentMonth = 7;
}
else if (totalDays > 31 * 3 + 30 * 1 + February){
totalDays -= 31 * 3 + 30 * 1 + February;
currentMonth = 6;
}
else if (totalDays > 31 * 2 + 30 * 1 + February){
totalDays -= 31 * 2 + 30 * 1 + February;
currentMonth = 5;
}
else if (totalDays > 31 * 2 + February){
totalDays -= 31 * 2 + February;
currentMonth = 4;
}
else if (totalDays > 31 + February){
totalDays -= 31 + February;
currentMonth = 3;
}
else if (totalDays > 31){
totalDays -= 31;
currentMonth = 2;
}
else{
currentMonth = 1;
}
cout << "今天是" << currentYear << "年 " << currentMonth << "月"<<(totalDays+1)<<" 日";//这个 多少号这里面一定有bug。
return currentYear;
}
void showDate(void){
int totalseconds = time(0);
int totalDays = totalseconds / (60*60*24);
int currentYear = 0;
getYear(totalDays);
}
int main(){
cout << "显示当前时间" << endl;
showDate();
showTime();
system("pause");
return 0;
}
#include <iostream>
#include <ctime>
#pragma warning(disable:4244)
using namespace std;
void showTime(void){
int totalSeconds = time(0);//得到从1970年1月1日到现在的秒数。
int currentSecond = totalSeconds % 60;//当前秒=总秒数%60.
int totalMinutes = totalSeconds / 60;//总分钟数 = 当前秒数/60
int currentMinute = totalMinutes % 60;//当前分钟数 = 总分钟数%60
int totalHours = totalMinutes / 60; //总分钟数/60= 当前小时数
int currentHour = (totalHours + 8) % 24;//这个结果几次出来都是2想到时区问题了,但是想的方式不对,没出结果,
//现在是早上10点,几次输出的都是2。百思不得解,这个返回的是0时区的时间,北京也就是现在呆的地方时东8区,应该+2,所以,得到结果了。
cout << currentHour << ":" << currentMinute << ":" << currentSecond << endl;
}
bool isLeapYear(int year){
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return true;
return false;
}
int getMonth(int year, int totaldays){
int currentMonth = 0;
int February = 28;
if (isLeapYear(year)){
February = 29;
}
if (totaldays > 31 * 6 + 30 * 4 + February){
currentMonth = 12;
}
else if (totaldays > 31 * 6 + 30 * 3 + February){
currentMonth = 11;
}
else if (totaldays > 31 * 5 + 30 * 3 + February){
currentMonth = 10;
}
else if (totaldays > 31 * 5 + 30 * 2 + February){
currentMonth = 9;
}
else if (totaldays > 31 * 4 + 30 * 2 + February){
currentMonth = 8;
}
else if (totaldays > 31 * 3 + 30 * 2 + February){
currentMonth = 7;
}
else if (totaldays > 31 * 3 + 30 * 1 + February){
currentMonth = 6;
}
else if (totaldays > 31 * 2 + 30 * 1 + February){
currentMonth = 5;
}
else if (totaldays > 31 * 2 + February){
currentMonth = 4;
}
else if (totaldays > 31 + February){
currentMonth = 3;
}
else if (totaldays > 31){
currentMonth = 2;
}
else
currentMonth = 1;
return currentMonth;
}
int getYear(int totalDays){
//cout << totalDays << endl;
const int unixEpoch = 1970;
int currentYear = unixEpoch;
//int currentMonth = 0;
//放在循环里面一直做这个
while (totalDays>=365){
if (totalDays > 365 * 400 + 24 * 4 + 1){
totalDays -= 365 * 400 + 24 * 4 + 1;
currentYear += 400;
}
else if (totalDays>365*100+25-1){
totalDays -= 365 * 100 + 25 - 1;
currentYear += 100;
}
else if (totalDays>365*4+1){
totalDays -= 365 * 4 + 1;
currentYear += 4;
}
else if (totalDays > 365){
if (isLeapYear(currentYear)){
totalDays -= 366;
}
else
totalDays -= 365;
currentYear++;
}
}
//cout << totalDays << endl;
int currentMonth = 0;
int February = 28;
if (isLeapYear(currentYear)){
February = 29;
}
if (totalDays > 31 * 6 + 30 * 4 + February){
totalDays -= 31 * 6 + 30 * 4 + February;
currentMonth = 12;
}
else if (totalDays > 31 * 6 + 30 * 3 + February){
totalDays -= 31 * 6 + 30 * 3 + February;
currentMonth = 11;
}
else if (totalDays > 31 * 5 + 30 * 3 + February){
totalDays -= 31 * 5 + 30 * 3 + February;
currentMonth = 10;
}
else if (totalDays > 31 * 5 + 30 * 2 + February){
totalDays -= 31 * 5 + 30 * 2 + February;
currentMonth = 9;
}
else if (totalDays > 31 * 4 + 30 * 2 + February){
totalDays -= 31 * 4 + 30 * 2 + February;
currentMonth = 8;
}
else if (totalDays > 31 * 3 + 30 * 2 + February){
totalDays -= 31 * 3 + 30 * 2 + February;
currentMonth = 7;
}
else if (totalDays > 31 * 3 + 30 * 1 + February){
totalDays -= 31 * 3 + 30 * 1 + February;
currentMonth = 6;
}
else if (totalDays > 31 * 2 + 30 * 1 + February){
totalDays -= 31 * 2 + 30 * 1 + February;
currentMonth = 5;
}
else if (totalDays > 31 * 2 + February){
totalDays -= 31 * 2 + February;
currentMonth = 4;
}
else if (totalDays > 31 + February){
totalDays -= 31 + February;
currentMonth = 3;
}
else if (totalDays > 31){
totalDays -= 31;
currentMonth = 2;
}
else{
currentMonth = 1;
}
cout << "今天是" << currentYear << "年 " << currentMonth << "月"<<(totalDays+1)<<" 日";//这个 多少号这里面一定有bug。
return currentYear;
}
void showDate(void){
int totalseconds = time(0);
int totalDays = totalseconds / (60*60*24);
int currentYear = 0;
getYear(totalDays);
}
int main(){
cout << "显示当前时间" << endl;
showDate();
showTime();
system("pause");
return 0;
}
这个 还是比较难搞的,并且觉得,好像也未必能跑呢。
5.25逆序素数:
#include <iostream>
#include <iomanip>
using namespace std;
int getBits(int number){
if (number == 0)return 1;
int bit = 0;
while (number>0){
number /= 10;
bit++;
}
return bit;
}
int reverse(int number){
int sum = 0;
int bit = getBits(number);
int stage = pow(10, bit - 1);
int currentNumber = 0;
while (number > 0){
currentNumber = number % 10;
sum += currentNumber*stage;
stage /= 10;
number /= 10;
}
return sum;
}
bool isPrime(int number){
for (int i = 2; i <= number / 2; i++){
if (number%i == 0)
return false;
}
return true;
}
bool isEmirp(int number){
if (isPrime(number) && isPrime(reverse(number))){
return true;
}
return false;
}
void printEmirp(void){//prime 逆序变成 emirp 比如 13是 素数,逆序后的31 也是,这就是 逆序,2 3 5 也是 11 也是
int count = 0;
for (int i = 2; count < 100; i++){
if (isEmirp(i)){
cout << setw(5) << i;
count++;
if (count % 10 == 0)
cout << endl;
}
}
}
int main(){
cout << "输出逆序素数" << endl;
printEmirp();
system("pause");
return 0;
}
5.26回文素数
#include <iostream>
#include <iomanip>
using namespace std;
bool isPrime(int number){
for (int i = 2; i <= number / 2; i++){
if (number%i == 0)
return false;
}
return true;
}
int getBits(int number){
if (number == 0)return 1;
int bit = 0;
while (number>0){
number /= 10;
bit++;
}
return bit;
}
int reverse(int number){
int sum = 0;
int bit = getBits(number);
int stage = pow(10, bit - 1);
int currentNumber = 0;
while (number > 0){
currentNumber = number % 10;
sum += currentNumber*stage;
stage /= 10;
number /= 10;
}
return sum;
}
bool isReverseSame(int number){
if (number == reverse(number))
return true;
return false;
}
bool isReverseSamePrime(int number){
if (isPrime(number) && isReverseSame(number))
return true;
return false;
}
void printReverseSamePrime(void){
int count = 0;
for (int i = 2; count < 100; i++){
if (isReverseSamePrime(i)){
cout << setw(7) << i;
count++;
if (count % 10 == 0)
cout << endl;
}
}
}
int main(){
cout << "输出回文素数" << endl;
printReverseSamePrime();
system("pause");
return 0;
}
5.27 梅森素数
#include <iostream>
#include <iomanip>
using namespace std;
bool isPrime(int number){
for (int i = 2; i <= number / 2; i++){
if (number%i == 0)
return false;
}
return true;
}
void printMersennePrime(){
int p=31;
cout << "p\t2^p-1" << endl;
int mersenne = 0;
for (int p = 2; p<=31; p++){
mersenne = pow(2, p) - 1;
if (isPrime(mersenne)){
cout << p << "\t" << mersenne << endl;
}
}
}
int main(){
cout << "输出梅森素数" << endl;
printMersennePrime();
system("pause");
return 0;
}
5.28 孪生素数
#include <iostream>
using namespace std;
bool isPrime(int number){
for (int i = 2; i <= number / 2; i++){
if (number%i == 0)
return false;
}
return true;
}
bool isTwinPrimes(int number){
if (isPrime(number) && isPrime(number + 2))
return true;
return false;
}
void printTwinPrimes(void){
for (int i = 2; i < 1000; i++){
if (isTwinPrimes(i)){
cout << "(" << i << "," << i + 2 << ")" << endl;
}
}
}
int main(){
cout << "输出孪生素数" << endl;
printTwinPrimes();
system("pause");
return 0;
}