-1

「client_DB」と呼ばれるレコードのデータベースを管理するために使用されるプログラムがあります。配列「client_DB」は、顧客の携帯電話の通話記録で構成されています。各顧客通話レコードには、次の 8 つのフィールドが含まれています。1) 10 桁の携帯電話番号 (文字列、ダッシュなし)、2) 通話に使用された中継局の数 (整数)、3) 電話番号の長さ。通話分 (整数)、4) 通話の正味コスト (double)、5) 税率 (double)、6) 通話税 (double)、7) 通話の総コスト (double)、および 8 ) "discount_aval" という名前の文字列フィールドで、値は "yes" または "no" です。配列 client_DB には 20 レコードの容量 (SIZE) があります。

次の値で構成される「client_data.txt」という最初の入力ファイルから読み取ります。

9546321555  0   0   yes
5612971340  5   50  no
3051234567  8   25  no
7542346622  24  17  no
3054432762  15  30  yes
9544321011  50  100 yes
8776219988  87  82  yes
9042224556  4   5   yes
7877176590  11  1   no
5617278899  20  45  no
9546321555  4   3   yes
5612971340  79  86  no
3051234567  8   25  no
7542346622  24  118 no
3054432762  115 25  yes
9544321011  43  10  yes
8776219988  265 22  yes
9042224556  2   5   yes
7877176590  89  67  no
5617278899  40  56  no

私の削除機能は最初の値のみを削除します。他の値を削除するために入力すると、単に削除されません! 私の検索機能は単純に 2 つの数字を返します。これはオフであり、私が望むものではありません。ヘルプ?ユーザーにセル番号を尋ねてから、配列全体を検索して見つけて削除できるようにしたいと考えています。検索で入力も取得し、それを見つけて、その場所を返すようにします。試しましたが、何が間違っていたのかわかりません。私のメインでは、ユーザーが関数メニューから選択したときに両方の関数を呼び出しました。ここに私のコードがあります:

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

//************************************************************************
//Name:  Kevin          Due Date: 022113
//Instructor: Dr. Bullard               Total Points:  100 pts
//Assignment2: client_call.cpp          UsIDFAU: 
//:


using namespace std;

const int CAPACITY = 20;

 class client_db
  {
  public:
    string cellnum;
    int numofrelay;
    int call_length;
    double net_cost;
    double tax_rate;
    double call_tax;
    double total_cost;
    string discount_aval;
   };

bool IsFull(int); //returns true if the array is full; otherwise false.
bool IsEmpty(int count);// returns ture if the array is empty; otherwise false.

void Add(client_db A[], int & count, client_db & db);
void Remove(client_db A[], int *count, string name);// removes an item from the array if it is there
void Print_DB(client_db A[], int count);//prints to output file
void Call_stats(client_db A[], int count);// prints all the items in the array
int Search_DB(client_db A[], int count, string name); //if the name is in the array, its location is returned
//                                        //otherwise return -1;
//
bool IsFull(int count)
////Description: Determines if the array is full
{
    return (count == CAPACITY);
}

bool IsEmpty(int count)
////Description: Determines if the array is empty
{
    return (count == 0);
}

void Process (client_db A[], int count)
{

    for(int i=0; i<count; i++)
    {
    if (A[i].numofrelay >=1 && A[i].numofrelay<=5)
    {
        A[i].tax_rate=0.01;
        A[i].net_cost = ((A[i].numofrelay / 50.0)*0.40*A[i].call_length);

    }
    else if (A[i].numofrelay >=6 && A[i].numofrelay<=11)
    {
        A[i].tax_rate=0.03;
        A[i].net_cost = ((A[i].numofrelay / 50.0)*0.40*A[i].call_length);


    }
    else if (A[i].numofrelay>=12 && A[i].numofrelay<=20)
    { 
        A[i].tax_rate=0.05;
        A[i].net_cost = ((A[i].numofrelay / 50.0)*0.40*A[i].numofrelay);


    }
    else if (A[i].numofrelay >=21 && A[i].numofrelay<=50)
    {
       A[i].tax_rate =0.08;
       A[i].net_cost = ((A[i].numofrelay / 50.0)*0.40*A[i].call_length);


    }
    else if (A[i].numofrelay >50)
    {
        A[i].tax_rate =0.12;
        A[i].net_cost = ((A[i].numofrelay / 50.0)*0.40*A[i].call_length);


    }
    A[i].call_tax = ((A[i].tax_rate)/(100))*(A[i].net_cost);
    A[i].total_cost = A[i].net_cost + A[i].call_tax;
    }
}

void Print_DB(client_db A[], int count)

//Description: Prints the items stored in A to the standard i/o device
{

    string filename;
    cout<<"Enter output filename: "; //geting filename
    cin>>filename;

    ofstream output; //declaring an output file stream

    output.open(filename.c_str()); // c_str() converts a C++ string into a 
                                  // c-style string (char array) &
                                  //open binds an ofstream to a file
    for(int i=0; i<count; i++)
    {

        output<<A[i].cellnum<<"\t"
              <<A[i].numofrelay<<"\t"
              <<A[i].call_length<<"\t"
              <<A[i].net_cost<<"\t"
              <<A[i].tax_rate<<"\t"
              <<A[i].call_tax<<"\t"
              <<A[i].total_cost<<"\t"
              <<A[i].discount_aval<<endl;

    }

    output.close();
}

int Search(client_db A[], int count, string cellnum)
////Description: Locates cellnumbers in A's fields
{
    cout<<"Please enter a phone number:   "<<endl;
    cin>>cellnum;

    for(int i=0; i<count; i++)
    {
        if (cellnum == A[i].cellnum)
        {
            cout<<i<<endl;
        }

    }
   return -1;
}

void Add(client_db A[], int &count)
////Description: Adds key to the array
{
    if (!IsFull(count))
    {
        cout<<"Enter a cellphone number, number of relay stations and the call lenght and if a discount is available: ";
        cin>>A[count].cellnum>>A[count].numofrelay>>A[count].call_length>>A[count].discount_aval;
        count++;

    }
    else
    {
        cout<<"The list is full\n";
    }

}

void Add(client_db A[], int &count, client_db &db)
////Description: Adds key to the array
{
    if (!IsFull(count))
    {
        A[count] = db; 
        count++;

    }
    else
    {
        cout<<"The list is FULL! \n";
    }

}
void Remove(client_db A[], int *count, string cellnum )

////Description: Removes the number from the array is it is there
{

    int loc = Search(A,*count,cellnum);

    if (IsEmpty(*count))
    {
        cout<<"There is nothing to remove\n";
        return;
    }
    else if (loc == -1)
    {
        cout<<"Number is not in data\n";
    }
    else
    {
        for(int j=loc; j<(*count)-1; j++)
        {
            A[j] = A[j+1];
        }
        (*count)--;

    }
}


void Call_stats(client_db A[],int count) // prints to screen
{

    for(int i=0; i<count; i++)
    {
        cout<<A[i].cellnum<<"\t"
            <<A[i].numofrelay<<"\t"
            <<A[i].call_length<<"\t"
            <<A[i].discount_aval<<endl;

    }
}
void Menu ()
{
    cout<<"The values of the filename you entered have been recognized"<<endl;
    cout<<"Please enter the letter of your application of choice"<<endl;
    cout<<"       "<<endl;
    cout<<"************  WELCOME TO THE MAIN MENU  ************"<<endl;
    cout<<" Add an item...........................A"<<endl;
    cout<<" Remove an item........................R"<<endl;
    cout<<" Search for an item....................S"<<endl;
    cout<<" Print current data....................P"<<endl;
    cout<<" Print to output file..................O"<<endl;
    cout<<"****************************************************"<<endl;
}



int main()
{

    char answer;
    char answer2;
    client_db CLIENT[CAPACITY]; //declaring database
    int count = 0;   //initializing count
    string cellnum;

    string filename;
    cout<<"Hello!, this program holds clients call data records."<<endl;
    cout<<"Enter input filename: "; //geting filename
    cin>>filename;

    ifstream input; //declaring an input file stream

    input.open(filename.c_str()); // c_str() converts a C++ string into
        while(count<CAPACITY && !input.eof()) //reading until the end of the file (eof=end-of-file)
    {


        input>>CLIENT[count].cellnum
        >>CLIENT[count].numofrelay
        >>CLIENT[count].call_length
        >>CLIENT[count].discount_aval;

        count++;

    }

    do
{

  Menu();
  cout<<"Please enter a command letter:  "<<endl;
    cin>>answer;
    client_db db;

    switch (answer)
{

case 'A' : 
    cout<<"Enter a cellphone number, number of relay stations and the call lenght and if a discount is available: "<<endl;
    cin>>db.cellnum>>db.numofrelay>>db.call_length>>db.discount_aval;
    Add(CLIENT, count, db);
break;
case 'R' : Remove(CLIENT,&count,cellnum);
break;
case 'S' : 
    Search(CLIENT,count,cellnum);

break;
case 'P' : Call_stats(CLIENT,count);
break;
case 'O' :
    Process(CLIENT,count); //how do i set the precision for this?
    Print_DB(CLIENT,count);
break;
    }
     cout<<"Would you like to make another command?(y/n):   "<<endl;
   cin>>answer2;
} while (answer2 == 'Y' || answer2 == 'y');
 cout<<"Goodbye"<<endl;
    return 0;






}
4

1 に答える 1

1

それはまさにあなたが関数に返したいもののようです。インデックス 2 と 12 の電話番号は同じであることに注意してください。実際には、リストには 10 個の一意の電話番号しかないようです。したがって、これらの 10 個の数字のそれぞれを検索すると、出力として 2 つの数字が得られます。

最初の一致のみを出力したい場合は、break;次のように a を追加するだけです。

for(int i=0; i<count; i++)
{
    if (!(A[i].cellnum.compare(cellnum)))
    {
        cout<<i<<endl;
        break;
    }

}

検索機能で。同一の電話番号が望ましくない場合は、ユーザーが電話番号を検索できるようにする前に、これを確認することを検討できます。

編集:削除機能も正しく機能していないようです。検索機能を使用して電話番号のインデックスを取得しようとしましたが、検索機能は常に -1 を返します。break上記のように を追加し、i-1 の代わりに返します。iこれを機能させるには、for ループの外で宣言します。

[削除] を選択したときにすべてのオカレンスを削除したい場合は、次のようにします。

あなたの主な機能で:

case 'R' : 
cout<<"Please enter a phone number:   "<<endl;
cin>>cellnum;
Remove(CLIENT,&count,cellnum); break;

case 'S' : 
cout<<"Please enter a phone number:   "<<endl;
cin>>cellnum;
Search(CLIENT,count,cellnum); break;

探す:

int Search(client_db A[], int count, string cellnum){
   int index = -1;

   for(int i=0; i<count; i++)
   {
       if (!(A[i].cellnum.compare(cellnum)))
       {
           cout<<i<<endl;
           index = i;
           break;
       }
   }
   return index;
}

そして削除:

void Remove(client_db A[], int *count, string cellnum ){
int loc;
while((loc=Search(A,*count,cellnum)) != -1){
      if (IsEmpty(*count)){
          cout<<"There is nothing to remove\n";
          return;
      }
      else if (loc == -1){
          cout<<"Number is not in data\n";
      }
      else{
          for(int j=loc; j<(*count)-1; j++)
          {
              A[j] = A[j+1];
          }
          (*count)--;

      }
}
}
于 2013-02-20T05:03:38.717 に答える