Изменение массива фиксированного размера на вектор

Данный файл содержит пары. Затем возьмите двухзначное число (называемое X) и вычислите сумму выигрыша / проигрыша. Правило выигрыша / проигрыша: если введенное число совпадает с X, то это выигрыш, а общая сумма выигрыша равна (сумма * 70); в противном случае это потеря (-сумма).

For example: [ticket.txt] 09 10
13 15
25 21

Если номер броска равен 09, сумма выигрыша / проигрыша билета равна (10 * 70 — 15 — 21 = 664)

Если число броска составляет 42, сумма выигрыша / проигрыша билета равна (-10 — 15 — 21 = -46).

Время чтения файла по массивам имеет фиксированный размер. Я имею в виду, что если файл ticket.txt не имеет определенного размера. Может кто-нибудь помочь мне изменить файл чтения по массиву на вектор или что-то еще не имеет фиксированного размера.

For example: [ticket.txt] 09 10
13 15
25 21
.. ..

#include <iostream>
#include <fstream>

using namespace std;
int line1[100]; // array that can hold 100 numbers for 1st column
int line2[100]; // array that can hold 100 numbers for 2nd column
int main()
{
int winNum, winAmount = 0, lostAmount = 0, result = 0;
int num = 0; // num start at 0
ifstream inFile;
inFile.open("Ticket.txt"); //open File
if (inFile.fail())
{
cout << "Fail to open the file" << endl;
return 1;
}int myArray[3][2];
for(int i = 0; i < 3; i++)
for(int j = 0; j < 2; j++)
inFile >> myArray[i][j];

cout << "Numbers from File: " << endl;

for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 2; j++)
{
cout << myArray[i][j] << " ";
}
cout << "\n";
}

cout << endl;
cout << "Enter the toss-up number: "; // enter the win number
cin >> winNum;

for(int i = 0; i< 3;i++)
{
if (myArray[i][0] == winNum)
{
winAmount = myArray[i][1] * 70; //  number user choose = win number, winAmount = winAmount * 70 - lostAmount
}
else
{
lostAmount = lostAmount + myArray[i][1]; //number user choose != win number, the amount will be -lost amounts
}
}

result = winAmount - lostAmount;
cout << result;

cout << endl << endl;
system("pause");
return 0;
}

-1

Решение

Есть множество разных способов решения этой проблемы.

Можно сделать vector из vectors

std::vector<std::vector<int>> myArray;

но это довольно расточительно. Только внутренний размер имеет переменный размер, поэтому быстрое улучшение

std::vector<std::array<int, 2>> myArray;

загрузка myArray может быть довольно простым, в зависимости от того, сколько проверки вы хотите включить. Вот это с минимальной проверкой:

int number,amount;
while (inFile >> number >> amount)
{
myArray.push_back({number,amount});
}

Это будет цикл до двух ints не может быть прочитано, будь то из-за конца файла или мусора в файле. Это также легко обмануть файлом с изношенным количеством столбцов. Лучше подходы использовать std::getline чтобы получить целые строки и убедиться, что в каждой строке ровно два действительных числа, и ничего больше.

Остальная часть вашего кода не изменилась.

Но может быть лучший способ сделать это, рассмотреть

а) Сумма убытков никогда не меняется. Вы можете предварительно вычислить его и устранить цикл в случае потери.

б) Расширяя это, вы можете исключить часть цикла в выигрыше. Сумма проигрыша содержит выигрышный номер, используйте сумму проигрыша минус сумму выигрыша. Другими словами,

winnings = amount * 70 - (loss - amount)

Который так же, как

winnings = amount * 70 - loss + amount

или же

winnings = amount * 71 - loss

Таким образом, мы можем перестать смотреть, как только найдем выигрыш, и сделаем только один расчет.

c) Мы можем устранить любую необходимость в цикле поиска с помощью std::map,

Чтение в файле в std::map похож:

std::map<int, int> myMap;

int number,amount;
int loss = 0;
while (inFile >> number >> amount)
{
myMap[number] = amount; // map the amount to the number
loss += amount;
}

и поиск это что-то вроде

int result = 0;
auto found = myMap.find(winNum); // look in the map for a number

if (found != myMap.end()) // number is in the map
{
result = 71* found->second; // take the winnings plus one extra to counterbalance
// number's addition to the losses
}
result -= loss; //remove the loss

Цикл вычислений полностью исключен, и меньше кода почти всегда лучше. Код, которого там нет, содержит ноль ошибок. Если это не быть ошибкой, но это другая проблема.

Примечание: для небольших файлов этот подход будет МЕДЛЕННЫМ. std::map имеет гораздо меньшую временную сложность, чем итерация std::vector, но каждая из этих итераций, которую он должен выполнить, может быть намного дороже.

Документация по std::array

Документация по std::vector

Документация по std::map

0

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

Других решений пока нет …