The code does not compile running into an error in the function userSelectItem(budget budgetData[])
*******Compile*******Error*******
1>------ Build started: Project: Project4, Configuration: Debug Win32 ------
1> main.cpp
1>c:\users\ahoffman\documents\personal\school\cs36 2\project4_new\project4\project4\main.cpp(417): error C2664: 'isCategoryInArray' : cannot convert parameter 1 from 'budget []' to 'budget'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
1>c:\users\ahoffman\documents\personal\school\cs36 2\project4_new\project4\project4\main.cpp(426): error C2664: 'isCategoryInArray' : cannot convert parameter 1 from 'budget []' to 'budget'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
1>c:\users\ahoffman\documents\personal\school\cs36 2\project4_new\project4\project4\main.cpp(432): error C2664: 'NumberOfItemsInArray' : cannot convert parameter 1 from 'budget' to 'budget []'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>c:\users\ahoffman\documents\personal\school\cs36 2\project4_new\project4\project4\main.cpp(436): error C2676: binary '[' : 'budget' does not define this operator or a conversion to a type acceptable to the predefined operator
1>c:\users\ahoffman\documents\personal\school\cs36 2\project4_new\project4\project4\main.cpp(436): error C2228: left of '.categoryName' must have class/struct/union
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Code:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;
const int MAXIMUM_BUDGET_ITEMS = 500;
const int MAXIMUM_USER_INPUT_CATEGORIES = 100;
enum categoryType {income, expense};
struct budget{
categoryType budgetCategory;
string categoryName;
double categoryAmount;
bool cleared;
};
void SetupBudget(budget budgetData[]);
void QueryuserNewOldData(budget budgetData[]);
bool LoadData(budget budgetData[]);
void AddData(budget budgetData[]);
int NumberOfItemsInArray(budget budgetData[]);
bool StringHasSpace(string str);
double GetCategoryAmount();
bool GetCleared();
bool GetCategoryType();
char GetUserInput();
string GetCategoryName();
budget ClearBudgetItems();
int GetMenuSelection(int lower, int upper);
void DisplayBudget(budget budgetData[]);
void SaveData(budget budgetData[]);
void MainMenu(budget budgetData[]);
void DeleteBudgetItem(budget budgetData[]);
string userSelectItem(budget budgetData[]);
bool isCategoryInArray(budget budgetData, string categoryNameString);
int main()
{
budget budgetData[MAXIMUM_BUDGET_ITEMS];
SetupBudget(budgetData);
QueryuserNewOldData(budgetData);
MainMenu(budgetData);
return 0;
}
void SetupBudget(budget budgetData[])
{
for (int i = 0; i < MAXIMUM_BUDGET_ITEMS; i++)
{
budgetData[i] = ClearBudgetItems();
}
}
void QueryUserNewOldData(budget budgetData[])
{
char userChoice = '\0';
userChoice = GetUserInput();
if (userChoice == 'E')
{
if (LoadData(budgetData) == false)
{
AddData(budgetData);
}
}
if (userChoice == 'N')
{
AddData(budgetData);
}
}
bool LoadData(budget budgetData[])
{
bool success = false;
char categoryType;
char cleared;
ifstream inFile;
inFile.open("BUDGET.TXT");
int i = 0;
while (inFile.is_open() && !inFile.eof())
{
inFile >> categoryType >> budgetData[i].categoryName >> budgetData[i].categoryAmount >> cleared;
if (categoryType == 'I')
{
budgetData[i].budgetCategory = income;
}
if (categoryType == 'E')
{
budgetData[i].budgetCategory = expense;
}
if (cleared == 'Y')
{
budgetData[i].cleared = true;
}
if (cleared == 'N')
{
budgetData[i].cleared = false;
}
success = true;
i++;
}
if (!inFile || inFile.eof() || success == false)
{
cout << endl << "Could not open file to load data." << endl
<< "Please enter some data!" << endl;
}
inFile.close();
return success;
}
void AddData(budget budgetData[])
{
char keepEntering = '\0';
int limit = 0;
limit = NumberOfItemsInArray(budgetData);
for
(int i = 0;
(limit + i) < (limit + MAXIMUM_USER_INPUT_CATEGORIES)
&& (limit + i) < MAXIMUM_BUDGET_ITEMS;
i++)
{
if (GetCategoryType() == true)
{
budgetData[i+limit].budgetCategory = income;
}
else
{
budgetData[i+limit].budgetCategory = expense;
}
budgetData[i+limit].categoryName = GetCategoryName();
budgetData[i+limit].categoryAmount = GetCategoryAmount();
budgetData[i+limit].cleared = GetCleared();
do{
cout << endl << "Enter another item Y/N?";
cin >> keepEntering;
if (toupper(keepEntering) == 'N')
i = MAXIMUM_USER_INPUT_CATEGORIES;
} while (toupper(keepEntering) != 'N' && toupper(keepEntering) != 'Y');
}
}
int NumberOfItemsInArray(budget budgetData[])
{
int items = 0;
bool quit = false;
for (int i = 0; quit == false; i++)
{
if (budgetData[i].categoryName != "\0")
items++;
else
quit = true;
}
return items;
}
bool GetCategoryType()
{
char userChoice = '\0';
do {
cout << "Is this an (I)ncome or (E)xpense?" << endl << "Choice : ";
cin >> userChoice;
userChoice = toupper(userChoice);
if (userChoice != 'I' && userChoice != 'E')
{
cout << endl << "!!!!!Please enter I or E" << endl << endl;
}
} while (userChoice != 'I' && userChoice != 'E');
if (userChoice == 'I')
{
return true;
}
if (userChoice == 'E')
{
return false;
}
}
bool GetCleared()
{
char userChoice = '\0';
do {
cout << "Has this item cleared enter Y/N" << endl << "Choice : ";
cin >> userChoice;
userChoice = toupper(userChoice);
if (userChoice != 'Y' && userChoice != 'N')
{
cout << endl << "!!!!!Please enter Y or N" << endl << endl;
}
} while (userChoice != 'Y' && userChoice != 'N');
if (userChoice == 'Y')
{
return true;
}
else
{
return false;
}
}
double GetCategoryAmount()
{
double amount = 0;
do {
cout << "Enter the ammount for the item" << endl
<< "The item must be positive, i.e. 433.22" << endl
<< "Please enter the ammount: ";
cin >> amount;
} while (amount < 0);
return amount;
}
string GetCategoryName()
{
string name = "\0";
do {
cout << "Enter the name for the category" << endl
<< "The category name must be 15 charcters or less" << endl
<< "and it may not contain any spaces" << endl;
cin >> name;
} while (name.size() >= 15 || StringHasSpace(name));
return name;
}
bool StringHasSpace(string str)
{
for (unsigned int i = 0; i < str.length(); i++)
{
if (str[i] == ' ')
return true;
}
return false;
}
char GetUserInput()
{
char userChoice = '\0';
do {
cout << "Which Data would you like to use?" << endl << " N - New budget data" << endl;
cout << " E - Existing budget data" << endl << "Choice : ";
cin >> userChoice;
userChoice = toupper(userChoice);
if (userChoice != 'E' && userChoice != 'N')
{
cout << endl << "!!!!!Please enter E or N" << endl << endl;
}
} while (userChoice != 'E' && userChoice != 'N');
return userChoice;
}
budget ClearBudgetItems()
{
budget b;
b.categoryAmount = 0.00;
b.categoryName = "\0";
b.cleared = false;
b.budgetCategory = income;
return b;
}
int GetMenuSelection(int lower, int upper)
{
int menuSelection = 0;
do{
cin >> menuSelection;
if (menuSelection < lower || menuSelection > upper)
{
cout << "Your selection must be between " << lower << " and "
<< upper << endl << "Please try again: ";
}
} while (menuSelection < lower || menuSelection > upper);
return menuSelection;
}
void DisplayBudget(budget budgetData[])
{
int numberOfBudgetItems = 0;
numberOfBudgetItems = NumberOfItemsInArray(budgetData);
cout << endl << "INCOME:" << endl;
cout << "Item Amount Cleared" << endl;
for (int i = 0; i < numberOfBudgetItems; i++)
{
if (budgetData[i].budgetCategory == income)
{
cout << endl << budgetData[i].categoryName << " " << budgetData[i].categoryAmount;
if (budgetData[i].cleared == true)
cout << " *";
}
}
cout << endl << endl << "Expense:" << endl;
cout << "Item Amount Cleared" << endl;
for (int i = 0; i < numberOfBudgetItems; i++)
{
if (budgetData[i].budgetCategory == expense)
{
cout << endl << budgetData[i].categoryName << " " << budgetData[i].categoryAmount;
if (budgetData[i].cleared == true)
cout << " *";
}
}
}
void SaveData(budget budgetData[])
{
char save = '\0';
do{
cout << "Would you like to save data Y/N?";
cin >> save;
} while ((toupper(save) != 'Y') && (toupper(save) !='N'));
if (toupper(save) == 'Y')
{
ofstream outFile;
outFile.open("BUDGET.TXT");
for (int i = 0; i < NumberOfItemsInArray(budgetData); i++)
{
if (budgetData[i].budgetCategory == income)
{
outFile << "I ";
}
if (budgetData[i].budgetCategory == expense)
{
outFile << "E ";
}
outFile << budgetData[i].categoryName << " " << budgetData[i].categoryAmount << " ";
if (budgetData[i].cleared == true)
{
outFile << 'Y' << endl;
}
else
{
outFile << 'N' << endl;
}
}
outFile.close();
}
}
void MainMenu(budget budgetData[])
{
bool quit = false;
do{
cout << endl << endl
<< "Main Menu!" << endl
<< "(1)Display Budget" << endl
<< "(2)Add Budget Item" << endl
<< "(3)Find Budget Category" << endl
<< "(4)Delete Budget Item" << endl
<< "(5)Exit" << endl;
switch(GetMenuSelection(1, 5))
{
case 1: DisplayBudget(budgetData);
break;
case 2: AddData(budgetData);
break;
case 3: //FindData(budgetData);
break;
case 4: //DeleteData(budgetData);
break;
case 5:
quit = true;
SaveData(budgetData);
break;
}
}while (quit == false);
}
void DeleteBudgetItem(budget budgetData[])
{
do{
string itemToDelete = userSelectItem(budgetData);
int numberOfItemsInBudget = NumberOfItemsInArray(budgetData);
for (int i = 0; i < numberOfItemsInBudget; i++)
{
if (budgetData[i].categoryName == itemToDelete)
{
for (int x = i; x < numberOfItemsInBudget; x++)
{
categoryType budgetCategoryTemp;
string categoryNameTemp;
double categoryAmountTemp;
bool clearedTemp;
budgetCategoryTemp = budgetData[i].budgetCategory;
categoryNameTemp = budgetData[i].categoryName;
categoryAmountTemp = budgetData[i].categoryAmount;
clearedTemp = budgetData[i].cleared;
budgetData[i].budgetCategory = budgetData[i+1].budgetCategory;
budgetData[i].categoryName = budgetData[i+1].categoryName;
budgetData[i].categoryAmount = budgetData[i+1].categoryAmount;
budgetData[i].cleared = budgetData[i+1].cleared;
budgetData[i+1].budgetCategory = budgetCategoryTemp;
budgetData[i+1].categoryName = categoryNameTemp;
budgetData[i+1].categoryAmount = categoryAmountTemp;
budgetData[i+1].cleared = clearedTemp;
if (i == numberOfItemsInBudget - 1)
{
budgetData[i] = ClearBudgetItems();
}
}
}
}
} while(itemToDelete != "quit");
}
string userSelectItem(budget budgetData[])
{
string userInput = NULL;
do{
DisplayBudget(budgetData);
cout << "Enter the name of the item you would like to delete: ";
cin >> userInput;
if(isCategoryInArray(budgetData, userInput))
{
return userInput;
}
else
{
cout << endl << "**Please type the category exactly as shown**" << endl;
}
}while(!isCategoryInArray(budgetData, userInput));
return userInput;
}
bool isCategoryInArray(budget budgetData, string categoryNameString)
{
int itemsInArray = NumberOfItemsInArray(budgetData);
for (int i = 0; i < itemsInArray; i++)
{
if (budgetData[i].categoryName == categoryNameString)
{
return true;
}
}
return false;
}