Как использовать динамический размер массива структур?

Я должен сделать свою домашнюю работу. Это консольное приложение, которое использует массив структур, которые хранят информацию о компьютере (марка, год изготовления, вес и инвентарный номер). Поэтому я написал полностью работающую программу, но я хочу использовать динамический массив, потому что я не знаю, сколько записей будет вводить пользователь.

Есть ли способ сделать это. Чтобы добавить новые записи в массиве, пока пользователь не скажет 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;
}

3

Решение

Да. Вместо вашего массива используйте

std::vector<ComputerInfo> computerArray;

и вы можете добавить столько объектов, сколько захотите:

ComputerInfo c;
// read the data
computerArray.push_back(c);

сейчас, computerArray[0] будет иметь информацию в c,

Вам нужно будет #include <vector>,

Кроме того, вместо char computerMark[20] Вы можете использовать std::string,

1

Другие решения

У вас есть два варианта:

1) Использование std::vector вместо массива. Это очень мощный инструмент и, безусловно, стоит научиться его использовать.

2) Динамически распределяйте массив и изменяйте его размер по мере добавления новых элементов. В основном это означает написание вашей собственной версии std::vector, Это хороший способ укрепить свои навыки программирования. Вы узнаете, что входит в написание стандартных классов и функций. Тем не менее, я советую использовать std::vector в более серьезном программировании, потому что оно уже было тщательно протестировано и отлажено.

0