程序设计,输入10名学生语文、数学、外语课成绩,计算每名学生3门课的平均成绩,输出每个人各科成绩及平均成绩,并分析3门课程的优秀率(90分以上为优秀)。
怎么分析优秀率
#include <iostream>
#include <list>
#include <sstream>
#include <iomanip>
using namespace std;
struct Token { // 一个简单的结构体,成员只有一个字符串,用来储存数值或符号
string text;
Token(string text) : text(text) {}
double doubleValue() { // 将string类型转化为double类型
stringstream ss(text);
double value;
ss >> value;
return value;
}
};
class Parser {
struct Tree { // 二叉树
Token token; // 储存数值或符号
Tree * left; // 指向左子树的指针
Tree * right; // 指向右子树的指针
Tree(Token token) : token(token) {
left = 0;
right = 0;
}
~Tree() {
if (left != 0) delete left;
if (right != 0) delete right;
}
};
Tree * expression; // 指向表达式二叉树的指针
double result; // 整个表达式的计算结果
static double execute(Tree * expression) { // 计算表达式的值
if (expression->left == 0) { // 左子树为空时,token储存的是当前子树的值
return expression->token.doubleValue();
} else { // 左右子树均存在,分别计算左右子树的值,再根据符号进行四则运算
double left = execute(expression->left);
double right = execute(expression->right);
switch (expression->token.text[0]) { // 左右子树均存在时,token储存的是符号
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
}
// 这里不加的话会报warning: control may reach end of non-void function
return 0;
}
}
public:
Parser() {
expression = 0;
}
~Parser() {
if (expression != 0) delete expression;
}
// 执行表达式计算
double execute() {
if (expression != 0) {
result = execute(expression);
delete expression;
expression = 0;
}
return result;
}
// 创建一棵新树, 这里用list模拟实现栈的功能
void create(list<Tree*> &subTreeStack, list<string> &operatorStack) {
Tree* node = new Tree(Token(operatorStack.back())); // 新子树值为此时符号栈的顶部
operatorStack.pop_back(); // pop掉符号栈的栈顶
node->right = subTreeStack.back(); // 新树的右孩子为子树栈的顶部
subTreeStack.pop_back(); // pop掉子树栈的栈顶
if (!subTreeStack.empty()) {
node->left = subTreeStack.back(); // 新树的左孩子为此时子树栈的顶部
subTreeStack.pop_back();
} else { // 考虑特殊情况: -5、-0、+0
Tree* temp = new Tree(Token("0"));
node->left = temp; // 新树的左孩子为一个值为0的子树
}
subTreeStack.push_back(node); // 新树加进栈顶
}
// 将表达式构建成一棵二叉树
void parse(string str) {
list<Tree*> subTreeStack; // 子树栈
list<string> operatorStack; // 符号栈
for (unsigned i = 0; i < str.length(); i++) {
if (str[i] >= '0' && str[i] <= '9') { // 数字则为叶子节点
string value = "";
for (unsigned j = i; j < str.length(); j++) { // 提取数字,包含可能存在的小数点
if ((str[j] >= '0' && str[j] <= '9') || str[j] == '.') {
value += str[j];
i = j;
} else {
break;
}
}
Tree* node = new Tree(Token(value));
subTreeStack.push_back(node);
} else if (str[i] == '+' || str[i] == '-') {
string value = "";
value += str[i];
if (operatorStack.empty()) {
operatorStack.push_back(value);
} else {
if (i >= 1 && str[i-1] == '(') // 当出现(- 或者(+ 手动添加一个值为0的子树
subTreeStack.push_back(new Tree(Token("0")));
// 遇到加减符号,如果符号栈不为空,先将此时的栈构建一棵子树,再将该符号入栈
while (!operatorStack.empty() &&
(operatorStack.back() == "+" || operatorStack.back() == "-"
|| operatorStack.back() == "*" || operatorStack.back() == "/")) {
create(subTreeStack, operatorStack);
}
operatorStack.push_back(value);
}
} else if (str[i] == '*' || str[i] == '/') {
string value = "";
value += str[i];
if (operatorStack.empty()) {
operatorStack.push_back(value);
} else {
// 遇到乘除符号,如果符号栈不为空且栈顶同为乘除符号,先将此时的栈构建一棵子树,再入栈
while (!operatorStack.empty() &&
(operatorStack.back() == "*" || operatorStack.back() == "/")) {
create(subTreeStack, operatorStack);
}
operatorStack.push_back(value);
}
} else if (str[i] == '(') {
string value = "";
value += str[i];
operatorStack.push_back(value);
} else if (str[i] == ')') {
while (operatorStack.back() != "(") { // 构建子树,直至遇到 '('
create(subTreeStack, operatorStack);
}
operatorStack.pop_back(); // pop '('
}
}
while (!operatorStack.empty()) { // 继续构建二叉树,直至符号栈为空
create(subTreeStack, operatorStack);
}
expression = subTreeStack.back(); // 最后子树栈的栈顶的值即为表达式的值
}
};
int main(int argc, char const *argv[]) {
Parser p = Parser();
string expression;
while (cin >> expression) {
if (expression.length() > 0) { // 不处理空字符串
p.parse(expression);
cout << fixed << setprecision(3) << p.execute() << endl;
}
}
return 0;
}
由于题目太过简单,以下是代码实现:
#include <iostream>
#include <iomanip>
using namespace std;
const int STUD_NUM = 10;//学生人数
const int COURSE_NUM = 3;//课程数
//定义学生类
class Student {
public:
Student();//构造函数
void setScore(int index,float score);
void calcAvg();//计算平均成绩
void output();//输出成绩
float getAvg();//获取平均成绩
float getExcellentRate(int courseIndex);//获取优秀率
private:
float score[COURSE_NUM];//存放学生三门课成绩
float avg;//平均成绩
};
Student::Student() {
for (int i = 0; i < COURSE_NUM; i++) {
score[i] = 0;
}
avg = 0;
}
void Student::setScore(int index, float score) {
this->score[index] = score;
}
void Student::calcAvg() {
float sum = 0;
for (int i = 0; i < COURSE_NUM; i++) {
sum += score[i];
}
avg = sum / COURSE_NUM;
}
void Student::output() {
for (int i = 0; i < COURSE_NUM; i++) {
cout << setw(8) << score[i];
}
cout << setw(8) << avg << endl;
}
float Student::getAvg() {
return avg;
}
float Student::getExcellentRate(int courseIndex) {
float excellentNum = 0;
for (int i = 0; i < STUD_NUM; i++) {
if (score[courseIndex] >= 90) {
excellentNum++;
}
}
return excellentNum / STUD_NUM;
}
int main() {
Student stud[STUD_NUM];
//读入学生成绩
for (int i = 0; i < STUD_NUM; i++) {
cout << "请输入第" << i + 1 << "名学生的成绩(语文,数学,外语): ";
float ch, math, eng;
cin >> ch >> math >> eng;
stud[i].setScore(0, ch);
stud[i].setScore(1, math);
stud[i].setScore(2, eng);
stud[i].calcAvg();
}
//输出成绩表头
cout << setw(12) << "语文" << setw(8) << "数学" << setw(8) << "外语" << setw(8) << "平均成绩" << endl;
//输出学生成绩及平均成绩
for (int i = 0; i < STUD_NUM; i++) {
cout << "第" << i + 1 << "名学生: ";
stud[i].output();
}
//输出优秀率
for (int i = 0; i < COURSE_NUM; i++) {
cout << "第" << i + 1 << "门课的优秀率: " << stud[0].getExcellentRate(i) * 100 << "%" << endl;
}
return 0;
}
循环统计就可以了。
#include <iostream>
using namespace std;
int main() {
const int num_students = 10;
const int num_subjects = 3;
int scores[num_students][num_subjects];
double averages[num_students];
// 输入学生成绩
for (int i = 0; i < num_students; i++) {
cout << "请输入第" << i + 1 << "名学生的语文、数学、外语成绩:" << endl;
for (int j = 0; j < num_subjects; j++) {
cin >> scores[i][j];
}
}
// 计算平均成绩
for (int i = 0; i < num_students; i++) {
int sum = 0;
for (int j = 0; j < num_subjects; j++) {
sum += scores[i][j];
}
averages[i] = (double) sum / num_subjects;
}
// 输出每个人各科成绩及平均成绩
for (int i = 0; i < num_students; i++) {
cout << "第" << i + 1 << "名学生的语文、数学、外语成绩为:";
for (int j = 0; j < num_subjects; j++) {
cout << scores[i][j] << " ";
}
cout << ",平均成绩为:" << averages[i] << endl;
}
// 计算优秀率
int excellent_counts[num_subjects] = {0};
for (int i = 0; i < num_students; i++) {
for (int j = 0; j < num_subjects; j++) {
if (scores[i][j] >= 90) {
excellent_counts[j]++;
}
}
}
double excellent_rates[num_subjects];
for (int j = 0; j < num_subjects; j++) {
excellent_rates[j] = (double) excellent_counts[j] / num_students;
cout << "第" << j + 1 << "门课的优秀率为:" << excellent_rates[j] << endl;
}
return 0;
}