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