搜索和删除数组中的函数
Search and Remove Functions in an array
我有一个程序用于管理一个名为"client_DB"的记录数据库。数组"client_DB"由客户的手机通话记录组成。每个客户呼叫记录包含八个字段,如下所示:1)十位数的手机号码(字符串,无破折号),2)呼叫中使用的中继站数量(整数),3)以分钟为单位的呼叫长度(整数);4)呼叫的净成本(双倍);5)税率(双倍),6)呼叫税(双倍),7)调用的总成本(双)和8)名为"discount_aval"的字符串字段,值为"yes"或"no"。阵列client_DB的容量(SIZE)为20条记录。
它从一个名为"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
我的Remove函数只删除第一个值,如果我键入来删除任何其他值,它根本不会!我的搜索功能只需返回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 fulln";
}
}
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 removen";
return;
}
else if (loc == -1)
{
cout<<"Number is not in datan";
}
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;
}
这似乎正是您希望函数返回的内容。请注意,索引2和12处的电话号码是相同的。如果事实是这样的话,列表中似乎只有10个唯一的电话号码。因此,当搜索这10个数字中的每一个时,您将得到2个数字作为输出,因为它们都有一个重复。
如果您只想打印第一个匹配项,只需添加一个break;
,如下所示:
for(int i=0; i<count; i++)
{
if (!(A[i].cellnum.compare(cellnum)))
{
cout<<i<<endl;
break;
}
}
在"搜索"功能中。如果不需要相同的电话号码,您可以考虑在允许用户搜索电话号码之前进行检查。
编辑:我发现您的Remove函数也不能正常工作。您尝试使用搜索功能获取电话号码的索引,但搜索功能总是返回-1。我会添加如上所述的break
,然后返回i
而不是-1。在for循环之外声明i
以使其工作。
由于您希望在选择删除时删除所有事件,我将执行以下操作:
在您的主要功能中:
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 removen";
return;
}
else if (loc == -1){
cout<<"Number is not in datan";
}
else{
for(int j=loc; j<(*count)-1; j++)
{
A[j] = A[j+1];
}
(*count)--;
}
}
}
- 第 i 个元素返回 i 的函数数组
- 使用嵌套函数数组是个好主意吗?
- 正确实现类函数数组
- 试图引用已删除函数数组的相等运算符
- 如何在静态函数中使用成员函数数组
- 无法创建函数数组
- 构造函数数组
- 使用开关或定义函数数组 - 更快
- 编写一个函数,该函数将覆盖主函数数组中的值
- 可以像'funs[1]();'一样调用的函数数组
- std::AVX内部函数数组
- 如果数组大小未知,如何将函数数组作为参数传递
- 从函数数组中获取值
- 使用元编程在编译时初始化函数数组
- 将C函数数组转换为C++函数指针数组
- 复制构造函数 [数组] C++
- 添加函数数组并随机选择其中一个
- 指针到私有成员函数数组
- 可以单独声明函数数组的元素
- (c++)将main中的随机值保存到函数数组中