《C++程序设计》(第4版)|问题精选与提炼|第3章 C++程序设计初步

3.1 基于过程的程序设计和算法

一个基于过程的程序应包括哪两部分内容?

  1. 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构
  2. 对操作的描述。即操作步骤,也就是算法。 

算法的表示有哪些方法? 

  1. 自然语言;
  2. 流程图;
  3. 伪代码;
  4. 用计算机语言表示算法。 

3.2 C++的程序结构和C++语句

 C++的执行语句包括哪些种?

     1.控制语句

      2. 函数和流对象调用语句

      3.表达式语句

3.3 赋值操作

C++中,赋值表达式可包括在其他表达式中。例:

if((a=b)>0) cout<<"a>0"<<endl;

3.4 C++的输入与输出

cout语句的一般格式为:
    cout<<表达式1<<表达式2<<……<<表达式n;

执行cout语句时,系统发生了什么? 

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或'\n',ends,flush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。

有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。
需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件

请分别写出下面七种情况的输出结果:

double a=123.456789012345;对a赋初值
(1) cout<<a;
(2) cout<<setprecision(9)<<a;
(3) cout<<setprecision(6);
(4) cout<< setiosflags(ios∷fixed);
(5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;
(6) cout<<setiosflags(ios∷scientific)<<a;
(7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a;
 

  1.  输出: 123.456
  2. 输出: 123.456789
  3. 恢复默认格式(精度为6) 输出: 123.456
  4. 默认输出6位小数 输出: 123.456789
  5. 输出: 123.45678901
  6. 输出: 1.234568e+02
  7. 输出: 1.2346e02

下面是整数输出的例子,请分别写出下面六种情况的输出结果:
int b=123456;对b赋初值
(1) cout<<b;
(2) cout<<hex<<b;
(3) cout<<setiosflags(ios∷uppercase)<<b;
(4) cout<<setw(10)<<b<<','<<b;
(5) cout<<setfill('*')<<setw(10)<<b;输出;
(6) cout<<setiosflags(ios∷showpos)<<b;

  1.  输出: 123456
  2. 按十六进制整数形式输出: 1e240 //字母e代表十六进制中的14
  3. 输出: 1E240
  4. 第一个b指定字段宽度为10,前有四个空格输出:    123456,123456
  5. **** 123456
  6. 输出: +123456 

3.5 编写顺序结构的程序

3.6 关系运算和逻辑运算

闰年的条件是符合下面二者之一的,请用一个逻辑表达式表示,使表达式为真时,变量year为闰年。

  1. 能被4整除,但不能被100整除;
  2. 能被100整除,又能被400整除。 
(year %4 ==0 && year %100 != 0) || year%400 == 0

3.7 选择结构和if语句 

条件运算符的一般形式是:

        表达式1?表达式2:表达式3

其执行顺序是什么?

 先求解表达式1,若为真则求解表达式2,此时整个条件表达式的值等于表达式2的值;若表达式1的值为0,则求解表达式3,其值为整个条件表达式的值。

(程序设计)输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转化。然后输出最后得到的字符。

#include <iostream>
using namespace std;
int main(void)
{
	char ch;
	cin >> ch;
	ch = (ch >= 'A' && ch <= 'Z') ? (ch + 32) : ch;
	cout << ch << endl;
	return 0;
}


习题1:(程序设计)找出100~200的全部素数。 


#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(void)
{
    int m, k, i, n = 0;
    bool prime;
    for (m = 101; m <= 200; m += 2)//判别m是否为素数,从101变化到200,增量为2
    {
        prime = true;//循环开始时设prime为真,即先认为m为素数
        k = int(sqrt(m));//用k代表根号m的整数部分
        for (i = 2; i <= k; i++)
            if (m % i == 0)
            {
                prime = false;
                break;
            }
        if (prime)//如果m为素数
        {
            cout << setw(5) << m;
            n += 1;//用n累计输出素数的个数
        }
        if (n % 10 == 0) cout << endl;//输出10个数后换行
    }
    cout << endl;
    return 0;
}

 思路:让m被\sqrt{m}除,如果m不能被其间任何一个整数整除,就可以确定m是素数。

习题2:(程序设计)有三个整数a,b,c,由键盘键入,输出其中最大的数。 

#include <iostream>
using namespace std;
int main(void)
{
	int a, b, c, temp, max;
	cout << "please enter three integer numbers:";
	cin >> a >> b >> c;
	temp = (a > b) ? a : b;
	max = (temp > c) ? temp : c;
	cout << "max=" << max << endl;
	return 0;
}

思路:“打擂台” 。

习题3:(程序设计)输入两个正整数m和n,求其最大公约数和最小公倍数。

#include <iostream>
using namespace std;
int main(void)
{
	int p, r, n, m, temp;
	cout << "please enter two positive integer numbers n,m:";
	cin >> n >> m;
	if (n < m)
	{
		temp = n;
		n = m;
		m = temp;//把较大的数放在n,较小数放m
	}
	p = n * m;
	while (m != 0)
	{
		r = n % m;
		n = m;
		m = r;
	}
	cout << "最大公约数=" << n << endl;
	cout << "最小公倍数=" << p / n << endl;
	return 0;
}

 注意:最大公约数乘以最小公倍数就是这两个数的乘积。

习题4:(程序设计):输出所有的“水仙花数”。即各位数字的立方和等于该数本身的三位数。

#include <iostream>
using namespace std;
int main(void)
{
	int i, j, k, n;
	cout << "narcissus numbers are:" << endl;
	for (n = 100; n < 1000; n++)
	{
		i = n / 100;//百位
		j = n / 10 - i * 10;//十位
		k = n % 10;//个位
		if (n == i * i *i +j * j * j + k * k * k)
			cout << n << " ";
	}
	cout << endl;
	return 0;
}

 习题5:(程序设计)一个数如果恰好等于它的因子之和,这个数就称为“完数”。找出1000以内的所有完数,按下面格式输出其因子。

6,its factors are 1,2,3

方法一: 

#include <iostream>
using namespace std;
int main(void)
{
	int m, s, i;
		for (m = 2; m < 1000; m++)
		{
			s = 0;
			for (i = 1;i < m; i++)
				if ((m % i) == 0) s += i;
				if (s == m) {
				cout << m << ",";
				cout << "its factors are:";
				for (i = 1; i < m; i++)
					if (m % i == 0) cout << i << " ";
				cout << endl;
			}
	}

	return 0;
}

方法二:

#include <iostream>
using namespace std;

int main(void)
{
    int k[11];
    int i, a, n, s;
    for (a = 2; a <= 1000; a++)
    {
        n = 0;
        s = a;
        for (i = 1; i < a; i++)
        {
            if ((a % i) == 0)
            {
                n++;
                s -= i;
                k[n] = i; // 将找到的因子赋给 k[1],...,k[10]
            }
        }
        if (s == 0)
        {
            cout << a << ",";
            cout << "its factors are: ";
            for (i = 1; i <= n; i++)
            {
                cout << k[i] << " ";
            }
            cout << endl;
        }
    }
    return 0;
}

习题6:(程序设计) 猴子吃桃。一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第10天早上想再吃时,只剩下一个桃子了。
问:第一天共摘了多少个桃子?

#include <iostream>
int main()
{
	int sum=1;//最后剩下1个桃 
	for(int i=0;i<=8;i++)//0也算一次,也就是9次 
	{
		sum=(sum+1)*2;//重复操作 
		printf("猴子第%d天吃了%d桃\n",9-i,sum);
	}
}

习题7:两个乒乓球队进行比赛,各出3人。甲队为 ABC 3人,乙队为 XYZ 3人。巳抽签决定比赛名单 。 有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序输出3对赛手的名单。 

#include<iostream>
using namespace std;
int main() {
	char i, j, k;//i,j,k分别为A,B,C三人的对手
	for (i = 'X'; i <= 'Z'; i++) 
		for (j = 'X'; j <= 'Z'; j++)
			if (i != j) 
				for (k = 'X'; k <= 'Z'; k++)
					if (i != k && j != k) 
						if (i != 'X' && k != 'X' && k != 'Z') 
							cout << "A--" << i << " " << "B--" << j << " " << "C--" << k << endl;
				
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

抚壮而高掌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值