Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con arreglos y funciones en C++

Estas en el tema de Problema con arreglos y funciones en C++ en el foro de C/C++ en Foros del Web. Hola a tod@s, necesito de su ayuda, tengo que hacer un programa que lleva el registro de estudiantes, numero carnet, nombre y edad, aun no ...
  #1 (permalink)  
Antiguo 25/05/2014, 16:02
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Problema con arreglos y funciones en C++

Hola a tod@s, necesito de su ayuda, tengo que hacer un programa que lleva el registro de estudiantes, numero carnet, nombre y edad, aun no esta terminado:

- declare una estructura y luego un arreglo de estructuras (el usuario puede
indicar cuantos estudiantes va a ingresar [n])
- cree una función para llenar el arreglo, pero el carnet no se puede repetir
- entonces dentro de la función hay una condicional que comprueba que no se
repita

El problema es:

- que pido el ingreso de nombre con gets, pero al ejecutarlo, pide carnet y luego
se salta el nombre y me pide la edad, no pide el nombre.
- si utilizo cin en lugar de gets, funciona bien, pero me da otro problema, si n > 5,
solo me pide 4 datos y luego se congela el programa y me da error.

Necesito ayuda por favor, que puede estar pasando o cual es mi error??

#include <iostream>

using namespace std;

//Variables
int op=0, n=0;

struct estudiantes{

int carnet;
char nombre[50];
int edad;

};

//Constantes
#define PAUSA_MENSAJE system("pause")
#define PAUSA system("pause>nul")
#define LIMPIA_PANTALLA system("cls")

//Funciones
void ingresaDatos(estudiantes x[]);
void ordenaDatos();
void muestraDatos();
void grabaArchivoyCierra();
void abrirArchivoylectura();
void buscaDatos();

int main(){

estudiantes reg[n];

//estudiantes *preg = reg;

while(op != 5){

LIMPIA_PANTALLA;

cout << "\n\n\n\n\n\n\t\t\tControl de estudiantes" << endl;
cout << "\n\t\t\t1. Ingresar estudiantes";
cout << "\n\t\t\t2. L estudiantes";
cout << "\n\t\t\t3. Lista de estudiantes";
cout << "\n\t\t\t4. Lista ordenada de estudiantes";
cout << "\n\t\t\t5. Salir";
cout << "\n\n\t\t\tEscribe tu opcion: ";

cin >> op;

switch(op){
case 1:
LIMPIA_PANTALLA;
cout << "\n\n\t\tCuantos estudiantes vas a ingresar: ";
cin >> n;
ingresaDatos(reg);

break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:

op = 5;

break;



}

} //Fin bucle while


}//Fin programa

/* Funcion que permite llenar el arreglo
de estructuras con los datos correspondientes */
void ingresaDatos(estudiantes x[]){

int i=0,j,k;
bool fin=false;

for(i=0; i<n; i++){

LIMPIA_PANTALLA;
cout << "\n\n\n\n\n\t\t\tAlumno [" << i+1 << "]" << endl;
cout << "\n\t\t\tIngresa No. de carnet: ";
cin >> x[i].carnet;

if(i>0){

while(fin == false){

for(j=1; j<n; j++){
for(k=0; k<n-i; k++){
if(x[k].carnet == x[k+1].carnet){

cout << "\n\t\t\tNo. de carnet ya existe." << endl;
cout << "\n\t\t\tIngresa No. de carnet: ";
cin >> x[i].carnet;

}
else{

fin=true;

}
}
}
}//Fin while
}//Fin if

cout << "\n\t\t\tNombre del estudiante: ";
gets(x[i].nombre);
cout << "\n\t\t\tEdad del estudiante: ";
cin >> x[i].edad;

}

cout << "\n\n\n\t\t\t";
PAUSA_MENSAJE;

}
  #2 (permalink)  
Antiguo 25/05/2014, 20:20
 
Fecha de Ingreso: mayo-2014
Mensajes: 5
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Hola,

Prueba con cin.get(x[i].nombre, 50, '\n');

Saludos
  #3 (permalink)  
Antiguo 25/05/2014, 22:04
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Gracias por responder devjpcb, ya probé el comando que me indicas, pero no funciono, me permitió escribir el carnet, pero luego no me pide ni el nombre, ni la edad y no continua la aplicación.
  #4 (permalink)  
Antiguo 26/05/2014, 01:30
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Problema con arreglos y funciones en C++

Tienes que vaciar el bufer de entrada despues de cada escaneo (de todos los que uses):

Código C++:
Ver original
  1. cin >> x[i].carnet;
  2. fflush_stdin();

La fflush_stdin() simplemente descarta los caracteres de stdin, puedes encontrar por ahi mas implementaciones de esta funcion que hacen lo mismo:

Código C:
Ver original
  1. void fflush_stdin() {
  2.     int c;
  3.     while((c = getchar()) != EOF && c != '\n');
  4. }

Saludos
vosk
  #5 (permalink)  
Antiguo 26/05/2014, 01:38
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

otro problema que tienes es que primero declaras reg[n]; y después pide que la persona ingrese el valor de n.
¿O sea declaras un arrya de estudiantes de que de tamaño 0? XD
Por mas que le digas que n vale 500 el array lo declaraste antes XD
estudiantes reg[n];
cin >> n;

Para que funcione debe ser así:
cin >> n;
estudiantes reg[n];


La opción 1 de tu menú es inviable. A n le debes declarar si o si... y no es una opción.
Para poder variar el tamaño debes usar memoria dinámica de lo contrario reg[] sera siempre una constante, y por eso debes tener el valor n antes de crear el array.
  #6 (permalink)  
Antiguo 26/05/2014, 15:33
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Gracias vosk y vangodp por responder, en cuanto a declarar el array antes de pedir n, si estaba en un error, gracias por eso, también agregue la otra función fflush_stdin();

Entonces, ahora, lógicamente si me permite ingresar la cantidad de datos en el arreglo que se indica en n, sin necesidad por el momento pensaría de usar memoria dinámica, PERO me da otro error, ingreso el valor de n, se crea luego el arreglo y llamo a la función para llenar el arreglo, todo avanza sin problema, pero al llegar al ultimo dato a ingresar, me aparece la pausa, pero se congela de nuevo, sin poder continuar con el programa, les dejo siempre el código, agradezco su ayuda.

#include <iostream>

using namespace std;

//Variables
int op=0, n=0;

struct estudiantes{

int carnet;
char nombre[50];
int edad;

};

//Constantes
#define PAUSA_MENSAJE system("pause")
#define PAUSA system("pause>nul")
#define LIMPIA_PANTALLA system("cls")

//Funciones
void ingresaDatos(estudiantes x[]);
void ordenaDatos();
void muestraDatos();
void grabaArchivoyCierra();
void abrirArchivoylectura();
void buscaDatos();

void fflush_stdin() {
int c;
while((c = getchar()) != EOF && c != '\n');
}

int main(){

//estudiantes *preg = reg;

while(op != 5){

LIMPIA_PANTALLA;

cout << "\n\n\n\n\n\n\t\t\tControl de estudiantes" << endl;
cout << "\n\t\t\t1. Ingresar estudiantes";
cout << "\n\t\t\t2. L estudiantes";
cout << "\n\t\t\t3. Lista de estudiantes";
cout << "\n\t\t\t4. Lista ordenada de estudiantes";
cout << "\n\t\t\t5. Salir";
cout << "\n\n\t\t\tEscribe tu opcion: ";

cin >> op;

switch(op){
case 1:
LIMPIA_PANTALLA;
cout << "\n\n\t\tCuantos estudiantes vas a ingresar: ";
cin >> n;

estudiantes reg[n];

ingresaDatos(reg);

break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:

op = 5;

break;



}

} //Fin bucle while


}//Fin programa

/* Funcion que permite llenar el arreglo
de estructuras con los datos correspondientes */
void ingresaDatos(estudiantes x[]){

int i=0,temp;
bool fin=false;

for(i=0; i<n; i++){

LIMPIA_PANTALLA;
cout << "\n\n\n\n\n\t\t\tAlumno [" << i+1 << "]" << endl;
cout << "\n\t\t\tIngresa No. de carnet: ";
cin >> x[i].carnet;
fflush_stdin();

cout << "\n\t\t\tNombre del estudiante: ";
cin >> x[i].nombre;
cout << "\n\t\t\tEdad del estudiante: ";
cin >> x[i].edad;

}//Fin for

cout << "\n\n\n\t\t\t";
PAUSA_MENSAJE;

}
  #7 (permalink)  
Antiguo 26/05/2014, 16:12
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Hola de nuevo amigos, jejeje, ya volví a probar el código a buscar información y he podido resolver el problema, el inconveniente era que, en el primero switch, tengo mas de 1 instrucción y no esta entre llaves, agregue las llaves y problema resuelto, gracias por su ayuda, me sirvió de mucho.
  #8 (permalink)  
Antiguo 26/05/2014, 19:35
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

ok perfecto¡Suerte! =)
  #9 (permalink)  
Antiguo 27/05/2014, 20:37
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Hola amigos, vengo a molestarlos un poco de nuevo, siempre con el mismo programa, ya esta solucionado lo que preguntaba antes, pero tengo el siguiente problema, aparte de permitir llenar el arreglo de estructuras con carnet, nombre y edad, el programa no debe permitir carnet repetidos al momento de ingresar datos, ya hice una funcion, probe whiles, fors y nada, no me sale, miren como va el codigo, que solucion me proponen??

#include <iostream>
#include <cstdlib>

using namespace std;

//Variables
int op=0, n=0;

struct estudiantes{

int carnet;
char nombre[50];
int edad;

};

//Constantes
#define PAUSA system("pause")
#define LIMPIA_PANTALLA system("cls")

//Funciones
void ingresaDatos(estudiantes x[]);
void ordenaDatos(estudiantes x[]);
void muestraDatos(estudiantes x[]);
void grabaArchivoyCierra();
void abrirArchivoylectura();
void buscaDatos();
int evaluaValor(int a, estudiantes x[]);

int main(){

estudiantes *preg;
preg = new estudiantes[100];

while(op != 5){

LIMPIA_PANTALLA;

cout << "\n\n\n\n\n\n\t\t\tControl de estudiantes" << endl;
cout << "\n\t\t\t1. Ingresar estudiantes";
cout << "\n\t\t\t2. L estudiantes";
cout << "\n\t\t\t3. Lista de estudiantes";
cout << "\n\t\t\t4. Lista ordenada de estudiantes";
cout << "\n\t\t\t5. Salir";
cout << "\n\n\t\t\tEscribe tu opcion: ";

cin >> op;

switch(op){
case 1:{

LIMPIA_PANTALLA;
cout << "\n\n\t\tCuantos estudiantes vas a ingresar: ";
cin >> n;

ingresaDatos(preg);

}
break;
case 2:{}
break;
case 3:{

LIMPIA_PANTALLA;
muestraDatos(preg);

}
break;
case 4:{}
break;
case 5:

delete [] preg;
op = 5;

break;

}
} //Fin bucle while

}//Fin programa

/* Funcion que permite llenar el arreglo
de estructuras con los datos correspondientes */
void ingresaDatos(estudiantes x[]){

for(int i=0; i<n; i++){

LIMPIA_PANTALLA;
cout << "\n\n\n\n\n\t\t\tAlumno [" << i+1 << "]" << endl;
cout << "\n\t\t\tIngresa No. de carnet: ";
cin >> j;
//Aqui va la verificacion del carnet
cout << "\n\t\t\tNombre del estudiante: ";
cin >> x[i].nombre;
cout << "\n\t\t\tEdad del estudiante: ";
cin >> x[i].edad;

}//Fin for

cout << "\n\n\n\t\t\t";
PAUSA;

}

void muestraDatos(estudiantes x[]){

for(int i=0; i<n; i++){

cout << "\n\n" << x[i].carnet << endl;
cout << x[i].nombre << endl;
cout << x[i].edad << endl;

}

PAUSA;

}

int evaluaValor(int a, estudiantes x[]){
bool fin = else;
for(int i=0; i<n; i++){
if(a == x[i].carnet){

fin = true;

}
else{

fin = false;

}
}
return fin;
}
  #10 (permalink)  
Antiguo 27/05/2014, 22:36
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

el carnet debería ser un string en ves de int.
Y puedes comparar cadenas de texto tipo

string s = "123456";
if ( s =="123456" ){
cout << "tadaaaaa"<< endl;
}

no tiene por que ser int ya que no vas hacer cálculos con el, ademas si es string también permite poner letras que muchas veces llevan los carnets.

Es comparar el string actual con cada uno de los otros string de la tabla y si existe haces saltar los fuegos artificiales XD
  #11 (permalink)  
Antiguo 28/05/2014, 11:54
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Gracias por tu respuesta vangodp, usar un string es una buena opción porque no haré cálculos, así lo hice al inicio, carnet era un string, use gets para obtener los datos, pero se saltaba esa parte y lo mismo pasaba con el nombre, porque también usaba gets y solo me pedía edad, por eso cambie carnet a int, ya no me dio ese error y pedí nombre con cin y no con gets, lo bueno es que después de mucho luchar y analizar logre resolver el problema de carnet repetido, dejo el código para que lo vean.

#include <iostream>
#include <cstdlib>

using namespace std;

//Variables
int op=0, n=0;

struct estudiantes{

int carnet;
char nombre[50];
char apellido[50];
int edad;

};

//Constantes
#define PAUSA system("pause")
#define LIMPIA_PANTALLA system("cls")

//Funciones
void ingresaDatos(estudiantes x[]);
void ordenaDatos(estudiantes x[]);
void muestraDatos(estudiantes x[]);
void grabaArchivoyCierra();
void abrirArchivoylectura();
void buscaDatos();

int main(){

estudiantes *preg;
preg = new estudiantes[100];

while(op != 5){

LIMPIA_PANTALLA;

cout << "\n\n\n\n\n\n\t\t\tControl de estudiantes" << endl;
cout << "\n\t\t\t1. Ingresar estudiantes";
cout << "\n\t\t\t2. L estudiantes";
cout << "\n\t\t\t3. Lista de estudiantes";
cout << "\n\t\t\t4. Lista ordenada de estudiantes";
cout << "\n\t\t\t5. Salir";
cout << "\n\n\t\t\tEscribe tu opcion: ";

cin >> op;

switch(op){
case 1:{

LIMPIA_PANTALLA;
cout << "\n\n\t\tCuantos estudiantes vas a ingresar: ";
cin >> n;

ingresaDatos(preg);

}
break;
case 2:{}
break;
case 3:{

LIMPIA_PANTALLA;
muestraDatos(preg);

}
break;
case 4:{}
break;
case 5:

delete [] preg;
op = 5;

break;

}
} //Fin bucle while

}//Fin programa

/* Funcion que permite llenar el arreglo
de estructuras con los datos correspondientes */
void ingresaDatos(estudiantes x[]){

for(int i=0; i<n; i++){

int k=0, j=0;
bool fin = false;

LIMPIA_PANTALLA;
cout << "\n\n\n\n\n\t\t\tAlumno [" << i+1 << "]" << endl;
cout << "\n\t\t\tIngresa No. de carnet: ";
cin >> j;
//Aqui va la verificacion del carnet
if(i>0){
while(fin == false){
if(j == x[k].carnet){
cout << "\n\t\t\tNo. de carnet ya existe" << endl;
cout << "\n\t\t\tIngresa No. de carnet: ";
cin >> j;
k=0;
}
else{
k++;
}
if(k==n){
x[i].carnet = j;
fin = true;
}
}//Fin while
}
else{
x[i].carnet = j;
}

cout << "\n\t\t\tNombre del estudiante: ";
cin >> x[i].nombre;
cout << "\n\t\t\tApellido del estudiante: ";
cin >> x[i].apellido;
cout << "\n\t\t\tEdad del estudiante: ";
cin >> x[i].edad;

}//Fin for

cout << "\n\n\n\t\t\t";
PAUSA;

}

void muestraDatos(estudiantes x[]){

cout << "\n\n\n\t\t\tListado de estudiantes\n";
for(int i=0; i<n; i++){

cout << "\n\n\t\t\tNo. carnet:\t" << x[i].carnet;
cout << "\n\t\t\tNombre:\t\t" << x[i].nombre << " " << x[i].apellido;
cout << "\n\t\t\tEdad:\t\t" << x[i].edad;

}

cout << "\n\n\n\t\t\t";
PAUSA;

}
  #12 (permalink)  
Antiguo 28/05/2014, 13:59
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

-Es que gets() es para obtener string
getc() para enteros
gets() para string
-getch() para letras, puedes usar el getchar() pero tienen ventajas y desventajas mira la documentación para ver sus diferencias.
-getche es lo mismo que getch() pero al recorrer el dato lo imprime también.
El mejor que veo para entrar con strings es getline(cin, string); por que permite leer espacios.
Pero hay mas funciones interesantes, deberías buscar averiguarlas.
Ahora estoy algo liado pero dentro de un rato mirare el código ;)
  #13 (permalink)  
Antiguo 28/05/2014, 14:40
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Que tal amigo, se que gets es para strings, lo use con carnet, siendo un arreglo char, pero falla igual, utilice tambien cin.getline y falla igual, gracias por la inf. la tendre en cuenta.
  #14 (permalink)  
Antiguo 28/05/2014, 22:23
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

Eso se debe a residuos en el buffer.
Algunas funciones dejan el el carácter '\n' enter en el buffer cuando pulsas enter.

cuando por ejemplo pedimos un int y lo guardamos con cin hacemos uso del buffer...¿Y como funciona el buffer?
el bufer es un mecanismo que acumula cadenas de numeros y/o letras hasta que encuentra con el caracter '\n' que no es mas que la tecla enter.

Entonces si tenemos un programa que pide un numero y lo recorre con cin>>numero;

Entramos con por ejemplo el numero 22 y no pasa nada, ese 22 esta en el buffer y realmente aun no ha ido a la variable numero. Es cuando pulsamos el enter que el operador >> envía 22 a numero ¿capiche?XD

El gran problema es que al pulsar enter estamos pulsando un caracter y numero es un int ¿verdad?Supongo que te estaras haciendo la pregunta del millon...¿Y donde demonios esta ese enter? XDD
Pues el enter se queda en el buffer para trollearte... así de claro XD

luego viene nuestra cin.getline() tan maja que espera un enter tambien para dar por concluida la entrada del string y pfff se lo salta asi todas ellas jajaja

¿que no te lo cres? pues te lo demuestro >_<

Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. int main () {
  7.     system ( "MODE CON cols=100 lines=50" );
  8.    
  9.     int num;
  10.     string nombre;
  11.    
  12.     cin >> num;
  13.    
  14.     getline ( cin, nombre );
  15.    
  16.    
  17.     cout << nombre << endl;
  18.     cout << "Si no pide nombre ya te has colado por que num: " << num << ", ya se ha mostrado" << endl;
  19.    
  20.     cin.ignore();
  21.     return 0;
  22. }

El programa ese de arriba tam majo pide un int, y cuando pulsas el enter te pilla un bonito salto ni pide nombre ni imprime na el guapo del getline XD

Pero a cambio si hago eso:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. int main () {
  7.     system ( "MODE CON cols=100 lines=50" );
  8.    
  9.     int num;
  10.     string nombre;
  11.    
  12.     cin >> num;
  13.    
  14.     if ( cin.peek() == '\n' ) {  // Si en el buffer a quedado rastro por pulsar enter '\n'
  15.         cin.ignore ( 1, '\n' ); // Ignoramos ese enter
  16.         cout << "efectivamente habia un enter en el buffer y como bueno que soy te lo he limpiado ya XD"<< endl;
  17.     }
  18.  
  19.     getline ( cin, nombre );
  20.    
  21.    
  22.     cout << "Mi nombre es: "<< nombre << endl;
  23.     cout << "Si no pide nombre ya te has colado por que num: " << num << ", ya se ha mostrado" << endl;
  24.    
  25.     cin.ignore();
  26.     return 0;
  27. }

La función peek() me va decir si tiene un enter metio en el buffer de cin y si lo encuentra el cin.ignore() nos "ignorara" literalmente 1 solo enter.¡bua uno solo=(! ¡¡No!!! Cuantos yo quiera ¿1000 te parece bien?XD cin.ignore ( 1000, '\n' ); Después de eso ya podía haber 1000 enters en el buffer que se lo va pasar por el forro jajaja

Bueno que si jeje, lo que te quiero decir que si usas >> debes liberar el buffer si luego despues vas usar getch, getline... o lo que sea que use buffer XDD con cin.ignore( cantidadDeCaracteresAIgnorar, CaracterAIgnorar); si pongo cin.ignore( 3000, 'a' ) estoy ignorando 3000 letras a. así que si escuchas eso https://www.youtube.com/watch?v=g52DkZRtXQM nos cargamos la letra XDD

Has las pruebas de purgar el buffer y me cuentas ;)
Después de eso te va funcionar todo normal ya lo veras XDDD

Ah!! Diga lo que diga las malas lenguas nunca nunca nunca use fflush() para limpiar el buffer, dice la leyenda que es indomable XDD(tiene comportamiento indefinido), si usas c++ usas funciones de c++ ;).

Enga taluego que sino te aburro jaja

Obs: lo de que ignore limpia el buffer no me tomes a serio XDD solo lo ignora el dichoso enter XD, si quieres limpiarlo hazlo con cin.sync(); que sincroniza el buffer con lo que hemos escrito limpiando todo lo que no hayamos escrito nosotros excluyendo asi el \n.

Última edición por vangodp; 28/05/2014 a las 23:38
  #15 (permalink)  
Antiguo 29/05/2014, 03:17
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Problema con arreglos y funciones en C++

@vangodp: "...Diga lo que diga las malas lenguas nunca nunca nunca use fflush() para limpiar el buffer..."

Cuatro post mas arribe le comenté a @sorfistaweb que vaciara el buffer de entrada con la version fflush_stdin() (valida para C y c++), pero por lo visto no ha echo ni caso. A ver si al menos a ti te hace caso.

Saludos
vosk
  #16 (permalink)  
Antiguo 29/05/2014, 04:34
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

Cita:
A ver si al menos a ti te hace caso.
El tema de los buffer es para llevar a serio que sino todo te va salir mal.
O hace caso o parte la cabeza en el intento XD
  #17 (permalink)  
Antiguo 29/05/2014, 07:37
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 6 meses
Puntos: 61
Respuesta: Problema con arreglos y funciones en C++

El problema (y su solucion) de "el programa pasa de largo y no lee" es tan usual que lo pregunten en este foro que deberia ser parte de las FAQ, o un aviso cuando uno publica algo.

Vas a publicar algo y podría decir:
- Ingrese aqui su consulta, pero si su programa no lee, pasa de largo, etc. use fflush etc etc.
o bien
- Ingrese aqui su consulta, pero por favor ANTES lea las FAQ, para no hacer mil veces la misma pregunta (claro que antes habria que considerar el caso en las FAQ).

Tambien podría decir lo útil/necesario que resulta usar Highlight y lo feo que se ve el código en azul y sin indentacion.

El numero 14 es mágico, corresponde a la cantidad máxima de mensajes que existe entre que alguien pregunta esto y el siguiente que lo vuelve a preguntar sin haber leido lo mismo en el foro. Mentí: Inventé la estadística.
__________________
Visita mi perfil en LinkedIn
  #18 (permalink)  
Antiguo 29/05/2014, 12:16
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

vangodp, gracias por la explicación, muy buena y muy clara, lo tomare en cuenta y vosk, claro que tome en cuenta el consejo de antes, probé la función fflush pero no me funciono, entonces la ignore jejeje...

Gracias a todos por sus consejos, todos los tomo en cuenta y lo pruebo, pero si no funciona, lo descarto, puede ser que yo lo hice mal y por eso no funciono.

y lo de

if ( cin.peek() == '\n' ) { // Si en el buffer a quedado rastro por pulsar enter '\n'
cin.ignore ( 1, '\n' ); // Ignoramos ese enter
cout << "efectivamente habia un enter en el buffer y como bueno que soy te lo he limpiado ya XD"<< endl;
}

ya lo utilice y funciona sin problemas, lo mas importante, es que me ha quedado claro a que se debe, gracias de nuevo a todos, en estos pocos comentarios he aprendido mucho.

Saludos....
  #19 (permalink)  
Antiguo 29/05/2014, 16:10
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: Problema con arreglos y funciones en C++

oye! XD
Cuando logre solucionarlo pon el código aqui por que sirve para otros con el mismo problema ;)
  #20 (permalink)  
Antiguo 29/05/2014, 16:56
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con arreglos y funciones en C++

hola amigo.
bueno pues cre que llege un poco tarde pero alomejor te ubiera funcionado usar mejor fgets este no dela \n en el buffer si no quelo guarda en a variable que s ele pasa y bueno solo seria cosa de eliminarlo.
tambien no se recomienda usar gets por que eso llevaria a tu programa a tener un error ya que como no especifica la cantidad de caracteres a recibir a este se le puede ingresar los que sean y cuando ya son mucho luego da el error por eso es mejor usar fgets.
  #21 (permalink)  
Antiguo 29/05/2014, 20:51
Avatar de sorfistaweb  
Fecha de Ingreso: febrero-2014
Ubicación: Guatemala
Mensajes: 21
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Problema con arreglos y funciones en C++

Les dejo el código, aun no esta finalizado pero pronto, gracias por sus buenos consejos y ayuda.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. //Variables
  7. int op=0, n=0;
  8. bool fin = false;
  9.  
  10. struct estudiantes{
  11.            
  12.            int carnet;
  13.            char nombre[50];
  14.            char apellido[50];
  15.            int edad;
  16.            
  17.            };
  18.  
  19. //Constantes
  20. #define PAUSA system("pause")
  21. #define LIMPIA_PANTALLA system("cls")
  22.  
  23. //Funciones
  24. void ingresaDatos(estudiantes x[]);
  25. void ordenaDatos(estudiantes x[]);
  26. void muestraDatos(estudiantes x[]);
  27. void grabaArchivoyCierra(estudiantes x[]);
  28. void abrirArchivoylectura(estudiantes x[]);
  29. void buscaDatos(estudiantes x[]);
  30.  
  31. int main(){
  32.    
  33.     estudiantes backup, *preg, *preg2;
  34.     preg = new estudiantes[100];
  35. //    preg2 = new backup[100];
  36.    
  37.     while(op != 7){
  38.              
  39.              LIMPIA_PANTALLA;
  40.              
  41.              cout << "\n\n\n\n\n\n\t\t\tControl de estudiantes" << endl;
  42.              cout << "\n\t\t\t1. Ingresar estudiantes";
  43.              cout << "\n\t\t\t2. Guardar datos en archivo";
  44.              cout << "\n\t\t\t3. Abrir archivo y leer datos";
  45.              cout << "\n\t\t\t4. Lista de estudiantes";
  46.              cout << "\n\t\t\t5. Lista ordenada de estudiantes";
  47.              cout << "\n\t\t\t6. Buscar estudiante por carnet";                                                    
  48.              cout << "\n\t\t\t7. Salir";                                      
  49.              cout << "\n\n\t\t\tEscribe tu opcion: ";
  50.              cin >> op;
  51.              
  52.              switch(op){
  53.                         case 1:{
  54.                              
  55.                              LIMPIA_PANTALLA;
  56.                              cout << "\n\n\t\tCuantos estudiantes vas a ingresar: ";
  57.                              cin >> n;
  58.  
  59.                              ingresaDatos(preg);
  60.                              
  61.                         }
  62.                         break;
  63.                         case 2:{
  64.                              }
  65.                         break;
  66.                         case 3:{
  67.                              
  68.                              }
  69.                         break;
  70.                         case 4:{
  71.                              //Aqui se muestran los datos desordenados
  72.                              LIMPIA_PANTALLA;
  73.                              cout << "\n\n\n\t\t\tListado de estudiantes\n";
  74.                              muestraDatos(preg);                            
  75.                              }
  76.                         break;                                                
  77.                         case 5:{
  78.                             cout << "\n\n\n\t\t\tListado ordenado de estudiantes\n";
  79.                             PAUSA; 
  80.                               }
  81.                         break;
  82.                         case 6:{
  83.                              buscaDatos(preg);
  84.                               }
  85.                         break;
  86.                         case 7:{
  87.                               delete [] preg;
  88.                               op = 7;
  89.                               }
  90.                         break;                                    
  91.                         }                                      
  92.              } //Fin bucle while
  93.    
  94.     }//Fin programa
  95.  
  96. /* Funcion que permite llenar el arreglo
  97. de estructuras con los datos correspondientes */
  98. void ingresaDatos(estudiantes x[]){
  99.  
  100.     for(int i=0; i<n; i++){
  101.            
  102.              int k=0, j=0;
  103.              
  104.              LIMPIA_PANTALLA;
  105.              cout << "\n\n\n\n\n\t\t\tAlumno [" << i+1 << "]" << endl;
  106.              cout << "\n\t\t\tIngresa No. de carnet: ";
  107.              cin >> j;                                                
  108.              //Aqui va la verificacion del carnet                    
  109.              if(i>0){
  110.                     while(fin == false){
  111.                             if(j == x[k].carnet){
  112.                                  cout << "\n\t\t\tNo. de carnet ya existe" << endl;
  113.                                  cout << "\n\t\t\tIngresa No. de carnet: ";
  114.                                  cin >> j;
  115.                                  k=0;
  116.                                  }
  117.                                  else{
  118.                                       k++;      
  119.                                       }
  120.                             if(k==n){
  121.                                      x[i].carnet = j;
  122.                                      fin = true;
  123.                                      }
  124.                             }//Fin while        
  125.                     }
  126.                     else{
  127.                          x[i].carnet = j;
  128.                          }            
  129.    
  130.              cout << "\n\t\t\tNombre del estudiante: ";                        
  131.              cin >> x[i].nombre;
  132.              cout << "\n\t\t\tApellido del estudiante: ";            
  133.              cin >> x[i].apellido;                          
  134.              cout << "\n\t\t\tEdad del estudiante: ";  
  135.              
  136.              fin = false;
  137.              while(fin == false){
  138.                     cin >> x[i].edad;                  
  139.                     if((x[i].edad < 17)||(x[i].edad > 60)){
  140.                             cout << "\n\t\t\tEdad incorrecta.";  
  141.                             cout << "\n\t\t\tEdad del estudiante: ";  
  142.                             }
  143.                             else{
  144.                                 fin = true;
  145.                             }
  146.                    
  147.                    
  148.                     }//fin while
  149.                                            
  150.              
  151.              
  152.              }//Fin for
  153.  
  154.     cout << "\n\n\n\t\t\t";
  155.     PAUSA;    
  156.      
  157.     }
  158.  
  159. //Funcion que muestra datos
  160. void muestraDatos(estudiantes x[]){
  161.  
  162.                 for (int i=0;i<n; i++){      
  163.  
  164.                         cout << "\n\n\t\t\tNo. Carnet:\t" << x[i].carnet;
  165.                         cout << "\n\t\t\tNombre:\t\t" << x[i].nombre << " " << x[i].apellido;
  166.                         cout << "\n\t\t\tEdad:\t\t" << x[i].edad << " anios";  
  167.              
  168.                 }//Fin for
  169.  
  170.         cout << "\n\n\n\t\t\t";
  171.         PAUSA;
  172.        
  173. }
  174.  
  175.      
  176.  
  177. //Nombre de la funcion que busca al estudiante
  178. void buscaDatos(estudiantes x[]){
  179.      
  180.     int buscar;   //variable para ingresar el numero de carnet del estudiate
  181.     int posicion;   //variable para ubicacion de numero de carnet
  182.  
  183.       LIMPIA_PANTALLA; //limpear pantalla
  184.         cout << "\n\n\n\n\n\t\t\tBusqueda de estudiante por carnet";
  185.         cout << "\n\t\t\tIngrese numero de carnet: ";   //mensaje de pantalla
  186.         cin >> buscar;   //sirve para ingresar el numero de carnet del estudiante
  187.  
  188.         for(posicion=0;posicion<n;posicion++)   //ciclo for para llevar la cuenta de la posicion
  189.     {
  190.             if(buscar==x[posicion].carnet)  //Si el numero ingresado es igual a uno de la lista proceder
  191.         {
  192.                  cout << "\n\n\t\t\tNo. carnet:\t" << x[posicion].carnet;
  193.                  cout << "\n\t\t\tNombre:\t\t" << x[posicion].nombre << " " << x[posicion].apellido;            
  194.                  cout << "\n\n\n\t\t\tEl Estudiante fue encontrado exitosamente!";  //mensaje de pantalla
  195.  
  196.             }
  197.             else{
  198.                  cout << "\n\n\t\t\tNo. carnet no existe";
  199.                  }
  200.         }
  201.  
  202.       cout << "\n\n\n\t\t\t";
  203.       PAUSA;       //mantenerlo en pantalla
  204. }

Etiquetas: arreglos, c++, estructuras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:54.