ARGENTOP2P

Soporte, Ayuda y Consultas => Programación en General => Mensaje publicado por: Billy Gates en Noviembre 15, 2006, 12:54:01

Título: Ayuda con un programita hecho en C.
Publicado por: Billy Gates en Noviembre 15, 2006, 12:54:01
¿Qué tal gente cómo les va? Yo un tanto desaparecido por la maldita fuckultad.
Es esa misma institución la que me trae acá con una duda.

(Cuanta formalidá, ni yo me la creo culiao  :P)

Bueno paso a comentarles:

Me dieron el siguiente ejercicio, para codificarlo en C.

(http://i7.tinypic.com/2nrq7w2.jpg)

A simple vista es más que sencillo. En pascal lo hago en 5 minutos, pero de C no cazo un shoto.
Hice mi mejor esfuerzo, el archivo compila, pero aún asi no funciona me parece.

En teoria tendría que cargar los datos opr teclado, pero una vez que lo ejecuto se "corta solo".

Les dejo el código:

En rojo está lo que tendría que ser la carga del file. En teoría está bien, pero no anda.
En azul, lo que tendría que listar por pantalla.


#define QUIMICA1   2

#define FISICA2    0
#define QUIMICA2   1

#define MATRICULAS 250

struct alumno
 {
   int matricula, nota[3];
   int inscripto[2];
 };

int aprobado(int nota)
 {
   if(nota==99 || nota<4)
     return 0;
   return 1;
 }

int main(int argc, char *argv[]){
   FILE *notas, *inscr;
   struct alumno al[MATRICULAS];
   int m;

   if(argc != 3) {
printf("%s [notas file] [inscr file]");
return -1;
   }

[color=red]    notas = fopen(argv[1], "r");
   while(!feof(notas)) {
fscanf(notas, "%d", &m);
if(m<0 || m>=MATRICULAS) {
   printf("Error\n");
   break;
}
fscanf(notas, "%d %d %d",
   &(al[m].nota[MATEMATICA]),
   &(al[m].nota[FISICA1]),
   &(al[m].nota[QUIMICA1])
);
   }
   fclose(notas);

   inscr = fopen(argv[2], "r");
   while(!feof(inscr)) {
fscanf(inscr, "%d", &m);
if(m<0 || m>=MATRICULAS) {
   printf("Error\n");
   break;
}
fscanf(inscr, "%d %d",
   &(al[m].inscripto[FISICA2]),
   &(al[m].inscripto[QUIMICA2])
);
   }
   fclose(inscr);
[/color]

[color=blue]    for(m=0; m<MATRICULAS; m++) {
if(al[m].inscripto[FISICA2]==0) {
   if(!aprobado(al[m].nota[MATEMATICA])
     || !aprobado(al[m].nota[FISICA1]))
printf("%d\n", m);
}
if(al[m].inscripto[QUIMICA2]==0) {
   if(!aprobado(al[m].nota[QUIMICA1]))
printf("%d\n", m);
}
[/color]    }
   return 0;
}


Les adjunto el archivo *.cpp por las dudas.

Click acá para bajar el archivo (http://www.badongo.com/file/1718501)

Gracias de antemano.
Hoy a la noche es la entrega, si me ayudan barbaro!  :up:
Título: Re: Ayuda con un programita hecho en C.
Publicado por: Predicador en Noviembre 15, 2006, 14:25:30
Hmm, para cargar registros (struct) deberias usar el fread() (http://www.cplusplus.com/ref/cstdio/fread.html) de la siguiente forma:
fread(al,sizeof(alumno),1,notas);
donde al es donde quedara la informacion guardada que es de tipo alumno (para este ejemplo) y deberias alocar la memoria antes.
Realmente hace mucho que no toco de C, asi que no esoty muy fresco; espero que mi mini colboracion sirva de algo.
baii
Título: Re: Ayuda con un programita hecho en C.
Publicado por: Billy Gates en Noviembre 15, 2006, 18:16:52
Al final ni me enrosque, y lo hice mas a lo criollo :P
(Gracias Predi por el consejo)

Lo hice en dos programitas, asi dejo cargado el archivo y listo.

Codigo del cargador:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

int fin(void);
void carganotas(void);
void cargainscr(void);

void main(void)
{
  clrscr();   
  printf("Ingreso de datos de archivos \n");
  printf("\n");
  carganotas();
  cargainscr();
}

/* Funciones */
int fin(void)
{
  char res;
  do
    {
      clrscr();
      printf("Ingresar otro alumno <S/N>?: ");
      res=getchar();
      fflush(stdin);
      res=toupper(res);
    }
  while (res!= 'S' && res!='N');
  return (res=='N');
}


void carganotas(void)
{
  struct not
  {
    int matr, notamat, notafis, notaquim;
  };

  FILE *notas;

  struct not arch1;

  printf("Ingresar datos de notas \n");
  notas=fopen("notas.dat", "wb");
  do
    {
      printf("Ingrese el n£mero de matr¡cula: ");
      scanf("%d", &arch1.matr); fflush(stdin);
      printf("Ingrese nota en Matem tica: ");
      scanf("%d", &arch1.notamat); fflush(stdin);
      printf("Ingrese nota en Qu¡mica I: ");
      scanf("%d", &arch1.notamat); fflush(stdin);
      printf("Ingrese nota en F¡sica I: ");
      scanf("%d", &arch1.notamat); fflush(stdin);
      fwrite(&arch1, sizeof arch1, 1, notas);
    } while(!fin());
  fclose(notas);
}

void cargainscr(void)
{
  struct inscr
  {
    int matri, quim2ins, fis2ins;
  };

  FILE *inscriptos;

  struct inscr arch2;

  clrscr();
  printf("Ingresar datos de inscripcion a materias \n");
  inscriptos=fopen("inscriptos.dat", "wb");
  do
    {
      printf("Ingrese el n£mero de matr¡cula: ");
      scanf("%d", &arch2.matri); fflush(stdin);
      printf("Se inscribe en Qu¡mica II? (0 = Si, 1 = No): ");
      scanf("%d", &arch2.quim2ins); fflush(stdin);
      printf("Se inscribe en Fisica II? (0 = Si, 1 = No): ");
      scanf("%d", &arch2.fis2ins); fflush(stdin);
      fwrite(&arch2, sizeof arch2, 1, inscriptos);
    }
  while(!fin());
  fclose(inscriptos);
}


Codigo del programa en si:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

void main()
{
  struct not
  {
    int matr, notamat, notafis, notaquim;
  };

  struct inscr
  {
    int matri, quim2ins, fis2ins;
  };

  FILE *notas, *inscriptos;

  struct not arch1;
  struct inscr arch2;

  printf("Listado de Alumnos que no pueden cursar las materias \n");
  notas=fopen("notas.dat","rb");
  inscriptos=fopen("inscriptos.dat", "rb");
  fread(&arch1,sizeof(struct not),1,notas); /* Lectura anticipada*/
  fread(&arch2,sizeof(struct inscr),1,inscriptos);
  clrscr();
  while(!feof(notas) && !feof(inscriptos))
  {
    if(arch1.matr==arch2.matri)
    {
      /* Quimica */
      if(arch2.quim2ins==0)
      {
if((arch1.notaquim<4) || (arch1.notaquim==99))
{
  printf("El matriculado %d no puede cursar la Qu¡mica II \n");
  printf("\n");
}
      }
      /* Fisica */
      if(arch2.fis2ins==0)
      {
if((arch1.notamat<4) || (arch1.notamat==4) || (arch1.notafis<4) || (arch1.notafis<4))
{
  printf("El matriculado %d no puede cursar la F¡sica II \n");
  printf("\n");
}
      }
    }
  fread(&arch1,sizeof(struct not),1,notas);
  fread(&arch2,sizeof(struct inscr),1,inscriptos);
  }
  getchar();
}