Fecha y hora actual: Sab 19 May, 2012 20:19 pm
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

ayuda codigo de registros

Responder al Tema Ir a página 1, 2  Siguiente

Índice del Foro > C, C#, Visual C++ > ayuda codigo de registros

Autor Mensaje
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Lun 19 Dic, 2011 21:31 pm

Título del mensaje: ayuda codigo de registros

Responder citando

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//constantes//
#define IVA 16.0f
#define POR_RET_IVA 10.0f
#define POR_RET_ISR 10.0f
#define CAPTURA_MES 1
#define CAP_INGRESO 2
#define CAP_GASTOS 3
#define L_INGR_ANUALES 4
#define L_GAST_ANUALES 5
#define CALC_IMPUESTOS 6
#define SALIR 7
#define MESES 12
#define GASTOS 20
#define INGRESOS 20

void mostrar_menu();
void captura_mes();
void captura_ingreso();
void captura_gasto();
void lista_ingreso_anual();
void lista_gasto_anual();
float monto(float ganancia_bruta);
void calculo_impuestos();
void inicializa();

typedef struct registro1
{
char concepto[30+1];
char RFC[21+1];
float monto;
int mes;
struct registro1* sig;

}ingreso;

typedef struct registro2
{
char concepto[30+1];
char RFC[21+1];
float monto;
int mes;
struct registro2* sig;
}gasto;

//variables globales de uso interno del programa//
char *meses[MESES];
int m,contador=0,mes,reg,indice,porcentaje_ISR[3];
float rango_monto[3][2],ingreso_meses[MESES],gastos_meses[MESES];
//arreglo de ingresos y gastos//
ingresos ingreso[INGRESOS],gastos gasto[GASTOS];

int main()
{
//variables de programa modificables por el usuario//
ingreso *info_registro1;
gasto *info_registro2;

int opcion,continuar = 1;
inicializa();
do
{
mostrar_menu();
scanf("%d",&opcion);
switch(opcion)
{
case CAPTURA_MES:
captura_mes();
break;
case CAP_INGRESO:
captura_ingreso();
break;
case CAP_GASTOS:
captura_gasto();
break;
case L_INGR_ANUALES:
lista_ingreso_anual();
break;
case L_GAST_ANUALES:
lista_gasto_anual();
break;
case CALC_IMPUESTOS:
calculo_impuestos();
break;
case SALIR:
continuar = 0;
break;
default:printf("Opcion no valida!\n");
}
if(continuar){
system("pause");
}
}while(continuar);
return 0;
}

void inicializa()
{
reg=0;
m=0;
mes=1;
indice=0;
meses[0]="Enero";
meses[1]="Febrero";
meses[2]="Marzo";
meses[3]="Abril";
meses[4]="Mayo";
meses[5]="Junio";
meses[6]="Julio";
meses[7]="Agosto";
meses[8]="Septiembre";
meses[9]="Octubre";
meses[10]="Noviembre";
meses[11]="Diciembre";
rango_monto[0][0]=0;
rango_monto[0][1]=10000.00;
rango_monto[1][0]=10000.00;
rango_monto[1][1]=20000.00;
rango_monto[2][0]=20000.00;
rango_monto[2][1]=10000000.00;
porcentaje_ISR[0]=11;
porcentaje_ISR[1]=15;
porcentaje_ISR[2]=20;
}

void mostrar_menu()
{
ingreso*info_registro1;
ingreso*nuevo;
nuevo=info_registro1;
system("cls");
printf("CALCULO DE IMPUESTOS ANUAL\n\n");
printf("Menu principal:\n");
printf("1. Establecer mes para la captura (mes actual es %s)\n",meses[mes-1]);
printf("2. Captura de ingresos\n");
printf("3. Captura de gastos\n");
printf("4. Mostrar lista de ingresos anual\n");
printf("5. Mostrar lista de gastos anual\n");
printf("6. Calculo de impuestos anual\n");
printf("7. Salir\n");
printf("Opcion: ");
}

void captura_mes()
{
printf("Establecer mes para captura\n");
for(contador=0,indice;contador<MESES;contador++,indice++)
printf("%d) %s\n",indice+1,meses[contador]);
printf("Elige el mes (1 a 12):\n");
fflush(stdin);
scanf("%d",&m);
if(m > 12)
printf("Mes no valido!\n");
else
{
printf("Se ha establecido el mes de captura en %s\n",meses[m-1]);
mes = m;
}
}

void captura_ingreso()
{
ingreso*info_registro1;
ingreso*nuevo;
nuevo=(ingreso*)malloc(sizeof(ingreso));
nuevo->sig=info_registro1->sig;
info_registro1->sig=nuevo;

printf("Captura ingresos\n");
printf("Dame un ingreso mas para el mes de %s: \n",meses[m-1]);
printf("Provee datos para el ingreso %d.\n",reg);
if(reg>INGRESOS)
printf("no hay mas espacio\n");
printf("RFC:");
fflush(stdin);
gets(nuevo->RFC);
printf("Concepto:");
fflush(stdin);
gets(nuevo->concepto);
printf("Monto:");
fflush(stdin);
scanf("%f",&nuevo->monto);
nuevo->mes=m;
++reg;
}

void captura_gasto()
{
gasto*info_registro2;
gasto*nuevo;
nuevo=(gasto*)malloc(sizeof(gasto));
nuevo->sig=info_registro2->sig;
info_registro2->sig=nuevo;

printf("Captura gastos\n");
printf("Dame el gasto del mes de %s: \n",meses[m-1]);
printf("Provee datos para el gasto %d.\n",reg);
if(reg>GASTOS)
printf("no hay mas espacio\n");
printf("Concepto:");
fflush(stdin);
gets(nuevo->concepto);
printf("Monto:");
fflush(stdin);
scanf("%f",&nuevo->monto);
nuevo->mes=m;
++reg;
}

void lista_ingreso_anual()
{
ingreso*info_registro1;
ingreso*nuevo;
nuevo=info_registro1->sig;
printf("Mostrar lista de ingresos anual\n\n");
printf("Indice Mes\t\tMonto\tRFC\t\tConcepto\n");
printf("%d\t",indice);
printf("%s",meses[nuevo->mes-1]);
strcpy(ingresos ingreso,nuevo->monto);
strcpy(ingresos ingreso,nuevo->RFC);
strcpy(ingresos ingreso,nuevo->concepto);
}

void lista_gasto_anual()
{
gasto*info_registro2;
gasto*nuevo;
nuevo=info_registro2->sig;
printf("Mostrar lista de gastos anual\n");
printf("Indice Mes\t\tMonto\tCconcepto\n");
printf("%d\t",indice);
printf("%s",meses[nuevo->mes-1]);
strcpy("nuevo->monto",gastos gasto);
strcpy("nuevo->concepto",gastos gasto);
}

float monto(float gan_bruta)
{
float por_isr;
if((gan_bruta>rango_monto[0][0])&&(gan_bruta<=rango_monto[1][0]))
por_isr= porcentaje_ISR[0];
else
if((gan_bruta>rango_monto[1][0])&&(gan_bruta<=rango_monto[2][0]))
por_isr= porcentaje_ISR[1];
else
if(gan_bruta>rango_monto[2][0])
por_isr= porcentaje_ISR[2];
else
por_isr=0.00;

return(por_isr);
}

void calculo_impuestos()
{
float iva,subtotal,ret_isr,ret_iva,total,gan_bruta,isr,gan_neta,isr_pag,gasto_iva,iva_pag;
float por_isr,ingreso_total,gasto_total;

for(contador;contador<=MESES;contador++)
{
ingreso_total=ingreso_meses[contador];
gasto_total=gastos_meses[contador];
}
iva=(ingreso_total*IVA)/100;
subtotal=ingreso_total+iva;
ret_isr=(ingreso_total*POR_RET_ISR)/100;
ret_iva=(ingreso_total*POR_RET_IVA)/100;
total=subtotal-(ret_isr+ret_iva);
gan_bruta=(ingreso_total-gasto_total);
por_isr=monto(gan_bruta);
isr=(gan_bruta*por_isr)/100;
gan_neta=(gan_bruta-isr);
isr_pag=(isr-ret_isr);
gasto_iva=(gasto_total*IVA)/100;
iva_pag=(iva-gasto_iva-ret_iva);
printf("CALCULO DE IMPUESTOS\n\n");
printf("***Tabla de Recibo de Honorarios***\n");
printf("Ingresos\t\t%.2f\n",ingreso_total);
printf("(+) IVA\t\t\t%.2f\n",iva);
printf("(=) Subtotal\t\t%.2f\n",subtotal);
printf("(-) Retención ISR\t%.2f\n",ret_isr);
printf("(-) Retención IVA\t%.2f\n",ret_iva);
printf("(=) Total\t\t%.2f\n",total);
printf("***Tabla Ganancias***\n");
printf("Ingresos\t\t%.2f\n",ingreso_total);
printf("(-) Gastos\t\t%.2f\n",gasto_total);
printf("(=) Ganancia Bruta\t%.2f\n",gan_bruta);
printf("(-) ISR %.2f%%\t\t%.2f\n",por_isr,isr);
printf("(=) Ganancia Neta\t%.2f\n",gan_neta);
printf("***Tabla ISR***\n");
printf("ISR %.2f%%\t\t%.2f\n",por_isr,isr);
printf("(-) ISR Retenido\t%.2f\n",ret_isr);
printf("(=) ISR a Pagar\t\t%.2f\n",isr_pag);
printf("***Tabla IVA***\n");
printf("IVA\t\t\t%.2f\n",iva);
printf("(-) Gastos IVA\t\t%.2f\n",gasto_iva);
printf("(-) Retención IVA\t%.2f\n",ret_iva);
printf("(=) IVA a Pagar\t\t%.2f\n",iva_pag);
}

me marca un error donde tengo declarados los arreglos de ingresos y gastos y donde vienen los strcpy

y no se por que!!! me urge terminar este programa

gracias

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Mar 20 Dic, 2011 16:19 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Qué dice literalmente el error? (de ésto siempre me acordaré de alguna respuesta del capi)


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Mar 20 Dic, 2011 23:06 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

dice incompatible type for argument 1 of strcpy, y tambien me salen unos warnings en las lineas 226,227 y 228 que dicen:

passing arg 2 of strcpy from incompatible pointer type.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Mie 21 Dic, 2011 16:21 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

hablamos del mismo código? Oye marcela, pero lo que muestras no tiene por donde cogerlo. Hay errores por montón de lugares... por cierto no se a que líneas se refiere el error, porque como podrás ver... el código no está indexado, más o menos creo que corresponde a las líneas...
Código:

...
void lista_gasto_anual()
{

...
.. pero no hay nada anómalo. Luego no se si conoces la palabra literal, y es algo así como exacto, en resumen te pedía que fueras más precisa con los mensajes de error.

Por ejemplo, incompatible type for argument 1 of strcpy. Indica que el primer argumento de la función strcpy() (copiar cadenas) no es un tipo compatible. Dicha función funciona de la siguiente forma:

char * strcpy( char * cadenaDestino, const char * cadenaOrigen);

Pasa la cadenaOrigen, de tipo const char *, a cadenaDestino, de tipo char *. entiendes?

y para, passing arg 2 of strcpy from incompatible pointer type. Te indica que el segundo argumento que le pasas a la función strcpy() no es un puntero compatible, osea, que le pasas un puntero o un arreglo, pero no es de tipo const char.

Bueno aparte de esas cositas que nombraste, tienes filigranas como ésta por ejemplo:
Código:
...
strcpy(ingresos ingreso,nuevo->monto);
...
usas strcpy() para declarar una estructura en su primer argumento, algo inaudito, ya que como antes te comenté, strcpy() copia de un puntero a otro, y su primer argumento no puede ser una declaración. Además en el segundo argumento le metes un float, de verdad, que sentido tiene todo eso?

Pienso que el código que estás afrontando es demasiado para los pocos conocimientos que posees. Mi consejo es que practiques mucho y repases.

suerte Ok


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Mie 21 Dic, 2011 20:46 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Si creo que tienes razón, lo mejor para mi será ponerme a estudiar y practicar Triste

gracias

Volver arriba
Ver perfil del usuario Enviar mensaje privado
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Mar 27 Dic, 2011 20:18 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Código:
#define IVA 16.0f
#define POR_RET_IVA 10.0f
#define POR_RET_ISR 10.0f
#define CAPTURA_MES 1
#define CAP_INGRESO 2
#define CAP_GASTOS 3
#define L_INGR_ANUALES 4
#define L_GAST_ANUALES 5
#define CALC_IMPUESTOS 6
#define SALIR 7
#define MESES 12
#define GASTOS 20
#define INGRESOS 20

void mostrar_menu();
void captura_mes();
void captura_ingreso();
void captura_gasto();
void lista_ingreso_anual();
void lista_gasto_anual();
float monto(float ganancia_bruta);
void calculo_impuestos();
void inicializa();

typedef struct registro1
{
    char concepto[30+1];
    char RFC[21+1];
    float monto;
    int mes;
    struct registro1* sig;

}ingreso;

typedef struct registro2
{
    char concepto[30+1];
    char RFC[21+1];
    float monto;
    int mes;
    struct registro2* sig;
}gasto;

//variables globales de uso interno del programa//
char *meses[MESES];
int i,mes_elegido,reg,porcentaje_ISR[3];
float rango_monto[3][2];
//arreglo de registros para ingresos y gastos//
ingreso ingresos[INGRESOS];
gasto gastos[GASTOS];

int main()
{
    //variables de programa modificables por el usuario//
    int opcion,continuar = 1;
    inicializa();
    do
    {
        mostrar_menu();
        scanf("%d",&opcion);
        switch(opcion)
        {
            case CAPTURA_MES:
                captura_mes();
                break;
            case CAP_INGRESO:
                captura_ingreso();
                break;
            case CAP_GASTOS:
                captura_gasto();
                break;
            case L_INGR_ANUALES:
                lista_ingreso_anual();
                break;
            case L_GAST_ANUALES:
                lista_gasto_anual();
                break;
            case CALC_IMPUESTOS:
                calculo_impuestos();
                break;
            case SALIR:
                continuar = 0;
                break;
            default:printf("Opcion no valida!\n");
        }
        if(continuar){
            system("pause");
        }
    }while(continuar);
    return 0;
}

void inicializa()
{
    i=0;
    reg=0;
    mes_elegido=1;
    meses[0]="Enero";
    meses[1]="Febrero";
    meses[2]="Marzo";
    meses[3]="Abril";
    meses[4]="Mayo";
    meses[5]="Junio";
    meses[6]="Julio";
    meses[7]="Agosto";
    meses[8]="Septiembre";
    meses[9]="Octubre";
    meses[10]="Noviembre";
    meses[11]="Diciembre";
    rango_monto[0][0]=0;
    rango_monto[0][1]=10000.00;
    rango_monto[1][0]=10000.00;
    rango_monto[1][1]=20000.00;
    rango_monto[2][0]=20000.00;
    rango_monto[2][1]=10000000.00;
    porcentaje_ISR[0]=11;
    porcentaje_ISR[1]=15;
    porcentaje_ISR[2]=20;
}

void mostrar_menu()
{
    ingreso*info_registro1;
    ingreso*nuevo;
    nuevo=info_registro1;
    system("cls");
    printf("CALCULO DE IMPUESTOS ANUAL\n\n");
    printf("Menu principal:\n");
    printf("1. Establecer mes para la captura (mes actual es %s)\n",meses[mes_elegido-1]);
    printf("2. Captura de ingresos\n");
    printf("3. Captura de gastos\n");
    printf("4. Mostrar lista de ingresos anual\n");
    printf("5. Mostrar lista de gastos anual\n");
    printf("6. Calculo de impuestos anual\n");
    printf("7. Salir\n");
    printf("Opcion: ");
}

void captura_mes()
{
    int indice;
    printf("Establecer mes para captura\n");
    for(i=0,indice=0;i<MESES;i++,indice++)
    printf("%d) %s\n",indice+1,meses[i]);
    printf("Elige el mes (1 a 12):\n");
    fflush(stdin);
    scanf("%d",&mes_elegido);
    if(mes_elegido > MESES)
        printf("Mes no valido!\n");
    else
        printf("Se ha establecido el mes de captura en %s\n",meses[mes_elegido-1]);
}

void captura_ingreso()
{
    ingreso*info_registro1;
    ingreso*nuevo;
    nuevo=(ingreso*)malloc(sizeof(ingreso));
    nuevo->sig=info_registro1->sig;
    info_registro1->sig=nuevo;

    printf("Captura ingresos\n");
    printf("Dame un ingreso mas para el mes de %s: \n",meses[mes_elegido-1]);
    printf("Provee datos para el ingreso %d.\n",reg);
    if(reg>INGRESOS)
       printf("no hay mas espacio\n");
    printf("RFC:");
    fflush(stdin);
    gets(nuevo->RFC);
    printf("Concepto:");
    fflush(stdin);
    gets(nuevo->concepto);
    printf("Monto:");
    fflush(stdin);
    scanf("%f",&nuevo->monto);
    nuevo->mes=mes_elegido;
    ++reg;
}

void captura_gasto()
{
    gasto*info_registro2;
    gasto*nuevo;
    nuevo=(gasto*)malloc(sizeof(gasto));
    nuevo->sig=info_registro2->sig;
    info_registro2->sig=nuevo;

    printf("Captura gastos\n");
    printf("Dame el gasto del mes de %s: \n",meses[mes_elegido-1]);
    printf("Provee datos para el gasto %d.\n",reg);
    if(reg>GASTOS)
       printf("no hay mas espacio\n");
    printf("Concepto:");
    fflush(stdin);
    gets(nuevo->concepto);
    printf("Monto:");
    fflush(stdin);
    scanf("%f",&nuevo->monto);
    nuevo->mes=mes_elegido;
    ++reg;
}

void lista_ingreso_anual()
{
    ingreso*info_registro1;
    ingreso*nuevo;
    printf("Mostrar lista de ingresos anual\n\n");
    printf("Indice  Mes\t\tMonto\t\tRFC\t\tConcepto\n");
    for(nuevo=info_registro1->sig,i=0;nuevo!=NULL;nuevo=nuevo->sig,i++)
    {
        printf("%d\t",i);
        printf("%s  ",meses[nuevo->mes-1]);
        printf("\t%.2f\t",nuevo->monto);
        printf("\t%s\t",nuevo->RFC);
        printf("%s\n",nuevo->concepto);
    }
}

void lista_gasto_anual()
{
    gasto*info_registro2;
    gasto*nuevo;
    printf("Mostrar lista de gastos anual\n");
    printf("Indice\tMes\t\tMonto\t\tConcepto\n");
    for(nuevo=info_registro2->sig,i=0;nuevo!=NULL;nuevo=nuevo->sig,i++)
    {
       printf("%d\t",i);
       printf("%s",meses[nuevo->mes-1]);
       printf("\t%.2f\t",nuevo->monto);
       printf("\t%s\n",nuevo->concepto);
    }
}

float monto(float gan_bruta)
{
    float por_isr;
    if((gan_bruta>rango_monto[0][0])&&(gan_bruta<=rango_monto[1][0]))
    por_isr= porcentaje_ISR[0];
    else
    if((gan_bruta>rango_monto[1][0])&&(gan_bruta<=rango_monto[2][0]))
    por_isr= porcentaje_ISR[1];
    else
    if(gan_bruta>rango_monto[2][0])
    por_isr= porcentaje_ISR[2];
    else
    por_isr=0.00;
    return(por_isr);
}

void calculo_impuestos()
{
    float iva,subtotal,ret_isr,ret_iva,total,gan_bruta,isr,gan_neta,isr_pag,gasto_iva,iva_pag;
    float por_isr,ingreso_total=0,gasto_total=0;

    ingreso*info_registro1;
    gasto*info_registro2;

    ingreso*total1;
    gasto*total2;

    total1=info_registro1->sig;
    total2=info_registro2->sig;

    while(total1!=NULL)
    {
        ingreso_total+=total1->monto;
        total1=total1->sig;
    }

    while(total2 != NULL)
    {
        gasto_total+=total2->monto;
        total2=total2->sig;
    }

    iva=(ingreso_total*IVA)/100;
    subtotal=ingreso_total+iva;
    ret_isr=(ingreso_total*POR_RET_ISR)/100;
    ret_iva=(ingreso_total*POR_RET_IVA)/100;
    total=subtotal-(ret_isr+ret_iva);
    gan_bruta=(ingreso_total-gasto_total);
    por_isr=monto(gan_bruta);
    isr=(gan_bruta*por_isr)/100;
    gan_neta=(gan_bruta-isr);
    isr_pag=(isr-ret_isr);
    gasto_iva=(gasto_total*IVA)/100;
    iva_pag=(iva-gasto_iva-ret_iva);
    printf("CALCULO DE IMPUESTOS\n\n");
    printf("***Tabla de Recibo de Honorarios***\n");
    printf("Ingresos\t\t%.2f\n",ingreso_total);
    printf("(+) IVA\t\t\t%.2f\n",iva);
    printf("(=) Subtotal\t\t%.2f\n",subtotal);
    printf("(-) Retención ISR\t%.2f\n",ret_isr);
    printf("(-) Retención IVA\t%.2f\n",ret_iva);
    printf("(=) Total\t\t%.2f\n",total);
    printf("***Tabla Ganancias***\n");
    printf("Ingresos\t\t%.2f\n",ingreso_total);
    printf("(-) Gastos\t\t%.2f\n",gasto_total);
    printf("(=) Ganancia Bruta\t%.2f\n",gan_bruta);
    printf("(-) ISR %.2f%%\t\t%.2f\n",por_isr,isr);
    printf("(=) Ganancia Neta\t%.2f\n",gan_neta);
    printf("***Tabla ISR***\n");
    printf("ISR %.2f%%\t\t%.2f\n",por_isr,isr);
    printf("(-) ISR Retenido\t%.2f\n",ret_isr);
    printf("(=) ISR a Pagar\t\t%.2f\n",isr_pag);
    printf("***Tabla IVA***\n");
    printf("IVA\t\t\t%.2f\n",iva);
    printf("(-) Gastos IVA\t\t%.2f\n",gasto_iva);
    printf("(-) Retención IVA\t%.2f\n",ret_iva);
    printf("(=) IVA a Pagar\t\t%.2f\n",iva_pag);
}


ya corregi el codigo, le quite los strcpy y otros detalles y ya compila bien solo que cuando elijo la opcion de lista_ingreso_anul despues de realizar el procedimiento me saca del programa me dice main.exe dejo de funcionar :(  y el codigo deberia de terminar hasta que yo le de la instruccion

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Mie 28 Dic, 2011 14:18 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Lo que no entiendo es porque listas un puntero vacío, ya que en las dos funciones para listar usas dos punteros que declaras ahí mismo, pero con que fin?

Código:
...
    ingreso*info_registro1;
    ingreso*nuevo;
...


Lo normal es que trabajes con los que declaras al principio...
Código:
...
//arreglo de registros para ingresos y gastos//
ingreso ingresos[INGRESOS];
gasto gastos[GASTOS];
...


Aún así el código no es muy claro, aunque legible, y abusas de variables globales...

Quieres aprender? Puedo enseñarte con diferentes pasos (prácticas) como trabajar con una lista enlazada, aceptas el desafío? Eso si, usando tu mismo ejercicio.


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
eduar2083
Usuario Activo


Registrado: 14 Nov 2008
Mensajes: 195
Ubicación: Lima - Perú

Mensaje Publicado: Mie 28 Dic, 2011 16:42 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Hola.
El programa tiene muchos errores.
- No muestras los headers que estás utilizando.
- Como ya lo dijo WhiteSkull, utilizas demasiadas variables globales. En la medida de lo posible evítalas y en lugar de ello, haz que lo módulos se comuniquen a través del paso de parámetros. A lo sumo podrías declarar el array de cadena de caracteres que representa a los nombres de cada mes como global de la siguiente manera:
Código:
char *meses[] =
{
   "Enero", "Febrero", "Marzo", "Abril",
   "Mayo", "Junio", "Julio", "Agosto",
   "Setiembre", "Octubre", "Noviembre", "Diciembre"
};

Y accedes a cada uno de ellos simplemente indexando el array
Código:
puts(meses[0]);   /* imprime Enero */
puts(meses[11]);   /* imprime Diciembre */

- la instrucción fflush(stdin); no funcionará en Linux, el comportamiento será indefinido ya que dicha función está definida en el estándar Ansi C para funcionar con flujos de salida (como stdout) y no con flujos de entrada (como stdin), sin embargo, para Windows está definida para ambos flujos, en lugar de ello, debes crear una rutina para limpiar el búfer de entrada manualmente.
Código:
void flush_stdin(void)
{
   int c;

   while ((c = getchar()) != EOF && c != '\n')
      ;
}

-Declaras 2 estructuras idénticas, podrías declarar una sola y declarar 2 variables. Lo más viable para tu ejercicio es utilizar estructuras dinámicas, como listas, pilas o colas. La estructura autoreferenciada para las 2 primeras sería declarada de la siguiente manera:
Código:
typedef struct
{
   char concepto[30+1];
   char RFC[21+1];
   float monto;
   int mes;
}
Registro;

/* Estructura autoreferenciada */
typedef struct Nodo
{
   Registro
   struct Nodo *sig;
}
Nodo;


Hay varias cosas por cambiar, puedes hacerlo mejor. Sin embargo sería recomendable además que dieras más pistas acerca de funcionamiento del programa, el proceso que debe realizar ya que no logro comprender el correcto funcionamiento. Postea la descripción del problema.

Un saludo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Mie 28 Dic, 2011 23:35 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

El objetivo de mi practica era poder implementar registros de ingresos y gastos, que me soliciten RFC,monto y concepto, y que el mes de trabajo sea una captura implicita para cada registro y que me permita cualquier cantidad de registros para un mismo mes.

Tambien me pide algunos requerimientos como por ejemplo:

Declarar un arreglo de registros para ingreso y otro para gasto de un tamaño de 20 elementos cada uno

Inicializar en la subrutina de inicializacion las variables globales

si me di a entender???

WhiteSkull si me gustaria aprender, creo que si necesito un poco de ayuda

gracias

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Jue 29 Dic, 2011 02:57 am

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Bien... es que lo que necesitas no sólo es aprender el concepto de lista enlazada, si no también a desarrollar una aplicación, pasaremos de lo simple a lo complejo. Prescindiendo de las variables globales y para ponértelo más fácil, te pongo "casi" todo el código. Tu solamente debes hacer lo siguiente; con el código que muestro abajo, debes declarar un tipo ingreso, tal como tienes definido y luego creas un registro, osea le asignas unos valores, de momento no tomes valores por teclado, haz una asignación directa con el operador = o con la función de turno.
Código:
#include <stdio.h>
#include <conio.h> // funcion getch()
#include <string.h> // funcion strcpy()

// Primero definimos los tipos
typedef struct registro1
{
    char concepto[30+1];
    char RFC[21+1];
    float monto;
    int mes;
    struct registro1* sig;

}ingreso;

int main()
{
    // Declaramos aquí
   
    // creamos un registro
   
    getch();
    return 0;
}


Una pista. Para asignar cadenas a un arreglo, recuerda que debemos usar strcpy().


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Jue 29 Dic, 2011 23:35 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Sería algo como esto? es que no estoy segura si lo desarrolle bien.

Código:
#include <stdio.h>
#include <conio.h> // funcion getch()
#include <string.h> // funcion strcpy()
#define MAX_ING 20  //constantes

// Primero definimos los tipos
typedef struct registro1
{
    char concepto[30+1];
    char RFC[21+1];
    float monto;
    int mes;
    struct registro1* sig;

}ingreso;

int main()
{
    // Declaramos aquí
    ingreso ingresos[MAX_ING];
    // creamos un registro

    strcpy(ingresos[0].concepto,"Desarrollo de sistema");
    strcpy(ingresos[0].RFC,"MUGL790912");
    ingresos[0].monto=300.50;
    ingresos[0].mes=12;
    getch();
    return 0;
}

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Vie 30 Dic, 2011 02:42 am

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Todo bien, a excepción de dos cosas.

Primero:
Código:
ingreso ingresos[MAX_ING]; // MAL, no se crea una array

En una lista enlazada, se vinculan punteros, no se trata de un tipo vector donde se accede aleatoriamente (que puedes empezar por donde quieras). Por eso es autoreferenciado, se llega hasta un registro determinado por medio de otro, entiendes?
http://es.wikipedia.org/wiki/Lista_(inform%C3%A1tica)#Listas_Enlazadas_vs._Vectores_o_Matrices

Por lo que el control del tamaño puedes hacerlo de varias formas, una la más sencilla, es crear una función que nos devuelva el tamaño, cómo? Recorriendo todos los nodos hasta llegar al nodo NULO. Por cada nodo no nulo, se incrementa una variable que devolverá el valor en dicha función. Otra forma, también simple, es colocar una variable estática en la estructura, la cual hay que incrementar manualmente en razón de los registros creados, o reducirla cuando sea realizada una eliminación de un registro, entiendes? Aunque esto lo veremos más adelante.

Segundo:
No se le olvidó algún miembro de la lista?
Código:
struct registro1* sig;

Pues si, las variables siempre deberán estar inicializadas con un valor, por lo menos en C. Ya que el compilador es un poco perezoso, y el lo único se limitará a reservar memoria, pero no asigna valores por defecto. Lo recomendable es que al nodo siguiente, le asignaras NULL para que en caso de recorrerlo sepamos que no hay otro registro después del presente.

Por lo demás me alegro que ya empieces a familiarizarte con strcpy() Risa.

Bien, puedes hacerlo mejor marcela, pasemos al siguiente desafío. Con el código que muestro abajo, debemos crear otro registro siguiendo el mismo proceso que el anterior, pero OJO ! tendrás que asignar el puntero del siguiente registro al primero Risa . Luego para rematar la faena, quiero que definas la función que he creado, la cual nos devolverá la longitud total de la lista Guiño .

Código:
#include <stdio.h>
#include <conio.h> // funcion getch()
#include <string.h> // funcion strcpy()

// Primero definimos los tipos
typedef struct registro1
{
    char concepto[30+1];
    char RFC[21+1];
    float monto;
    int mes;
    struct registro1* sig;

}ingreso;

// Luego las declaraciones de las funciones, importante ya que vamos a usar un tipo
// definido por el usuario y que pasamos como argumento, si no el compilador... ya sabes
char numeroDeResgitrosActuales(ingreso *); // le pasamos un puntero del registro, osea, donde comienzan los registros

int main()
{
    ingreso ingresos; // Declaramos aquí
    // creamos un registro
    strcpy(ingresos.concepto,"Desarrollo de sistema"); // usamos strcpy() para copiar cadenas
    strcpy(ingresos.RFC,"MUGL790912");
    ingresos.monto=300.50;
    ingresos.mes=12; // Diciembre
    ingresos.sig=NULL; // Cerramos la entrada, marcándola con el token NULL
    // creamos otro registro
   
    printf("\nLa lista contiene actualmente %d registros.\n pulse cualquier tecla para -salir- ",
        numeroDeResgitrosActuales( /* aquí falta algo */ ) );
   
    getch();
    return 0;
}

char numeroDeResgitrosActuales(ingreso * pIngreso)
{
    /* Define la función aquí */
    char i=0; // Como no vamos a superar 20 registros con un char es más que suficiente, de esa forma somos más eficientes con la gestión de memoria
    return i;
}


Con este ejercicio pondrás en práctica tus conocimientos sobre los punteros. Recuerda que de los errores se aprende.

reeditado. Ayuda con los punteros -> http://www.foro.lospillaos.es/viewtopic.php?p=16362#16362


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Dom 01 Ene, 2012 21:24 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Me costo algo de trabajo poder comprender todo lo que se refiere a los punteros Ojos pero creo hice algunos avances

A proposito feliz año nuevo

Código:

#include <stdio.h>
#include <stdlib.h> //funcion malloc()
#include <conio.h> // funcion getch()
#include <string.h> // funcion strcpy()

// Primero definimos los tipos
typedef struct registro1
{
    char concepto[30+1];
    char RFC[21+1];
    float monto;
    int mes;
    struct registro1* sig;

}ingreso;

// Luego las declaraciones de las funciones, importante ya que vamos a usar un tipo
// definido por el usuario y que pasamos como argumento, si no el compilador... ya sabes
char numeroDeResgitrosActuales(ingreso * pIngreso); // le pasamos un puntero del registro, osea, donde comienzan los registros

int main()
{
    ingreso ingresos; // Declaramos aquí
    ingreso *pIngreso;
    pIngreso= &ingresos;
    // creamos un registro
    strcpy(ingresos.concepto,"Desarrollo de sistema"); // usamos strcpy() para copiar cadenas
    strcpy(ingresos.RFC,"MUGL790912");
    ingresos.monto=300.50;
    ingresos.mes=12; // Diciembre
    ingresos.sig= NULL; // Cerramos la entrada, marcándola con el token NULL
    // creamos otro registro
    strcpy(ingresos.concepto,"Curso capacitacion");
    strcpy(ingresos.RFC,"MUGL79009CD3");
    ingresos.monto=500.00;
    ingresos.mes=3;
    ingresos.sig= pIngreso;

    printf("\nLa lista contiene actualmente %d registros.\n pulse cualquier tecla para -salir- ",
        numeroDeResgitrosActuales(pIngreso) );

    getch();
    return 0;
}

char numeroDeResgitrosActuales(ingreso * pIngreso)
{
    /* Define la función aquí */
    pIngreso=(ingreso*)malloc(sizeof(ingreso));
    pIngreso->sig=NULL;
    char i=0; // Como no vamos a superar 20 registros con un char es más que suficiente, de esa forma somos más eficientes con la gestión de memoria
    while(ingreso->sig!=NULL)
    {
        i++;
    }
    return i;
}

Volver arriba
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Dom 01 Ene, 2012 23:03 pm

Título del mensaje: Re: ayuda codigo de registros

Responder citando

y supuestamente cuantos registros te muestra la función ? Triste

mal marcela, flojísima con el tema de los punteros... por eso no entiendes nada de como funciona una lista enlazada... si estás estudiando programación, avanzar sin los conocimientos que se te exigen en este ejercicio será como intentar subir una pendiente helada con un monopatín... es preferible tomarse su tiempo y seguir estudiando el tema, de verdad que te lo aconsejo de corazón.

Veamos es no hay nada medianamente bien en el ejercicio, y eso que te lo puse facilísimo. Vamos a estudiar lo que has hecho por partes, no pasa nada, no te deprimas Risa , ya te comenté que de los errores se aprende, así que aplica el dicho y veamos.

Código:
...
    ingreso ingresos; // Declaramos aquí
    ingreso *pIngreso;
    pIngreso= &ingresos;
...
nooooooo !!! asignas la direccion de trabajo de ingresos al puntero del mismo fin, con que motivo?
Te pedía que crearas otro registro, así de simple... Triste Para crear otro registro, creamos una nueva instancia, lo correcto hubiera sido ésto, por ejemplo:
Código:
...
    ingreso ingresos; // Declaramos aquí
    ingreso *pOtroIngreso;
...

El inconveniente, es que si declaras un puntero, hay que asignarle la memoria manualmente Triste (con malloc). Entonces que tal si prescindimos del puntero para crear un sencillo registro y nos acogemos a lo que te pedía...
WhiteSkull escribió:
...Con el código que muestro abajo, debemos crear otro registro siguiendo el mismo proceso que el anterior...

Así que la declaración adecuada con lo que pedía quedaría así...
Código:
...
    ingreso ingresos; // Declaramos aquí
    ingreso otroIngreso;
...


Siguiente parte, la asignación de datos al nuevo registro...
Código:
...
    // creamos otro registro
    strcpy(ingresos.concepto,"Curso capacitacion");
    strcpy(ingresos.RFC,"MUGL79009CD3");
    ingresos.monto=500.00;
    ingresos.mes=3;
    ingresos.sig= pIngreso;
...
QUEEEEÉ ?!!! jajaja tranquila no pasa nada, es que se acaba de derramar el café sobre los pantalones. Veamos, no estás sobrescribiendo el registro anterior? (Responde a esto en el siguiente hilo e intenta explicarme que intentabas hacer)
Esto se resolvía de la misma manera con que se hizo con el anterior registro, aprovechando que tenías declarado uno nuevo, peeero, primeramente enlazamos el puntero del siguiente registro con el puntero miembro del anterior registro.
Código:
...
        ingresos.sig=&otroIngreso; // enlazamos el registro anterior con el nuevo
...


Luego rellenamos el registro como el anterior...
Código:
...
        // creamos el nuevo registro enlazado
        strcpy(otroIngreso.concepto,"Programilla en C");
        strcpy(otroIngreso.RFC,"Que es RFC?");
        otroIngreso.monto=1.2345;
        otroIngreso.mes=1; // Febrero
        otroIngreso.sig=NULL; // Cerramos la entrada, marcándola con el token NULL
...


Bien, ahora pasamos a la siguiente parte... pasar el registro a la función, dicho de otra forma, pasar la referencia (su dirección) al puntero de la función. Ok, en el ejercicio, lo hiciste bien. Peero si el caso fuera pasar la lista misma, y no el puntero de la lista, en este caso ingresos, entonces deberá quedar así, con el ampersand delante.
Código:
...
    printf("\nLa lista contiene actualmente %d registros.\n pulse cualquier tecla para -salir- ",
        numeroDeResgitrosActuales( &ingresos ) );
...


Y ahora vamos a por la última parte, la definición de la función numeroDeResgitrosActuales(), ésta parte iba más o menos bien, aunque de verdad, no creo que te devuelva más de un cero "pelao". Por qué? Pues porque si ya pasamos la dirección del puntero de la lista pIngreso, por qué le asignaste una nueva dirección? (esta es otra respuesta que necesito de ti)
Código:
...
char numeroDeResgitrosActuales(ingreso * pIngreso)
{
    /* Define la función aquí */
    pIngreso=(ingreso*)malloc(sizeof(ingreso)); // Asigna o reserva un espacio de memoria, y así pierdes la que teniamos :(
...

Lo que si era cierto, es que necesitábamos un puntero para trabajar con el, en este caso para movernos entre los registros, de esa forma, no perdemos el origen de la dirección y no modificamos el puntero de la lista. La solución quedaría por crear un puntero que apuntara a pIngreso:
Código:
...
char numeroDeResgitrosActuales(ingreso * pIngreso)
{
    /* Define la función aquí */
    int i=0;
    ingreso * pRegistro; // usamos un puntero temporal para mostrar los registros del puntero de Ingreso
    pRegistro=pIngreso; // de esa forma comenzamos desde el puntero de Ingreso y no perdemos el puntero inicial
...
y luego lo ideal, en el bucle while() sería comprobar si el puntero actual es nulo o no, incrementando i en el caso de que no fuera y asignándose así mismo el siguiente puntero que contiene en su miembro sig, como si de un trabalenguas se tratase.

Código corregido y completo:
Código:
#include <stdio.h>
#include <conio.h> // funcion getch()
#include <string.h> // funcion strcpy()

// Primero definimos los tipos
typedef struct registro1
{
    char concepto[30+1];
    char RFC[21+1];
    float monto;
    int mes;
    struct registro1* sig;

}ingreso;

// Luego las declaraciones de las funciones, importante ya que vamos a usar un tipo
// definido por el usuario y que pasamos como argumento, si no el compilador... ya sabes
char numeroDeResgitrosActuales(ingreso *); // le pasamos un puntero del registro, osea, donde comienzan los registros
void lista_ingreso_anual(ingreso *); // le pasamos un puntero del registro, osea, donde comienzan los registros

int main()
{
    ingreso ingresos; // Declaramos aquí
    // creamos un registro
    strcpy(ingresos.concepto,"Desarrollo de sistema"); // usamos strcpy() para copiar cadenas
    strcpy(ingresos.RFC,"MUGL790912");
    ingresos.monto=300.50; // el resto de asignaciones se realizan con el operador =
    ingresos.mes=12; // Enero, mejor usar un enum, pero da igual no quiero que t explote la cabeza
    ingresos.sig=NULL; // Cerramos la entrada, marcándola con el token NULL
    // creamos otro registro
    if (ingresos.sig==NULL) {
        printf("No hay mas registros, así que vamos a meter otro.");
        ingreso otroIngreso; // creamos otro registro
        ingresos.sig=&otroIngreso; // enlazamos el registro anterior con el nuevo       
        // creamos el nuevo registro enlazado
        strcpy(otroIngreso.concepto,"Curso capacitacion");
        strcpy(otroIngreso.RFC,"MUGL79009CD3");
        otroIngreso.monto=500.0;
        otroIngreso.mes=3; // Marzo
        otroIngreso.sig=NULL; // Cerramos la entrada, marcándola con el token NULL
    }
   
    printf("\nLa lista contiene actualmente %d registros.\n pulse cualquier tecla para -salir- ",
        numeroDeResgitrosActuales( &ingresos ) );
   
    getch();
    return 0;
}

char numeroDeResgitrosActuales(ingreso * pIngreso)
{
    /* Define la función aquí */
    int i=0;
    ingreso * pRegistro; // usamos un puntero temporal para mostrar los registros del puntero de Ingreso
    pRegistro=pIngreso; // de esa forma comenzamos desde el puntero de Ingreso y no perdemos el puntero inicial
    while(pRegistro!=NULL)
    {
        i++;
        pRegistro=pRegistro->sig; // pasamos al siguiente registro
    }
       
    return i;
}


Y ahora? Risa Ahora el último desafío y paso final, aquí supuestamente mezclas todos los pasos, que servirá además para que puedas acabar tu programa. Aquí no mostraré código porque lo único que debes hacer es remodelar el ejercicio anterior, lo que te pediré es lo siguiente; Los registros deben introducirse mediante una función, por ejemplo introduceRegistro() tomará un argumento donde le pasamos el puntero original de la lista, los datos se introducirán por medio de entradas, y en caso de superar los 20 registros no nos dejará introducir uno nuevo y retornará un -1, en caso contrario siempre retornará 0 o si quieres 1 para indicar que no tiene memoria suficiente o no la dispone:) .

Este será el último ejercicio, espero que puedas caminar por donde antes te caías.
suerte Ok

Ah!! y FELIZ AÑO 2012 !!!!! Amigos Amigos Amigos Amigos


http://www.youtube.com/watch?v=-lT1zCukNQY
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Mar 03 Ene, 2012 03:24 am

Título del mensaje: Re: ayuda codigo de registros

Responder citando

Una duda, lo puedo hacer con un array de 20 ó tengo que hacerlo con el puntero a la lista que le voy a pasar como argumento??? Ojos

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página 1, 2  Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda por favooor

Yeranea Aviña Preséntate a la comunidad 2 Sab 19 May, 2012 03:35 am Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda Por favor estoy aprendiendo, Error en C++

Leisnar23 C, C#, Visual C++ 1 Vie 18 May, 2012 21:37 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Buscar un patrón en el código fuente de una web

aadriann PHP 1 Vie 18 May, 2012 00:15 am Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda sentencia

WhiteSkull Java 1 Mar 15 May, 2012 17:20 pm Ver último mensaje
El foro no contiene ningún mensaje nuevo

Ayuda problema con proyecto de C. URGE

nlce C, C#, Visual C++ 1 Dom 13 May, 2012 18:28 pm Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,