课程设计-问卷调查处理系统(C++)

题目要求

编写一个应用程序,处理问卷调查的回收答卷,统计调查结果,提供信息查询。

【问题详述】

某调查机构每次发放的调查问卷有n(例如n=20)个单项选择题,每个题都是由题目和ABCD共4个选项构成,题目和选项全部是文字,且长度(含标点符号)都少于40个汉字(80个字符)。每次发放调查问卷的数量都在P(例如P=10000)份以内。要求应用程序对回收的答卷作如下处理:

  1. 统计回收答卷的总数和有效答卷数。如果答卷中任意一题出现多选、未答或者是选项以外的答案,该答卷视为无效。例如,可能某次调查问卷的统计结果为:发放问卷2000份,回收答卷1953份,有效答卷1920份。

  2. 统计有效答卷中每一题四种选项的数量。例如,某次问卷的统计结果是,第2题选择A选项的答卷数量为448,选择B选项的答卷数量为1205,选C的为253,选D的为14。

  3. 有效答卷中单题的选项分布查询:用户输入一个题号,程序显示题目,全部选项的文字内容并列出调查答卷中该题各种选项的百分比。

    例如针对某次问卷,输入题号为2时,查询结果为:

    题目问题是,“你对自己所学的专业感兴趣吗?”,对应的选项文字及答题分布情况为:

    选择A“很感兴趣” 的占23.3%;

    选择B “比较感兴趣” 的占62.8%;

    选择C“还行吧” 的占13.2%;

    选择D“没有兴趣” 的占0.7%;

  4. 卷面内容查询:输入题号,显示卷面上该题及其各个选项的文字内容。

【提示】

  1. 将调查问卷内容按题号顺序保存为文本文件QST.txt,每题占5行:题目占一行,每个选项的文字各占一行。例如,第5题在文件中的内容是:

    5.你喜欢玩网络游戏吗?

    A:很喜欢,经常是一玩就不知道吃饭睡觉。

    B:喜欢,有空时经常玩游戏,但不会影响正常工作学习。

    C:有时玩。大家都玩,不能显得太另类了吧。

    D:太费时间了,不玩。

  2. 将回收答卷的数据保存为文本文件ANS.txt。文件的一行对应一份回收答卷,每一行都是由试卷中的n个题目的答案字母(大写)组成,可以统一不含空格,这样每行都是串长为n的字符串。例如,某答卷第10题选择了A,则对应行的第10个字母是A。无效答案记为字母X。

  3. 统计结果写到RSLT.txt文件中,该文件的每行对应有效答卷一题的统计结果,每行5个整数,分别表示题号、选择A,B,C,D的答卷数量。例如,假设结果文件中第2行的5个数值是:2 448 1205 253 14,表示在回收的答卷中,第2题选择A,B,C,D的数量分别是448,1205, 253和14。

  4. 请自行设计一套调查问卷题目与选项文字以及回收答卷的数据,作为程序运行的输入数据

思路

  1. 读取题目和选项数据:从题目和选项的文本文件(QST.txt)中读取题目和选项的内容。每个题目由题目标题和四个选项构成,可以使用一个结构体来表示题目和选项的组合。

  2. 读取回收答卷数据:从回收答卷的文本文件(ANS.txt)中读取回收答卷的内容。每一行表示一份答卷,每个字符代表对应题目的选择。可以使用一个字符串的向量来保存回收答卷的数据。

  3. 统计回收答卷的总数和有效答卷数:遍历回收答卷数据,对每份答卷进行验证。如果答卷中任意一题出现多选、未答或选项以外的答案,则该答卷视为无效。根据验证结果,统计回收答卷的总数和有效答卷数。

  4. 统计有效答卷中每一题四种选项的数量:遍历有效答卷数据,对每份答卷的每个题目的选择进行统计。使用一个结构体数组来保存每一题的统计结果,包括题目编号和四种选项的数量。

  5. 输出统计结果到文件:将统计结果写入到结果文件(RSLT.txt)中。每一行表示一道题目的统计结果,包括题目编号和四种选项的数量。

  6. 查询单题选项分布:根据用户输入的题号,查询对应题目的选项分布情况。通过题目编号从题目结构体数组和统计结果结构体数组中获取相关信息,并计算每个选项的百分比。

  7. 查询卷面内容:根据用户输入的题号,查询对应题目的题目内容和选项文字。通过题目编号从题目结构体数组中获取相关信息。

代码

// main.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iomanip>

using namespace std;

// 存储题目和选项的结构体
struct Question {
    string title;
    vector<string> options;
};

// 统计结果的结构体
struct Result {
    int questionNumber;
    int optionCounts[4];
};

// 读取题目和选项数据
vector<Question> readQuestions(const string& filename) {
    vector<Question> questions;
    ifstream file(filename);

    if (file.is_open()) {
        string line;
        while (getline(file, line)) {
            Question question;
            question.title = line;

            for (int i = 0; i < 4; i++) {
                getline(file, line);
                question.options.push_back(line);
            }

            questions.push_back(question);
        }

        file.close();
    } else {
        cout << "Failed to open file: " << filename << endl;
    }

    return questions;
}

// 读取回收答卷数据
vector<string> readAnswerSheets(const string& filename) {
    vector<string> answerSheets;
    ifstream file(filename);

    if (file.is_open()) {
        string line;
        while (getline(file, line)) {
            answerSheets.push_back(line);
        }

        file.close();
    } else {
        cout << "Failed to open file: " << filename << endl;
    }

    return answerSheets;
}

// 统计回收答卷的总数和有效答卷数
void countAnswerSheets(const vector<string>& answerSheets, int& totalSheets, int& validSheets) {
    totalSheets = answerSheets.size();
    validSheets = 0;

    for (const string& sheet : answerSheets) {
        bool isValid = true;

        for (char answer : sheet) {
            if (answer != 'A' && answer != 'B' && answer != 'C' && answer != 'D') {
                isValid = false;
                break;
            }
        }

        if (isValid) {
            validSheets++;
        }
    }
}

// 统计有效答卷中每一题四种选项的数量
vector<Result> countOptions(const vector<string>& answerSheets) {
    vector<Result> results;

    for (int i = 0; i < answerSheets[0].size(); i++) {
        Result result;
        result.questionNumber = i + 1;
        fill(result.optionCounts, result.optionCounts + 4, 0);

        for (const string& sheet : answerSheets) {
            char answer = sheet[i];

            if (answer == 'A') {
                result.optionCounts[0]++;
            } else if (answer == 'B') {
                result.optionCounts[1]++;
            } else if (answer == 'C') {
                result.optionCounts[2]++;
            } else if (answer == 'D') {
                result.optionCounts[3]++;
            }
        }

        results.push_back(result);
    }

    return results;
}

// 输出统计结果到文件
void writeResults(const vector<Result>& results, const string& filename) {
    ofstream file(filename);

    if (file.is_open()) {
        for (const Result& result : results) {
            file << result.questionNumber << " ";
            for (int i = 0; i < 4; i++) {
                file << result.optionCounts[i] << " ";
            }
            file << endl;
        }

        file.close();
    } else {
        cout << "Failed to open file: " << filename << endl;
    }
}

// 查询单题选项分布
void queryOptionDistribution(const vector<Question>& questions, const vector<Result>& results, int questionNumber) {
    if (questionNumber < 1 || questionNumber > questions.size()) {
        cout << "Invalid question number." << endl;
        return;
    }

    const Question& question = questions[questionNumber - 1];
    const Result& result = results[questionNumber - 1];
    int total = result.optionCounts[0] + result.optionCounts[1] + result.optionCounts[2] + result.optionCounts[3];

    cout << "题目问题是:" << question.title << endl;
    cout << "对应的选项文字及答题分布情况为:" << endl;

    for (int i = 0; i < 4; i++) {
        cout << "选择" << static_cast<char>('A' + i) << " \"" << question.options[i] << "\" 的占" << fixed << setprecision(1) << (result.optionCounts[i] * 100.0 / total) << "%;" << endl;
    }
}

// 查询卷面内容
void queryQuestionContent(const vector<Question>& questions, int questionNumber) {
    if (questionNumber < 1 || questionNumber > questions.size()) {
        cout << "Invalid question number." << endl;
        return;
    }

    const Question& question = questions[questionNumber - 1];

    cout << "题目问题是:" << question.title << endl;
    cout << "对应的选项文字为:" << endl;

    for (int i = 0; i < 4; i++) {
        cout << static_cast<char>('A' + i) << ":" << question.options[i] << endl;
    }
}

int main() {
    string questionFile = "QST.txt";  // 题目和选项文件名
    string answerFile = "ANS.txt";    // 回收答卷文件名
    string resultFile = "RSLT.txt";   // 统计结果文件名

    // 读取题目和选项数据
    vector<Question> questions = readQuestions(questionFile);

    // 读取回收答卷数据
    vector<string> answerSheets = readAnswerSheets(answerFile);

    // 统计回收答卷的总数和有效答卷数
    int totalSheets, validSheets;
    countAnswerSheets(answerSheets, totalSheets, validSheets);
    cout << "回收答卷总数:" << totalSheets << endl;
    cout << "有效答卷数:" << validSheets << endl;

    // 统计有效答卷中每一题四种选项的数量
    vector<Result> results = countOptions(answerSheets);

    // 输出统计结果到文件
    writeResults(results, resultFile);

    // 查询单题选项分布
    int questionNumber;
    cout << "请输入题号进行选项分布查询:" << endl;
    cin >> questionNumber;
    queryOptionDistribution(questions, results, questionNumber);

    // 查询卷面内容
    cout << "请输入题号进行卷面内容查询:" << endl;
    cin >> questionNumber;
    queryQuestionContent(questions, questionNumber);

    return 0;
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学生信息管理系统是一种用于管理学生信息的软件系统。它能够帮助学校或教育机构高效地管理和维护学生的基本信息、课程成绩、考勤记录等重要数据。 在C语言课程设计中,学生信息管理系统可以通过使用C语言进行编程实现。首先,我们需要定义学生信息的数据结构,包括学号、姓名、年龄、性别、班级等字段。 其次,通过使用C语言中的文件操作函数,我们可以创建一个文件来存储学生信息。可以使用C语言中的文件打开、写入、读取等函数来实现将学生信息保存至文件,以及从文件中读取学生信息的功能。 在学生信息管理系统中,还可以实现添加学生、删除学生、修改学生信息等功能。通过用户输入相应的指令或菜单,我们可以在系统中进行这些操作,并将修改后的学生信息保存至文件。 此外,在管理系统中还可以实现查询学生信息、统计学生人数等功能。用户可以输入学生的学号或姓名来查询学生的相关信息,例如成绩、年龄等。通过编程实现统计学生人数的功能,可以对学生总人数、男女生人数等进行统计,并将结果输出给用户。 学生信息管理系统设计还可以考虑使用界面来提升用户体验。在C语言中,可以使用图形界面库或控制台UI库来设计一个简洁美观的界面,使用户可以方便地进行操作。 总之,C语言课程设计中的学生信息管理系统可以利用C语言的特点和文件操作等功能,实现学生信息的添加、删除、修改、查询和统计等基本操作,提高学生信息的管理效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值