Problema con la función borrar en un arrays unidimensional [C++]

Iniciado por Jesusinfo, 23 Julio 2016, 03:22 AM

0 Miembros y 1 Visitante están viendo este tema.

Jesusinfo

Buenas noches recientemente me ayudaron en una programa y estoy totalmente agradecido. Se trata de el mismo código pero con mas funciones añadida

El programa captura n cantidad de estudiante y almacena 5 notas diferentes en cada estudiantes, teniendo las funciones basicas de [imprimir los estudiante, insertar nuevos estudiantes, buscar un estudiante junto sus notas y borrar un estudiante junto a sus notas]

El problema es que no me borra la posición adecuada del estudiante siempre me borra los la ultima mitad de estudiantes

No encuentro como plantear adecuadamente la funcion de borrar

Código (cpp) [Seleccionar]
//Funcion de borrar un estudiante------------------------------------------------------

   int borrar(int pos,int estudiantes[],int notas[]){
       for(int i=pos-1; i<num; i++){
               estudiantes[i];
               num--;
             for (int x=0; x<asignatura; x++){
              notas[5*i+x];
              notas--;
     }
   }
}


para que me borre solo la posición que teclee el usuario.

Disculpe la molestias, les agradecería su cordial ayuda compañeros es la única función que me falla.

AlbertoBSD

#1
Como marcas un registro vacio??

La idea seria la siguiente

   int borrar(int pos,int estudiantes[],int notas[]){
       int i = pos -1;
               estudiantes[i] = /*Valor para identificar estudiante vacio*/;
             for (int x=0; x<asignatura; x++){
              notas[5*i+x] = /* Nota vacia */;
             // notas--; // Esta instruccion no tiene sentido
     }
}


Te tienes que plantear como identificar a un estudiante vacio, o si eso no existe tendrias que mover los valores restantes para que ocupen la posicion eliminada.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

crack81

#2
Jesusinfo  tienes que tener cuidado con la funcion borrar() esta tiene truco ya como ha dicho AlbertoBSD  tienes dos opciones o marcar que la casilla esta vacia o reacomodar las posciones del arreglo

Como te mecione en el post anterior yo prefiero utilizar struct porque son un poco mas flexibles y facilmente se le puede asignar un atributo que indique vacio u ocupado segun se necesite, bueno regresemos al problema para  saber la manera sencilla si una posicion esta vacia segun tu codigo es marcar la casilla con el numero -1 con este puede ser una marca para comprar si una casilla esta vacia  o no.

El otro problema que aparentemente podria ser una mejor opcion pero al mismo tiempo puedes ser un poco mas complicado es reacomodar las posiciones del arreglo.

Supongamos tu ingresas a N estudiantes digamos 5 cada uno con su valor que lo identifica

[1] [2] [3] [4] [5]

cada casilla obviamente esta asociado a N cantidad de calificaciones creo en este ejemplo son tambien 5


Bueno que pasa si el usuario decide eliminar al estudiante numero 3
Lo mas facil seria declararlo como vacio de esta forma

[1] [2] [-1] [4] [5]

Asi cuando imprimir a los estudiantes no existiria el numero 3, en ese momento al momento de marcarlo vacio estas dejando una posicion en desuso  tienes dos opciones al momento de agregar otro alumno el primer es recorrer todo el arreglo y econtrar una poscion vacia(marcada como -1) y anadir ahi al estudiante y la otra es anadir al final de la lista como se esta haciendo habitualmente ingnorando que estamos desperdiciando lugares y claramente memoria.


Por ultimo otra opcion que tenemos como dije mas arriba es reordenar el arreglo supongamos
tenemos esta lista originalmente


[1] [2] [3] [4] [5]

Eliminamos el tercero
[1] [2]  ? [4] [5]

Pero en vez de marcarlo como vacio con el numero -1 recorremos todo el arreglo haciendo esto

[1] [2] [4] [5]

Esto implica mover todas las casillas que se encuentra a la derecha una posicion anterior eso para un programa que tiene maximo 100 estudiantes no es nada pero imaginates si fueran cantidades mucho mas grandes y complejas la cosas ya no seria tan optima.

Entiendo que estas practicando y te animo ha que termines tu programa usando arreglos es una buena practica y te ayuda a pensar.
Pero seria bueno revisar vectores y  listas enlazada para que te des una idea que este problema se podria resolver de una manera mas simple no importando la cantidad de estudiantes.


Espero te sirva este choro que he escrito.
Saludos....




Si C/C++ es el padre de los lenguajes entonces ASM es dios.

Jesusinfo

Cita de: AlbertoBSD en 23 Julio 2016, 05:11 AM
Como marcas un registro vacio??

La idea seria la siguiente

    int borrar(int pos,int estudiantes[],int notas[]){
        int i = pos -1;
                estudiantes[i] = /*Valor para identificar estudiante vacio*/;
              for (int x=0; x<asignatura; x++){
              notas[5*i+x] = /* Nota vacia */;
              // notas--; // Esta instruccion no tiene sentido
      }
}


Te tienes que plantear como identificar a un estudiante vacio, o si eso no existe tendrias que mover los valores restantes para que ocupen la posicion eliminada.

Saludos

Gracias albert agarre la idea indique 0 como mi valor vacio, quize indicarle una variable string pero al parecer no es posible por ser entero tanto los estudiantes como las notas,
lo que si no he podido hasta los momentos es eliminar el estudiante junto a sus notas, pero me sirvio lo que me dijiste nuevamente gracias.

Citarcrack81

Gracias crack pues bien capte la idea, si es una verdad que tengo que estudiar bien a fondo vectores y listas enlazadas, capte la idea simple de [-1] para declararlo vació pero  para ser sincero no se plantearlo de esa forma en la función, y tengo que investigar sobre el struct porque como te habrás imaginado me estoy adentrando a este mundo de la programación y estoy totalmente agradecido con ustedes por su recomendaciones y ayuda.