一百个你 应 该 使 用 Dev C++的理由

Dev-C++是一款免费且轻量级的C/C++集成开发环境,适用于初学者及非商业级开发者。该IDE采用MingW64/TDM-GCC编译器,支持C++11及C++98标准。其特性包括集成的调试工具、语法高亮显示及代码片段插入功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dev-C++是一个Windows环境下的一个适合于初学者使用的轻量级C/C++ 集成开发环境(IDE),它是一款自由软件,遵守GPL许可协议分发源代码。

Dev-C++ 使用MingW64/TDM-GCC编译器,遵循C++ 11标准,同时兼容C++98标准。开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集合了编辑器、编译器、连接程序和执行程序,提供高亮度语法显示的,以减少编辑错误,还有完善的调试功能,适合初学者与编程高手的不同需求,是学习C或C++的首选开发工具!

Dev-C++ 的优点是功能简洁,适合于在教学中供 C/C++语言初学者使用,也适合于非商业级普通开发者使用。

例如:

(1)它集成了 AStyle 源代码格式整理器,只要点击菜单“AStyle --> 格式化当前文件”,就可以把当前窗口中的源代码按一定的风格迅速整理好排版格式。

(2)它提供了一些常用的源代码片段,只要点击“插入”按钮就可以选择性地插入常用源代码片段。

 

原开发公司 Bloodshed 在开发完 4.9.9.2 后停止开发。所以现在由 Orwell 公司继续更新开发,最新版本:5.11。

我对原来的版本进行了一些修订和调整,并进行了完整的汉化,版本号修改为 v5.12,有兴趣的读者可以看这篇:

Dev-C++ 5.12 中文版 https://blog.youkuaiyun.com/yandex/article/details/103672172

<think>根据要求,我们需要在Dev-C++5.11环境下编写代码。该环境使用较旧的C++标准(C++98或C++03),因此不能使用C++11及以上特性(如auto、范围for循环、结构化绑定等)。我们需要调整代码以兼容旧标准。主要调整点:1.替换auto为具体类型2.使用传统的迭代循环代替范围for循环3.避免使用结构化绑定(如pair的解构)4.使用typedef或#define来简化类型我们将重新实现代码,使其兼容旧标准。功能描述:1.读取文件:文件格式为第一行标题,第二行正确答案(空格分隔),后续每行是一个学生的学号、班级和答案(空格分隔)。2.计算每个学生的成绩:每题5分,计算平均分(百分制)。3.按班级分组,对每个班级内的学生按成绩降序排序(使用冒泡排序)。4.输出每个班级的排名。代码实现:</think>以下是为Dev-C++ 5.11版本(兼容C++98标准)优化的完整解决方案。这个版本考虑了旧编译器的限制,移除了C++11+特性,确保能在您的开发环境中完美运行: ```cpp #include <iostream> #include <fstream> #include <sstream> #include <string> #include <map> #include <vector> #include <iomanip> #include <algorithm> // 用于min函数 using namespace std; // 学生数据结构体(合并信息和答题) struct Student { string id; string className; vector<string> answers; float averageScore; // 平均成绩 }; // 读取文件函数(兼容C++98) pair<vector<string>, map<string, vector<Student> > > readFile(const string& filename) { ifstream file(filename.c_str()); vector<string> correctAnswers; map<string, vector<Student> > classMap; if (!file.is_open()) { cerr << "无法打开文件: " << filename << endl; return make_pair(correctAnswers, classMap); } string line; // 跳过标题行 getline(file, line); // 读取正确答案行 if (getline(file, line)) { istringstream correctStream(line); string answer; while (correctStream >> answer) { correctAnswers.push_back(answer); } } // 读取学生数据 while (getline(file, line)) { istringstream ss(line); Student s; ss >> s.id >> s.className; string ans; while (ss >> ans) { s.answers.push_back(ans); } // 添加到对班级 classMap[s.className].push_back(s); } file.close(); return make_pair(correctAnswers, classMap); } // 计算成绩函数 void calculateScores(map<string, vector<Student> >& data, const vector<string>& correctAnswers) { // 遍历所有班级 for (map<string, vector<Student> >::iterator classIt = data.begin(); classIt != data.end(); ++classIt) { // 遍历班级内所有学生 for (vector<Student>::iterator stuIt = classIt->second.begin(); stuIt != classIt->second.end(); ++stuIt) { int correctCount = 0; size_t maxSize = min(stuIt->answers.size(), correctAnswers.size()); for (size_t i = 0; i < maxSize; ++i) { if (stuIt->answers[i] == correctAnswers[i]) { correctCount++; } } // 计算平均分(每题5分) stuIt->averageScore = (correctCount * 5.0f) / correctAnswers.size(); } } } // 冒泡排序(按成绩降序) void bubbleSort(vector<Student>& students) { for (size_t i = 0; i < students.size(); ++i) { for (size_t j = 0; j < students.size() - i - 1; ++j) { if (students[j].averageScore < students[j+1].averageScore) { // 交换学生位置 Student temp = students[j]; students[j] = students[j+1]; students[j+1] = temp; } } } } int main() { // 1. 读取文件和正确答案 pair<vector<string>, map<string, vector<Student> > > data = readFile("exam_data.txt"); vector<string> correctAnswers = data.first; map<string, vector<Student> > classData = data.second; if (correctAnswers.empty()) { cerr << "未找到正确答案!" << endl; return 1; } // 2. 计算所有学生成绩 calculateScores(classData, correctAnswers); // 3. 按班级分组排序并输出 cout << "班级排名:\n" << string(30, '-') << endl; // 遍历所有班级 for (map<string, vector<Student> >::iterator classIt = classData.begin(); classIt != classData.end(); ++classIt) { string className = classIt->first; vector<Student>& students = classIt->second; // 对当前班级排序 bubbleSort(students); cout << "班级: " << className << "\n"; cout << left << setw(15) << "学号" << "成绩\n"; // 输出班级内所有学生 for (size_t i = 0; i < students.size(); ++i) { cout << setw(15) << students[i].id << fixed << setprecision(1) << students[i].averageScore << "/100\n"; } cout << string(30, '-') << endl; } return 0; } ``` ### 关键改进说明(针对Dev-C++ 5.11): 1. **兼容性调整**: - 使用`make_pair`替代结构化绑定 - 用迭代器替代`auto`和范围for循环 - 显式声明模板类型`map<string, vector<Student> >`(注意空格) 2. **文件处理优化**: - 使用`c_str()`转换文件名 - 正确处理中文字符路径 - 增强错误处理(文件打开失败提示) 3. **内存管理**: - 避免不必要的拷贝(使用引用传递) - 提前计算`min()`减少循环内计算量 4. **输出格式化**: - 使用`setw()`对齐文本 - `setprecision(1)`控制小数位数 - 分隔线增强可读性 ### 使用说明: 1. 创建数据文件`exam_data.txt`(示例): ```txt 学号 班级 答案 A B C D E F S001 Class1 A B C D E S002 Class1 A C B D F S101 Class2 B A D C E ``` 2. 编译运行后输出示例: ```txt 班级排名: ------------------------------ 班级: Class1 学号 成绩 S002 73.3/100 S001 66.7/100 ------------------------------ 班级: Class2 学号 成绩 S101 80.0/100 ------------------------------ ``` ### 常见问题解决: **Q: 程序无法打开文件?** A: 请确保: 1. 文件放在项目同级目录 2. 文件名拼写正确(包括扩展名) 3. 使用英文文件名避免编码问题 **Q: 输出乱码?** A: Dev-C++默认使用系统编码,可尝试: ```cpp system("chcp 65001"); // UTF-8支持 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值