第五周:循环判断加强

1.奖学金问题

题目:

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

  1. 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

  2. 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

  3. 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

  4. 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

  5. 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

【输入形式】输入的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名由一个英文字母代表;期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

【输出形式】输出包括三行,第一行是获得最多奖金的学生的姓名(一个字母代表),第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。

【样例输入】

4

Y 87 82 Y N 0

C 88 78 N Y 1

L 92 88 N N 0

Z 83 87 Y N 1

【样例输出】

C

9000

28700

代码:

#include <iostream>
using namespace std;

int main()
{
    int b, c, f, n, i, max = 0, count = 0, m = 0;;
    char a, d, e, name = 0;
    cin >> n;
    for(i = 1; i <= n; i ++ )
    {
        m = 0;
        cin >> a >> b >> c >> d >> e >> f;
        if(b > 80 && f >= 1)
            m += 8000;
        if(b > 85 && c > 80)
            m += 4000;
        if(b > 90)
            m += 2000;
        if(b > 85 && (e == 'Y'))
            m += 1000;
        if(c > 80 && (d == 'Y'))
            m = m + 850;
        if(m > max)
        {
            max = m;
            name = a;
        }
        count += m;
    }
        cout << name << endl;
        cout << max << endl;
        cout << count;
    return 0;
}

2.近似计算π

题目:

根据公式*π*/4=1-1/3+1/5-1/7+… ,直到最后一项小于10^-6。计算并输出π的值。

【输入形式】无输入

【输出形式】π的值

【输出样例】3.14159

【编程要求】请用for循环实现

代码:

#include <stdio.h>
#include <cmath>

int main()
{
    float pi, sum = 0, n = 1.0, sign = 1.0;
    for(n = 1.0; fabs(sign / n) >= 1e-6; n = n + 2)
    {
        sum += (sign / n);
        sign = -sign;
    }
    pi = 4 * sum;
    printf("%.5f", pi);
    return 0;
}

3.简单计算器

题目:

编写一个根据用户键入的两个操作数和一个运算符,由计算机输出运算结果的程序。当键入的两个操作数为0时,结束运算。

【输入形式】两个操作数和一个运算符(运算符只包括五个:±*/%)。当键入的两个操作数为0时,结束运算。若出现其他非法运算符号,输出Error。若运算符为‘/’,除数为0时,输出Error。

【输出形式】每输入一组数据,则显示一个计算结果并换行等待键入下一组测试数据。

【样例输入】

3 5 *

3 5 -

12 12 #

12 12 *

5 0 /

0 0 +

【样例输出】

15

-2

Error

144

Error

【提示】最外层用while(1)的循环,内层用switch(ch)判断运算符号来进行计算。

代码:

#include <stdio.h>

int main()
{
    int a, b;
    char op;
    while(1)
    {
        scanf("%d %d %c", &a, &b, &op);
        if(a == 0 && b == 0) break;
        else
        switch(op)
        {
            case '+' : printf("%d\n", a + b); break;
            case '-' : printf("%d\n", a - b); break;
            case '*' : printf("%d\n", a * b); break;
            case '/' : 
                if(b == 0)
                {
                    printf("Error");
                    break;
                }
                else
                {
                    printf("%d\n", a / b);
                    break;
                }
            case '%' : printf("%d\n", a%b); break;
            default : printf("Error\n"); break;
        }
    }
    return 0;
}

4.完数

题目:

一个数如果恰好等于它的因子之和,这个数就成为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序打印出1000之内(包括1000)所有的完数,并按如下格式输出其所有因子:

6 its factors are 1,2,3.

【输入形式】无输入

【输出形式】输出1000以内所有的完数及其因子,每行输出一个完数及其因子。

6 its factors are 1,2,3.

代码:

#include <iostream>

using namespace std;

int main()
{
    int i, sum = 0, n;
    for(n = 2; n <= 1000; n ++)
    {
        sum = 0;
        for(i = 1; i < n; i ++)
        {
            if(n % i == 0)
                sum += i;
        }
        if(sum == n)
        {
            cout << n << " its factors are 1";
            for(i = 2; i < n; i ++)
            {
                if(n % i == 0)
                cout << "," << i;
            }
            cout << "." << endl;
        }
    }
     return 0;
}

5.数字菱形图案

题目:

编程打印用数字构成的菱形图案,菱形上半部分的行数n( 1<n<10 )从键盘输入,总行数为2n-1。图案的样式按下面的样例。

【输入形式】从键盘输入包括中间一行在内的菱形上半部分的行数n ( 1<n<10 )。

【输出形式】输出用数字构成的菱形图案,样式按下面的样例,其中各数字间用1个空格间隔,最中间最长的一行的起始数字1位于第1列。

【样例输入】4

【样例输出】

1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 2 1
1 2 1
1

代码:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int n, i;
    cin >> n;
    for(i = 1; i <= n; i ++)
    {
        cout << setw((n - i) * 2);
        if(i == 1)
            cout << " " << 1 << setw((n - i) * 2) << endl;
        if(i > 1 && i < n)
        {
            for(int j = 1; j < i; j ++)
                cout << " " << j;
            for(int k = i; k >= 1; k --)
                cout << " " << k;
            cout << " " << setw((n - i) * 2) << endl;
        }
        if(i == n)
        {
            cout << 1;
            for(int j = 2; j < i; j ++)
                cout << " " << j;
            for(int k = i; k >= 1; k --)
                cout << " " << k;
            cout << endl;
        }
    }
    for(i = n; i <= n && i >= 1; i --)
    {

            cout << setw((n - i) * 2);

        if(i > 1 && i < n)
        {
            for(int j = 1; j < i; j ++)
            cout << " " << j;
            for(int k = i; k >= 1; k --)
            cout << " " << k;
            cout << " " << setw((n - i) * 2) << endl;
        }
        if(i == 1)
            cout << " " << 1 << setw((n - i) * 2) << endl;
    }
    return 0;
}

6.跳水高手

题目:

5位跳水高手参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果。

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一。

决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错。请编程解出比赛的实际名次。

【输入形式】无输入

【输出形式】按名次排序输出。例如:5 2 3 1 4。每人的名次之间有个空格,但最后一个名次4的后面没有空格。

代码:

#include <iostream>
using namespace std;

int main()
{
    int a = 1, b = 1, c = 1, d = 1, e = 1;
    for(a = 1; a <= 5; a ++)
    {
        for(b = 1; b <= 5; b ++)
        {
            for(c = 1; c <= 5; c ++)
            {
                for(d = 1; d <= 5; d ++)
                {
                    for(e = 1; e <= 5; e ++)
                    {
                        if((b == 2 && a != 3) || (b != 2 && a == 3))
                        if((b == 2 && e != 4) || (b != 2 && e == 4))
                        if((c == 1 && d != 2) || (c != 1 && d == 2))
                        if((c == 5 && d != 3) || (d == 3 && c != 5))
                        if((e == 4 && a != 1) || (a == 1 && e != 4))
                        if(a != b && a != c && a != d && a != e && b != c && b!=d && b !=e && c != d && c != e && d != e)
                        cout << a << " " << b << " " << c << " " << d << " " << e;
                    }
                }
            }
        }
    }
 return 0;
}

7.约瑟夫环问题

题目:

有n个人围成一圈,按顺序从1到n编号。从第1个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。

【输入形式】考虑如下两种情况:

(1)如果n超出"n must be a natural number less than 10000",则打印"n is out of range of valid values.",其中n应该用如上输入的具体的n数值代替。

(2)如果n是有效范围的数值,则打印"Last No. is:",然后直接在冒号后面输出最后留下来的人的编号。

【运行时的输入输出样例1】

Input n(n must be a natural number less than 10000):5

Last No. is:4

【运行时的输入输出样例2】

Input n(n must be a natural number less than 10000):10000

100000 is out of range of valid values.

【测试数据】一共9组测试数据:1,2,3,10,0,90,10000,10001,-1,其中0,-1,10001都不是有效范围的值。

代码:

#include <iostream>
using namespace std;

int main()
{
    int n, i, m = 3, f = 0;
    cout << "Input n(n must be a natural number less than 10000):" << endl;
    cin >> n;
    if(n > 10000 || n <= 0)
    cout << n << " is out of range of valid values.";
    if(n > 0 && n <= 10000)
    {
         for(i = 1; i <= n; i ++)
            f = (f + m) % i;
         cout << "Last No. is:" << f + 1;
     }
     return 0;
}

8.正负数统计

题目:

读入一系列整数,统计出正整数个数i和负整数个数j,读入0则结束。

【输入形式】若干个整数

【输出形式】正整数数量和负整数数量

【样例输入】

5

-3

2

0

【样例输出】positive integers are 2 and negative integers are 1

代码:

#include <stdio.h>

int main()
{
    int i = 0, j = 0, n;
    scanf("%d", &n);
    while(n != 0)
    {
        if(n > 0) i ++;
        if(n < 0) j ++;
        scanf("%d", &n);
    }
    if (n == 0);
    printf("positive integers are %d and negative integers are %d\n", i, j);
    return 0;
}

9.图案输出

题目:

编写程序,在屏幕上显示图案。其中,行数n由用户输入。当n=6时,输出图案如下所示。

在这里插入图片描述

【注意】符号之间无空格,第一行左边无空格

代码:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int n, i, j, k;
    cin >> n;
    for(i = 1; i <= 2 * n - 1; i ++)
        cout << "*";
    cout << endl;
    for(k = 2; k <= n; k ++)
    {
        cout << setw(k);
        for(j = 1; j <= 2 * (n - k) + 1; j ++)
            cout << "*";
        cout << endl;
    }
    return 0;
}


10.菜单程序

题目:

实现一个简单的菜单程序,运行时显示:“Menu:A(dd) D(elete) S(ort) Q(uit),Select one:”提示用户输入。A表示增加;D表示删除,S表示排序,Q表示退出。输入为A、D、S时分别提示“数据已经增加(Added)、删除(Deleted)、排序(Sorted)。”,输入为Q时程序结束。循环结构和选择结构套用。其中,选择结构要求用if-else语句以及break和continue语句完成。

【输入形式】单个字符

【输出形式】字符对应的操作结果

【样例输入】

A

Q

【样例输出】

Menu: A(dd) D(elete) S(ort) Q(uit),Select one:

Added.

Menu: A(dd) D(elete) S(ort) Q(uit),Select one:

Quit.

【提示】注意单词末尾的句号

代码:

#include <iostream>
using namespace std;

int main()
{
    char a;
    do{
        cout << "Menu: A(dd) D(elete) S(ort) Q(uit),Select one:" << endl;
        cin >> a;
        if(a == 'A')
        {
            cout << "Added." << endl;
            continue;
        }
        if(a == 'D')
        {
            cout << "Deleted." << endl;
            continue;
        }
        if(a == 'S')
        {
            cout << "Sort." << endl;
            continue;
        }
        if(a == 'Q')
        {
            cout << "Quit.";
            break;
        }
    }while(1);
    return 0;
}



欢迎提问,学弟学妹们加油~

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只可爱的小猴子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值