目录
1.奖学金问题
题目:
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
-
院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
-
五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
-
成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
-
西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
-
班级贡献奖,每人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;
}
欢迎提问,学弟学妹们加油~