gpt4 book ai didi

c++ - 移动结构数组 C++

转载 作者:行者123 更新时间:2023-11-28 05:38:55 25 4
gpt4 key购买 nike

我对 C++ 编程和数据结构还很陌生,确实需要一些帮助。我正在做一个作业,我有一个 100 行的文本文件,每行都有一个项目、一个状态(出售或想要)和一个价格。我需要浏览文本文件并向结构数组添加行,并且在添加行时我需要将新信息与之前提交的信息进行比较。如果有一行是想要的,并且价格高于先前输入的待售商品,则该商品将从结构中删除,并且结构数组会移动。我遇到麻烦的地方在于,一旦找到满足条件的行,就实际移动所有结构。

我的问题是,当我尝试使用第二个 for 循环移动结构数组时,什么也没有发生,我只是得到空结构,而且似乎没有任何东西移动。如果你们能提供任何帮助,我们将不胜感激。下面是文本文件的代码和我当前的代码。

#include<iostream>
#include<fstream>
#include <string>
#include <algorithm>
#include <sstream>

using namespace std;

struct items
{
string type;
int status;
int price;
} itemArray [100];


int main(int argc, char *argv[]) {
int x = -1;
//int chickenCount = 0;
int counter = 0;
int itemsSold = 0;
int itemsRemoved = 0;
int itemsForSale = 0;
int itemsWanted = 0;
string itemType;
int itemStatus = 0;
int itemPrice = 0;
int match = 0;

ifstream myReadFile( "messageBoard.txt" ) ;

std::string line;
//char output[100];
if (myReadFile.is_open()) {
while (!myReadFile.eof()) {
getline(myReadFile,line); // Saves the line in STRING.
line.erase(std::remove(line.begin(), line.end(), ' '), line.end());
//cout<<line<<endl; // Prints our STRING.
x++;
std::string input = line;
std::istringstream ss(input);
std::string token;
while(std::getline(ss, token, ',')) {
counter++;
//std::cout << token << '\n';
if (counter>3){
counter =1;
}
//cout << x << endl;
if (counter == 1){
itemType = token;
//cout<< itemType<<endl;
}
if (counter == 2){
if (token == "forsale"){
itemStatus = 1;
//itemsForSale++;

}
if (token == "wanted"){
itemStatus = 0;
//itemsWanted++;
}
//cout<< itemStatus<<endl;
}
if (counter == 3){
itemPrice = atoi(token.c_str());
//cout<< itemPrice<<endl;
}


//cout<<"yo"<<endl;
}

if (x >= 0){
for (int i = 0; i<100;i++){
if (itemArray[i].type == itemType){
//cout<<itemType<<endl;
if(itemArray[i].status != itemStatus){

if (itemArray[i].status == 1){
if(itemPrice>=itemArray[i].price){
itemsSold++;
match =1;
//itemArray[i].type = "sold";
for (int j=i; j<100-1;j++){
//cout<<j<<endl;
itemArray[j].type = itemArray[j+1].type;
itemArray[j].status = itemArray[j+1].status;
itemArray[j].price = itemArray[j+1].price;
}
i =i-1;

break;
}
}
if (itemArray[i].status == 0){
if(itemArray[i].price>=itemPrice){
itemsSold++;
match = 1;
//itemArray[i].type = "sold";
for (int j=i; j<100-1;j++){
//cout<<j<<endl;
itemArray[j].type = itemArray[j+1].type;
itemArray[j].status = itemArray[j+1].status;
itemArray[j].price = itemArray[j+1].price;
}
i=i-1;
break;
}
}
}
}
}
}

if (counter == 3 && match == 0){
itemArray[(x)].type = itemType;
itemArray[(x)].status = itemStatus;
itemArray[(x)].price = itemPrice;
}

match = 0;
// cout << itemArray[x].type << " " << itemArray[x].status<<" "<<itemArray[x].price<<endl;
}

for(int i=0;i<100;i++){
cout<<itemArray[i].type<< " "<<itemArray[i].status<<" "<<itemArray[i].price<<endl;
}
//cout<<itemArray[1].price<<endl;


cout << itemsSold<<endl;

}
myReadFile.close();

return 0;
}

文本文件:https://drive.google.com/file/d/0B8O3izVcHJBzem0wMzA3VHoxNk0/view?usp=sharing

感谢帮助

最佳答案

我在代码中发现了几个问题,但无法对其进行测试,我认为主要问题是您总是在位置“x”处插入新元素,该位置对应于从文件中读取的当前行,而没有考虑考虑已完成的元素的任何移动。您应该在第一个空槽中插入新元素(或者只是覆盖旧元素而不是移动所有内容)。另一个问题是您没有在数组中初始化状态和价格。

最好的方法是使用更标准的 C++ 功能重写代码,例如:

  • 将项目结构替换为具有定义默认值的构造函数的类
  • 使用对象复制(不需要逐个元素复制结构)
  • 使用标准的 C++ 容器,例如具有插入和删除方法的列表(参见 http://www.cplusplus.com/reference/list/list/)

关于c++ - 移动结构数组 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37607123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com