I have a problem with putting the value of creditos
and nota
in the structure.
I have a file with this, for example:
Grade: 4.5
I'm using strtok
, but it returns a char pointer, and I need a int
and a float
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char *nombre;
int creditos;
float nota;
}curso;
int conteo(FILE *_entrada);
void semestre(FILE *_entrada,curso *_materias,int *_cantidad,int *_ganadas,int *_perdidas,float *_promedio);
void imprimir(curso *_materias,int *_cantidad,int *_ganadas, int *_perdidas,float *_promedio);
int main(int argc, char *argv[]){
int ganadas=0;
int perdidas=0;
float promedio=0.0;
int cantidad=0;
char archivoEntrada[256];
curso *materias;
printf("Archivo de entrada \n");
scanf("%255s",archivoEntrada);
FILE *entrada;
entrada=fopen(archivoEntrada,"r");
if(entrada==NULL){
printf("No se logro abrir el archivo de entrada\n");
exit(EXIT_FAILURE);
}
cantidad=conteo(entrada);
materias=(curso *)malloc(sizeof(curso)*cantidad);
semestre(entrada,materias,&cantidad,&ganadas,&perdidas,&promedio);
imprimir(materias,&cantidad,&ganadas,&perdidas,&promedio);
free(materias);
}
int conteo(FILE *_entrada){
int i=0;
char auxiliar[40];
while(!feof(_entrada)){
fgets(auxiliar,40,_entrada);
i++;
}
rewind(_entrada);
return i/3;
}
void semestre(FILE *_entrada,curso *_materias,int *_cantidad,int *_ganadas,int *_perdidas,float *_promedio){
int i=0;
int sumaCreditos=0;
float sumaNotas=0.0;
char auxiliar2[100];
char *token;
fgets(auxiliar2 ,100,_entrada);
while(i<*_cantidad){
fgets(auxiliar2,100,_entrada);
token=strtok(auxiliar2,":");
token=strtok(NULL,":");
printf("Dato: %s \n",token);
(_materias->nombre)=token;
fgets(auxiliar2 ,100,_entrada);
token=strtok(auxiliar2,":");
(&_materias->creditos)=token;
sumaCreditos=sumaCreditos+(_materias->creditos);
fgets(auxiliar2 ,100,_entrada);
token=strtok(auxiliar2,":");
(&_materias->nota)=token;
if((_materias->nota)>3.0){
*_ganadas=(*_ganadas)+1;
}
else{
*_perdidas=(*_perdidas)+1;
}
sumaNotas=sumaNotas+((_materias->nota)*(_materias->creditos));
i++;
*_materias++;
}
*_promedio=(sumaNotas/sumaCreditos);
}
void imprimir(curso *_materias,int *_cantidad,int *_ganadas, int *_perdidas,float *_promedio){
char archivoSalida[256];
FILE *salida;
printf("Archivo de salida \n");
scanf("%255s",archivoSalida);
salida=fopen(archivoSalida,"w");
if(salida==NULL){
printf("No se logro abrir el archivo de salida\n");
exit(EXIT_FAILURE);
}
int i=0;
fprintf(salida,"Archivo de Salida: \n");
fprintf(salida,"Materia\tNota\tCreditos \n");
while(i<*_cantidad){
fprintf(salida,"%s\t%f\t%d \n",(_materias->nombre),(_materias->nota),(_materias->creditos));
_materias++;
i++;
}
fprintf(salida,"\nTotal de materias: %d \n",*_cantidad);
fprintf(salida,"Materias ganadas: %d \n",*_ganadas);
fprintf(salida,"Materias perdidas: %d \n",*_perdidas);
fprintf(salida,"Promedio ponderado: %f \n",*_promedio);
}