面向对象程序设计——Visual C++
第2章 流程控制语句

思考题

1、在C++中,怎样区分表达式和表达式语句?什么时候用表达式,什么时候用表达式语句?

表达式:由操作数和运算符组成的计算式,它可以用于计算并返回一个值。
表达式语句:将一个表达式作为语句使用,它不仅会计算表达式的值,还会将其丢弃,不返回任何值。
通常情况下,当我们需要计算并使用一个值时,就需要使用表达式;而当我们需要执行某些操作,但不需要返回任何值时,就可以使用表达式语句。例如,赋值语句就是一个表达式语句,它将一个表达式的值赋给一个变量,但不需要返回任何值。另外,函数调用也可以看作是一个表达式语句,它会执行函数并返回其返回值,但如果我们不需要使用返回值,也可以将其丢弃。

2、C++中有哪些形式的语句,它们分别具有什么特征?

C++中常见的语句包括:

  1. 表达式语句:由一个表达式和一个分号组成,用于计算表达式的值并将其丢弃。
  2. 赋值语句:用于将一个值赋给一个变量,形式为“变量名 = 表达式”。
  3. 条件语句:包括if语句和switch语句,用于根据条件执行不同的代码块。
  4. 循环语句:包括for语句、while语句和do-while语句,用于重复执行一段代码块。
  5. 跳转语句:包括break语句、continue语句和return语句,用于跳出循环、继续下一次循环或返回函数值。
  6. 声明语句:用于声明变量或函数,形式为“类型 变量名”或“类型 函数名(参数列表)”。 每种语句都有其特定的语法和用途,程序员需要根据具体情况选择合适的语句来实现所需功能。

3、C++提供哪些循环语句?它们各自的特点是什么?它们可以相互替代吗?可以相互嵌套吗?

C++提供了三种循环语句:for循环、while循环和do-while循环。它们各自的特点如下:

  1. for循环:可以在循环开始前初始化变量,可以在循环体内修改变量,可以在循环结束后执行一次语句。适用于已知循环次数的情况。
  2. while循环:只有一个条件判断,只要条件为真就一直执行循环体。适用于不知道循环次数的情况。
  3. do-while循环:先执行一次循环体,再判断条件是否为真,如果为真则继续执行循环体。适用于至少要执行一次循环体的情况。

这三种循环语句可以相互替代,但是在不同的情况下选择不同的循环语句可以使代码更加简洁和易读。
这三种循环语句也可以相互嵌套,即在一个循环体内再嵌套另一个循环体。嵌套循环可以用于处理多维数组、图形输出等问题。但是嵌套循环也容易导致代码复杂和效率低下,需要谨慎使用。

4、if(x=3)与if(x==3)之间的差别是什么?

if(x=3)是将3赋值给x,并判断x的值是否为真,因为赋值操作的返回值是被赋的值,所以if语句的条件永远为真,即使x原来的值为0或其他非0值。
而if(x==3)是判断x的值是否等于3,只有当x的值为3时条件才为真。因此,if(x=3)和if(x==3)的差别在于前者是赋值操作,后者是比较操作。在条件判断中应该使用比较操作,而不是赋值操作。如果需要进行赋值操作,应该将赋值操作放在if语句之前或之后,而不是在条件判断中。

5、完成下列循环语句后,n的值是多少?for(int n=0;n<100;n++)

完成该循环语句后,n的值为100。
因为循环条件是n<100,当n等于100时,循环结束,此时n的值为100。

6、在循环语句中,break语句和continue语句之间有什么区别?

在循环语句中,break语句用于跳出循环,即使循环条件仍然为真,也会立即停止循环并执行循环后面的语句。而continue语句用于跳过当前循环中剩余的语句,直接进入下一次循环。也就是说,当continue语句被执行时,循环体中continue语句后面的语句将被跳过,但循环条件仍然会被检查,如果条件为真,则继续执行下一次循环。
因此,break语句和continue语句的作用不同,前者用于跳出循环,后者用于跳过当前循环中的某些语句。

7、在C++程序运行过程中,用exit()函数和abort()函数都能退出程序的执行,它们之间有什么区别?

exit()函数和abort()函数都可以用于退出程序的执行,但它们之间有以下区别:

  1. exit()函数是正常退出程序,会执行程序中的各种清理工作,例如关闭文件、释放内存等。它可以返回一个整数值作为程序的退出状态码,这个状态码可以被其他程序或操作系统使用。
  2. abort()函数是异常退出程序,它会立即终止程序的执行,不会执行任何清理工作。它不会返回任何状态码,也不会给其他程序或操作系统任何提示。
  3. exit()函数可以在程序的任何地方调用,而abort()函数通常只在程序出现严重错误时才会被调用,例如内存分配失败、文件打开失败等。
  4. exit()函数可以被覆盖或重载,而abort()函数不能被覆盖或重载。

因此,exit()函数和abort()函数的使用场景不同,程序员需要根据具体情况选择合适的函数来退出程序的执行。

习题

1、编写一个C++程序,要求从键盘输入两个整数,并输出它们中绝对值较大者。

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    int num1, num2;
    cout << "请输入两个整数:" << endl;
    cin >> num1 >> num2;
    int abs1 = abs(num1);
    int abs2 = abs(num2);
    if (abs1 > abs2) {
        cout << "绝对值较大的数是:" << num1 << endl;
    } else {
        cout << "绝对值较大的数是:" << num2 << endl;
    }
    return 0;
}

在程序中,我们首先定义了两个整数变量num1和num2,然后通过cin语句从键盘输入这两个整数。接着,我们使用cmath库中的abs函数分别计算出num1和num2的绝对值,并将其存储在abs1和abs2变量中。最后,我们使用if语句比较abs1和abs2的大小,输出绝对值较大的数。

2、编写一个C++程序,要求从键盘输入三个整数,并按从小到大的次序将它们输出。

#include<iostream>
using namespace std;
int main(){
    int num1,num2,num3;
    cout<<"请输入三个整数:"<<endl;
    cin>>num1>>num2>>num3;
    if(num1>num2){
        int temp=num1;
        num1=num2;
        num2=temp;
    }
    if(num1>num3){
        int temp=num1;
        num1=num3;
        num3=temp;
    }
    if(num2>num3){
        int temp=num2;
        num2=num3;
        num3=temp;
    }
    cout<<"从小到大的次序输出为:"<<num1<<" "<<num2<<" "<<num3<<endl;
    return 0;
}

在程序中,我们首先定义了三个整数变量num1、num2和num3,然后通过cin语句从键盘输入这三个整数。接着,我们使用if语句进行三次比较,将它们按从小到大的次序排列。最后,我们使用cout语句输出排列后的结果。

3、编写一个C++程序,判断输入的年份是否为闰年。

#include<iostream>
using namespace std;
int main(){
    int year;
    cout<<"请输入一个年份:"<<endl;
    cin>>year;
    if((year%4==0&&year%100!=0)||year%400==0){
        cout<<year<<"年是闰年"<<endl;
    }else{
        cout<<year<<"年不是闰年"<<endl;
    }
    return 0;
}

在程序中,我们首先定义了一个整数变量year,然后通过cin语句从键盘输入一个年份。接着,我们使用if语句判断该年份是否为闰年,如果是,则输出“年份是闰年”,否则输出“年份不是闰年”。判断闰年的方法是:能被4整除但不能被100整除的年份为闰年,或者能被400整除的年份也为闰年。

7、编写一个C++程序,求100以内的自然数中所有奇数的和。

#include <iostream>
using namespace std;
int main() {
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        if (i % 2 == 1) {
            sum += i;
        }
    }
    cout << "100以内的自然数中所有奇数的和为:" << sum << endl;
    return 0;
}

输出结果为:

100以内的自然数中所有奇数的和为:2500

8、编写一个程序,求出1~1000之间的完全平方数。所谓完全平方数是指能够表示为另一个整数的平方的整数。要求每行输出6个数。

#include <iostream>
#include <cmath>
using namespace std;
int main() {
    int count = 0; // 计数器,每行输出6个数
    for (int i = 1; i <= 1000; i++) {
        int root = sqrt(i); // 求平方根
        if (root * root == i) { // 判断是否为完全平方数
            cout << i << " ";
            count++;
            if (count == 6) { // 每行输出6个数
                cout << endl;
                count = 0;
            }
        }
    }
    return 0;
} 

输出结果为:

1 4 9 16 25 36 
49 64 81 100 121 144 
169 196 225 256 289 324 
361 400 441 484 529 576 
625 676 729 784 841 900 
961

9、编写一个程序,求出1~1000之间的完全数。所谓完全数是指该数恰好等于它的因子(本身除外)之和的数,比如:6=1+2+3.

#include<iostream>
using namespace std;
int main(){
    for(int i=1;i<=1000;i++){
        int sum=0;//因子之和
        for(int j=1;j<i;j++){
            if(i%j==0){//判断j是否为i的因子
                sum+=j;//累加因子
            }
        }
        if(sum==i){//判断是否为完全数
            cout<<i<<" ";
        }
    }
    return 0;
}

输出结果为:6 28 496。

10、编写一个程序,求出1~1000之间的素数。要求每行输出6个数。

#include<iostream>
using namespace std;
int main(){
    int count=0;//计数器,每行输出6个数
    for(int i=2;i<=1000;i++){//从2开始判断
        bool flag=true;//标记是否为素数
        for(int j=2;j<i;j++){
            if(i%j==0){//判断是否能被整除
                flag=false;
                break;//如果能被整除,跳出循环
            }
        }
        if(flag){//如果是素数
            cout<<i<<" ";
            count++;
            if(count==6){//每行输出6个数
                cout<<endl;
                count=0;
            }
        }
    }
    return 0;
}

输出结果为:

2 3 5 7 11 13 
17 19 23 29 31 37 
41 43 47 53 59 61 
67 71 73 79 83 89 
97 101 103 107 109 113 
127 131 137 139 149 151 
157 163 167 173 179 181 
191 193 197 199 211 223 
227 229 233 239 241 251 
257 263 269 271 277 281 
293 307 311 313 317 331 
337 347 349 353 359 367 
373 379 383 389 397 401 
409 419 421 431 433 439 
443 449 457 461 463 467 
479 487 491 499 503 509 
521 523 541 547 557 563 
569 571 577 587 593 599 
601 607 613 617 619 631 
641 643 647 653 659 661 
673 677 683 691 701 709 
719 727 733 739 743 751 
757 761 769 773 787 797 
809 811 821 823 827 829 
839 853 857 859 863 877 
881 883 887 907 911 919 
929 937 941 947 953 967 
971

12、编写一个程序,求出所有的水仙花数。水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身。

#include<iostream>
using namespace std;
int main(){
    for(int i=100;i<=999;i++){
        int a=i/100;//百位数
        int b=i%100/10;//十位数
        int c=i%10;//个位数
        if(i==a*a*a+b*b*b+c*c*c){//判断是否为水仙花数
            cout<<i<<" ";
        }
    }
    return 0;
}

输出结果为:153 370 371 407

13、求出1~1000中能被3整除,但不能被7整除,且至少有一位数为5的所有整数。

#include<iostream>
using namespace std;
int main(){
    for(int i=1;i<=1000;i++){
        if(i%3==0 && i%7!=0){//判断能否被3整除,且不能被7整除
            int temp=i;
            while(temp>0){//判断是否至少有一位数为5
                if(temp%10==5){
                    cout<<i<<endl;
                    break;
                }
                temp/=10;
            }
        }
    }
    return 0;
}

15、设计一个程序,求斐波那契数列的前40项。

#include<iostream>
using namespace std;
int main(){
    int a=0,b=1,c;
    cout<<a<<" "<<b<<" ";
    for(int i=3;i<=40;i++){
        c=a+b;
        cout<<c<<" ";
        a=b;
        b=c;
    }
    return 0;
}

输出结果为:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986

17、数学史上有名的“百鸡”问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏一,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?编写一程序求解该问题。

#include<iostream>
using namespace std;
int main(){
    for(int i=0;i<=20;i++){//枚举鸡翁的数量
        for(int j=0;j<=33;j++){//枚举鸡母的数量
            int k=100-i-j;//计算鸡雏的数量
            if(i*5+j*3+k==100 && i+j+k==100){//判断是否符合条件
                cout<<"鸡翁:"<<i<<",鸡母:"<<j<<",鸡雏:"<<k<<endl;
            }
        }
    }
    return 0;
}

实验题:

2、改错题,找出下面程序的错误。

#include<iostream>
void main(){
	int i=1;
	do{
		i++;
		cout<<i<<endl;
	};
	while(i=3);
	cout<<”ok”<<endl;
}

3、填空题:用1、2、3、4这四个数组成四位数,编写一个程序,打印出所有可能组成的四位数,并统计出四位数的个数。程序如下,请补全程序。

#include<iostream.h>
void main(){
	int a,b,c,d,sum=0,x;
	for(a=1;_____;_____)
		for(b=1;_____;_____)
			for(c=1;_____;_____)
				for(d=1; _____;_____){
					x=a*_____+b*_____+c*10+d;
					cout<<”  ”<<x;
					sum=_____+1;
				}
				cout<<”\nsum=”<<sum;
}

结果:

#include <iostream>
using namespace std;
int main() {
    int a, b, c, d, sum = 0, x;
    for (a = 1; a <= 4; a++)
        for (b = 1; b <= 4; b++)
            for (c = 1; c <= 4; c++)
                for (d = 1; d <= 4; d++) {
                    if (a != b && a != c && a != d && b != c && b != d && c != d) { // 判断四个数字不重复
                        x = a * 1000 + b * 100 + c * 10 + d;
                        cout << "  " << x;
                        sum = sum + 1; // 统计四位数的个数
                    }
                }
    cout << "\nsum=" << sum << endl;
    return 0;
}