Título: Ayuda con este codigo!!
Publicado por: an_war en 25 Noviembre 2010, 03:22 am
Me he encontrado en un lio al intentar separar los datos unos de otros pues despues de un rato todo esta tan amontonado que ni se entiende y no logro separarlos, ademas aveces se salta algunos datos y por mas que me compila bien, no funciona como deberia y no logro saber porque agradecería de antemano su gran ayuda... #include <stdio.h> #include <string.h> #include <conio.h>
typedef struct alumno{ char carne[32]; char nombre[20]; int nota1; int nota2; int nota3; int nota4; int tot; }Alumno;
Alumno alumnos[40];
int total = 0;
void cargar(), guardar(), insertar(Alumno info); void ingresar(), buscar(), modificar(), eliminar(), ordenar(), mostrar(), ayuda(); char menu(void);
main() {
cargar(); char op;
for(;;) { switch(op=menu()) { case '1': ingresar(); getch(); break; case '2': buscar(); getch(); break; case '3': modificar(); getch(); break; case '4': eliminar(); getch(); break; case '5': ordenar(); getch(); break; case '6': mostrar(); getch(); break; case '7': break; default : printf("Opcion no valida"); getch(); break; }
if(op=='7') break;
}
printf("Presione (g) para guardar los cambios: ");
if(getche()=='g') guardar(); }
void insertar(Alumno info) { strcpy(alumnos[total].carne, info.carne); strcpy(alumnos[total].nombre, info.nombre); alumnos[total].nota1 = info.nota1; alumnos[total].nota2 = info.nota2; alumnos[total].nota3 = info.nota3; alumnos[total].tot = info.tot; total++; }
void cargar() { Alumno info; FILE *fp;
fp=fopen("alumnos.txt","r"); if(fp==NULL) { printf("No se puede abrir el archivo\n"); return; }
while(!feof(fp)) { if(fread(&info, sizeof(Alumno), 1, fp)!=1) break; insertar(info); }
fclose(fp); }
void guardar() { Alumno info; FILE *fp;
fp=fopen("alumnos.txt","w"); if(fp==NULL) { printf("No se puede abrir el archivo\n"); return; }
for(int i=0; i<total; i++) fwrite(&alumnos[i], sizeof(Alumno), 1, fp);
fclose(fp); }
void ingresar() { Alumno info;
printf("Ingrese carne: "); gets(info.carne); printf("Ingrese nombre: "); gets(info.nombre); printf("Ingrese Parcial No 1: "); scanf("%d", &(info.nota1)); printf("Ingrese Parcial No 2: "); scanf("%d", &(info.nota2)); printf("Ingrese Parcial No 3: "); scanf("%d", &(info.nota3)); insertar(info); printf("Alumno ingresado exitosamente\n"); }
void buscar() { char carne[32]; int i;
printf("Ingrese carne a buscar: "); gets(carne);
for(i=0; i<total; i++) if(!strcmp(alumnos[i].carne, carne)) { printf("--- Datos del alumno ---\n"); printf("Num.: %d\n", i+1); printf("Carné: %s\n", alumnos[i].carne); printf("Nombre: %s\n", alumnos[i].nombre); printf("Nota1: %d", alumnos[i].nota1); printf("Nota2: %d", alumnos[i].nota2); printf("Nota3: %d", alumnos[i].nota3); printf("nota definitiva: %d", alumnos[i].nota1+alumnos[i].nota2+alumnos[i].nota3); break; }
if(i==total) printf("Alumno no encontrado"); }
void modificar() { char nombre[20]; int i;
printf("Ingrese nombre a modificar: "); gets(nombre);
for(i=0; i<total; i++) if(!strcmp(alumnos[i].nombre, nombre)) { printf("--- Datos actuales del alumno ---\n"); printf("Num.: %d\n", i+1); printf("Carné: %s\n", alumnos[i].carne); printf("Nombre: %s\n", alumnos[i].nombre); printf("Nota1: %d\n\n", alumnos[i].nota1); printf("Nota2: %d\n\n", alumnos[i].nota2); printf("Nota3: %d\n\n", alumnos[i].nota3); printf("--- Nuevos datos del alumno ---\n"); printf("Carné: %s\n", alumnos[i].carne); printf("Ingrese nombre: "); gets(alumnos[i].nombre); printf("Ingrese nota1: "); scanf("%d", &(alumnos[i].nota1)); printf("Ingrese nota2: "); scanf("%d", &(alumnos[i].nota2)); printf("Ingrese nota3: "); scanf("%d", &(alumnos[i].nota3)); printf("\n\nDatos actualizados exitosamente!");
break; }
if(i==total) printf("Alumno no encontrado"); }
void eliminar() { char nombre[20]; int i;
printf("Ingrese nombre a eliminar: "); gets(nombre);
for(i=0; i<total; i++) if(!strcmp(alumnos[i].nombre, nombre)) { /* Recorre registros posteriores */ for(int j=i+1; j<total; j++) { strcpy(alumnos[j-1].carne, alumnos[j].carne); strcpy(alumnos[j-1].nombre, alumnos[j].nombre); alumnos[j-1].nota1 = alumnos[j].nota1; alumnos[j-1].nota2 = alumnos[j].nota2; alumnos[j-1].nota3 = alumnos[j].nota3; }
printf("Alumno eliminado"); total--; break; }
if(i==total) printf("Alumno no encontrado"); }
void ordenar() { int i, j; Alumno temp;
for(i=0; i<total-1; i++) { for(j=i+1; j<total; j++) if(strcmp(alumnos[i].nombre, alumnos[j].nombre)>0) { /* Copia en variable temporal datos actuales */ strcpy(temp.carne, alumnos[i].carne); strcpy(temp.nombre, alumnos[i].nombre); temp.nota1 = alumnos[i].nota1; temp.nota2 = alumnos[i].nota2; temp.nota3 = alumnos[i].nota3; /* Intercambia informacion */ strcpy(alumnos[i].carne, alumnos[j].carne); strcpy(alumnos[i].nombre, alumnos[j].nombre); temp.nota1 = alumnos[i].nota1; temp.nota2 = alumnos[i].nota2; temp.nota3 = alumnos[i].nota3; strcpy(alumnos[i].carne, alumnos[j].carne); strcpy(alumnos[j].nombre, temp.nombre); temp.nota1 = alumnos[i].nota1; temp.nota2 = alumnos[i].nota2; temp.nota3 = alumnos[i].nota3; } } printf("Se han ordenado los registros"); }
void mostrar() {
for(int i=0; i<total; i++) { printf("Num: %d\n", i+1); printf("carne: %s\n", alumnos[i].carne); printf("nombre: %s\n", alumnos[i].nombre); printf("parcial No 1: %d\n", alumnos[i].nota1); printf("parcial No 2: %d\n", alumnos[i].nota2); printf("parcial No 3: %d\n", alumnos[i].nota3); printf("nota definitiva: %d", alumnos[i].nota1+alumnos[i].nota2+alumnos[i].nota3+alumnos[i].nota4); } }
char menu(void) { char c; printf("(1)Ingresar, (2)Buscar, (3)Modificar, (4)Eliminar, (5)Ordenar, (6)Mostrar lista\n, ( (7)Salir\n");
printf("\nSeleccion: "); c=getche(); printf("\n"); return(c); }
Título: Re: Ayuda con este codigo!!
Publicado por: Beakman en 25 Noviembre 2010, 04:05 am
Me he encontrado en un lio al intentar separar los datos unos de otros pues despues de un rato todo esta tan amontonado que ni se entiende y no logro separarlos Para que querés separarlos?, es decir de que forma ? Lo probé y funcionó mas o menos bien. Le cambié un par de cosas para el ingreso no mas.
Título: Re: Ayuda con este codigo!!
Publicado por: an_war en 25 Noviembre 2010, 04:24 am
lo que pasa es que no se como generar espacios entre los menus para que todo no se amontone seguido y pues es que no se si notaste algunos errores que no se porque a ratos no funciona bien.
Título: Re: Ayuda con este codigo!!
Publicado por: Beakman en 25 Noviembre 2010, 04:40 am
lo que pasa es que no se como generar espacios entre los menus para que todo no se amontone seguido y pues es que no se si notaste algunos errores que no se porque a ratos no funciona bien.
Por qué no lo ponés asi?: printf(" (1)Ingresar \n (2)Buscar \n (3)Modificar \n (4)Eliminar \n (5)Ordenar \n (6)Mostrar lista \n (7)Salir\n");
Y tal vez quieras limpiar la pantalla. En linux es system("clear"); y en Window$ system("cls"); Así no se te amontona tanto. La primera vez que lo ejecute no me había encontrado un dato. Pero después lo ejecute varias veces y no encontré error todavía. Le cambie los get por cin>>
Título: Re: Ayuda con este codigo!!
Publicado por: an_war en 25 Noviembre 2010, 04:53 am
gracias.... genial, tenes razon con el limpiar pantalla "cls" asi cada menu se da en una pantalla en limpio, pero pues intente hacer lo de los cin>> pero me sacaba error ala hora de compilar, como hiciste vos, y al pues no es lo mismo, pues me acaba de dar la duda seria muy bueno si me explicas un poco su diferencia.
Título: Re: Ayuda con este codigo!!
Publicado por: Beakman en 25 Noviembre 2010, 05:14 am
Bien. El cin>> y el cou<< son del C++. Vos estas con C. Para que te funcionen en el encabezado tenes que poner la librería <iostream>. Yo lo puse de esta forma. #include <stdio.h> #include <string.h> //#include <conio.h> //esta no porque no es estandar #include<iostream> //para lo que necesitás using namespace std; //es muy importante
entonces después solo tenes que poner algo asi; char cadena[10]; cin >> cadena; //ingresa la cadena cout << cadena <<endl; //muestra la cadena
el "endl" va en lugar de '\n' PD: perdoná si te expliqué todo esto y vos ya lo sabías.
Título: Re: Ayuda con este codigo!!
Publicado por: an_war en 25 Noviembre 2010, 06:02 am
No pude colocar los cin me saca error y el error del que hablaba es que despues de meter el primer estudiante ya no pide el carne al registrar el siguiente estudiante
(http://D:\captura.png)
Título: Re: Ayuda con este codigo!!
Publicado por: Beakman en 25 Noviembre 2010, 06:16 am
Oka. Puede ser que pase de largo por el último caracter ingresado. Mira, así cambié la función para ingresar. void ingresar() { Alumno info; //gets(info.carne); cin >> info.carne; //gets(info.nombre); cin >> info.nombre; printf("Ingrese Parcial No 1: "); scanf("%d", &(info. nota1)); printf("Ingrese Parcial No 2: "); scanf("%d", &(info. nota2)); printf("Ingrese Parcial No 3: "); scanf("%d", &(info. nota3)); insertar(info); printf("Alumno ingresado exitosamente\n"); }
¿ Qué error te saca ?
|