NECESITO HACER ESTE PROGRAMA EN C(C++ NO!)

Cuestiones y dudas acerca de lenguajes de programación diversos.

Moderador: Moderadores

luciano19961969
Novat@
Mensajes: 1
Registrado: Mié May 11, 2016 8:12 pm

NECESITO HACER ESTE PROGRAMA EN C(C++ NO!)

Mensaje por luciano19961969 » Mié May 11, 2016 8:30 pm

Imagen

NECESITO HACER ESE PROGRAMA EN C LEYENDO PALABRA POR PALABRA DE UN ARCHIVO TXT QUE SE ENCUENTRA EN LA CARPETA DEL PROGRAMA HASTA AHORA HICE EL SIGUIENTE CODIGO PERO ALGO ESTA MAL Y VALIDA MAL TODO.

MAIN:
#include <stdio.h>
#include <stdlib.h>
#include "integrador.h"

int main()
{
t_info alumno;
t_fecha fproc;

char buffer[200];
int cant;

FILE *txt,*bin,*error;

txt=fopen("alumnos.txt","rt");
bin=fopen("alumnos.bin","wb");
error=fopen("error.txt","wt");

if (!txt || !bin || !error)
{
printf("El archivo no puede ser abierto");
return 1;
}

printf("Ingrese fecha de proceso(d-m-a): \n ");
fflush(stdin);
scanf("%d-%d-%d",&fproc.d,&fproc.m,&fproc.a);

while(!validarfecha(&fproc))
{
puts("La fecha es erronea, Ingrese fecha nuevamente(d/m/a):");
fflush(stdin);
scanf("%d-%d-%d",&fproc.d,&fproc.m,&fproc.a);
}


rewind(txt);
fgets(buffer,sizeof(buffer),txt);

while(!feof(txt)) //lee linea a linea y ahi hay que separar con |


{
//leerAlum(buffer,&alumno);

cant=reg_txt_a_bin_var(buffer,&alumno);
/* if(validarcarga(&alumno,&fproc))*/

fwrite(&alumno,sizeof(t_info),1,bin);
/* else
fprintf(error,"%s",buffer);*/
fgets(buffer,sizeof(buffer),txt);

}

fclose(txt);
fclose(bin);
fclose(error);
return 0;

}



ARCHIVO .H

#ifndef INTEGRADOR_H_INCLUDED
#define INTEGRADOR_H_INCLUDED
#include "Biblioteca/fecha.h"

typedef struct{
long int dni;
char apyn[40];
t_fecha fnac;
char sexo;
t_fecha ing;
char carrera[4];
int cantmat;
t_fecha aprob;
char estado;
t_fecha baja;
} t_info;


void leerAlum(const char *buffer,t_info *alumno);
int validarcarga( t_info *,t_fecha *);
void cargar(FILE *);
int reg_txt_a_bin_var(char *linea,t_info*emp);
#endif // INTEGRADOR_H_INCLUDED

ARCHIVO .C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "integrador.h"
#define CARRERAS(x) (strstr((x),"INF") || strstr((x),"ELE") || strstr((x),"IND") || strstr((x),"ECO") || strstr((x),"DER") || strstr((x),"ADM") || strstr((x),"MED") || strstr((x),"EDF") || strstr((x),"FIL"))
#define VERDADERO 1
#define FALSO 0


int tou_pper (int x)
{
return x==-1 ? x: (x &=0xff) >= 'a' && x <='z' ? x + 'A'-'a' : x ;
}
////////////////////////////////////////////////////////////

int validarcarga( t_info *alu, t_fecha *fproc)
{
fproc->a=fproc->a;
fproc->m=fproc->m;
fproc->a=fproc->a-10;

if(!(10000 < alu->dni && alu->dni < 100000000))
return 0;

if(!( validarfecha(&alu->fnac) && (dif_fecha(&alu->fnac,&fproc)<0)))
return 0;

if(!(alu->sexo=='M' || alu->sexo=='F'))
return 0;

if(!(validarfecha(&alu->ing) && (dif_fecha(&alu->ing,&fproc)<=0) && (dif_fecha(&alu->fnac,&alu->ing)<0) ))
return 0;

if(!(validarfecha(&alu->aprob)&&(dif_fecha(&alu->aprob,&alu->ing)>0)&& (dif_fecha(&alu->aprob,&fproc)<=0)))
return 0;
//else alu->aprob={alu->ing.d,alu->ing.m,alu->ing.a};

if(!CARRERAS(alu->carrera))
return 0;

if(alu->cantmat<0)
return 0;


return 1;
}

void leerAlum(const char *buffer,t_info *alumno)
{
sscanf(buffer,"%ld|%s|%d-%d-%d|%c|%d-%d-%d|%s|%d|%d-%d-%d|\n",
&alumno->dni,
&alumno->apyn,
&alumno->fnac.d,&alumno->fnac.m,&alumno->fnac.a,
&alumno->sexo,
&alumno->ing.d,&alumno->ing.m,&alumno->ing.a,
&alumno->carrera,
&alumno->cantmat,
&alumno->aprob.d,&alumno->aprob.m,&alumno->aprob.a);
}




void cargar(FILE *txt)
{
t_info alumno;
printf("Ingrese DNI:\n");
fflush(stdin);
scanf("%ld",&alumno.dni);

printf("Ingresar SEXO (F/M):");
fflush(stdin);
scanf("%c",&alumno.sexo);

printf("Ingrese fecha de nacimiento(d-m-a) :\n");
fflush(stdin);
scanf("%d-%d-%d",&alumno.fnac.d,&alumno.fnac.m,&alumno.fnac.a);

printf("Ingrese fecha de ingreso(d-m-a) :\n");
fflush(stdin);
scanf("%d-%d-%d",&alumno.ing.d,&alumno.ing.m,&alumno.ing.a);

printf("Ingrese carrera :\n");
fflush(stdin);
scanf("%s",alumno.carrera);

printf("Ingrese cantidad de materias aprobadas:\n");
fflush(stdin);
scanf("%d",&alumno.cantmat);

fprintf(txt,"%ld|%c|%d-%d-%d|%d-%d-%d|%s|%d\n"
,alumno.dni
,alumno.sexo
,alumno.fnac.d,alumno.fnac.m ,alumno.fnac.a
,alumno.ing.d,alumno.ing.m ,alumno.ing.a
,alumno.carrera
,alumno.cantmat);
fclose(txt);
}

int reg_txt_a_bin_var(char *linea,t_info*emp)
{
puts(linea);

char *act =strchr(linea,'\n');

if(!act){

return FALSO;
}


*act='\0';
act=strrchr(linea,'|');


sscanf(act+1,"%d%d%d",&emp->baja.d,&emp->baja.m,&emp->baja.a);

*act='\0';
act=strrchr(linea,'|');

sscanf(act+1,"%c",&emp->estado);

*act='\0';
act=strrchr(linea,'|');

sscanf(act+1,"%d%d%d",&emp->aprob.d,&emp->aprob.m,&emp->aprob.a);


*act='\0';
act=strrchr(linea,'|');


sscanf(act+1,"%d",&emp->cantmat);

*act='\0';

act=strrchr(linea,'|');

strncpy(emp->carrera,act+1,sizeof(emp->carrera));

*act='\0';
act=strrchr(linea,'|');

sscanf(act+1,"%d%d%d",&emp->ing.d,&emp->ing.m,&emp->ing.a);

*act='\0';

act=strrchr(linea,'|');

emp->sexo= *(act+1);


*act='\0';
act=strrchr(linea,'|');

sscanf(act+1,"%d%d%d",&emp->fnac.d,&emp->fnac.m,&emp->fnac.a);

*act='\0';
act=strrchr(linea,'|');

strncpy(emp->apyn,act+1,sizeof(emp->apyn));


*act='\0';
sscanf(linea,"%ld",&emp->dni);



return VERDADERO;
}

FUNCIONES FECHA:

archivo .h

#ifndef FECHA_H_INCLUDED
#define FECHA_H_INCLUDED
#define esbisiesto(x)((x)%4==0&&((x)%100!=0||(x)%400==0))

typedef struct
{ int d, m, a;
} t_fecha;

int dif_fecha(const t_fecha *f1, const t_fecha *f2);
int incrdias (const t_fecha *fecha);
int comparaFecha(t_fecha *,t_fecha *);

int validarfecha(const t_fecha *pf);
int cantdiasmes(int m, int a);
void ingresarfecha(t_fecha *pfecha);

int diferenciadias(const t_fecha *f1,const t_fecha *f2);
void diadespues ( t_fecha *f1);

int cuenta_dias ( t_fecha *f1, t_fecha *f2 );
void semana(const t_fecha *pf);
void sumardias(t_fecha *,int);

void sumardias1(t_fecha *,int);



#endif // FECHA_H_INCLUDED

archivo.c

#include<conio.h>
#include<stdio.h>
#include "fecha.h"


///////////////////////////////////////////////////////////
int validarfecha(const t_fecha *pf)
{
if(pf->a>1600)
if(pf->m>=1 && pf->m<=12)
if(pf->d>=1 && pf->d<=cantdiasmes(pf->m,pf->a))
return 1;
return 0;
}

//////////////////////////////////////////////////////////
int cantdiasmes(int m, int a)
{
static int dias_mes[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(m==2 && esbisiesto(a))
return 29;
else
return dias_mes[m-1];
}
//////////////////////////////////////////////////////
void ingresarfecha(t_fecha*pfecha)
{ //puts("Ingrese fecha (d/m/a):");
fflush(stdin);
//scanf("%d,%d,%d",&pfecha->d,&pfecha->m,&pfecha->a);
puts("Ingrese dia:");
fflush(stdin);
scanf("%d",&pfecha->d);
puts("Ingrese mes:");
fflush(stdin);
scanf("%d",&pfecha->m);
puts("Ingrese anio:");
fflush(stdin);
scanf("%d",&pfecha->a);

while(!validarfecha(pfecha))
{
puts("La fecha es erronea, Ingrese fecha nuevamente(d/m/a):");
fflush(stdin);
//scanf("%d,%d,%d",&pfecha->d,&pfecha->m,&pfecha->a);
puts("Ingrese día:");
scanf("%d",&pfecha->d);
puts("Ingrese mes");
fflush(stdin);
scanf("%d",&pfecha->m);
puts("Ingrese anio:");
fflush(stdin);
scanf("%d",&pfecha->a);
}
}
///////////////////////////////////////////////////////////////////

int diferenciadias(const t_fecha *f1,const t_fecha *f2)
{ int dif=0;
int m_act=f1->m;

while(m_act<f2->m)
{
dif+=cantdiasmes(m_act,f1->a);
m_act++;
}
dif-=f1->d;
dif+=f2->d;

return dif;
}

///////////////////////////////////////////////////////////
int cuenta_dias ( t_fecha *f1, t_fecha *f2 ) {
int acum = 0;

while ( 1 ) {
if ( f1->a == f2->a && f1->m == f2->m)
break;

acum = acum + ( cantdiasmes(f1->m,f1->a) - f1->d );

if ( f1->m == 12 ) {
f1->m = 1;
(f1->a)++;
} else
(f1->m)++;

f1->d= 0;
}

acum = acum + ( (f2->d) - (f1->d));
return acum;
}







/////////////////////////////////////////////////////////////////////

void diadespues (t_fecha *f1)
{ int m_act=f1->m;
int a_act=f1->a;
int d_act=f1->d;

d_act= cantdiasmes(f1->m,f1->a);
f1->d++; //incremento el dia
if(f1->d > d_act) //verifico si la cant de dias es superiot a los dias del mes
{
f1->d-=d_act; //vyelvo a la cantidad de dias pasados del mes.
f1->m++; //incremento el mes

if(f1->m > 12) //verifico si me pase de mes, osea de anio
{f1->m=1;// reseteo el mes
f1->a++; //incremento el año
}
}

printf("\nLa fecha del dia siguiente es: %d %d %d\n",f1->d,f1->m,f1->a);
}

void sumardias(t_fecha *f1,int cant)
{ int cantd;

cantd = cantdiasmes(f1->m,f1->a); // toma la cant de dias del mes ingresado
f1->d=f1->d + cant; //incremento el dia

if(f1->d > cantd) //ver si la cant de dias es superior a las que permite el mes
{
f1->d-=cantd; //vuelvo a la cant de dias
f1->m++; //incremento el mes

if(f1->m >12)
{
f1->m=1; //reseteo el mes
f1->a++; //incremento el año
esbisiesto(f1->a);
}
}

printf("La fecha sumada %d cantidad de dias es: %d/%d/%d\n",cant,f1->d,f1->m,f1->a) ;
}

void sumardias1(t_fecha *f1,int agrega)
{
int newMes, newDia, newYear=0, jan, fev, mar, abr, mai, jun, jul, ago, set, out, nov, dez;
int dia,mes,bis;

newMes = f1->m; dia=f1->d;
newYear = f1->a; mes=f1->m;

while(agrega>0)
{
if(mes==1)
{ for (jan=dia+1; jan<32; jan++)
{
if(agrega>0)
{agrega--;
newDia = jan;
}
}
if(agrega>0)
newMes=2;
}

if(newMes==1)
{ for(jan=1; jan<32; jan++)
{ if(agrega>0)
{
agrega--;
newDia = jan;
}
}
if(agrega>0)
newMes=2;
}
if(mes == 2 && esbisiesto(f1->a))
{
for(fev=dia+1; fev<30; fev++)
{
if(agrega>0)
{
agrega--;
newDia = fev;
}
}
if(agrega>0)
newMes=3;
}
if(mes == 2 && !esbisiesto(f1->a))
{
for(fev=dia+1; fev<29; fev++)
{
if(agrega>0)
{
agrega--;
newDia = fev;
}
}
if(agrega>0)
newMes=3;
}
if(newMes == 2 && esbisiesto(f1->a))
{
for(fev=1; fev<30; fev++)
{
if(agrega>0)
{
agrega--;
newDia = fev;
}
}
if(agrega>0)
newMes=3;
}
if(newMes == 2 && !esbisiesto(f1->a))
{
for(fev=1; fev<29; fev++)
{
if(agrega>0)
{
agrega--;
newDia = fev;
}
}
if(agrega>0)
newMes=3;
}
if(mes==3)
{
for(mar=dia+1; mar<32; mar++)
{
if(agrega>=0)
{
agrega--;
newDia = mar;
}
}
if(agrega>=0)
newMes=4;
}
if(newMes==3)
{for(mar=1; mar<32; mar++)
{
if(agrega>=0)
{
agrega--;
newDia = mar;
}
}
if(agrega>=0)
newMes=4;
}
if(mes==4)
{
for(abr=dia+1; abr<30; abr++)
{
if(agrega>=0)
{
agrega--;
newDia = abr;
}
}
if(agrega>=0)
newMes=5;
}
if(newMes==4)
{
for(abr=1; abr<30; abr++)
{
if(agrega>=0)
{
agrega--;
newDia = abr;
}
}
if(agrega>=0)
newMes=5;
}
if(mes==5)
{ for(mai=dia+1; mai<32; mai++)
{
if(agrega>=0)
{
agrega--;
newDia = mai;
}
}
if(agrega>=0)
newMes=6;
}
if(newMes==5)
{
for(mai=1; mai<32; mai++){
if(agrega>=0){
agrega--;
newDia = mai;
}
}
if(agrega>=0)
newMes=6;
}
if(mes==6){
for(jun=dia+1; jun<31; jun++){
if(agrega>=0){
agrega--;
newDia = jun;
}
}
if(agrega>=0)
newMes=7;
}
if(newMes==6){
for(jun=1; jun<31; jun++){
if(agrega>=0){
agrega--;
newDia = jun;
}
}
if(agrega>=0)
newMes=7;
}
if(mes==7){
for(jul=dia+1; jul<32; jul++){
if(agrega>=0){
agrega--;
newDia = jul;
}
}
if(agrega>=0)
newMes=8;
}
if(newMes==7){
for(jul=1; jul<32; jul++){
if(agrega>=0){
agrega--;
newDia = jul;
}
}
if(agrega>=0)
newMes=8;
}
if(mes==8){
for(ago=dia+1; ago<32; ago++){
if(agrega>=0){
agrega--;
newDia = ago;
}
}
if(agrega>=0)
newMes=9;
}
if(newMes==8){
for(ago=1; ago<32; ago++){
if(agrega>=0){
agrega--;
newDia = ago;
}
}
if(agrega>=0)
newMes=9;
}
if(mes==9){
for(set=dia+1; set<31; set++){
if(agrega>=0){
agrega--;
newDia = set;
}
}
if(agrega>=0)
newMes=10;
}
if(newMes==9){
for(set=1; set<31; set++){
if(agrega>=0){
agrega--;
newDia = set;
}
}
if(agrega>=0)
newMes=10;
}
if(mes==10){
for(out=dia+1; out<32; out++){
if(agrega>=0){
agrega--;
newDia = out;
}
}
if(agrega>=0)
newMes=11;
}
if(newMes==10){
for(out=1; out<32; out++){
if(agrega>=0){
agrega--;
newDia = out;
}
}
if(agrega>=0)
newMes=11;
}
if(mes==11){
for(nov=dia+1; nov<31; nov++){
if(agrega>=0){
agrega--;
newDia = nov;
}
}
if(agrega>=0)
newMes=12;
}
if(newMes==11){
for(nov=1; nov<30; nov++){
if(agrega>=0){
agrega--;
newDia = nov;
}
}
if(agrega>=0)
newMes=12;
}
if(mes==12){
for(dez=dia+1; dez<32; dez++){
if(agrega>0){
agrega--;
newDia = dez;
}
}
if(agrega>0 && newMes==12){
newMes=1;
newYear= newYear + 1;
if((newYear%4==0)||(newYear%400==0)&&(newYear%100!=0)){//Validar si es bisiesto
bis=1;
}else{
bis=0;
}
}
}
if(newMes==12){
for(dez=1; dez<32; dez++){
if(agrega>0){
agrega--;
newDia = dez;
}
}
if(agrega>0 && newMes==12){

newMes=1;
newYear= newYear + 1;
if((newYear%4==0)||(newYear%400==0)&&(newYear%100!=0))
{//Validar si es bisiesto
bis=1;
}else{
bis=0;
}
}
}
}





printf("\n\n La nueva fecha es dia %d del mes %d del anio %d\n",newDia-1,newMes,newYear);

}
//////////////////////////////////

void semana (const t_fecha *pf)
{
int t,anio,mes,dia;
anio=pf->a-1601;
mes=pf->m;
dia=pf->d;

t= 365*anio+anio/4-anio/100+anio/400+incrdias(pf);

/*for (i=0;i<mes;i++)
{t+=cantdiasmes(mes,anio);
}

t+=dia; */

t%=7;
switch (t)
{case 0: printf("Domingo\n");
break;
case 1: printf("Lunes\n");
break;
case 2: printf("Martes\n");
break;
case 3: printf("Miercoles\n");
break;
case 4: printf("Jueves\n");
break;
case 5: printf("Viernes\n");
break;
case 6: printf("Sabado\n");
break;
}

}
/////////////////////////////////////////////////////////////////
int dif_fecha(const t_fecha *f1, const t_fecha *f2)
{
int ca1,ca2,cd1,cd2;
ca1=f1->a-1601;
ca2=f2->a-1601;
cd1=ca1*365+ca1/4-ca1/100+ca1/400+incrdias(f1);
cd2=ca2*365+ca2/4-ca2/100+ca2/400+incrdias(f2);
return (cd1-cd2);
}

int incrdias (const t_fecha *fecha)
{
int dias=0,m=1;
for(m=1;m<fecha->m;m++)
{
dias+=cantdiasmes(m,fecha->a);
}
dias+=fecha->d;
return dias;
}


int comparaFecha( t_fecha *f1, t_fecha *f2)
{ //-1 si fecha1 < fecha2 / 0 si fecha1 = fecha2 / 1 si fecha1 > fecha2
int val;
if( f1->a < f2->a )
val=-1;
else if(f1->a > f2->a)
val=1;
else {
if(f1->m < f2->m)
val=-1;
else if(f1->m > f2->m)
val=1;
else{
if(f1->d < f2->d)
val=-1;
else if(f1->d > f2->d)
val=1;
else val=0;
}
}
return val;
}

Avatar de Usuario
GonzaloVazquez
Junior
Mensajes: 10
Registrado: Lun Dic 09, 2024 6:10 pm
Contactar:

Re: NECESITO HACER ESTE PROGRAMA EN C(C++ NO!)

Mensaje por GonzaloVazquez » Lun Dic 09, 2024 6:43 pm

El problema principal que mencionas, donde se valida incorrectamente todo, parece estar relacionado con el manejo de la lectura del archivo de texto y la correcta asignación y validación de los datos en las estructuras t_info y t_fecha. Aquí hay algunas sugerencias y correcciones para mejorar el flujo de tu programa.

Lectura de archivos:

En la función reg_txt_a_bin_var, el uso de strchr y strrchr puede ser problemático si no se gestionan adecuadamente los delimitadores, ya que estos métodos modifican la cadena original y pueden producir resultados inesperados.
También, la cadena linea que lees del archivo debe ser procesada correctamente antes de intentar extraer los datos. Puedes agregar más validaciones de los delimitadores para evitar problemas.
Manejo de la fecha:

El código para validar fechas en validarfecha está correcto en su mayoría, pero el cálculo de la diferencia de fechas en dif_fecha podría ser más robusto, verificando si las fechas son realmente anteriores o iguales a la fecha de procesamiento.
Algunas funciones como sumardias y diadespues podrían necesitar ajustes para asegurarse de que los días, meses y años se actualicen correctamente.
Validación y carga de datos:

En la función validarcarga, los valores devueltos por la validación de la fecha de nacimiento, fecha de ingreso, y fecha de aprobación podrían mejorarse para asegurar que el alumno cumpla con los criterios, como verificar que las fechas sean consistentes con las fechas actuales de procesamiento.
Uso de fflush(stdin):

El uso de fflush(stdin) es no estándar y puede causar comportamientos inesperados. En su lugar, puedes utilizar fgetc(stdin) o un bucle de lectura para limpiar el buffer de entrada.
Voy a sugerir algunos cambios y correcciones para mejorar la validación:

1. Corregir el flujo de lectura y asignación de datos

Código: Seleccionar todo

int reg_txt_a_bin_var(char *linea, t_info *emp) {
    char *act = strchr(linea, '\n');
    if (!act) return FALSO;

    *act = '\0';  // Eliminamos el salto de línea

    // Asignar la fecha de baja
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    sscanf(act + 1, "%d-%d-%d", &emp->baja.d, &emp->baja.m, &emp->baja.a);

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    sscanf(act + 1, "%c", &emp->estado);

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    sscanf(act + 1, "%d-%d-%d", &emp->aprob.d, &emp->aprob.m, &emp->aprob.a);

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    sscanf(act + 1, "%d", &emp->cantmat);

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    strncpy(emp->carrera, act + 1, sizeof(emp->carrera));

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    sscanf(act + 1, "%d-%d-%d", &emp->ing.d, &emp->ing.m, &emp->ing.a);

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    emp->sexo = *(act + 1);

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    sscanf(act + 1, "%d-%d-%d", &emp->fnac.d, &emp->fnac.m, &emp->fnac.a);

    *act = '\0';
    act = strrchr(linea, '|');
    if (!act) return FALSO;
    strncpy(emp->apyn, act + 1, sizeof(emp->apyn));

    *act = '\0';
    sscanf(linea, "%ld", &emp->dni);

    return VERDADERO;
}

Responder