Данный файл содержит пары. Затем возьмите двухзначное число (называемое 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;
}
Есть множество разных способов решения этой проблемы.
Можно сделать vector
из vector
s
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});
}
Это будет цикл до двух int
s не может быть прочитано, будь то из-за конца файла или мусора в файле. Это также легко обмануть файлом с изношенным количеством столбцов. Лучше подходы использовать 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
, но каждая из этих итераций, которую он должен выполнить, может быть намного дороже.
Других решений пока нет …