Ayuda con este codigo!!

Iniciado por an_war, 25 Noviembre 2010, 03:22 AM

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

an_war

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);
}



Beakman

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.

an_war

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. 

Beakman

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

an_war

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.

Beakman

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.

Código (c++) [Seleccionar]

#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;
Código (c++) [Seleccionar]

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.

an_war

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


Beakman

Oka.
Puede ser que pase de largo por el último caracter ingresado.

Mira, así cambié la función para ingresar.
Código (c++) [Seleccionar]

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 ?