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);
}
CitarMe 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.
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.
Cita de: 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.
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>>
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.
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.
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:%5Ccaptura.png)
Oka.
Puede ser que pase de largo por el último caracter ingresado.
Mira, así cambié la función para ingresar.
void ingresar()
{
Alumno info;
printf("Ingrese carne: ");
//gets(info.carne);
cin >> info.carne;
printf("Ingrese nombre: ");
//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 ?