У меня есть программа, имеющая 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--;
продолжение, которое является моим счетчиком записей, запись номер 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
по всему коду.Если ваша идея заключается в том, что когда вы добавляете элемент, он всегда вводится в конец списка, когда вы удаляете запись, вам нужно переместить следующее, чтобы пробел был в последней позиции:
Всего наилучшего.