//复习用,如有错误,请指正
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;
}