我有一个具有struct
以下形式的程序:
struct deudores{
int NRR;
float deuda;
char nombre[30], domicilio[30], sexo [1];
}deudor[5];
我只能接收 5 条数据记录,在这种情况下我正在处理债务人,我记录了 5 条数据,其组成如下:
void Agregar(){
if (cont<5){
cout<<":::Agregar Deudor:::"<<endl;
deudor[cont].NRR = cont + 1;
cout<<"Nombre: ";
cin>>deudor[cont].nombre;
cin.ignore();
cout<<"Domicilio: ";
cin>>deudor[cont].domicilio;
cin.ignore();
cout<<"Sexo(H/M): ";
cin>>deudor[cont].sexo;
cin.ignore();
cout<<"Deuda: ";
cin>>deudor[cont].deuda;
cin.ignore();
cont++;
cout<<"\nDeudor registrado correctamente\n"<<endl;
system("pause");
}
else{
cout<<"\nNo hay espacio disponible\n"<<endl;
system ("pause");
}
}
但是我的问题是在删除的那一刻,因为如果我有 5 个注册数据,它们的NRR(ID)
值从 1 到 5,我删除了数据编号 1 并且我创建了一个cont--;
cont 作为我的记录计数器,那么记录编号 1 仍然保留有值0但删除了第5条记录。我的删除方法如下:
void Eliminar(){
if (cont!=0){
bool band=false;
int dato;
cout<<"Ingresa el NRR a Eliminar: ";
cin>>dato;
for (int i=0; i<cont; i++){
if(dato == deudor[i].NRR){
cout<<":::Datos a Eliminar:::"<<endl;
cout << "========================" << endl;
cout<<"NRR: "<<deudor[i].NRR<<endl;
cout<<"Nombre: "<<deudor[i].nombre<<endl;
cout<<"Domicilio: "<<deudor[i].domicilio<<endl;
cout<<"Sexo: "<<deudor[i].sexo<<endl;
cout<<"Deuda: "<<deudor[i].deuda<<endl;
cout << "========================" << endl;
cout << "\nDeudor eliminado correctamente\n" << endl;
system ("pause");
band=true;
deudor[i].NRR = 0;
deudor[i].nombre[0]='\0';
*deudor[i].domicilio=0;
*deudor[i].sexo=0;
deudor[i].deuda=0.0;
cont--;
}
}
if(band==false){
cout<<"\nEl deudor ingresado no existe\n"<<endl;
system("pause");
}
}
else{
cout<<"\nNo hay deudores registrados\n"<<endl;
system ("pause");
}
}
我希望你能理解我的问题。
问题。
您有一个大小为 5 的静态数组
deudores
。由于大小是静态的,您不能自由地删除和插入记录,但您必须限制自己重复使用数组的位置。如果您从数组中删除随机和/或不连续的位置,这可能会出现问题。解决方案 1:使用stl 容器。
忘记 5 的修复
deudores
并使用适合您要执行的任务的数据持有者。在您的情况下,您需要在记录集合中的随机位置插入和删除,因此选择是std::list
:代码可能是这样的:
我尝试尽可能多地保留代码,但是使用 STL 函数和容器,您不需要将记录限制为 5。插入总是在最后(
push_back
)完成,删除可以在任何位置完成,即使没有问题如果您删除了多条记录。解决方案2:记录空闲位置。
如果您不想忘记数组,则需要知道可以或不可以在哪些位置写入数据,为此使用空闲位置的数组(相同大小),代码如下:
在这个版本中,
deudor
它永远不会被删除,而是被标记为“可用位置”,跟踪哪些位置可用对于妥善保存记录至关重要,因为有可能删除备用记录。风格问题。
您的代码中存在许多您应该注意的问题:
deudores
只有一个债务人而有deudor
多个债务人,互换名称是非常令人困惑的。char deudor::nombre[30]
.还会导致运行时错误。长于数组的长度。家也是一样。使用std::string
.5
整个代码中查找值。如果您的想法是,当您添加一个元素时,它总是在列表的末尾输入,当您删除一条记录时,您必须移动以下内容,以便间隙位于最后一个位置:
一切顺利。