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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM