栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

吉林大学超星MOOC学习通高级语言程序设计 C++ 实验02 分支与循环程序设计(2021级)(1)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

吉林大学超星MOOC学习通高级语言程序设计 C++ 实验02 分支与循环程序设计(2021级)(1)

由于本章节题目太多,我将分几次发布 实验02 分支与循环程序设计(2021级) 一. 程序题(共15题,100分) 1. (程序题)

题目编号 :Exp02-Enhance02,GJBook3-04-0102

题目名称:公式累乘

题目描述:用如下的展开式计算当n为某给定值时,圆周率π的值。

输入:一个正整数n (n<=100000)

输出:一个浮点数,保留小数点后10位。

样例1:

输入:1000
输出:3.1408077460

样例2:

输入:10000
输出:3.1415141187

 这道求近似圆周率的题的原型即为求阶乘

#include 

using namespace std;

int main()//求阶乘
{
    int x=1, sum=1;

    cin >> x;

    for (int y=1;y <= x;y++)
    {
        sum *= y;
    }

    cout << sum;


    return 0;
}

本题的解法如下

#include 
#include 

using namespace std;

int main()
{
    int n;
    cin >> n;
    double sum=1;

    for (int k = 1;k <= n;k++)
    {
        sum *= (double) 2 * k / ( 2* k - 1) * 2 * k / (2 * k + 1);
    }

    cout << fixed << setprecision(10) << 2 * sum << endl;

    return 0;
}

注意本题的几个小细节:

1.建议定义sum时使用double类型

2.结果为圆周率π,所以最后sum应该乘以2(仔细审题,避免临门一脚)

3.在for循环中求sum要加上(double)使表达式转化为双精度浮点型

4.使用包含的头文件标准输出控制小数点后10位

ps:有一些粗心的同学竟然发现自己最后的结果输出了一串0

这是因为变量定义的类型不对

int sum=1;

或者没有在for循环中求sum时加上(double)使表达式转化为双精度浮点型 

for (int k = 1;k <= n;k++)
    {
        sum *=  2 * k / ( 2* k - 1) * 2 * k / (2 * k + 1);
    }

还有一些同发现自己最后的结果过于离谱

这可能是因为在for循环中把n当成k来写了

for (int k = 1;k <= n;k++)
    {
        sum *= (double) 2 * k / ( 2* k - 1) * 2 * n / (2 * n + 1);
    }

总之,一定要明确自己的目标,思路清晰,多注意细节

2. (程序题)

题目编号 :Exp02-Basic11,GJBook3-04-03

题目名称:勒让德多项式

题目描述:

编一个程序,输入x、n,计算勒让德(Legendre)多项式的第 n 项(此题假定n取0时,为勒让德多项式第0项)。

输入:一个浮点数和一个整数,分别对应x和n(0<=n<=20)。

输出:一个浮点数,即勒让德多项式第n项的值,注意小数点后保留到第2位。
 

样例1:

输入:3.4 2
输出:16.84

样例2:

输入:3.4 10
输出:30143685.82

样例3:

输入:-3.4 2
输出:16.84

这道题与第一题有异曲同工之妙,但稍微复杂了一点,体现了分支和循环结构

有些同学可能被直接劝退

闲话少叙,直接上代码

#include 
#include 

using namespace std;

int main()
{
    double x = 0, p = 1;
    int n = 0;

    cin >> x >> n;

    if (n == 0)
        cout << "1.00" << endl;
    else if (n == 1)
        cout << fixed << setprecision(2) << x << endl;
    else
    {
        double i = 1.00;
        double j = x;

        for (int k = 2;k <= n;k++)
        {
            p = (2.00 * k - 1.00) / k * x * j - (k - 1.00) / k * i;
            i = j;
            j = p;

        }
        cout << fixed << setprecision(2) << p << endl;
    }

    return 0;
}

else里的for循环注意是在k=2时开始,不是从1开始

若最后的p结果与样例稍有出入,则要检查一下自己的表达式是否为正确形式

3. (程序题)

题目编号 :Exp02-Basic09,GJBook3例-04-10

题目名称:斐波纳契序列

问题描述:

开始,有一对小兔子。

 一个月后,变成大兔子开始怀孕;

两个月后, 生出一对小兔子,这时共有两对兔子(一对大兔子, 一对小兔子), 同时大兔子又再次怀孕;

 三个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又生出一对小兔子, 这时共有三对兔子(两对大兔子, 一对小兔子), 所有大兔子又全部怀孕;

 四个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子, 这时共有五对兔子(三对大兔子, 两对小兔子), 所有大兔子又全部怀孕;

五个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子, 这时共有八对兔子(五对大兔子, 三对小兔子), 所有大兔子又全部怀孕;

…… ……

假设在兔子的生养过程中没有死亡。编程序,输入 n , 计算 n 个月后,有多少对兔子, 并输出。

提示:注意序列各项间的递推关系。 

输入:一个非负整数n,表示月份(n≤91)

输出:n 个月后的兔子数(单位:对)

样例1:输入 0   输出 1

样例2:输入 1   输出 1

样例3:输入 2   输出2

样例4:输入10   输出89

递推数列,本人很喜欢用for循环,这个斐波那契用while循环也可以

关键就在中间部分的for循环处,揣摩一下这三个式子的关系。

for循环中m与n的关系要明确(为什么是"<")

因为m的初值为1,运算的次数为n-1,所以为"<"

#include 

using namespace std;

int main()
{
    int n;
    long long sum=1,x=1,y=1;

    cin >> n;

    for (int m = 1;m < n;m++)
    {
        sum = x + y;
        y = x;
        x = sum;

    }

    cout << sum << endl;

    return 0;
}

同样的,这里建议定义sum的时候使用long long 类型,否则程序有可能过不去

4. (程序题)

题目编号 :Exp02-Basic12,GJBook3-04-13

题目名称:数字金字塔

题目描述:编程序,制打印如下所示的n行数字金字塔(n由用户从键盘输入)。

输入:一个正整数 n (≤10)

输出:如上所示的类似数字金字塔。输出由数字 0~9构成的n行数字三角矩阵:其中第一行有1个数,第二行有3个数,依次类推,每个数字占用2位英文字符宽度,宽度不足2位的的在数字左侧补空格;整个数字三角阵,除必要的空格、数字、回车换行符,无多余字符。

样例1:

输入:1
输出:

(注:1的前面有一个空格)

样例2:

输入:3
输出:

(注:末行的第一个数字1前面有一个空格)

打表一时爽,考试泪两行

用数组打表会比较舒服,还有就是如何写出优美的for循环 

一般用两层就好:

外层定义行,内层定义行的内容

#include 

using namespace std;

int main()
{
    int n = 0,m;
    cin >> n;

    int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
    
    for (int i = 0;i < n;i++)//定义行
    {
        //下面为行的具体内容
        for (m = (2*n-1)-2*i;m > 0;m--)//打印空格
            cout << " ";
        
        for (int j = 0;j < i;j++)//打印每行的前半部分
        {
            cout << " "<= 0;k--)//后半部分
        {
            cout << " " << arr[k];
        }
        cout << endl;
    }

    return 0;
}

请大家仔细观察内层的三个for循环,可以说是写的比较优美了

1.关键的初值
for (m = (2*n-1)-2*i;m > 0;m--)//打印空格
            cout << " ";

打印空格,m的初值至关重要,(2*n-1)-2*i,我们可以逆向来思考这个问题

最后一行前面只有一个空格,每向上增加一行就会增加两个空格,所以第一行有(2*n-1)个空格

2.正向遍历数组
for (int j = 0;j < i;j++)//打印每行的前半部分
        {
            cout << " "<
3.逆向遍历数组
for (int k = i;k >= 0;k--)//后半部分
        {
            cout << " " << arr[k];
        }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510461.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号