C++系列作业

  1.编写一个完整的程序,实现功能:向用户提问“现在正在下雨吗?”,提示用户输入Y或N。若输入为Y,显示“现在正在下雨。”;若输入为N,显示“现在没有下雨”;否则继续提问“现在正在下雨吗?”

#include<iostream>
#include<string>
using namespace std;
int main() {
    string input;    //用户输入的是一个字符串,要用cin接收一行的输入
    while (1) {    //永远执行此循环
        cout << "现在正在下雨吗?";
        getline(cin, input);
        if (input == "Y") {
            cout << "现在正在下雨" << endl;
            break;    //结束循环
        }
        else if (input == "N") {
            cout << "现在没有下雨" << endl;
            break;    //结束循环
        }
        else {
            continue;
        }
    }
    system("pause");
    return 0;
}

 

  2. 编写一个完整的程序,运行时向用户提问“你考试考了多少分?(0~100)”,接收输入后判断其等级显示出来,规则为90到100优,80到90良,60到80中,0到60差。

#include<iostream>
using namespace std;
int main(){
    float number;
    while(1){
        //    第一次输入。
        cout << "你考试考了多少分?(0~100):";
        cin >> number;
        //    检测是否输入的是符合要求的数字
        while(cin.fail()){
            cout<<"你输入的不是数字,请重新输入!"<<endl;
            cin.clear();
            cin.sync();
            cout<<"你考试考了多少分?(0~100):";
            cin >> number;
        }
        //    当输入的是数字后,进入判断
        if(number >= 90 && number <= 100){
            cout << "你的等级是优" << endl;
        }
        else if(number>=80 && number<90){
            cout << "你的等级是良" << endl;
        }
        else if(number>=60 && number<80){
            cout << "你的等级是中" << endl;
        }
        else if(number>=0 && number<60){
            cout << "你的等级是差" << endl;
        }
        else{
            cout << "你输入的成绩不在判断等级的范围内,请重新输入!" << endl;
        }
    }
    return 0;
}

 

  3. 实现一个简单的菜单程序,运行时显示“Menu: A(dd) D(elete) S(ort) Q(uit),Select one:”,提示用户输入。A表示增加,D表示删除,S表示排序,Q表示退出。输入为A、D、S时分别提示“数据已经增加、删除、排序。”,输入为Q时程序结束。
      (1)要求用if…else语句进行判断,用break,continue控制程序流程。
      (2)要求使用switch语句。

#include<iostream>
#include<string>
using namespace std;
/*
    利用if...else语句进行判断,用break,continue控制流程。
*/
int main() {
    string input;
    while (1) {
        cout << "Menu: A(dd) D(elete) S(ort) Q(uit),Select one:";
        getline(cin, input);
        if (input == "A" || input == "a") {
            cout << "数据已经增加!" << endl;
            continue;
        }
        else if (input == "D" || input == "d") {
            cout << "数据已经删除!" << endl;
            continue;
        }
        else if (input == "S" || input == "s") {
            cout << "数据已经排序!" << endl;
            continue;
        }
        else if (input == "Q" || input == "q") {
            break;
        }
        else {
            cout << "你输入的参数有误,请重新输入!" << endl;
            continue;
        }
    }
}
/*
    利用switch语句进行编写
*/
//int main() {
//    char input;
//    while (1) {
//        cout << "Menu: A(dd) D(elete) S(ort) Q(uit),Select one:";
//        cin >> input;
//        switch (input) {
//        case 'A': 
//            cout << "数据已经增加!" << endl;
//            continue;
//        case 'D':
//            cout << "数据已经删除!" << endl;
//            continue;
//        case 'S':
//            cout << "数据已经排序!" << endl;
//            continue;
//        case 'Q':
//            break;
//        default:
//            cout<<"你输入的参数有误,请重新输入!" << endl;
//            continue;
//        }
//    }
//    return 0;
//}

 

  4. 输入一个两位整数,要求将该数逆序输出。例如,输入68,输出86。

#include<iostream>
using namespace std;
/*
    上机习题4
    输入一个两位整数,要求将该数逆序输出。
*/
int main() {
    int input;    //    定义要输入的整数
    int digit, unit;    //    定义十位数和个位数
    //    为了让程序可以重复输入输出,使用循环
    while (1) {
        cout << "请输入一个两位整数(10-99):";
        cin >> input;
        //    绝对值超过100的数字不符合题目要求
        if (input >= 100 || input <= -100) {
            cout << "你输入的数字不是两位整数,请重新输入" << endl;
            //    清除cin流的缓存,方便下次输入不会有问题。
            cin.clear();
            cin.sync();
            continue;
        }
        else {
            //    input整除10就能取出十位数
            digit = input / 10;
            //    input减去十位数乘以10就是个位数
            unit = input - digit * 10;
            //    重新组合输出数字
            cout << unit * 10 + digit << endl;
        }
    }
    return 0;
}
/*
    输出测试:
    -568    "你输入的数字不是两位整数,请重新输入"
    -89        -98
    89        98
    7        70
    -6        -60
    589        "你输入的数字不是两位整数,请重新输入"
    可以循环输入,每次都会有提示:"请输入一个两位整数(10-99):"
*/

 

  5. 求表达式的值

#include<iostream>
using namespace std;
/*
    上机习题5
*/
int main() {
    float x1 = 2.5;
    int a1 = 7;
    float y1 = 4.7;
    cout << "x1+a1%3*(int)(x1+y1)%2/4 ="<< x1 + a1 % 3 * (int)(x1 + y1) % 2 / 4 << endl;
    //    a1%3=1,(int)(x1+y1)=7
    //    1*7%2/4=7%2/4=1/4=0
    //    2.5+0=2.5
    int a2 = 2;
    int b2 = 3;
    float x2 = 3.5;
    float y2 = 2.5;
    cout << "(float)(a+b)/2+(int)x%(int)y =" << (float)(a2 + b2) / 2 + (int)x2 % (int)y2 << endl;
    //    (float)(a2+b2)=5.0,(int)x2=3,(int)y2=2
    //    5.0/2+3%2=2.5+1=3.5
    int a3 = 12;
    int n3 = 5;
    cout << "a%=(n%=2) =" << (a3 %= (n3 %= 2)) << endl;
    //    n3=n3%2=5%2=1
    //    a3=a3%1=12%1=0
    int a4 = 12;
    cout << "a+=a-=a*=a =" << (a4 += a4 -= a4 *= a4) << endl;
    //    a4=a4*a4=12*12=144
    //    a4=a4-a4=144-144=0
    //    a4=a4+a4=0+0=0
    system("pause");
    return 0;
}

 

  6. 编写一个完整的程序,运行时向用户提问“你考试考了多少分?(0~100)”,接收输入后判断其等级显示出来,规则为90到100优,80到90良,60到80中,0到60差。

#include<iostream>
using namespace std;
/*
    用if语句实现
*/
#include<iostream>
using namespace std;
int main(){
    float number;
    while(1){
        //    第一次输入。
        cout << "你考试考了多少分?(0~100):";
        cin >> number;
        //    检测是否输入的是符合要求的数字
        while(cin.fail()){
            cout<<"你输入的不是数字,请重新输入!"<<endl;
            cin.clear();
            cin.sync();
            cout<<"你考试考了多少分?(0~100):";
            cin >> number;
        }
        //    当输入的是数字后,进入判断
        if(number >= 90 && number <= 100){
            cout << "你的等级是优" << endl;
        }
        else if(number>=80 && number<90){
            cout << "你的等级是良" << endl;
        }
        else if(number>=60 && number<80){
            cout << "你的等级是中" << endl;
        }
        else if(number>=0 && number<60){
            cout << "你的等级是差" << endl;
        }
        else{
            cout << "你输入的成绩不在判断等级的范围内,请重新输入!" << endl;
        }
    }
    return 0;
}
/*
    用switch语句实现
*/
int main(){
    int number;
    cout << "你考试考了多少分?(0~100):";
    cin >> number;
    switch(number/10){
    case 10:
        cout<<"你的等级为优"<<endl;
        break;
    case 9:
        cout<<"你的等级为优"<<endl;
        break;
    case 8:
        cout<<"你的等级为良"<<endl;
        break;
    case 7:
        cout<<"你的等级为中"<<endl;
        break;
    case 6:
        cout<<"你的等级为中"<<endl;
        break;
    default:
        cout<<"你的等级为差"<<endl;
        break;
    }
    system("pause");
    return 0;
}

 

  7. 实现一个简单的菜单程序,运行时显示“Menu: A(dd) D(elete) S(ort) Q(uit),Select one:”,提示用户输入。A表示增加,D表示删除,S表示排序,Q表示退出。输入为A、D、S时分别提示“数据已经增加、删除、排序。”,输入为Q时程序结束。
      (1)要求用if…else语句进行判断,用break,continue控制程序流程。
      (2)要求使用switch语句。

#include<iostream>
#include<string>
using namespace std;
/*
    利用if...else语句进行判断,用break,continue控制流程。
*/
int main() {
    string input;
    while (1) {
        cout << "Menu: A(dd) D(elete) S(ort) Q(uit),Select one:";
        getline(cin, input);
        if (input == "A" || input == "a") {
            cout << "数据已经增加!" << endl;
            continue;
        }
        else if (input == "D" || input == "d") {
            cout << "数据已经删除!" << endl;
            continue;
        }
        else if (input == "S" || input == "s") {
            cout << "数据已经排序!" << endl;
            continue;
        }
        else if (input == "Q" || input == "q") {
            break;
        }
        else {
            cout << "你输入的参数有误,请重新输入!" << endl;
            continue;
        }
    }
}
/*
    利用switch语句进行编写
*/
int main() {
    char input;
    while (1) {
        cout << "Menu: A(dd) D(elete) S(ort) Q(uit),Select one:";
        cin >> input;
        switch (input) {
        case 'A': 
            cout << "数据已经增加!" << endl;
            continue;
        case 'D':
            cout << "数据已经删除!" << endl;
            continue;
        case 'S':
            cout << "数据已经排序!" << endl;
            continue;
        case 'Q':
            break;
        default:
            cout<<"你输入的参数有误,请重新输入!" << endl;
            continue;
        }
    }
    return 0;
}

 

  8. 用穷举法找出1~100间的质数并显示出来,分别使用while,do……while,for循环语句实现。

#include<iostream>
using namespace std;
/*
    用for循环实现求质数
*/
int main() {
    cout<<"2是质数"<<endl;
    //    待遍历的数,只需要遍历3开始所有的奇数
    for (int i = 3; i <= 99; i=i+2) {
        //    除数
        for (int j = 2; j <= i; j++) {
            //    遍历条件
            if (i%j == 0) {
                break;
            }
            //    超过i/2后不需要遍历,余数肯定不为0
            if (j > i / 2) {
                cout << i << "是质数" << endl;
                break;
            }
        }
    }
    system("pause");
    return 0;
}
/*
    用while循环实现求质数
*/
int main(){
    cout<<"2是质数"<<endl;
    int i = 3;
    //    遍历奇数
    while(i <= 99){
        //    记录整数成功的次数
        int flag = 0;
        int j = 2;
        //    只需要遍历i/2前面的部分就可以
        while(j<=i/2){
            //    整除成功一次就记录一次
            if(i%j==0){
                flag++;
                break;
            }
            j++;
        }
        //    只要flag又一次记录就不是质数
        if(flag==0){
            cout<<i<<"是质数"<<endl;
        }
        //    下一个奇数
        i=i+2;
    }
    system("pause");
    return 0;
}
/*
    用do while循环实现求质数
*/
int main(){
    cout<<"2是质数"<<endl;
    int i = 3;
    do{
        int j = 2;
        int flag = 0;
        do{
            if(i%j==0){
                flag++;
                break;
            }
            j++;
        }while(j<=i/2);
        if(flag==0){
            cout << i << "是质数" << endl;
        }
        i=i+2;
    }while(i<=99);
    system("pause");
    return 0;
}

 

  9. 在程序中定义一个int型变量,赋予1~100的值,要求用户猜这个数,比较两个数的大小,把结果提示给用户,直到猜对位置,分别使用while和do……while来实现。

/*
    用while实现
*/
#include<iostream>
using namespace std;
int main() {
    int n,m;
    cout << "请出题者输入一个数(1~100): ";
    cin >> n;
    cout << "请猜题者输入数字(1~100):";
    while (!cin.fail()) {
        cin.clear();
        cin.sync();
        cin >> m;
        if (m < n) {
            cout << "输入数字比既定数字小,请重新输入:";
            continue;
        }
        else if (m > n) {
            cout << "输入数字比既定数字大,请重新输入:";
            continue;
        }
        else {
            cout << "恭喜你猜对了数字,记得找铎神领取红包!" << endl;
            break;
        }
    }
    system("pause");
    return 0;
}
/*
    用do……while实现
*/
#include<iostream>
using namespace std;
int main() {
    int n, m;
    cout << "请出题者输入一个数(1~100): ";
    cin >> n;
    cout << "请猜题者输入数字(1~100):";
    do{
        cin.clear();
        cin.sync();
        cin >> m;
        if (m < n) {
            cout << "输入数字比既定数字小,请重新输入:";
            continue;
        }
        else if (m > n) {
            cout << "输入数字比既定数字大,请重新输入:";
            continue;
        }
        else {
            cout << "恭喜你猜对了数字,记得找铎神领取红包!" << endl;
            break;
        }
    } while (!cin.fail());
    //    让结果显示的代码,不要马上闪退结束。
    getchar();
    getchar();
    return 0;
}

 

  10. 输出九九乘法表

#include<iostream>
#include<iomanip>    //    为了引入setw()控制输出宽度
using namespace std;
int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= 9; j++) {
            //    setw(2)为了输出整齐
            cout << i << "*" << j << "=" << setw(2) << i*j << " ";
        }
        //    输出完一列以后就可以换行
        cout << endl;
    }
    system("pause");
    return 0;
}

 

  11. 完成函数,参数为两个unsigned short int型数,返回值为第一个参数除以第二个参数的结果,数据类型为short int;如果第二个参数为0,则返回值为-1,在主程序中实现输入输出。

#include<iostream>
using namespace std;
short int transfun(unsigned short int n1 , unsigned short int n2);
int main() {
    unsigned short int n1, n2;
    cout << "请输入第一个数:";
    cin >> n1;
    cout << "请输入第二个数:";
    cin >> n2;
    cout<<"返回值是"<<transfun(n1, n2)<<endl;
    system("pause");
    return 0;
}
short int transfun(unsigned short int n1, unsigned short int n2) {
    if (n2 == 0) {
        return -1;
    }
    else {
        return n1 / n2;
    }
}

 

  12. 编写函数把华氏温度转成摄氏温度

#include<iostream>
using namespace std;
//    摄氏度转华氏度的函数的声明
void CelTransFah(double Fah);
//    主函数
int main() {
    double Fah;
    while (!cin.fail()) {
        cin.clear();
        cin.sync();
        cout << "请输入一个华氏温度:";
        cin >> Fah;
        CelTransFah(Fah);
    }
    system("pause");
    return 0;
}
//    函数方法
void CelTransFah(double Fah) {
    double Cel;
    Cel = (Fah - 32.0)*5.0 / 9.0;
    cout << "相应的摄氏温度为:" << Cel << "°C" << endl;
}

 

  13. 体会引用的用法

#include<iostream>
using namespace std;
int main() {
    int intOne;
    int &rSomeRef = intOne;
    intOne = 5;
    cout << "intOne:\t" << intOne << endl;
    //    输出"intOne:    5"
    cout << "rSomeRef:\t" << rSomeRef << endl;
    //    输出"rSomeRef:5"
    int intTwo = 8;
    rSomeRef = intTwo;    //    通过改变引用来改变原来的变量
    cout << "\nintOne:\t" << intOne << endl;
    //    输出换行,然后输出"intOne:8"
    cout << "intTwo:\t" << intTwo << endl;
    //    输出"intTwo:    8"
    cout << "rSomeRef:\t" << rSomeRef << endl;
    //    输出"rSomeRef:8"
    system("pause");
    return 0;
}

 

  14. 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?

/*
    从该例子可以看到函数原型的参数名字。
    函数定义中的参数名字,函数调用的参数名字
    可以完全不一样。
*/
#include<iostream>
using namespace std;
void test(int a);
int main() {
    int c = 6;
    test(c);
    system("pause");
    return 0;
}
void test(int b) {
    cout << b << endl;
}

 

  15. 调用被重载的函数时,通过什么来区分被调用的是哪个函数?

/*
    从实验结果看出,是根据实参来进行匹配重载的,
    优先会考虑最好的匹配。
*/
#include<iostream>
#include<string>
using namespace std;
void test(int a) {
    cout << a << endl;
}
void test(double b) {
    cout << b << endl;
}
void test(string b) {
    cout << b << endl;
}
int main() {
    test(6);
    test(6.01);    //    这里输入6.0000后面不论多少个0都会被更优的6输出。
    test("六点零");
    system("pause");
    return 0;
}

 

  16. 完成函数,参数为两个unsigned short int型数,返回值为第一个参数除以第二个参数的结果,数据类型为short int;如果第二个参数为0,则返回值为-1,在主程序中实现输入输出。

#include<iostream>
using namespace std;
short int transfun(unsigned short int n1 , unsigned short int n2);
int main() {
    unsigned short int n1, n2;
    cout << "请输入第一个数:";
    cin >> n1;
    cout << "请输入第二个数:";
    cin >> n2;
    cout<<"返回值是"<<transfun(n1, n2)<<endl;
    system("pause");
    return 0;
}
short int transfun(unsigned short int n1, unsigned short int n2) {
    if (n2 == 0) {
        return -1;
    }
    else {
        return n1 / n2;
    }
}

 

  17. 编写函数把华氏温度转化为相应的摄氏温度,公式为如下,在主程序中提示用户输入一个华氏温度,转化后输出相应的摄氏温度。$$C=\frac{5}{9}*(F-32)$$

#include<iostream>
using namespace std;
//    摄氏度转华氏度的函数的声明
void CelTransFah(double Fah);
//    主函数
int main() {
    double Fah;
    while (!cin.fail()) {
        cin.clear();
        cin.sync();
        cout << "请输入一个华氏温度:";
        cin >> Fah;
        CelTransFah(Fah);
    }
    system("pause");
    return 0;
}
//    函数方法
void CelTransFah(double Fah) {
    double Cel;
    Cel = (Fah - 32.0)*5.0 / 9.0;
    cout << "相应的摄氏温度为:" << Cel << "°C" << endl;
}

 

  18. 编写函数判别一个数是否是质数,在主程序中实现输入输出。

#include<iostream>
using namespace std;
//    函数的声明
bool isprime(int prime);
int main() {
    int test;
    cout << "请输入一个整数:";
    cin >> test;
    if (isprime(test)) {
        cout << test << "是质数" << endl;
    }
    else {
        cout << test << "不是质数" << endl;
    }
    system("pause");
    return 0;
}
bool isprime(int prime) {
    if (prime == 2) {
        return true;
    }
    if (prime % 2 == 0) {
        return false;
    }
    else {
        for (int temp = 3; temp <= prime / 2; temp = temp + 2) {
            if (prime%temp == 0) {
                cout << prime << "=" << temp << "*" << prime / temp << endl;
                return false;
            }
        }
    }
    return true;
}

 

  19. 编写函数求两个整数的最大公约数和最小公倍数。

#include<iostream>
using namespace std;
int gcd(int n1, int n2);
int lcm(int n1, int n2);
int main() {
    int n1, n2;
    cout << "请输入第一个整数:";
    cin >> n1;
    cout << "请输入第二个整数:";
    cin >> n2;
    int N1 = gcd(n1, n2);
    int N2 = lcm(n1, n2);
    cout << n1 << "" << n2 << "的最大公约数是" << N1 << endl;
    cout << n1 << "" << n2 << "的最小公倍数是" << N2 << endl;
    system("pause");
    return 0;
}
//    要巧妙利用值传递,既达到交换的目的,又能不影响原来的输入输出。
void transnumber(int n1, int n2) {
    int temp;
    if (n1 < n2) {
        temp = n1;
        n1 = n2;
        n2 = temp;
    }
}
int gcd(int n1, int n2) {
    //    交换两数确认前者比后者大,利用形参继续完成事情。
    transnumber(n1, n2);
    int r1 = n1%n2;
    if (r1 == 0) {
        return n2;
    }
    else {
        gcd(n2, r1);
    }
}
int lcm(int n1, int n2) {
    int temp = gcd(n1, n2);
    return n1*n2 / temp;
}

 

  20. 在主程序中提示输入整数n,编写函数用递归的方法求1到n的和。

#include<iostream>
using namespace std;
int integersum(int n) {
    if (n>1) {
        return n + integersum(n - 1);
    }
    else {
        return 1;
    }
}
int main() {
    cout << integersum(100) << endl;
    system("pause");
    return 0;
}

 

  21. 用递归的方法编写函数求斐波那契数列,公式为$$F_n = F_{n-1} + F_{n-2} (n>2)$$ $$F_0 = F_1 = 1$$

/*
    为了观察递归调用的过程,特意写的比较麻烦,使用了一些输出
    方便观察递归进行到哪一步。
*/
#include<iostream>
using namespace std;
int fibonacci(int n) {
    if (n == 1) {
        cout << "使用了n=1" << endl;
        return 1;
    }
    else if (n == 2) {
        cout << "使用了n=2" << endl;
        return 1;
    }
    else {
        cout <<"此时n的值是"<< n << ",这回调用的是fibonacci的第" << n - 1 << "" << endl;
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
int main() {
    int n;
    while (1) {
        cin.sync();
        cin.clear();
        cout << "请输入想求的Fibonacci的项数:";
        cin >> n;
        cout << "Fibonacci第" << n << "项是:" << fibonacci(n) << endl;
    }
    system("pause");
    return 0;
}
/* 
    以n=6为例,输出结果如下:
    请输入想求的Fibonacci的项数:6
    此时n的值是6,这回调用的是fibonacci的第5项
    此时n的值是5,这回调用的是fibonacci的第4项
    此时n的值是4,这回调用的是fibonacci的第3项
    此时n的值是3,这回调用的是fibonacci的第2项
    使用了n=2
    使用了n=1
    使用了n=2
    此时n的值是3,这回调用的是fibonacci的第2项
    使用了n=2
    使用了n=1
    此时n的值是4,这回调用的是fibonacci的第3项
    此时n的值是3,这回调用的是fibonacci的第2项
    使用了n=2
    使用了n=1
    使用了n=2
    Fibonacci第6项是:8
    
    这是个单线程的过程,为了求解两个fibonacci的递归return,
    (1) 先求解第一个,一直求到n=2
    (2) 此时发现两个return都可以求了,就进入n=1求出来,然后又返回到n=2
    (3) 求解第二个,重复(1)(2),最后返回到n=2
*/

 

  22. 用递归的方法编写函数求n阶勒让德多项式的值,在主程序中实现输入输出,递归公式为:$$P_n(x)=\frac{(2n-1)P_{n-1}(x)-(n-1)P_{n-2}(x)}{n}$$ $$P_{0}(x)=1;P_{1}(x)=x$$

#include<iostream>
using namespace std;
double legendre(int n,double x) {
    if (n == 0) {
        return 1;
    }
    else if (n == 1) {
        return x;
    }
    else {
        return ((2*n-1)*x*legendre(n-1,x)-(n-1)*legendre(n-2,x))/n;
    }
}
int main() {
    int n;
    double x;
    while (1) {
        cin.sync();
        cin.clear();
        cout << "请输入想求的Legendre的阶数:";
        cin >> n;
        cout << "请输入想求的x值:";
        cin >> x;
        cout << "Legendre" << n << "阶,取x="<< x <<"的时候的值是:" << legendre(n,x) << endl;
    }
    system("pause");
    return 0;
}

 

  23. 编写递归函数getPower计算x^y,在同一个程序中针对整型和实型实现两个重载的函数。

#include<iostream>
using namespace std;
int getPower(int x, int y) {
    if (y == 0) {
        return 1;
    }
    else if (y > 0) {
        return x*getPower(x, y - 1);
    }
    else {
        return x*getPower(x, y + 1);
    }
}
double getPower(double x, int y) {
    if (y == 0) {
        return 1;
    }
    else if (y > 0) {
        return x*getPower(x, y - 1);
    }
    else {
        return x*getPower(x, y + 1);
    }
}
int main() {
    int a,m;
    double b;
    while (1) {
        cin.sync();
        cin.clear();
        cout << "请输入一个整数作为底数:";
        cin >> a;
        cout << "请输入一个实数作为另一个底数:";
        cin >> b;
        cout << "请输入一个整数作为指数:";
        cin >> m;
        cout << a << "" << m << "次方是" << getPower(a, m) << endl;
        cout << b << "" << m << "次方是" << getPower(b, m) << endl;
    }
    system("pause");
    return 0;
}

 

  24. 输入一个两整数,要求将该数逆序输出。例如,输入68,输出86。

#include<iostream>
using namespace std;
/*
1.输入一个两位整数,要求将该数逆序输出。
*/
int main() {
    int input;    //    定义要输入的整数
    int digit, unit;    //    定义十位数和个位数
    //    为了让程序可以重复输入输出,使用循环
    while (1) {
        cout << "请输入一个两位整数(10-99):";
        cin >> input;
        //    绝对值超过100的数字不符合题目要求
        if (input >= 100 || input <= -100) {
            cout << "你输入的数字不是两位整数,请重新输入" << endl;
            //    清除cin流的缓存,方便下次输入不会有问题。
            cin.clear();
            cin.sync();
            continue;
        }
        else {
            //    input整除10就能取出十位数
            digit = input / 10;
            //    input减去十位数乘以10就是个位数
            unit = input - digit * 10;
            //    重新组合输出数字
            cout << unit * 10 + digit << endl;
        }
    }
    return 0;
}
/*
输出测试:
-568    "你输入的数字不是两位整数,请重新输入"
-89        -98
89        98
7        70
-6        -60
589        "你输入的数字不是两位整数,请重新输入"
可以循环输入,每次都会有提示:"请输入一个两位整数(10-99):"
*/

 

  25. 求$\pi$,公式如下:$$\frac{\pi}{4} \approx 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ……  = \sum_{n=1}^{\infty}(-1)^{n-1} \frac{1}{2n-1}$$

#include<iostream>
#include<ctime>        //    引入clock_t类
#include<iomanip>    //    显示小数点的位数用的头文件
using namespace std;
double const EPS = 1e-9;
int main() {
    clock_t start, finish;    //    引入记录程序运行时间的对象
    start = clock();    // start对象执行clock()方法,开始计时
    double sum = 0;
    double k = 1;
    int i = 1;
    int flag = 0;
    while (k / i >= EPS) {
        if (i % 4 == 1) {
            sum = sum + k / i;
        }
        else {
            sum = sum - k / i;
        }
        i = i + 2;
        flag++;
    }
    double Sum = 4 * sum;
    cout << "π的值是:" << setprecision(10)<< Sum << endl;
    cout << EPS << "精度下共执行了" << flag << "次循环" << endl;
    finish = clock();    //    finish对象执行clock()方法,结束计时。
    cout << "花费的时间是:"<< finish - start << "/" << CLOCKS_PER_SEC << "(s)" << endl;
    system("pause");
    return 0;
}
/*
    实现的代码不难写,但是为了效率的问题,对EPS测试了几个常数,并记录了实验结果。
    π的值是:3.141572654
    1e-05精度下共执行了50000次循环
    花费的时间是:2/1000(s)
    π的值是:3.141590654
    1e-06精度下共执行了500000次循环
    花费的时间是:9/1000(s)
    π的值是:3.141592454
    1e-07精度下共执行了5000000次循环
    花费的时间是:76/1000(s)
    π的值是:3.141592634
    1e-08精度下共执行了50000000次循环
    花费的时间是:742/1000(s)
    π的值是:3.141592652
    1e-09精度下共执行了500000000次循环
    花费的时间是:7392/1000(s)
    到了1e-10时,循环数又翻10倍,花费的时间也会是10倍,70s的等待已经是到了不能忍受的范围。
    因此纵观以上取得精度以及准确性,可以取1e-08或者1e-09作为近似值。
*/

 

  26. 编写一个判断素数的函数,在主函数中输入一个整数n,调用判素数的函数,在主函数中输出判断结果。

#include<iostream>
using namespace std;
//    函数的声明
bool isprime(int prime);
int main() {
    int test;
    cout << "请输入一个整数:";
    cin >> test;
    if (isprime(test)) {
        cout << test << "是质数" << endl;
    }
    else {
        cout << test << "不是质数" << endl;
    }
    system("pause");
    return 0;
}
bool isprime(int prime) {
    if (prime == 2) {
        return true;
    }
    if (prime % 2 == 0) {
        return false;
    }
    else {
        for (int temp = 3; temp <= prime / 2; temp = temp + 2) {
            if (prime%temp == 0) {
                cout << prime << "=" << temp << "*" << prime / temp << endl;
                return false;
            }
        }
    }
    return true;
}

 

  27. 编写一个判润年的函数,在主函数中输入一个年份year,调用判润年的函数,在主函数中输出判断结果。

#include<iostream>
using namespace std;
bool isleapyear(int year) {
    if (year % 4 != 0) {
        return false;
    }
    else if (year % 100 == 0) {
        if (year % 400 == 0) {
            return true;
        }
        else {
            return false;
        }
    }
    else {
        return true;
    }
}
int main() {
    int year;
    while (!cin.fail()) {
        cin.clear();
        cin.sync();
        cout << "请输入一个年份:";
        cin >> year;
        if (isleapyear(year)) {
            cout << year << "年是闰年!可以找铎神领取红包!" << endl;
        }
        else {
            cout << year << "年不是闰年,但是也可以找铎神领取红包!" << endl;
        }
    }
    cout << "你输入的不是年份,请重新运行程序!" << endl;
    system("pause");
    return 0;
}

 

  28. 通过键盘输入一个实数,要求按四舍五入的规则保留两位小数并输出。

#include<iostream>
#include<cmath>
using namespace std;
/*
    不论输入的是多少位小数,我们需要的是保留两位小数,所以需要接触到的关键点是小数点后第三位。
    四舍五入版
*/
double rounding(double number) {
    int integer = static_cast<int>(number);    //    取输入实数的整数部分
    double knumber = number * 100;    //将需要判断第三位小数点移动到第一位。
    int kinteger = static_cast<int>(knumber);    //    取得增大100倍以后的整数,到时是输出的主体
    double dnumber = knumber-kinteger;    //    取剩余的小数部分
    if (abs(dnumber) < 0.5) {
        return    kinteger / 100.0;
    }
    else {
        if (dnumber > 0) {
            return kinteger / 100.0 + 0.01;
        }
        else {
            return kinteger / 100.0 - 0.01;
        }
    }
}
int main() {
    double number;
    double result;
    while (!cin.fail()) {
        cin.clear();
        cin.sync();
        cout << "请输入一个实数:";
        cin >> number;
        result = rounding(number);
        cout << number << "经过四舍五入以后的结果是" << result << endl;
    }
    system("pause");
    return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
/*
    不论输入的是多少位小数,我们需要的是保留两位小数,所以需要接触到的关键点是小数点后第三位。
    四舍六入五成双版(常见于分析化学有效位数取舍)。
    规则:
    对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,
    也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,
    "五"指的是根据5后面的数字来定,当5后有数时,舍5入1;
    当5后无有效数字时,
    需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)
    由于计算机中大量的浮点数都是带有很多位的,为了体现四舍六入五成双的算法。
    根据题目需要的2位小数,我统一截取4位小数开始计算。
    这样子会有一个bug,比如9.82501,因为截取了4位小数,所以修正出来是9.82,正确答案是9.83。
    但是只是为了演示,实际上必须是取定位数来统一输入,再用这个算法。
    可以再优化为要求输入小数的位数或判断输入数据的位数,但是这需要到数组和字符串的知识。
*/
double intercept(double number) {
    int integer = static_cast<int>(number);    //    取输入实数的整数部分
    double knumber = number * 10000;    //    将所需要的部分全部化为一个整数
    int kinteger = static_cast<int>(knumber);    //    截取整数部分
    double dnumber = kinteger / 10000.0;    //    取得所需要的数。
    return dnumber;
}
double rounding(double number) {
    double temp = intercept(number);    //    截取所需要判断的数字,应该已经告知此时的数字有4位。
    int ktemp = static_cast<int>(temp * 10000);
    int integer_result = static_cast<int>(temp);    //    输出结果的整数部分
    double    digital_result = temp - integer_result;    //    剩余的小数部分
    int judge_number = (((ktemp % 100000) % 10000) % 1000) % 100;    //    为了能取到最后低的两位数。
    if (judge_number != 50) {
        if (judge_number <= 49) {
            return integer_result + (static_cast<int>(digital_result * 100)) / 100.0;
        }
        else {
            return integer_result + (static_cast<int>(digital_result * 100)) / 100.0 + 0.01;
        }
    }
    else {
        if ((ktemp / 100) % 2 == 0) {    //    倒数第3位是偶数的时候,此时应该不进位
            return integer_result + (static_cast<int>(digital_result * 100)) / 100.0;
        }
        else {
            return integer_result + (static_cast<int>(digital_result * 100)) / 100.0 + 0.01;
        }
    }
}
int main() {
    double number;
    double result;
    while (!cin.fail()) {
        cin.clear();
        cin.sync();
        cout << "请输入一个实数:";
        cin >> number;
        result = rounding(number);
        cout << number << "经过四舍六入五成双以后的结果是" << result << endl;
    }
    system("pause");
    return 0;
}
posted @ 2019-02-19 15:16  JCChan  阅读(3397)  评论(0编辑  收藏  举报