下面是我的主要:
#include "terremoto.h"
int main(){
std::string filename, zona;
std::ifstream in_stream;
std::ofstream out_stream;
nodo *elenco, *filtroZona;
std::list<Terremoto> elencoDoppio;
float K;
// caricamento dati tramite file
std::cout << "Inserire nome file da caricare\n";
getline(std::cin, filename);
in_stream.open(filename);
// elenco è la linked list con tutti i terremoti
elenco = carica_elenco(in_stream);
// filtro per zone tramite input da tastiera
std::cout << "Inserire zona da filtrare\n";
std::cin >> zona;
filtroZona = filtro_zona(elenco, zona);
std::cout << filtroZona;
// copia di elenco in una double linked list (elencoDoppio)
elenco_to_list(elenco, elencoDoppio);
stampa_dlist(std::cout, elencoDoppio);
// filtro per soglia di magnitudo tramite input da tastiera
std::cout << "Inserire soglia magnitudo (filtra per >=K)\n";
std::cin >> K;
filtra_magnitudo(elencoDoppio, K);
stampa_dlist(std::cout, elencoDoppio);
return 0;
}
这是我terremoto.h:
#ifndef TERREMOTO_H
#define TERREMOTO_H
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include <list>
const int MAX_TERREMOTI = 100;
const int DIM_DATAORA = 20;
class Terremoto{
public:
Terremoto();
Terremoto(const Terremoto &t);
~Terremoto();
Terremoto& operator=(const Terremoto &t);
bool operator<(const Terremoto &other) const;
void getDataOra(char *str) const {std::strcpy(str, dataOra);}
int getProfondita() const {return profondita;}
float getMagnitudo() const {return magnitudo;}
std::string getZona() const {return zona;}
std::string getAnno() const;
private:
std::string zona;
char* dataOra; // 19 lettere "aaaa-mm-gg hh:mm:ss"
int profondita;
float magnitudo; // intervallo (0.0, 10.0)
friend std::istream& operator>>(std::istream &in, Terremoto &t);
friend std::ostream& operator<<(std::ostream &out, const Terremoto &t);
};
struct nodo{
Terremoto value;
nodo *next;
};
nodo* carica_elenco(std::ifstream &in);
void stampa_slist(std::ofstream &out, nodo* n);
float media_magnitudo(nodo *n, std::string anno);
nodo* filtro_zona(nodo* n, std::string zona);
void elenco_to_list(nodo *n, std::list<Terremoto> &l);
void stampa_dlist(std::ostream &out, std::list<Terremoto> &l);
void stampa_recenti(std::ostream &out, std::list<Terremoto> &l, int n);
void filtra_magnitudo(std::list<Terremoto> &l, float K);
#endif
这是我的terremoto.cpp:
#include "terremoto.h"
Terremoto::Terremoto(){
dataOra = new char[DIM_DATAORA];
}
Terremoto::Terremoto(const Terremoto &t){
dataOra = new char[DIM_DATAORA];
zona = t.zona;
strcpy(dataOra, t.dataOra);
profondita = t.profondita;
magnitudo = t.magnitudo;
}
Terremoto::~Terremoto(){
delete dataOra;
}
Terremoto& Terremoto::operator=(const Terremoto &t){
if (&t != this){
zona = t.zona;
strcpy(dataOra, t.dataOra);
profondita = t.profondita;
magnitudo = t.magnitudo;
}
return *this;
}
std::string Terremoto::getAnno() const{
std::string dataOraString(dataOra);
std::string anno = dataOraString.substr(0,4);
return anno;
}
std::istream& operator>>(std::istream &in, Terremoto &t){
std::getline(in, t.zona, ',');
in.getline(t.dataOra, DIM_DATAORA, ',');
in >> t.profondita;
in >> t.magnitudo;
in.ignore();
return in;
}
std::ostream& operator<<(std::ostream &out, const Terremoto &t)
{
out << t.zona << ","
<< t.dataOra << ","
<< t.profondita << ","
<< t.magnitudo << std::endl;
return out;
}
bool Terremoto::operator<(const Terremoto &other) const{
int year = std::stoi(getAnno());
int otherYear = std::stoi(other.getAnno());
return year < otherYear;
}
nodo* push_front(nodo *n, Terremoto t){
nodo *temp;
temp = new nodo;
temp->value = t;
temp->next = n;
return temp;
}
nodo* carica_elenco(std::ifstream &in){
nodo *n;
Terremoto t;
n = 0;
while (in >> t){
n = push_front(n, t);
}
return n;
}
void stampa_slist(std::ofstream &out, nodo* n){
while (n && out){
out << n->value;
n = n->next;
}
return;
}
float media_magnitudo(nodo *n, std::string anno){
float media = 0.0;
int count = 0;
while (n){
if((n->value).getAnno() == anno){
media += (n->value).getMagnitudo();
count++;
}
n = n->next;
}
media /= count;
return media;
}
nodo* filtro_zona(nodo* n, std::string zona){
nodo *n2 = 0;
while (n){
if ((n->value).getZona() == zona){
push_front(n2, (n->value));
}
n = n->next;
}
return n2;
}
void elenco_to_list(nodo *n, std::list<Terremoto> &l){
while (n){
l.push_back(n->value);
n = n->next;
}
return;
}
void stampa_dlist(std::ostream &out, const std::list<Terremoto> &l){
std::list<Terremoto> temp;
std::list<Terremoto>::iterator iter;
temp = l;
for (iter = temp.begin(); iter != temp.end(); iter++){
out << *iter;
}
out << std::endl;
return;
}
void stampa_recenti(std::ostream &out, const std::list<Terremoto> &l, int n){
std::list<Terremoto> temp;
std::list<Terremoto>::iterator iter;
int count;
temp = l;
temp.sort();
for (iter = temp.begin(), count = 0; iter != temp.end() && count < n; iter++){
out << *iter;
count++;
}
out << std::endl;
return;
}
void filtra_magnitudo(std::list<Terremoto> &l, float K)
{
std::list<Terremoto>::iterator iter;
iter = l.begin();
while (iter != l.end()){
if (iter->getMagnitudo() < K){
iter = l.erase(iter);
}
else
iter++;
}
return;
}
(Visual Studio代码)Terremoto. h-从第43行开始:
- 标记列表(...):VSCode建议“找不到'stampa_elenco'的函数定义”(这不是函数的名称,我也尝试重新启动,但错误仍然存在。
- 元素列表(...):和上面一样,但这次函数名是正确的。
- 标记列表(...):同样,它指出“stampa_elenco()”缺少一个定义,而且这也不是名称。
编译时,我只得到一个stampa_dlist(...)错误,如下所示:
未定义对“stampa_dlist(std::ostream&,std::__cxx11::list〈远程列表,std::分配器〉&)”的引用
显然是在 Backbone.js 道上发现的。
1条答案
按热度按时间hfyxw5xn1#
正如Richard Critten所建议的,定义中的“const”显然有问题,无论你检查多少,有时候完全不熟悉CS和需要休息的组合确实会击中:D
很抱歉问了这么愚蠢的问题,但还是谢谢你让我大开眼界