问题 1073: 弟弟的作业

本文介绍了一种使用C++解析并验证算术表达式正确性的方法,重点讲解了如何将字符数组转换为整数进行运算判断的过程,适用于解决特定格式的算术题目。

题目来源:https://www.dotcpp.com/oj/problem1073.html

思路分析:难点在于格式读入处理

                    我选择的是int char int = char []的形式

#include <bits/stdc++.h>

using namespace std;

int num=0;

int transformation(char d[4])//将字符数组转换成数字判断
{
    if(d[0]!='-')
    {
        if(strlen(d)==3)
        {
            return (d[0]-'0')*100+(d[1]-'0')*10+d[2]-'0';
        }
        if(strlen(d)==2)
        {
            return (d[0]-'0')*10+(d[1]-'0');
        }
        if(strlen(d)==1)
        {
            return (d[0]-'0');
        }
    }
    else
    {
        if(strlen(d)==4)
        {
            return -(d[1]-'0')*100+(d[2]-'0')*10+d[3]-'0';
        }
        if(strlen(d)==3)
        {
            return -(d[1]-'0')*10+(d[2]-'0');
        }
        if(strlen(d)==2)
        {
            return -(d[1]-'0');
        }
    }
}

int main()
{
    int a,b;
    char c;
    char d[4]= {0};
    while(scanf("%d%c%d=%s",&a,&c,&b,d)!=EOF)
    {
        if(d[0]=='?')//如果该题不会做 直接跳过
            continue;
        if(c=='+')
        {
            if(a+b==transformation(d))
                num++;
        }
        if(c=='-')
        {
            if(a-b==transformation(d))
                num++;
        }
    }
    cout<<num<<endl;


}

 

<think>好的,我需要帮用户找到一个关于用C++解决检查作业的示例。首先,用户的需求是检查作业,可能涉及到比较学生的答案和标准答案是否一致。这可能包括处理数学题、代码题或者其他类型的题目。不过用户提到的C++编程,所以示例应该用C++来实现。 先想一个简单的场景,比如数学作业的检查。例如,学生提交了一个包含数学题的答案,程序需要读取学生的答案和标准答案,然后对比是否正确。这时候可能需要文件操作,读取两个文件的内容,逐行比较。 然后考虑数据结构。比如,可以用两个vector或者数组来存储学生答案和标准答案,然后逐个比较元素。如果有不匹配的就记录下来,最后输出正确率或者错误的位置。 还需要处理可能的输入输出问题。比如,文件格式是什么样的?假设每行一个答案,这样读取起来比较方便。或者如果是更复杂的结构,比如JSON,但可能对于C++来说处理起来麻烦,所以暂时用简单的文本文件。 另外,可能需要异常处理,比如文件无法打开的情况,这时候程序需要给出提示。 接下来想代码结构。主函数可能包括读取两个文件,比较它们的内容,输出结果。需要用到fstream来读取文件,vector来存储数据,然后循环比较。 可能的错误点:文件行数不一致,这时候要处理这种情况,比如提示错误或者只比较共同的行数。 然后,代码示例应该包括这些部分。比如: 1. 打开两个文件,学生答案和标准答案。 2. 逐行读取,存储到两个vector中。 3. 比较每个对应的元素,统计正确数和错误位置。 4. 输出结果。 再考虑是否需要处理不同类型的答案,比如数字、字符串或者更复杂的数据结构。但作为示例,可能先处理简单的数值或字符串比较。 现在,写一个具体的例子。比如学生答案文件student.txt内容: 5 10 3.14 Hello 标准答案answer.txt内容: 5 12 3.14 World 程序读取这两个文件,比较每一行,输出哪些行正确,哪些错误。 代码的大致步骤: - 使用ifstream读取两个文件。 - 使用getline逐行读取,存储到vector<string>中。 - 遍历两个vector,比较每个元素。 - 统计正确数和错误的位置。 注意,如果答案可能包含前导或后置空格,可能需要trim处理,但示例中可以忽略,假设输入是干净的。 然后,代码示例: #include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; int main() { vector<string> studentAnswers; vector<string> correctAnswers; // 读取学生答案 ifstream studentFile("student.txt"); string line; while (getline(studentFile, line)) { studentAnswers.push_back(line); } studentFile.close(); // 读取标准答案 ifstream correctFile("answer.txt"); while (getline(correctFile, line)) { correctAnswers.push_back(line); } correctFile.close(); // 检查行数是否一致 if (studentAnswers.size() != correctAnswers.size()) { cout << "错误:答案行数不一致!" << endl; return 1; } // 比较答案 int total = studentAnswers.size(); int correct = 0; for (int i = 0; i < total; ++i) { if (studentAnswers[i] == correctAnswers[i]) { correct++; } else { cout << "第" << (i+1) << "题错误。学生答案:" << studentAnswers[i] << ",标准答案:" << correctAnswers[i] << endl; } } cout << "正确率:" << correct << "/" << total << endl; return 0; } 这个示例代码应该能满足基本需求。不过可能需要根据具体作业类型调整比较方式,比如数值比较可能有精度问题,这时候需要转换字符串为数值类型,但示例中可能直接比较字符串是否完全一致。 另外,用户可能希望更复杂的检查,比如数学表达式化简后的等价性,这时候需要更复杂的解析和比较逻辑,但作为示例,简单的字符串比较已经足够。 现在,按照用户的要求,生成相关问题问题应该围绕这个示例可能涉及的C++知识点,比如文件操作、vector使用、字符串处理,或者可能的扩展方向,比如如何处理不同题型、性能优化等。</think>### C++ 编程解决作业检查示例 以下示例演示如何用C++实现简单的作业检查程序,用于对比学生答案与标准答案的一致性: ```cpp #include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; int main() { vector<string> studentAnswers, correctAnswers; // 读取学生答案文件 ifstream studentFile("student_answers.txt"); string line; while (getline(studentFile, line)) { studentAnswers.push_back(line); } studentFile.close(); // 读取标准答案文件 ifstream correctFile("correct_answers.txt"); while (getline(correctFile, line)) { correctAnswers.push_back(line); } correctFile.close(); // 检查文件行数一致性 if (studentAnswers.size() != correctAnswers.size()) { cerr << "错误:答案数量不一致" << endl; return 1; } // 逐题比对答案 int score = 0; for (size_t i = 0; i < studentAnswers.size(); ++i) { if (studentAnswers[i] == correctAnswers[i]) { score++; } else { cout << "第" << i+1 << "题错误 | 学生答案:" << studentAnswers[i] << " | 标准答案:" << correctAnswers[i] << endl; } } cout << "最终得分:" << score << "/" << studentAnswers.size() << endl; return 0; } ``` #### 关键实现解析 1. **文件读取**:使用`ifstream`读取文本文件,逐行存储到`vector<string>`容器中[^3] 2. **容器操作**:通过`vector`实现动态数组管理,适应不同题量的作业检查 3. **字符串比对**:直接对比字符串内容,适用于选择题、填空题等题型 4. **错误处理**:检测文件行数差异,避免越界访问[^1] #### 扩展方向 - **支持数学表达式**:将字符串转换为数值类型,处理浮点数精度误差 ```cpp #include <cmath> bool isEqual(double a, double b, double epsilon = 0.001) { return fabs(a - b) < epsilon; } ``` - **代码题检查**:集成编译器API(如Clang)实现代码逻辑验证[^4] - **多线程优化**:使用`std::thread`并行处理大题量作业
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值