小明的调查作业

小明的调查作业

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述
小明的老师布置了一份调查作业,小明想在学校中请一些同学一起做一项问卷调查,聪明的小明为了实验的客观性,想利用自己的计算机知识帮助自己。他先用计算机生成了N个1到1000之间的随机整数(0<N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入
输入有2行,第1行为1个正整数,表示所生成的随机数的个数:
N
第2行有N个用空格隔开的正整数,为所产生的随机数。
输出
输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
样例输入
10
20 40 32 67 40 20 89 300 400 15
样例输出
8
15 20 32 40 67 89 300 400

//冒泡法/

#include<stdio.h>

int a[1000],b[1000];
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
if(a[j]>a[j+1])
a[j]^=a[j+1]^=a[j]^=a[j+1];
}
j=1;
i=1;
b[0]=a[0];
while(i<n)
{
if(a[i-1]!=a[i])
b[j++]=a[i];
i++;
}
printf("%d\n",j);
for(i=0;i<j;i++)
printf("%d ",b[i]);
printf("\n");
return 0;

}

/快排法/

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int n,i,a[1000],b[1000],j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(a[0]),cmp);
j=1;
i=1;
b[0]=a[0];
while(i<n)
{
if(a[i-1]!=a[i])
b[j++]=a[i];
i++;
}
printf("%d\n",j);
for(i=0;i<j;i++)
printf("%d ",b[i]);
printf("\n");
return 0;
}

<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、付费专栏及课程。

余额充值