跳转至

第一章 C++语言入门

基础数学知识

  • 三角形与梯形面积:三角形面积为 \(\frac{\text{底}\times\text{高}}{2}\),梯形面积为 \(\frac{(\text{上底}+\text{下底})\times\text{高}}{2}\);已知面积,也能反求高,对应 2061。
  • 等量关系与作差:两种情况共有的原有量,可以通过相减消去,再求单位时间的增长量,对应 2063、1005。
  • 小数乘除法:理解两个整数相除也可能得到小数,计算过程中要保留这部分结果,对应 1005。

1000:入门测试题目

提示 1:先把两个输入接住

输入3 5时,准备两个整数变量a、b:

int a, b;
cin >> a >> b;

读完这句,看看3和5分别放到哪儿了。

提示 2:输出和,不是接着显示

cout << a << b;会显示35,怎样让程序先做加法?

把a + b放进输出语句,自己补好分号与程序模板。

常见错误

cin 后用 >>,cout 后用 <<。

提交时只输出答案,不加“请输入”等提示语。

自测

输入:3 5 → 预期输出:8

输入:0 7 → 预期输出:7

自己试试:把第二个数改成零,先写出预期结果。

再把两个数交换位置,结果会不会变?

参考代码
#include <iostream>

using namespace std;

int main() {
    int a, b;
    cin >> a >> b;

    cout << a + b;

    return 0;
}

2060:【例1.1】计算机输出

提示 1:先核对要显示的文字

先看仔细啊,Hello World!的大小写、空格、感叹号,都要对上。

这题没有输入,不需要写cin。

提示 2:把文字放进双引号
cout << "Hello World!";

这句放进main,前后的程序模板,自己补一下。

常见错误

这里是 Hello World!,中间有空格,没有逗号。

别和后面的 1001 混淆,标点也要用英文。

自测

无需输入,预期输出:Hello World!。

方法一:cout 输出
#include <iostream>

using namespace std;

int main() {
    cout << "Hello World!";

    return 0;
}
方法二:printf 输出
#include <cstdio>

using namespace std;

int main() {
    printf("Hello World!");

    return 0;
}

2061:【例1.2】梯形面积

提示 1:先找图中同样高的部分

阴影三角形的底是15,面积是150。

先算高,面积乘2,再除以底。

算出来以后,回到图上看看,梯形的高是不是也找到了?

提示 2:把求出的高用起来
int h = 150 * 2 / 15;

梯形面积是“上底加下底,乘高,再除以2”。

两底是15、25,把这句话写成算式,结果存入double s。

知识补充:先求高,再求面积

图中三角形的底为 15,面积为 150,所以高为 \(h=\frac{150\times2}{15}=20\)。

梯形两底为 15、25,面积为 \(S=\frac{(15+25)\times20}{2}\)。

printf("%.2lf", s) 控制结果保留两位小数。

常见错误

三角形和梯形的面积公式,都有“除以 2”。

输出 400.00,不能只显示 400。

自测

无需输入,预期输出:400.00。

参考代码
#include <cstdio>

using namespace std;

int main() {
    int h = 150 * 2 / 15;
    double s = 1.0 * (15 + 25) * h / 2;

    printf("%.2lf", s);

    return 0;
}

2062:【例1.3】电影票

提示 1:先算三个人的票价

一张10元,3个人要付多少元?

读入人数x后,总价用x * 10计算。

提示 2:两个结果之间留空格
cout << x << ' ';

接着输出总价,别把两个数字直接接在一起。

常见错误

两个数之间要有空格。

别把人数和总价直接接在一起,也不要另加“元”。

自测

输入:3 → 预期输出:3 30

输入:1 → 预期输出:1 10

参考代码
#include <iostream>

using namespace std;

int main() {
    int x;
    cin >> x;

    cout << x << ' ' << x * 10;

    return 0;
}

2063:【例1.4】牛吃牧草

提示 1:先把草换成容易数的份数

把一头牛一天吃的草看作1份。

15头牛吃20天,共吃300份;20头牛吃10天,共吃多少份?

提示 2:多出的草是多长出来的

两次开始时的草一样多,第一种吃法多持续10天,草也多长10天。

先用总份数作差,再除以相差的天数:

int grass = (15 * 20 - 20 * 10) / (20 - 10);

每天新长几份,就能长期供几头牛吃。

知识补充:两种吃法怎样作差

15 头牛吃 20 天,总共吃掉 \(15\times20=300\) 份草。

20 头牛吃 10 天,总共吃掉 \(20\times10=200\) 份草。

原有草量相同,多出的 100 份,是多生长 10 天的草。

所以每天新长 \(\frac{300-200}{20-10}=10\) 份,可供 10 头牛吃一天。

常见错误

题目问的是每天新长的草能供几头牛吃,不是还能吃几天。

这题没有输入,手算出固定答案后可以直接输出。

自测

无需输入,预期输出:10。

方法一:按数量关系计算
#include <iostream>

using namespace std;

int main() {
    int grass = (15 * 20 - 20 * 10) / (20 - 10);

    cout << grass;

    return 0;
}
方法二:手算后直接输出
#include <iostream>

using namespace std;

int main() {
    cout << 10;

    return 0;
}

1001:Hello,World!

提示 1:和前面的输出题比标点

这次要显示Hello,World!,逗号后面没有空格。

自己写一行输出,和2060比一下,别把那题的文字直接搬过来啦。

常见错误

逗号后没有空格。

双引号只用来界定字符串,不会一起输出。

自测

无需输入,预期输出:Hello,World!。

参考代码
#include <iostream>

using namespace std;

int main() {
    cout << "Hello,World!";

    return 0;
}

1002:输出第二个整数

提示 1:按顺序给三个数找位置
int a, b, c;
cin >> a >> b >> c;

输入123 456 789,第二个数进了哪个变量?

只输出它,不是输出数字2。

常见错误

cout << 2; 输出的是数字 2,不是第二个输入。

三个数都要按题意读入。

自测

输入:123 456 789 → 预期输出:456

输入:-1 0 1 → 预期输出:0

参考代码
#include <iostream>

using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;

    cout << b;

    return 0;
}

1003:对齐输出

提示 1:把一行分成三个八格

拿草稿纸画三组八格,数放右边,组与组之间再空一格。

23占两格,左边要补六格;换成-23,负号也要占一格。

提示 2:先输出两组,再补第三组

a、b、c已读入,先写前两组:

printf("%8d %8d", a, b);

照着补第三组;%8d管八格,格式串里的空格管组间分隔。

知识补充:字段宽度

%8d 默认右对齐,不够 8 个字符时,左边补空格。

格式串中的普通空格,则是字段之间的分隔符。

因此这题写 "%8d %8d %8d",不能只把三个 %8d 紧挨着。

常见错误

%8d 的 8 包括数字本身和负号,不是额外补 8 个空格。

超过 8 位的数完整输出,不截断。

自测

输入:123456789 0 -1 → 预期输出:123456789 0 -1

输入:1 23 456 → 预期输出: 1 23 456

前导空格是输出的一部分,复制时留意。

自己试试:选三个不同位数的整数,先在纸上画出每个字段占的位置。

再把其中一个换成负数,看看负号是否也占宽度。

参考代码
#include <cstdio>

using namespace std;

int main() {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);

    printf("%8d %8d %8d", a, b, c);

    return 0;
}

1004:字符三角形

提示 1:逐行数空格和字符

先用&画三行:每行前面几个空格,随后几个字符?

这时不用循环,分别写三条输出。

提示 2:先完成第一行

字符已读入c:

cout << ' ' << ' ' << c << '\n';

接着补第二、三行;前两行末尾要换行,字符变量不能写成'c'。

常见错误

cout << 'c'; 输出字母 c,cout << c; 才输出变量里的字符。

前导空格决定形状,不用 Tab 代替。

自测

输入:&

预期输出:

  &
 &&&
&&&&&
方法一:cout 输出字符
#include <iostream>

using namespace std;

int main() {
    char c;
    cin >> c;

    cout << ' ' << ' ' << c << '\n';
    cout << ' ' << c << c << c << '\n';
    cout << c << c << c << c << c;

    return 0;
}
方法二:printf 格式化输出
#include <cstdio>

using namespace std;

int main() {
    char c;
    scanf("%c", &c);

    printf("  %c\n", c);
    printf(" %c%c%c\n", c, c, c);
    printf("%c%c%c%c%c", c, c, c, c, c);

    return 0;
}

1005:地球人口承载力估计

提示 1:先认清人数和年数

x亿人生活a年,消耗的资源记作x * a份。

y亿人生活b年,也算一次;两次开始时的资源相同。

提示 2:相减后,只剩相差那些年的新增资源

和前面牛吃草那题一样,先算两次总消耗差多少,再看相差几年。

double z = (1.0 * a * x - 1.0 * b * y) / (a - b);

z是每年新增资源能养活的人数,单位仍是亿人。

输入按x a y b读入,自己补保留两位小数的输出。

知识补充:把资源关系写出来

把一亿人生活一年的资源量看作 1 份。

设原有资源为 \(S\),每年新生资源为 \(g\),则:

\[ S+ag=ax,\qquad S+bg=by \]

两式相减,消掉 \(S\),得到:

\[ g=\frac{ax-by}{a-b} \]

能长期维持的人数,取决于每年的新生资源够多少人使用。

常见错误

输入顺序是 x、a、y、b,不是先读两个人数。

求差、做除法时保留括号,并在除法前转成浮点计算。

自测

输入:110 90 90 210 → 预期输出:75.00

输入:5 2 3 6 → 预期输出:2.00

参考代码
#include <iostream>
#include <cstdio>

using namespace std;

int main() {
    int x, a, y, b;
    cin >> x >> a >> y >> b;

    double z = (1.0 * a * x - 1.0 * b * y) / (a - b);

    printf("%.2lf", z);

    return 0;
}