基于数组的数据库无法正常工作

时间:2014-12-08 15:57:40

标签: c++ arrays

我必须为基于数组的数据库编写一个程序,该程序允许用户输入新数据,更新现有数据,删除条目和查看条目列表。需求是一个名为DATE的结构,一个名为CustData的结构,用于保存用户数据,一个类型为CustData的数组,大小为10,需要一个单独的函数来输入,更新,删除和显示客户数据。它还需要使用while循环来初始化数组中的每个索引,并将所有内容初始化为0.我编写了一个粗略的程序但是我工作的越多,我就越觉得我做错了。到目前为止,我已经开始工作,它允许我添加多个条目而不覆盖以前的条目,但我似乎无法限制我可以输入的条目数。我也有正确的条目显示。非常感谢任何可以提供的帮助,下面是我的程序到目前为止,一些数据输入部分被注释掉,以便更容易测试。我对此表示歉意,这是用C ++编写的,用visual studio 2013编写。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>



using namespace std;

struct Date
{
    int month,
        day,
        year;
};

struct cust
{
    int ID;
    string name;
    string address;
    string city;
    string state;
    string zip;
    string phone;
    double balance;
    Date lastpayment;
};

const int SIZE = 10;



int menuchoice;
int num = 0;
int i;

void showmenu();
void funcentercustdata(cust[], int);
void funcupdatecustdata();
void funcdeletecustdata();
void funcdisplaycustdata(cust[], int);
cust custdb[SIZE];

int main()
{
    cout << "Welcome to Michael's Marvelous Database Contrabulator!\n";
    cout << setw(10) << "Customer Database\n\n\n";

    showmenu();

    int index;

    for (index = 0; index < SIZE; index++)
    {
        custdb[index].ID = 0;
        custdb[index].name = "";
        custdb[index].address = "";
        custdb[index].city = "";
        custdb[index].state = "";
        custdb[index].zip = "";
        custdb[index].phone = "";
        custdb[index].balance = 0.00;
        custdb[index].lastpayment.month = 0;
        custdb[index].lastpayment.day = 0;
        custdb[index].lastpayment.year = 0;
    }

    return 0;
}

void showmenu()
{
    cout << "\n\n1) Enter new customer data.\n";
    cout << "2) Update customer data.\n";
    cout << "3) Delete customer data.\n";
    cout << "4) Display Customer data.\n";
    cout << "5) Quit the program.\n\n";
    cout << "Please enter your choice: ";
    cin >> menuchoice;

    do
    {
        switch (menuchoice)
        {
        case 1:
            funcentercustdata(custdb, SIZE);
            showmenu();
            break;
        case 2:
            funcupdatecustdata();
            showmenu();
            break;
        case 3:
            funcdeletecustdata();
            showmenu();
            break;
        case 4:
            funcdisplaycustdata(custdb, SIZE);
            showmenu();
            break;
        case 5:
            cout << "Thank you and have a nice day!\n";
            break;
        default:
            cout << "Please enter a correct choice\n";
            cin >> menuchoice;
            break;
        }
    } while (menuchoice != 5);

}
void funcentercustdata(cust custinfo[], int size)
{
        if (custinfo[i].ID != 0)
        {
            i++;
            cout << "\n\nEnter ID: ";
            cin >> custinfo[i].ID;
            cout << "Enter name: ";
            cin.ignore(0);
            cin >> custinfo[i].name;

            /*      cout << "Enter address: ";
                    cin.ignore(0);
                    cin>>custinfo[i].address;
                    cout << "Enter city: ";
                    cin.ignore(0);
                    cin>>custinfo[i].city;
                    cout << "Enter state: ";
                    cin.ignore(0);
                    cin>>custinfo[i].state;
                    cout << "Enter zip: ";
                    cin.ignore(0);
                    cin>>custinfo[i].zip;
                    cout << "Enter phone number (###-###-####): ";
                    cin.ignore(0);
                    cin>>custinfo[i].phone;

                    cout << "Enter balance: ";
                    cin >> custinfo[i].balance;
                    cout << "Enter last payment (mo day year, e.g. 11 17 2014): ";
                    cin >> custinfo[i].lastpayment.month >> custinfo[i].lastpayment.day
                    >> custinfo[i].lastpayment.year;
                    cin.ignore(1);
                    //  }*/
            cout << "Customers successfully added.\n";
        }
        else if (custinfo[i].ID != 0 && custinfo[i].ID >= 4)
        {
            cout << "No further inputs allowed\n";
        }
        else
        {
            cout << "\n\nEnter ID: ";
            cin >> custinfo[i].ID;
            cout << "Enter name: ";
            cin.ignore(0);
            cin >> custinfo[i].name;

            /*      cout << "Enter address: ";
            cin.ignore(0);
            cin>>custinfo[i].address;
            cout << "Enter city: ";
            cin.ignore(0);
            cin>>custinfo[i].city;
            cout << "Enter state: ";
            cin.ignore(0);
            cin>>custinfo[i].state;
            cout << "Enter zip: ";
            cin.ignore(0);
            cin>>custinfo[i].zip;
            cout << "Enter phone number (###-###-####): ";
            cin.ignore(0);
            cin>>custinfo[i].phone;

            cout << "Enter balance: ";
            cin >> custinfo[i].balance;
            cout << "Enter last payment (mo day year, e.g. 11 17 2014): ";
            cin >> custinfo[i].lastpayment.month >> custinfo[i].lastpayment.day
            >> custinfo[i].lastpayment.year;
            cin.ignore(1);
            //  }*/
            cout << "Customers successfully added.\n";
        }
    }
void funcupdatecustdata()
{
    cout << "insert function 2\n\n";
}
void funcdeletecustdata()
{
cout << "insert function 3\n\n";
}
void funcdisplaycustdata(cust custinfo[], int size)
    {
        for (int i = 0; i < size; i++)
        {
            if (custinfo[i].ID == 0)
                cout << " ";
            else if (custinfo[i].ID != 0)
            {
            cout << "\n\nClient ID: " << custinfo[i].ID << endl;
            cout << "Client name: " << custinfo[i].name << endl;
            /*      cout << "Client address: " << custinfo[i].name << endl;
                    cout << "Client city: " << custinfo[i].name << endl;
                    cout << "Client state: " << custinfo[i].name << endl;
                    cout << "Client zip: " << custinfo[i].name << endl;
                cout << "Client phone: " << custinfo[i].name << endl;*/
            cout << "Client balance: " << custinfo[i].balance << endl;
            cout << "Client last deposit: " << custinfo[i].lastpayment.month << "/" <<
                custinfo[i].lastpayment.day << "/" << custinfo[i].lastpayment.year << endl;
        }
    }
    }

1 个答案:

答案 0 :(得分:1)

您已经就程序中的问题提出了多个问题。所以我将看看第一个问题:

我似乎无法限制我可以输入的条目数

首先,您的代码存在一些根本性缺陷。一个缺陷就是showmenu()函数重复调用showmenu()。这是一个递归调用,完全没必要。想象一下,如果您的程序或类似程序以这种方式构建,必须每天24小时运行,并且添加了数千个条目。您将使用所有递归调用来彻底清除堆栈。所以这必须修复。

其次,showmenu(),至少对我来说,应该做它所说的,那就是&#34;显示菜单&#34;。它不应该是处理输入。在单独的函数中处理输入。

这是该程序的更模块化版本:

#include <iostream>

void processChoice(int theChoice);
void showmenu();
void addCustomer();
void deleteCustomer();
int getMenuChoice();

int customerCount = 0;
int main()
{
    cout << "Welcome to Michael's Marvelous Database Contrabulator!\n";
    cout << setw(10) << "Customer Database\n\n\n";
    int choice = 0;
    do 
    {
       showmenu();
       choice = getMenuChoice();
       if (choice != 5)
          processChoice(choice);
    } while (choice != 5);
}

void showmenu()
{
    cout << "\n\n1) Enter new customer data.\n";
    cout << "2) Update customer data.\n";
    cout << "3) Delete customer data.\n";
    cout << "4) Display Customer data.\n";
    cout << "5) Quit the program.\n\n";
}

int getMenuChoice()
{
    int theChoice;
    cout << "Please enter your choice: ";
    cin >> theChoice;
    return theChoice;
}

void processChoice(int theChoice)
{
   switch (theChoice)
   {
      case 1:
        addCustomer();
      break;
      //...
      case 3:
        deleteCustomer();
      break;
   }
}

void addCustomer()
{
   if ( customerCount < 10 )
   { 
      // add customer
      // put your code here to add the customer
      //...
      // increment the count
      ++customerCount;
   }
}

void deleteCustomer()
{
   if ( customerCount > 0 )
   { 
      // delete customer
      --customerCount;
   }
}

这是跟踪客户数量的基本概要。代码组织和模块化是关键。当前条目数的计数可以通过addCustomerdeleteCustomer函数递增或递减。另请注意在add/deleteCustomer()中完成的测试。

main()函数中,请注意do-while循环及其设置方式。 showMenu函数显示自己,getMenuChoice函数获取选择并返回所选的数字 如果选择不是5,则处理请求。如果是5,则while的{​​{1}}部分会将您踢出处理,否则您将从顶部开始(do-whileshowMenu等)。这可以避免原始代码正在进行的递归调用。