DHU上机打卡D22

1.弟弟的作业

你的弟弟刚做完了"100以内数的加减法"这部分的作业,请你帮他检查一下。每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负整数;c是弟弟算出的答案,可能是不超过200的非负整数,也可能是单个字符"?",表示他不会算。

个人总结:

1.题目要求用字符串,找到加号(或减号)等号位置,选取a和b,提取弟弟的答案,判断是否一致输出。

#include <iostream>

#include <string>

#include <sstream>

using namespace std;

int main() {

string line;

int correct_count = 0;

while (getline(cin, line)) {

if (line.find('+') != string::npos) {

size_t plus_pos = line.find('+');

size_t equals_pos = line.find('=');

int a = stoi(line.substr(0, plus_pos));

int b = stoi(line.substr(plus_pos + 1, equals_pos - plus_pos - 1));

string c = line.substr(equals_pos + 1);

int correct_answer = a + b;

if (c == "?") {

continue;

}

if (stoi(c) == correct_answer) {

correct_count++;

}

}

else if (line.find('-') != string::npos) {

size_t minus_pos = line.find('-');

size_t equals_pos = line.find('=');

int a = stoi(line.substr(0, minus_pos));

int b = stoi(line.substr(minus_pos + 1, equals_pos - minus_pos - 1));

string c = line.substr(equals_pos + 1);

int correct_answer = a - b;

if (c == "?") {

continue;

}

if (stoi(c) == correct_answer) {

correct_count++;

}

}

}

cout << correct_count << endl;

return 0;

}

2.奖学金

明明所在学校的惯例是在每学期的期末考试之后发放奖学金。

发放的奖学金共有五种,获取的条件各不相同:

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

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

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

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

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

只要符合条件就可以得奖。 每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。

例如明明的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

由于老师在学期末的时候很忙,所以,他把奖学金统计的事情交给明明做。老师把考试的相关数据给了明明,让他统计出以下数据:

1) 哪位同学获得的奖学金最多;

2) 获得最多奖学金的同学一共获得了多少奖学金;

3) 所有获得奖学金的同学一共获得了多少奖学金;

明明虽然很愿意帮老师这个忙,但是他发现,同学的数量很多,统计起来很麻烦,经常有统计出错的情况发生。于是明明就想请你帮一个忙,帮他写一个统计程序,统计出以上三项内容。

个人总结:

1.用while实现持续输入读取,通过if-else if-else进行奖学金判断,输出结果。

#include <iostream>

#include <string>

using namespace std;

int main() {

int N;

int case_num = 0;

while (cin >> N) {

if (case_num > 0) {

cout << endl;

}

case_num++;

string max_name;

int max_money = 0;

int total_all = 0;

for (int i = 0; i < N; i++) {

string name;

int score_final;

int score_class;

char is_cadre;

char is_west;

int paper_num;

int money = 0;

cin >> name >> score_final >> score_class >> is_cadre >> is_west >> paper_num;

if (score_final > 80 && paper_num >= 1) {

money += 8000;

}

if (score_final > 85 && score_class > 80) {

money += 4000;

}

if (score_final > 90) {

money += 2000;

}

if (score_final > 85 && is_west == 'Y') {

money += 1000;

}

if (score_class > 80 && is_cadre == 'Y') {

money += 850;

}

total_all += money;

if (money > max_money) {

max_money = money;

max_name = name;

}

}

cout << max_name << endl;

cout << max_money << endl;

cout << total_all << endl;

}

return 0;

}

3.字符串统计

明明最近在做一个有关字符串的统计工作。两个由小写字母组成的字符串s1和s2,明明需要统计出以下四种关系:

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);

(2)在s1中且在s2中的字母;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;

(4)不在s1中且也不在s2中的字母;

例如两个字符串s1为"lkjsvoahs",s2为"qglhskjdfg":

(1)在s1或者在s2或者s1、s2中都存在的字母:adfghjkloqsv;

(2)在s1中且在s2中的字母:hjkls;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母:adfgoqv;

(4)不在s1中且也不在s2中的字母:bceimnprtuwxyz;

明明统计了很久,但是由于统计过程十分繁琐,且很容易出错,导致明明的进度非常慢,很有可能因为统计不完而错过了晚上的约会。因此明明想请你帮个忙,帮他写一个程序,用程序来统计出以上几项内容。

明明的问题可以归结为:

输入两串由小写字母组成的字符串s1和s2,比较其中的字母,输出以下四项,输出的字母以字典顺序排列:

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母);

(2)在s1中且在s2中的字母;

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母;

(4)不在s1中且也不在s2中的字母;

例如字符串s1为sadf,s2为asdf,则需输出以下四行(注意输出的格式):

in s1 or s2:adfs

in s1 and s2:adfs

in s1 but not in s2 ,or in s2 but not in s1:

not in s1 and s2:bceghijklmnopqrtuvwxyz

个人总结:

1.参考豆包:并集:in_s1 || in_s2(只要一个存在就加入);交集:in_s1 && in_s2(两个都存在才加入);对称差集:(in_s1 && !in_s2) || (!in_s1 && in_s2)(仅一个存在);补集:!in_s1 && !in_s2(两个都不存在)。循环读取判断。

#include <iostream>

#include <string>

#include <cstring>

using namespace std;

int main() {

string s1, s2;

int case_count = 0;

while (cin >> s1 >> s2) {

if (case_count > 0) {

cout << endl;

}

case_count++;

bool exist_in_s1[26] = {false};

bool exist_in_s2[26] = {false};

for (char c : s1) {

int idx = c - 'a';

exist_in_s1[idx] = true;

}

for (char c : s2) {

int idx = c - 'a';

exist_in_s2[idx] = true;

}

string union_str = "";

string intersect_str = "";

string diff_str = "";

string complement_str = "";

for (int i = 0; i < 26; i++) {

char ch = 'a' + i;

bool in_s1 = exist_in_s1[i];

bool in_s2 = exist_in_s2[i];

if (in_s1 || in_s2) {

union_str += ch;

}

if (in_s1 && in_s2) {

intersect_str += ch;

}

if ((in_s1 && !in_s2) || (!in_s1 && in_s2)) {

diff_str += ch;

}

if (!in_s1 && !in_s2) {

complement_str += ch;

}

}

cout << "in s1 or s2:" << union_str << endl;

cout << "in s1 and s2:" << intersect_str << endl;

cout << "in s1 but not in s2 ,or in s2 but not in s1:" << diff_str << endl;

cout << "not in s1 and s2:" << complement_str << endl;

}

return 0;

}

翻译:

1.分析机

在19世纪,还有一位英国的数学家兼发明家查尔斯•巴贝奇提出了现代数字计算机的原理。他构想了许多机器,比如差分机,这些机器旨在解决复杂的数学问题。许多历史学家认为巴贝奇及其助手、数学家奥古斯塔•阿达•拜伦是现代数字计算机的真正先驱。巴贝奇的一项设计---一分析机,具有现代计算机的许多特征。它采用了一套类似打孔卡片的输入流,有一个用于保存数据的"存储器",一个用于进行算术运算的"运算器",还有一个能生成永久记录的打印机。尽管巴贝奇未能将这一想法付诸实践,但就当时的技术而言,这或许确实是可行的。

  1. 早期的计算机

模拟计算机于 19世纪末开始被制造出来。早期的型号是通过旋转轴和齿轮来进行计算的。那些无法通过其他方式解决的过于复杂的方程式的近似值是通过这类机器来计算的。凯尔文勋爵建造了一台机械式的潮汐预测器,这是一台专门的模拟计算机。在第一次和第二次世界大战期间,机械以及后来的电气模拟计算系统被用于潜艇中作为鱼雷航向预测器,以及在飞机中作为炸弹瞄准器控制器。还有一种系统是为预测密西西比河流域的春季洪水而设计的。

  1. 电子计算机

在第二次世界大战期间,一支由科学家和数学家组成的团队在伦敦北部的布莱切利公园工作,他们制造出了第一台全电子数字计算机:科洛西姆计算机。到1943年12月,配备了 1500个真空管的科洛西姆计算机已投入使用。它被用于破译用恩尼格玛密码加密的德国无线电信息。由艾伦•图灵领导的这个团队,在很大程度上成功地尝试破解了这一密码。

相关推荐
得一录1 小时前
星图·全参数调试qwen3.1-B
深度学习·算法·aigc
plus4s1 小时前
2月14日(76-78题)
c++·算法·图论
pzx_0011 小时前
【论文阅读】Attention Is All You Need
论文阅读·算法
-To be number.wan2 小时前
算法学习日记 |贪心算法
c++·学习·算法·贪心算法
清钟沁桐2 小时前
算法实现
算法
梦游钓鱼2 小时前
c++中一维数组和二维数组的应用
数据结构·c++·算法
铁甲前沿2 小时前
基于最小二乘拟合减小四轮定位数据采集误差的方法
算法
程序员酥皮蛋2 小时前
hot 100 第二十六题 26.环形链表 II
算法
啊阿狸不会拉杆2 小时前
《机器学习导论》第 16 章-贝叶斯估计
人工智能·python·算法·机器学习·ai·参数估计·贝叶斯估计