2014-12-08 6 views
-1

Мне нужно написать программу для базы данных на основе массива, которая позволит пользователю вводить новые данные, обновлять существующие данные, удалять записи и просматривать список записей. Требования - это структура, называемая DATE, структура CustData, которая содержит пользовательские данные, массив типа CustData с размером 10 и требует отдельной функции для ввода, обновления, удаления и отображения данных клиента. Также необходимо использовать цикл while для инициализации каждого индекса в массиве со всеми инициализированными значениями 0. У меня есть грубая программа, но чем больше я работаю над этим, тем больше я чувствую, что делаю это совершенно неправильно. До сих пор я работал над тем, что он позволяет добавлять несколько записей без перезаписывания предыдущих, но я не могу ограничить количество записей, которые я могу ввести. У меня также есть отображение записей правильно. Любая помощь, которая может быть предложена, очень ценится, ниже моя программа до сих пор, с некоторыми из разделов ввода данных, прокомментированных, чтобы облегчить тестирование. Мои извинения за то, оставив это, это в C++, написанное с визуальной студией 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; 
     } 
    } 
    } 
+0

Вы должны почти всегда отмечать, какой язык он есть. Это помогает людям найти вопрос, а также влияет на синтаксическую окраску кода. – crashmstr

+0

Извините, не осознал, что забыл упомянуть об этом, просто исправил его. Он написан на C++-коде, написанном в Microsoft visual studio 2013. – Michael

+0

'У меня есть грубая программа, написанная, но чем больше я работаю над ней, тем больше чувствую, что делаю это совершенно неправильно. Вот почему вы разрабатываете * и проверяете * каждый часть вашей программы, прежде чем перейти к следующей части.Вы не должны писать программу одним выстрелом и понимать, что у вас есть проблема здесь, где-то еще и т. Д. – PaulMcKenzie

ответ

1

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

Я не могу показаться, чтобы иметь возможность ограничить количество записей я могу ввести

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

Во-вторых, showmenu(), по крайней мере для меня, должен делать то, что он говорит, и это «показать меню». Он не должен обрабатывать ввод. Выполняйте обработку ввода в отдельной функции.

Вот более модульная версия программы:

#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; 
    } 
} 

Это основной контур отслеживания количества клиентов. Ключевой является организация и модульность кода. Счетчик текущего количества записей либо увеличивается, либо уменьшается с помощью функций addCustomer и deleteCustomer. Также обратите внимание на тест, который делается в add/deleteCustomer().

В функции main() обратите внимание на цикл do-while и способ его настройки. Функция showMenu показывает себя, функция getMenuChoice получает выбор и возвращает номер, который был выбран.
Если выбор не 5, обработайте запрос. Если это 5, то while часть do-while выдает вас из обработки, в противном случае вы вернетесь наверх (showMenu, getMenuChoice и т. Д.). Это позволяет избежать рекурсивных вызовов, которые выполнял ваш оригинальный код.

+0

Благодарим вас за помощь, мне пришлось немного изменить то, что вы разместили, и объединить некоторые вещи вместе, но, похоже, он работает правильно. Я также добавил проверку индекса в части отображения, поэтому я знаю, что массивы написаны правильно. – Michael

Смежные вопросы