题目来源:
P1051 [NOIP2005 提高组] 谁拿了最多奖学金 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1051
题目分析:
根据输入格式我们知道,首先是要将这几个输入数据存入,接着在进行计算得出:
1.奖学金最多的学生 (可通过比较最大值来计算)
2.最多学生的奖学金数量(计算结束直接输出即可)
2.总奖学金数(加起来就行)
所以:只要计算算出每个同学的奖学金多少就好办了
因为是有多个学生的成绩而我们又不知道到底是有多少学生,所以最好采用循环并存入数组的方法,输入各种数据类型,分类将不同类型的数据存入不同的列表之中。
我们一步步来落实。
1.通过循环存储数据,做到名字数据一一对应。 代码如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
int n; // 表示学生数量
scanf("%d", &n); //输入获取学生数量,7行通过学生数量生成名字列表
string name[100];
int qm[1000];
int py[1000];
char gb[1000];
char xb[1000];
int lw[1000];
for (int i = 1; i <= n; ++i) {
string a; // 名字
int b;
int c;
char d;
char e;
int f;
cin >> a;
scanf("%d%d %c %c%d",&b, &c, &d, &e, &f);
name[i] = a;
qm[i] = b; //期末成绩
py[i] = c; //评议成绩
gb[i] = d; //干部
xb[i] = e; //西部
lw[i] = f; //论文
}
printf("\n这是名字:");
for (int i = 1; i <= n; i++) {
printf("%s ", name[i].c_str());
}
printf("\n这是期末成绩:");
for (int i = 1; i <= n; i++) {
printf("%d ", qm[i]);
}
printf("\n这是评议成绩:");
for (int i = 1; i <= n; i++) {
printf("%d ", py[i]);
}
printf("\n这是干部:");
for (int i = 1; i <= n; i++) {
printf("%c ", gb[i]);
}
printf("\n这是西部:");
for (int i = 1; i <= n; i++) {
printf("%c ", xb[i]);
}
printf("\n这是论文:");
for (int i = 1; i <= n; i++) {
printf("%d ", lw[i]);
}
return 0;
}
注意:(本人在做时踩的坑):
1.%s是相对char类型的输出,想用%s实现输出string类型数组需要用上name[i].c_str()
来源:C语言中如何使用printf输出string类型字符串_printf输出字符串-CSDN博客
2.输入时,字符串和其他输入内容之间是不能有空格的,例如:输入内容为1 Y,则实际字符数据获取的数据为空格,要解决这个问题,就需要在%d 和 %c 之间加一个空格
3.字符串数据不好用scanf函数输入,改为cin即可
运行结果:
现在,我们已经解决了将各类数据意义对应,现在进行判断,因为可以获得多种奖学金,所以我们要设置一个累加器 money,当满足条件A时加上条件A的奖励,满足条件B时加上条件B的奖励,代码如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
int n; // 表示学生数量
scanf("%d", &n); //输入获取学生数量,7行通过学生数量生成名字列表
string name[120];
int qm[120];
int py[120];
char gb[120];
char xb[120];
int lw[120];
for (int i = 1; i <= n; ++i) {
string a; // 名字
int b;
int c;
char d;
char e;
int f;
cin >> a;
scanf("%d%d %c %c%d",&b, &c, &d, &e, &f);
name[i] = a;
qm[i] = b; //期末成绩
py[i] = c; //评议成绩
gb[i] = d; //干部
xb[i] = e; //西部
lw[i] = f; //论文
}
int money[120] = {};//奖学金初始化为0元
for (int i = 1;i<=n;++i){
if (qm[i]>80 && lw[i] >=1){
money[i]+=8000;
}
if (qm[i]>85 && py[i]>80){
money[i]+=4000;
}
if (qm[i]>90){
money[i]+=2000;
}
if (qm[i]>85 && xb[i] == 'Y'){
money[i]+=1000;
}
if (py[i]>80 && gb[i] == 'Y'){
money[i]+=850;
}
}
int max = -10000; // 寻找最大值
string maxm;
for (int i = 1;i<=n;i++){
if (money[i]>max){
max = money[i];
maxm = name[i];
}
}
int moneyz = 0;
for (int i = 1;i<=n;i++){
moneyz += money[i];
}
printf("%s\n%d\n%d",maxm.c_str(),max,moneyz);
return 0;
}
完成!