3.1 基于过程的程序设计和算法
一个基于过程的程序应包括哪两部分内容?
- 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构。
- 对操作的描述。即操作步骤,也就是算法。
算法的表示有哪些方法?
- 自然语言;
- 流程图;
- 伪代码;
- 用计算机语言表示算法。
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;
- 输出: 123.456
- 输出: 123.456789
- 恢复默认格式(精度为6) 输出: 123.456
- 默认输出6位小数 输出: 123.456789
- 输出: 123.45678901
- 输出: 1.234568e+02
- 输出: 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;
- 输出: 123456
- 按十六进制整数形式输出: 1e240 //字母e代表十六进制中的14
- 输出: 1E240
- 第一个b指定字段宽度为10,前有四个空格输出: 123456,123456
- **** 123456
- 输出: +123456
3.5 编写顺序结构的程序
3.6 关系运算和逻辑运算
闰年的条件是符合下面二者之一的,请用一个逻辑表达式表示,使表达式为真时,变量year为闰年。
- 能被4整除,但不能被100整除;
- 能被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被除,如果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;
}