elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con la función borrar en un arrays unidimensional [C++]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con la función borrar en un arrays unidimensional [C++]  (Leído 2,396 veces)
Jesusinfo

Desconectado Desconectado

Mensajes: 38


Copartícipe del conocimiento


Ver Perfil
Problema con la función borrar en un arrays unidimensional [C++]
« en: 23 Julio 2016, 03:22 am »

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
  1. //Funcion de borrar un estudiante------------------------------------------------------
  2.  
  3.    int borrar(int pos,int estudiantes[],int notas[]){
  4.        for(int i=pos-1; i<num; i++){
  5.                estudiantes[i];
  6.                num--;
  7.              for (int x=0; x<asignatura; x++){
  8.               notas[5*i+x];
  9.               notas--;
  10.      }
  11.    }
  12. }

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.


« Última modificación: 23 Julio 2016, 07:10 am por Jesusinfo » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Problema con la función borrar en un arrays unidimensional [C++]
« Respuesta #1 en: 23 Julio 2016, 05:11 am »

Como marcas un registro vacio??

La idea seria la siguiente

Código
  1.    int borrar(int pos,int estudiantes[],int notas[]){
  2.        int i = pos -1;
  3.                estudiantes[i] = /*Valor para identificar estudiante vacio*/;
  4.              for (int x=0; x<asignatura; x++){
  5.               notas[5*i+x] = /* Nota vacia */;
  6.              // notas--; // Esta instruccion no tiene sentido
  7.      }
  8. }

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


« Última modificación: 23 Julio 2016, 05:13 am por AlbertoBSD » En línea

crack81

Desconectado Desconectado

Mensajes: 222



Ver Perfil
Re: Problema con la función borrar en un arrays unidimensional [C++]
« Respuesta #2 en: 23 Julio 2016, 06:19 am »

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....




« Última modificación: 23 Julio 2016, 06:21 am por crack81 » En línea

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

Desconectado Desconectado

Mensajes: 38


Copartícipe del conocimiento


Ver Perfil
Re: Problema con la función borrar en un arrays unidimensional [C++]
« Respuesta #3 en: 23 Julio 2016, 07:08 am »

Como marcas un registro vacio??

La idea seria la siguiente

Código
  1.    int borrar(int pos,int estudiantes[],int notas[]){
  2.        int i = pos -1;
  3.                estudiantes[i] = /*Valor para identificar estudiante vacio*/;
  4.              for (int x=0; x<asignatura; x++){
  5.               notas[5*i+x] = /* Nota vacia */;
  6.              // notas--; // Esta instruccion no tiene sentido
  7.      }
  8. }

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.

Citar
crack81

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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
"Arrays de clases, pasados como argumento a una funcion"
Programación C/C++
Sauruxum 2 2,675 Último mensaje 28 Octubre 2010, 06:21 am
por Sauruxum
Duda pascal array unidimensional
Programación General
pyxolo 3 3,167 Último mensaje 3 Septiembre 2011, 02:18 am
por Valkyr
Matriz a vector unidimensional??[Solucionado]
Programación C/C++
JohnMcb 5 3,406 Último mensaje 30 Abril 2013, 05:08 am
por JohnMcb
Contar el numero de arrays en una funcion
Programación C/C++
ramona98 1 2,384 Último mensaje 27 Agosto 2013, 12:46 pm
por avesudra
Funcion RecomendarButacas Ayuda!! (Recorrer arrays de arrays)
Java
elenfatico 2 2,924 Último mensaje 7 Abril 2016, 00:44 am
por 50ShadesOfKenyi
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines