习题整理《C++17从入门到精通》第四章-语句

//复习用,如有错误,请指正

1.什么是空语句?什么时候需要用到空语句?

答:空语句中只含有一个单独的分号,如果在程序的某个地方,语法上需要一条语句(如while和for),但逻辑上不需要,此时应该使用空语句。

2.什么是程序块?为什么有时要定义程序块?

答:复合语句是指用花括号括起来的(可能为空的)语句和声明的序列,复合语句也被称为块,一个块就是一个作用域。

语法上需要一条语句,但是逻辑上需要多条语句,则应该使用复合语句(块)。

3.编写一个简单的计算器程序,依次输入左操作数、运算符、右操作数,输出程序运算结果。

答:

#include <iostream>

using namespace std;



int main() {

    char op;

    double num1, num2;



    cout << "请输入左操作数:";

    cin >> num1;



    cout << "请输入运算符(+、-、*、/):";

    cin >> op;



    cout << "请输入右操作数:";

    cin >> num2;



    switch (op) {

        case '+':

            cout << "结果:" << num1 + num2;

            break;

        case '-':

            cout << "结果:" << num1 - num2;

            break;

        case '*':

            cout << "结果:" << num1 * num2;

            break;

        case '/':

            if (num2 != 0)

                cout << "结果:" << num1 / num2;

            else

                cout << "错误:除数不能为0";

            break;

        default:

            cout << "错误:无效的运算符";

    }



    return 0;

}

4.编写程序,从键盘输人一个年份,根据年份是否是闰年,分别打印不同的信息。

答:

#include <iostream>

using namespace std;



int main() {

    int year;



    cout << "请输入一个年份:";

    cin >> year;



    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {

        cout << year << "年是闰年。" << endl;

    } else {

        cout << year << "年不是闰年。" << endl;

    }



    return 0;

}

5.编写程序,从键盘输人一个人的身高和体重,根据 BMI 指数公式,输出这个人是否肥胖的判断结果。

注:胖瘦的 BMI指数=体重(kg)/身高2(m)。BMI指数衡量胖瘦的 WTO标准:偏瘦(BMI<18.5)、正常(18.5<BMI 25)偏胖(25<BMI<30)、肥胖(BMI>30)。

答:

#include <iostream>

using namespace std;



int main() {

    double height, weight;

    double bmi;



    cout << "请输入身高(单位:米):";

    cin >> height;



    cout << "请输入体重(单位:千克):";

    cin >> weight;



    // 计算BMI指数

    bmi = weight / (height * height);



    // 判断肥胖程度并输出结果

    if (bmi < 18.5) {

        cout << "您的BMI指数为:" << bmi << ",偏瘦。" << endl;

    } else if (bmi >= 18.5 && bmi < 25) {

        cout << "您的BMI指数为:" << bmi << ",正常。" << endl;

    } else if (bmi >= 25 && bmi < 30) {

        cout << "您的BMI指数为:" << bmi << ",偏胖。" << endl;

    } else {

        cout << "您的BMI指数为:" << bmi << ",肥胖。" << endl;

    }



    return 0;

}

6.编写程序,从键盘输入摄氏温度,将其转换为华氏温度并输出。

答:

#include<iostream>

using namespace std;

int main(){

    int c,f;

    cin>>c;

    f=c*1.8+32;

    cout<<f;

    return 0;

}

7.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

注: C++判断一个字符是否字母、数字、空格的函数分别为 isalpha()、isdigit()、isspace(),返回的是 true 和 false。头文件 cctype 中声明了这些函数。输入一个字符,也可以用if(ch>='a'&&ch <='z')来判断一个字符是否是小写字母。

答:

#include<iostream>

#include<cctype>

using namespace std;

int main(){

    int alpha=0,space=0,digit=0,other=0;

    string line;

    cin>>line;

    for(char c:line){

        if(isalpha(c)){

            alpha++;

        }

        else if(isspace(c)){

            space++;

        }

        else if(isdigit(c)){

            digit++;

        }

        else other++;

    }

    cout<<"alphacount="<<alpha<<endl;

    cout<<"spacecount="<<space<<endl;

    cout<<"digitcount="<<digit<<endl;

    cout<<"othercount="<<other<<endl;

    return 0;

}

8.下列代码片段的错误是什么?为什么?

case true:

int ival{0};

int jval;

break;

case false:

jval = 3;

答:在case false分支中jval未定义。

在 C++ 中,每个 case 标签都会形成一个新的作用域,变量在该作用域内定义后只能在该作用域内使用。

因此,当程序执行到某个 case 分支时,会创建新的作用域并定义变量 ival 和 jval。然而,在作用域之外,这些变量将无法访问或使用。这意味着在 case true 分支中定义的 ival 和 jval 变量,在 case false 分支中是不可见的。

9.请分别写出用 for 语句和 do-while 语句计算 n 的阶乘的程序。

答:

使用for语句计算n!:

#include <iostream>

using namespace std;

int main() {

    int n;

    int factorial = 1;

    cout << "请输入一个整数:";

    cin >> n;

    for (int i = 1; i <= n; ++i) {

        factorial *= i;

    }

    cout << n << " 的阶乘是:" << factorial << endl;

    return 0;

}

使用do-while语句计算n!:

#include <iostream>

using namespace std;

int main() {

    int n;

    int factorial = 1;

    cout << "请输入一个整数:";

    cin >> n;

    int i = 1;

    do {

        factorial *= i;

        ++i;

    } while (i <= n);

    cout << n << " 的阶乘是:" << factorial << endl;

    return 0;

}

10.下列的代码片段的错误原因是什么? 请改正

(1) while(int i== 3){/* ... */)

(2) while(int j= 3){/ * ... * /}

j++ ;

(3) for (unsigned i{10}; i>= 0;i-- )

std::cout << i <<'\n';

答:

(1)while(int i== 3){/* ... */):

错误原因:在 while 循环条件中,应该使用布尔表达式作为条件,但这里使用了赋值表达式 int i == 3,这会导致语法错误。

修改:

int i = 3; // 初始化 i 的值为 3

while (i == 3) {

    // 循环体

}

(2)while(int j= 3){/ * ... * /} j++ ;:

错误原因:while 循环的循环体应该使用花括号 {} 包裹,但这里使用了注释符号 /* ... */,并且 j++ 不在循环体内,应该放在花括号内。

修改:

int j = 3; // 初始化 j 的值为 3

while (j == 3) {

    // 循环体

    j++; // j 自增

}

(3)for (unsigned i{10}; i>= 0;i-- ) std::cout << i <<'\n';:

错误原因:循环条件 i >= 0 也存在问题,因为无符号整数 unsigned 的范围是非负数,不会小于 0。

修改:

for (unsigned i = 10; i > 0; --i) // 初始化 i 为 10,循环条件为 i 大于 0,每次递减 1

std::cout << i << '\n'; // 输出 i 的值并换行,注意 i 的范围是 [1, 10]

11.说明下列程序的错误及其原因。

#include < iostream >

int main() {

int arr[10];

for (int i{0};i<10; i++)

arr[i] = 2 *i + 1;

for (i=0;i<10;i++)

std::cout << i < ‘\t';

}

答:

第二个for循环中未声明变量i,应该是for (int i=0;i<10;i++);

输出应该是std::cout << arr[i]< ‘\t';

12.如下所示,编写程序根据用户输入行数,输出对应行数的金字塔。

*

* *

* * *

* * * *

答:

#include <iostream>

using namespace std;



int main() {

    int rows;

    cout << "请输入金字塔的行数:"<<endl;

    cin >> rows;



    for (int i = 0; i < rows; i++) {

        // 输出空格

        for (int j = 0; j < rows - i ; j++) {

            cout << " ";

        }

        // 输出星号

        for (int k = 0; k < i + 1; k++) {

            cout << "*";

            // 每个星号后加一个空格(除了最后一个星号)

            if (k < i) {

                cout << " ";

            }

        }

        cout << endl;

    }

    return 0;

}

13.下面是 6 行的杨辉三角形,编写程序,输入行数打印对应行数的杨辉三角形

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

答:

#include<iostream>

using namespace std;

int main(){

    int n,k=1;

    cin>>n;

    int a[n][n];

    for(int i=0;i<n;++i){

        a[i][0]=1;

        a[i][k]=0;

        for(int j=0;j<k;j++){

            if(j!=0) a[i][j]=a[i-1][j-1]+a[i-1][j];

            cout<<a[i][j]<<' ';

        }

        k++;

        cout<<endl;

    }

    return 0;

}

14.编写一个程序,从键盘输人一个正整数,判断它是否是质数.提示: 假设 n 不是质数,必然存在 1<a<b<n,使得 n=a*b。

答:

#include<iostream>

using namespace std;

int main(){

    int n,i;

    cin>>n;

    for(i=2;i*i<=n;++i){

        if(n%i==0) break;

    }

    if(i*i>n){

        cout<<"IsPrime";

    }

    else{

        cout<<"NotPrime";

    }

    return 0;

}

15.编写一个程序,输出小于 100 的所有质数。

答:

#include <iostream>

using namespace std;



bool isPrime(int num) {

    if (num <= 1) {

        return false;

    }



    for (int i = 2; i * i <= num; i++) {

        if (num % i == 0) {

            return false;

        }

    }



    return true;

}



int main() {

    cout << "小于 100 的所有质数:" << endl;



    for (int i = 2; i < 100; i++) {

        if (isPrime(i)) {

            cout << i << " ";

        }

    }



    cout << endl;



    return 0;

}

16.编写程序:根据公式 PI/4=1-1/3+1/5-1/7..,求出圆周率 PI 的近似值。要求最后一项的绝对值小于 10-6,输出 PI的近似值。

答:

#include <iostream>

using namespace std;



int main() {

    double pi = 0.0;

    double denominator = 1.0;

    int sign = 1;

    double term = 1.0;



    while (term > 1e-6) {

        pi += sign * term;

        denominator += 2.0;

        sign *= -1;

        term = 1.0 / denominator;

    }



    pi *= 4;



    cout << "PI 的近似值为:" << pi << endl;



    return 0;

}

17.猜数字游戏:下列程序随机生成一个1~100 的正整数 num,然后让用户从键盘输入一个猜想的数字 guess,如果 guess 等于 num,那么就显示成功的祝贺信息,如果失败就提示用户继续输入,直到超过指定的猜测次数(如 8 次)就提示失败的信息。请在?处补充代码。

# include < iostream >

# include < cstdlib>

#include < ctime>

int main() {

srand((unsigned)time(0));//生成随机数种子

int number = rand() % 100 + 1;//生成一个[1,100]随机整数

int guess{};

bool success = false;//是否成功的标志

for (int i= 0;i!= 8?;i++) {

std::cout <<"请输入猜测的数字:";

std::cin >> guess;

?//判断是否猜中

}

if (?)

std::cout <<"祝贺,你猜中了这个数:"<< number < ‘\n';

else

std::cout <"很遗憾,猜测失败!";

}

}

执行情况:

请输入猜测的数字: 50

你猜测的数字有点小:

请输人猜测的数字: 70

你猜测的数字有点大:

请输人猜测的数字: 60

你猜测的数字有点大:

请输人猜测的数字: 55

你猜测的数字有点大:

请输人猜测的数字: 52

你猜测的数字有点小:

请输人猜测的数字: 53

你猜测的数字有点小:

请输人猜测的数字: 54

祝贺,你猜中了这个数:54

答:

#include <iostream>

#include <cstdlib>

#include <ctime>



int main() {

    srand(static_cast<unsigned>(time(0))); // 生成随机数种子

    int number = rand() % 100 + 1; // 生成一个 [1, 100] 的随机整数

    int guess;

    bool success = false; // 是否成功的标志



    for (int i = 0; i < 8; ++i) {

        std::cout << "请输入猜测的数字: ";

        std::cin >> guess;



        if (guess == number) { // 判断是否猜中

            success = true;

            break;

        }

    }

    if (success) {

        std::cout << "祝贺,你猜中了这个数:" << number << '\n';

    } else {

        std::cout << "很遗憾,猜测失败!" << '\n';

    }

    return 0;

}

18.从键盘输入一个弧度x,计算正弦函数 sin(x)的值。要求最后一项的绝对值小于10-5,并统计出此时累计了多少项。sin(x)的近似计算公式为:

sin(x)=x-x3/3!+x5/5!-x7/7!+…+(-1)n*x2n+1/(2n+1)!+…

答:

#include <iostream>

#include <cmath>

using namespace std;



int main() {

    double x;

    cout << "请输入弧度 x:";

    cin >> x;



    double sinX = 0.0;

    double term = x;

    int n = 1;

    int count = 0;



    while (abs(term) > 1e-5) {

        sinX += term;

        n += 2;

        count++;

        term = -term * x * x / (n * (n - 1));

    }



    cout << "sin(" << x << ") 的近似值为:" << sinX << endl;

    cout << "累计了 " << count << " 项" << endl;



    return 0;

}

19.从键盘输入一个正整数 n,计算从 1到 n 的所有整数的阶乘之和。

答:

#include <iostream>

using namespace std;



int main() {

    int n;

    cout << "请输入一个正整数 n:";

    cin >> n;



    int factorial = 1; // 阶乘的初始值为 1

    long long sum = 0; // 防止溢出,使用 long long 类型存储结果



    for (int i = 1; i <= n; ++i) {

        factorial *= i; // 计算当前数的阶乘

        sum += factorial; // 将当前数的阶乘累加到总和中

    }



    cout << "从 1 到 " << n << " 的所有整数的阶乘之和为:" << sum << endl;



    return 0;

}

20.有5个人坐在一起,问第5个人多少岁,他说比第 4个人大 2岁。问第4个人多岁,他说比第3个人大2岁。问第3个人,他说他比第2人大2岁。问第 2个人,他说比第1个人大2岁。最后问第 1个人,他说是 10 岁。请问第 5 个人多少岁?

答:

#include <iostream>

using namespace std;



int findAge(int n) {

    if (n == 1) {

        return 10; // 第 1 个人的年龄是已知的,为 10 岁

    } else {

        return findAge(n - 1) + 2; // 根据前一个人的年龄推出当前人的年龄

    }

}

int main() {

    int ageOfPerson5 = findAge(5);

    cout << "第 5 个人的年龄是:" << ageOfPerson5 << " 岁" << endl;

    return 0;

}

21.约瑟夫环问题:有n个人围成一圈,按顺序编号。从第 1 个人开始报数(从1~m报数),凡报到 m 的人退出圈子,问最后留下的是原来的第几号?

答:

#include<iostream>

using namespace std;

int main(){

    int n,m,cnt=0;

    cin>>n>>m;

    int a[n+1];

    for(int i=1;i<n+1;++i){

        a[i]=1;

    }

    while((n-=n/m)>=m){

        for(int i=1;i<n+1;++i){

            if(a[i]) cnt++;

            if(cnt==m){

                a[m]=0;

                cnt=0;

            }

        }

    }

    for(int i=1;i<n+1;++i){

        if(a[i]) cout<<i<<'\t';

    }

    return 0;

}

22.海滩上有一堆桃子,5 只猴子来分。第 1 只猴子把这堆桃子平均分为 5 份,多了1个,这只猴子把多的 1 个扔入海中,拿走了 1 份。第 2 只猴子把剩下的桃子又平均分成5份,又多了1个,它同样把多的 1个扔入海中,拿走了 1份,第 3~5 只猴子都是这样做的。试问,海滩上原来最少有多少个桃子?

答:3121个

#include<iostream>

using namespace std;

int main(){

    int x,j=1,i=0;

    while(1){

        x=4*j;

        for(i=0;i<5;){

            if(x%4!=0) break;

            else{

                x=(x/4)*5+1;

                i++;

            }

        }

        if(i==5) break;

        j++;

    }

    cout<<x;

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kethy__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值