16级C++第一次上机解题报告

来源:互联网 发布:网络bug是什么意思啊 编辑:程序博客网 时间:2024/05/22 03:47

A 小山坡

时间限制:1000ms  内存限制:65536kb

通过率:179/181 (98.90%)   正确率:179/261 (68.58%)

题目描述

画出一个小山坡。

输入

没有输入。

输出

画出的小山坡。

输入样例

输出样例

/\

/\ / \ /\

/\/ \/ \""/ \

 

考察知识点

输出语句,转义符的使用

解题思路

直接输出即可

参考代码1(stdio)

#include <cstdio>int main() {    printf("        /\\ \n");    printf("   /\\  /  \\    /\\ \n");    printf("/\\/  \\/    \\\"\"/  \\");    return 0;}


 

参考代码2(iostream)

#include<iostream>using namespace std;int main() {    cout << "        /\\\n"         << "   /\\  /  \\    /\\\n"         << "/\\/  \\/    \\\"\"/  \\\n";    return 0;}


助教的话

这题助教打算简单的考一下转义符(当然包括复制粘贴的用法)并且让你们分清楚/和\的区别。然后发现有些同学使用原义字符串来写,思路也非常不错。然后这题打图案顺便演示了一下黑框程序是可以做简单的图形的(有兴趣的同学可以搜索ASCII艺术)

 

B 取出十位数

时间限制:1000ms  内存限制:65536kb

通过率:179/180 (99.44%)   正确率:179/234 (76.50%)

题目描述

给定一个自然数,取出它的十位上的数字。

输入

一个自然数 n

(0≤n≤2^31−1) 

输出

取出的十位上的数字。

输入样例

123456789

输出样例

8

 

考察知识点

基本数据类型int的使用及操作

解题思路

对于输入的数,先除以10再对10取模即可。

即:ans=n/10%10

不推荐把数字作为字符串处理,因为需要对小于10的数进行额外处理。

参考代码

#include<iostream>using namespace std;int main() {    int n;    while (cin >> n)        cout << n / 10 % 10 << endl;}


助教的话

这个题主要演示一下利用取模和除法完成数位的提取。以提取十位数为例,有很多方法可以提取,一个通用的方法是/10%10,不停的进行这一过程,可以很容易提取出各个位的数字。同样有同学尝试使用字符串来读取和处理,也是可取的思路,只不过要注意没有十位的情况。在提取各个位的时候,使用字符串,同样是要注意不存在的位数的处理。

后期学习进制转换时也与本题所涉及的数位提取有很大关联。

 

C 重力加速度

时间限制:1000ms  内存限制:65536kb

通过率:177/180 (98.33%)   正确率:177/312 (56.73%)

题目描述

小罗乘着他秘密制造的宇宙飞船来到了另一个未知的星球探索。在下飞船之前,小罗需要确认这个星球的重力加速度。

但是飞船上的加速度仪在着陆的时候受到撞击卡住了。

于是他打算使用一个重锤与打点计时器(50Hz)(50Hz)来测量重力加速度。将重锤放在高处,穿入纸带,开启打点计时器,然后使重锤落下。

取纸带与直尺对齐,以与重锤相同的位置为零点,5个点读数(单位cmcm)。

现在来利用逐差法求出重力加速度的估计值,单位为 m/s2m/s2

如图所示。

输入

9个数据,为纸带的直接读数(图中的OABC……),精确到小数点后2位。

输出

重力加速度的估计值,保留2位小数

输入样例

0.00 1.00 3.00 6.00 10.00 15.00 21.00 28.00 36.00

输出样例

1.00

输出格式说明

保留2位小数: c++中保留小数需要使用iomanip头文件。像这样

#include<iomanip>

输出一个数的时候这样,

double a;

cin>>a;

cout<<fixed<<setprecision(2)<<a<<endl;

这样即对a这个double数字保留了小数点后两位小数。

hint

高中物理忘差不多的童鞋看这里:

首先用纸带的直接读数作差,算出每两个点之间的距离

S1,S2,S3,…,SnS1,S2,S3,…,Sn

然后代入方程

SjSi=(ji)git2Sj−Si=(j−i)git2

用后一半减前一半,

分别解出g1,g2,…,gn2g1,g2,…,gn2,然后求平均值作为估计值

g=n2i=0gin2

 

 

考察知识点

基本数据类型float/double的使用及操作

解题思路

依次读入9个数,按照Hint中给的式子进行计算即可。

参考代码

#include<iostream>#include<iomanip>using namespace std;int main() {    double s1, s2, s3, s4, s5, s6, s7, s8, s9, g;    cin >> s1 >> s2 >> s3 >> s4 >> s5 >> s6 >> s7 >> s8 >> s9;    g = (s9 - s5 - s5 + s1) / 16;    cout << fixed << setprecision(2) << g << endl;    return 0;}


助教的话

这题主要考察一个浮点数的算术操作问题(虽然大部分人的问题都是公式看不懂)。同时助教搞这么长的纸带还有一个目的(肯定会觉得申请那么多变量写那么多一样的公式很烦的对吧)就是引入一下循环的好处和作用。

很多同学意识非常好化简了公式得到了结果,而有些同学没按照公式做导致错误。

虽然本题要求了保留两位小数,基本没有浮点误差,但是浮点数精度仍然是许多编程语言(包括C++)里的大问题。简单的来说,所有的浮点数在计算机里表示出来都会差一点,多次运算以后就会差很多(double大概能够到15位有效数字请自行琢磨),这也是导致运算以后的浮点数不能严格相等的原因(差有效数字后的16位什么的)。以后编程的时候大家也要多多注意。

0 0