如何使用动态大小的结构数组?
Posted
技术标签:
【中文标题】如何使用动态大小的结构数组?【英文标题】:How to use a dynamically sized array of structs? 【发布时间】:2012-09-10 13:29:33 【问题描述】:我必须做作业。它是一个控制台应用程序,它使用一组结构来保存有关计算机的信息(品牌、制造年份、重量和库存编号)。所以我写了一个完全可以工作的程序,但是我想用一个动态数组,因为我不知道用户会输入多少条记录。
有没有办法做到这一点。要在数组中添加新记录,直到用户说 n/N?有什么建议吗?
这是我的程序版本:
#include "stdafx.h"
#include <iostream>
using namespace std;
struct ComputerInfo
char computerMark[20], invertarNumber[6];
unsigned int year;
float weight;
;
ComputerInfo computerArray[300];
ComputerInfo AddComputers(ComputerInfo compterArray[], int counter)
cout << "Enter mark of the computer: ";
cin >> computerArray[counter].computerMark;
cout << "Enter year of establish: ";
cin>> computerArray[counter].year;
while ((computerArray[counter].year < 1973)
|| (computerArray[counter].year > 2013))
cout << "INVALID YEAR!!!" << endl;
cout << "Enter year of establish: ";
cin>> computerArray[counter].year;
cout << "Enter computer weidth: ";
cin >> computerArray[counter].weight;
cout << "Enter computer invertar number(up to six digits): ";
cin >> computerArray[counter].invertarNumber;
return computerArray[counter];
void ShowRecords()
int counter = 0;
while (computerArray[counter].year != 0)
cout << "Mark: " << computerArray[counter].computerMark << endl;
cout << "Year: " << computerArray[counter].year << endl;
cout << "Weidth: " << computerArray[counter].weight << endl;
cout << "Inv. number: " << computerArray[counter].invertarNumber << endl << endl;
counter++;
void MoreThanTenYearsOld(ComputerInfo computerArray[])
int counter = 0;
float counterOldComputers = 0;
float computerPer = 0;
while (computerArray[counter].year == 0)
if (computerArray[counter].year <= 2003)
counterOldComputers++;
counter++;
computerPer = counterOldComputers / 3;
cout << endl;
cout << "Percantage of old computers is: " << computerPer << endl;
int main()
int counter = 0;
float computerPer = 0;
char answer = 'y';
for (int i = 0; i <= 299; i++)
strcpy(computerArray[i].computerMark,"");
while((answer == 'Y') || (answer == 'y'))
computerArray[counter] = AddComputers(computerArray, counter);
cout << endl;
cout << "Do you want to enter more records (Y/N): ";
cin >> answer;
cout << endl;
counter++;
MoreThanTenYearsOld(computerArray);
return 0;
【问题讨论】:
停止使用数组,开始使用std::vector
。
只是想知道:为什么是 1973..2013 范围?
【参考方案1】:
是的。而不是你的数组,使用
std::vector<ComputerInfo> computerArray;
您可以添加任意数量的对象:
ComputerInfo c;
// read the data
computerArray.push_back(c);
现在,computerArray[0]
将拥有c
中的信息。
您需要#include <vector>
。
此外,您可以使用std::string
代替char computerMark[20]
。
【讨论】:
并在vector
中使用std::string
。
@honk 你的意思是在ComputerInfo
里面?
是的,正是为了帮助自动生成的复制构造函数。但你知道的。
这个答案没有解决 OP 明确表示他正在做作业并且可能不允许使用 STL 类的事实。
@Code-Guru 问题中没有任何内容建议任何此类限制。在没有更多信息的情况下,我认为像这里所做的那样提供最佳解决方案是正确的方法。【参考方案2】:
你有两个选择:
1) 使用std::vector
而不是数组。这是一个非常强大的工具,当然值得学习如何使用。
2) 动态分配数组并在添加更多项目时调整其大小。基本上这意味着编写您自己的std::vector
版本。这是增强您的编程技能的好方法。您将了解编写标准类和函数的内容。但是,我建议在更严肃的编程中使用std::vector
,因为它已经过彻底的测试和调试。
【讨论】:
以上是关于如何使用动态大小的结构数组?的主要内容,如果未能解决你的问题,请参考以下文章