我的代码只是计算学生的最终成绩。当我在CodeBlocks中运行它时,我没有问题。但是,当我在Visual Studio中复制它(想要尝试IDE)时,我收到错误vector subscript out of range
。
main.cpp
中的:
#include <iostream>
#include <vector>
#include <stdexcept>
#include "info.h"
#include "grade.h"
int main()
{
std::cout << "enter name and grades" << std::endl;
std::vector<info> students;
info record;
while (read(std::cin, record))
{
students.push_back(record);
}
for (std::vector<info>::size_type i = 0; i < students.size(); i++)
{
std::cout << students[i].name << " ";
try
{
double finalgrade = grade(students[i]); // ERROR
std::cout << finalgrade;
}
catch (std::domain_error e)
{
std::cout << e.what();
}
std::cout << std::endl;
}
return 0;
}
在info.h
:
#ifndef GUARD_info
#define GUARD_info
#include <string>
#include <vector>
struct info
{
std::string name;
double midterm, final;
std::vector<double> homework;
};
std::istream& read_hw(std::istream&, std::vector<double>&);
std::istream& read(std::istream&, info&);
#endif
在info.cpp
:
#include <iostream>
#include <vector>
#include "info.h"
std::istream& read_hw(std::istream& in, std::vector<double>& hw)
{
if (in)
{
hw.clear();
double x;
while (in >> x)
{
hw.push_back(x);
}
in.clear();
}
return in;
}
std::istream& read(std::istream& in, info& stu)
{
in >> stu.name >> stu.midterm >> stu.final;
read_hw(in, stu.homework);
return in;
}
我有median.cpp
,median.h
,grade.cpp
和grade.h
个文件,其中包含计算中位数和最终成绩的函数(随着帖子越来越长,将它们保留下来)。< / p>
我认为问题不在于代码本身(因为它在CodeBlocks上运行良好),而是与不同编译器的兼容性。我还没有找到一个令人满意的答案,并且很乐意得到关于可能导致错误的内容的输入(visual studio构建它没有错误,但在显示最终成绩时失败)。谢谢。
编辑:以下是grade.cpp
,grade.h
,median.cpp
和median.h
个文件:
在grade.cpp
:
#include <vector>
#include <stdexcept>
#include "median.h"
#include "info.h"
double grade(double midterm, double final, double hw)
{
return 0.2*midterm + 0.4*final + 0.4*hw;
}
double grade(double midterm, double final, const std::vector<double>& hw)
{
if (hw.size() == 0)
throw std::domain_error("Student has done no homework.");
return grade(midterm, final, median(hw));
}
double grade(const info& stu)
{
return grade(stu.midterm, stu.final, stu.homework);
}
在grade.h
:
#ifndef GRADE_H_INCLUDED
#define GRADE_H_INCLUDED
#include <vector>
#include "info.h"
#include <stdexcept>
double grade(double, double, double);
double grade(double, double, const std::vector<double>&);
double grade(const info&);
#endif
在median.cpp
:
#include <vector>
#include <stdexcept>
double median(std::vector<double> vec)
{
if (vec.size() == 0)
throw std::domain_error("Median of an empty vector.");
typedef std::vector<double>::size_type vec_sz;
vec_sz size = vec.size();
vec_sz mid = size / 2;
return size % 2 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid];
}
在median.h
:
#ifndef GUARD_median_h
#define GUARD_median_h
#include <vector>
double median(std::vector<double>);
#endif
答案 0 :(得分:1)
我错误地写了我的median()函数
return size % 2 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid];
我应该写的时候
return size % 2 == 0 ? (vec[mid] + vec[mid - 1]) / 2 : vec[mid];
谢谢MarkU!