C++ 使用结构数组(c+;+;)中的数据绘制线图

C++ 使用结构数组(c+;+;)中的数据绘制线图,c++,visual-c++,C++,Visual C++,一个文本文件包含100名学生,每行包括:名字、姓氏、考试1、考试2、考试3。我将文本文件中的数据读入一个结构数组。但是现在我需要在x轴上画一个线图,上面有学生的数量,y轴上有三个学生的考试成绩。考试1为绿色,考试2为红色,考试3为蓝色。并用水平线表示每次考试的平均值。理论上应该是这样的 这是我到目前为止提出的代码,但我还没有弄清楚从何处开始创建线图 #include "library.h" #include<iostream> #include<cmath

一个文本文件包含100名学生,每行包括:名字、姓氏、考试1、考试2、考试3。我将文本文件中的数据读入一个结构数组。但是现在我需要在x轴上画一个线图,上面有学生的数量,y轴上有三个学生的考试成绩。考试1为绿色,考试2为红色,考试3为蓝色。并用水平线表示每次考试的平均值。理论上应该是这样的

这是我到目前为止提出的代码,但我还没有弄清楚从何处开始创建线图

#include "library.h"
#include<iostream>
#include<cmath>
#include <cstdlib>
#include <fstream>
#include <string>
#include <iostream>

using namespace std;

struct StudentInfo {
string first;
string last;
int e1;
int e2;
int e3;
};

void main()
{
 
ifstream in_file;

in_file.open("exams.txt");
StudentInfo students[100];
int count = 0;

while(in_file >> students[count].first){
    in_file >> students[count].last;
    in_file >> students[count].e1;
    in_file >> students [count].e2;
    in_file >> students [count].e3;
    count ++;
}

for (int i = 0; i < count; i++){
 
    cout << students[i].first << " " << students[i].last << " " << students[i].e1 << " " << students[i].e2 << " " << students[i].e3 << endl;
}

in_file.close();
}
#包括“library.h”
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构学生信息{
先串;
最后一串;
INTE1;
int e2;
INTE3;
};
void main()
{
_文件中的ifstream;
在_file.open(“exams.txt”);
学生信息学生[100];
整数计数=0;
while(在_文件>>学生[count].第一个){
在\u文件>>学生[count]中。最后;
在\u文件>>学生[count].e1;
在_文件>>学生[count].e2;
在_文件>>学生[count].e3;
计数++;
}
for(int i=0;icout您很可能希望使用图形库。
有一些人会为你画图表。
还有其他人只能画形状

我使用SFML创建了这个丑陋的示例,因为它是我最熟悉的:

为了速度,我硬编码了很多

这是通过绘制边界来实现的:

std::数组边框{
sf::Vertex(sf::Vector2f(0.f,0.f),sf::Color::Black),
sf::Vertex(sf::Vector2f(0.f,100.f),sf::Color::Black),
sf::顶点(sf::矢量2F(全宽,100.f),sf::颜色::黑色)
};
window.draw(border.data()、border.size()、sf::PrimitiveType::LineStrip);
创建顶点向量以存储折线图的线条部分:

std::矢量线图1;
std::向量线图2;
std::矢量线图3;
遍历每个学生并向这些向量添加顶点:

line\u graph\u 1.向后放置(sf::Vector2f(x,100.f-student.e1),sf::Color::Red);
线条图2.放置背面(sf::Vector2f(x,100.f-student.e2),sf::Color::Green);
线图3.放置背面(sf::Vector2f(x,100.f-student.e3),sf::Color::Blue);
在底部绘制名称:

text.setString(student.first+''+student.last);
const auto bounds=text.getLocalBounds();
text.setPosition(
x+bounds.left-bounds.width/2.f,
128.f+bounds.top-bounds.height/2.f
);
窗口。绘制(文本);
在遍历所有学生之后,我绘制了线向量:

window.draw(line\u graph\u 1.data()、line\u graph\u 1.size()、sf::PrimitiveType::LineStrip);
window.draw(line_graph_2.data()、line_graph_2.size()、sf::PrimitiveType::LineStrip);
绘制(线图3.data(),线图3.size(),sf::PrimitiveType::LineStrip);
最后画出平均线:

std::数组平均线{
顶点(sf::Vector2f(0.f,100.f-平均值),sf::Color::Red),
顶点(sf::矢量2F(全宽,100.f-平均值),sf::颜色::红色)
};
window.draw(average_-line.data()、average_-line.size()、sf::PrimitiveType::Lines);
平均线={
顶点(sf::Vector2f(0.f,100.f-平均值),sf::Color::Green),
顶点(sf::矢量2F(全宽,100.f-平均值),sf::颜色::绿色)
};
window.draw(average_-line.data()、average_-line.size()、sf::PrimitiveType::Lines);
平均线={
顶点(向量2f(0.f,100.f-平均值3),颜色::蓝色),
顶点(sf::矢量2F(全宽,100.f-平均值),sf::颜色::蓝色)
};
window.draw(average_-line.data()、average_-line.size()、sf::PrimitiveType::Lines);

类似的图形库是一个好的开始,没有图形化。

你有一个图形库你应该用来做这个任务吗?C++不知道没有帮助的像素是什么,所以你必须弄清楚在你走之前,你将使用哪个图形库。常用的GUI L图书馆包括,或者,但是还有很多其他的你可能想看看。用你最喜欢的搜索引擎试试
c++GUI框架
。。令人惊讶的是,你被要求完成一个图形作业,却对如何做图形一无所知。我会检查你是否正确理解了要求。但是e是没有图形可以做的事情。例如,你可以计算平均值。在任何情况下,一旦你对图形部分进行排序,就需要能够做到这一点。