|
| Autor |
Mensaje |
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Lun 19 Dic, 2011 21:31 pm
Título del mensaje: ayuda codigo de registros |
|
|
#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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Mar 20 Dic, 2011 23:06 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Mie 21 Dic, 2011 16:21 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
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  |
http://www.youtube.com/watch?v=-lT1zCukNQY
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Mar 27 Dic, 2011 20:18 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
| 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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
|
| Volver arriba |
|
|
eduar2083 Usuario Activo

Registrado: 14 Nov 2008 Mensajes: 195 Ubicación: Lima - Perú
|
Publicado: Mie 28 Dic, 2011 16:42 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
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 |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Mie 28 Dic, 2011 23:35 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Jue 29 Dic, 2011 02:57 am
Título del mensaje: Re: ayuda codigo de registros |
|
|
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 |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Jue 29 Dic, 2011 23:35 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Vie 30 Dic, 2011 02:42 am
Título del mensaje: Re: ayuda codigo de registros |
|
|
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() .
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 . Luego para rematar la faena, quiero que definas la función que he creado, la cual nos devolverá la longitud total de la lista .
| 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 |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Dom 01 Ene, 2012 21:24 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
Me costo algo de trabajo poder comprender todo lo que se refiere a los punteros 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 |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Dom 01 Ene, 2012 23:03 pm
Título del mensaje: Re: ayuda codigo de registros |
|
|
y supuestamente cuantos registros te muestra la función ?
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 , 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... 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 (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? 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
Ah!! y FELIZ AÑO 2012 !!!!!  |
http://www.youtube.com/watch?v=-lT1zCukNQY
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
|
| Volver arriba |
|
|