elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error en programa de C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error en programa de C  (Leído 3,534 veces)
Saikilito

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Error en programa de C
« en: 29 Octubre 2017, 02:33 am »

Buenas noches.

Estoy a medias tratando de hacer un programa simple en C, se trata de listar los materiales de varias sucursales y cada item tiene su restricción para poder ser agregado al sistema, el problema es cuando estoy ingresando me genera un error y de verdad no entiendo que es lo que pasa, si alguien me puede ayudar muchas gracias!





Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

# define N 50
# define M 2000000000

typedef struct
{
int  sucursal;
int codItem, cant;
float precUni, precVent ;
char descItem[50];
int lleno;
}fac;

fac inventario[10];

void admitir () ;
void agregar();
void caracteres();
void consultar();
void normalizar();
void vaciar() ;
void restriccion();

int op ;
int i ;


int main( void ) {


void vaciar() ;

aqui :

/*Swich para ingresar una opcion */

printf("Ferreteria Algo me gano: \n\n");
printf(" 1. Finalizar\n");
printf(" 2. Agregar\n");
printf(" 3. Consultar\n");
printf(" 4. Modificar\n");
printf(" 5. Listar\n");
printf(" Selecione una opcion: "); scanf("%i", &op);

printf("\n\n");

switch(op)
{
case 1:  {exit(1); break;}
case 2:  {agregar(); goto aqui;}
case 3:  {consultar(); goto aqui;}
case 4:  { break;}
case 5:  { break;}

default : {system("cls");goto aqui;}
}


printf("\n");
getchar();
return 0; }


void agregar()
{
int op2 ;

/*Aqui agregamos los elementos de la estructura y restrigimos con una funcion */
system("cls");

printf("Ingrese la cantidad de elementos que desea agregar: "); scanf("%i", &op2);

for ( i = 0; i < op2; ++i)
{

if (inventario[i].lleno == 0)
{
printf("\n\nPara el elemento #%i \n", i+1  );

printf("Ingrese Codigo de Item:  "); scanf("%i",&inventario[i].codItem);

printf("Ingrese Desc Item:  "); caracteres(inventario[i].descItem);

printf("Ingrese Cantidad : ");
restriccion(inventario[i].cant, M , 12);

printf("Ingrese Precio Unitario: ");
restriccion(inventario[i].precUni, M, 10000);

printf("Ingrese Precio de Venta: ");
restriccion(inventario[i].precVent, M, 15000);

printf("Ingrese la Sucursal :");
restriccion(inventario[i].sucursal, 24, 1);

inventario[i].lleno = 1 ;
printf("\n");
}
}
system("cls");
}

void caracteres(char k[N])
{

/* Aqui aseguramos que no se ingresen cadenas de caracteres vacias */
cvacia:
fflush(stdin);
fgets(k,N,stdin);
normalizar(k);
    if (strlen(k) == 0)
{
printf("Llenar este campo es obligatorio\n");
goto cvacia;
}
}


void vaciar()
{
/* Con la variable .lleno pordemos controlar que registro ya ha sido usado */

for ( i = 0; i < 10; ++i)
inventario[i].lleno = 0 ;

}

void normalizar(char k[N])
{
int i;

/* Aqui quitamos el problema del fgets que termina las cadenas con \n */

for (i = 0; i < N; ++i)
{
if( k[i] == '\n' )
{
k[i] = '\0';
}
}
}

void consultar()
{

/* funcion para consultar los items ya agregados previamente */

int op3, z = 0 ;

printf("Ingrese el codigo del elemento: "); scanf("%i", &op3);

printf("Codigo Item | Desc-Item | Cantidad | Prec Unitario | Prec Venta | Sucursal |\n");

for ( i = 0; i <10 ; ++i)
{
if (inventario[i].codItem == op3)
{
printf("     %i          %s          %i          %.2f          %.2f          %i     \n", inventario[i].codItem,
inventario[i].descItem,inventario[i].cant, inventario[i].precUni,inventario[i].precVent, inventario[i].sucursal);
++z ;

}
}

if (z == 0)
printf("\n\nNo se encontro el item seleccionado\n\n");

system("pause"); system("cls");

}

void restriccion(int var, int max, int menor)
{

/* Aqui paso por parametro las restricciones para los datos de cada registro*/

iterar:

fflush(stdin); scanf("%i",&var);

/*En la restriccion para precio unitario deberia pasar por el primer if
ya que max == M pero no lo hace */

if (max == M)
{
if (var <= menor)
{
printf("Ingrese un Valor mayor a %i \n", menor);
goto iterar ;
}
}
else if (var < menor || var > max)
    {
printf("Ingrese un valor entre %i & %i\n", menor, max );
goto iterar ;
}
}



En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Error en programa de C
« Respuesta #1 en: 29 Octubre 2017, 03:41 am »

que tipo de dato es precUni ?
que tipo de dato es el primer parametro de tu funcion restriccion?
Calzan?

En C existe el paso por valor, en C++ existe el paso por referencia. Por lo que veo estas usando paso por valor, y luego en tu funcion restriccion usas la direccion de memoria de la copia que esta siendo creada, no la direccion de memoria de la variable original, no hay manera que la variable original cambie:

- haz que los tipo de los datos que pasas calcen
- pasa direcciones de memoria a las funciones si quieres que las funciones cambien los datos, al estilo de la funcion scanf.



En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Saikilito

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Error en programa de C
« Respuesta #2 en: 29 Octubre 2017, 04:41 am »

que tipo de dato es precUni ?
que tipo de dato es el primer parametro de tu funcion restriccion?
Calzan?

En C existe el paso por valor, en C++ existe el paso por referencia. Por lo que veo estas usando paso por valor, y luego en tu funcion restriccion usas la direccion de memoria de la copia que esta siendo creada, no la direccion de memoria de la variable original, no hay manera que la variable original cambie:

- haz que los tipo de los datos que pasas calcen
- pasa direcciones de memoria a las funciones si quieres que las funciones cambien los datos, al estilo de la funcion scanf.






Buenas noches, Muchas gracias por tu respuesta!!!

Tenias razón que descuido el mio! tipos incompatibles de variables!

Como solución, ya que con esa función estoy capturando dos tipos diferenrtes de variables,  se me ocurrió agregarle a la función dos parámetros mas, uno para las variables float y otro para controlar que tipo de dato voy a capturar por vez.

Pero ahora me surgió otra cuestión y ojala puedas ayudarme también, la cosa es que aun me da un error, creo que no puedo usar parámetros de diferente naturaleza, seria genial si pudiera aclarar eso.

Por otra parte aun estoy aprendiendo sobre el tema de los puntos y las direcciones, en este caso para pasar las direcciones creo que deberia usar el & en los parametros y quitarlos en el scanf que esta en la funcion?

Disculpa mi ignoracion y muchas gracias por tu ayuda, te dejo dos imagenes para que chekee lo que intente hacer.



En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Error en programa de C
« Respuesta #3 en: 29 Octubre 2017, 05:08 am »

Las direcciones de memoria son del mismo tamano, no importa a que dato apunten.
Lo malo es que los datos si tienen tipo.
3 soluciones posibles.

Solucion 1:
Haz 2 funciones, una que lee un int, otra que lee float y RETORNA el valor leido

luego en tu programa haces

Código
  1. mivariable = funcionqueleeint();

y la funcionqueleeint() hace de todo, lee, chequea, itera, y devuelve el dato listo.
Haz lo mismo con otra funcion que lee float.

Solucion 2a:
Te gusta, quieres aprender o necesitas usar punteros.
Define 2 funciones, 1 que lee floats, otra que lee int. Hace lo mismo que lo anterior, pero en vez de retornar los valores, los asigna a la variable que se pasa como parametro.

Invocalas de manera separada de acuerdo al tipo de dato que quieres leer.

Quieres leer un int ?

Código
  1. void mifuncionlectoraparaint( int * punteroaint)  {
  2.  printf("Ingrese int" );
  3.  scanf("%d", punteroaint);
  4.  int valoringresado = *punteroaint;
  5.  
  6.  // mas logica usando el valor ingresado, que se obtiene usando valoringresado
  7. }

se usa desde otro lados, al estilo scanf

Código
  1. ...
  2. mifuncionlectoraparaint( & mivariableint )

Lo mismo con float

Solucion 2b.
Alternativa: Usas una variable local a la funcion para leer y solo asignas al final:

Código
  1. void mifuncionlectoraparaint( int * punteroaint)  {
  2.  int variablelocal;
  3.  printf("Ingrese int" );
  4.  scanf("%d", &variablelocal);
  5.  
  6.  // agregar logica aqui que use la variable local
  7.  
  8. ...
  9.  
  10.  // y al final
  11.  *punteroaint = variablelocal;
  12. }

Solucion 3a:
1 sola funcion que lee ints y floats

Código
  1. void mifuncionlectoraparatodos( void * punteroadato, int esEntero)  {
  2.  if( esEntero == 1 ) {
  3.     printf("Ingrese int" );
  4.     scanf("%d", (int *) punteroadato);
  5.     int valoringresado =*(int *) punteroadato;
  6.     // logica especifica para int, usando valoringresado
  7.  } else {
  8.     printf("Ingrese float" );
  9.     scanf("%f", (float *) punteroadato);
  10.     float valoringresado = *(float *) punteroadato;
  11.     // logica especifica para float, usando valoringresado
  12.  }
  13. }

Se invoca de todos lados indicando si lo que se quiere leer es int o no, mas la direccion de memoria

Solucion 3b.
Lo mismo anterior, pero usar una variable local, y solo asignar al final, parecido a la solucion 2b.

En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Saikilito

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Error en programa de C
« Respuesta #4 en: 29 Octubre 2017, 05:21 am »

Las direcciones de memoria son del mismo tamano, no importa a que dato apunten.
Lo malo es que los datos si tienen tipo.
3 soluciones posibles.

Solucion 1:
Haz 2 funciones, una que lee un int, otra que lee float y RETORNA el valor leido

luego en tu programa haces

Código
  1. mivariable = funcionqueleeint();

y la funcionqueleeint() hace de todo, lee, chequea, itera, y devuelve el dato listo.
Haz lo mismo con otra funcion que lee float.

Solucion 2a:
Te gusta, quieres aprender o necesitas usar punteros.
Define 2 funciones, 1 que lee floats, otra que lee int. Hace lo mismo que lo anterior, pero en vez de retornar los valores, los asigna a la variable que se pasa como parametro.

Invocalas de manera separada de acuerdo al tipo de dato que quieres leer.

Quieres leer un int ?

Código
  1. void mifuncionlectoraparaint( int * punteroaint)  {
  2.  printf("Ingrese int" );
  3.  scanf("%d", punteroaint);
  4.  int valoringresado = *punteroaint;
  5.  
  6.  // mas logica usando el valor ingresado, que se obtiene usando valoringresado
  7. }

se usa desde otro lados, al estilo scanf

Código
  1. ...
  2. mifuncionlectoraparaint( & mivariableint )

Lo mismo con float

Solucion 2b.
Alternativa: Usas una variable local a la funcion para leer y solo asignas al final:

Código
  1. void mifuncionlectoraparaint( int * punteroaint)  {
  2.  int variablelocal;
  3.  printf("Ingrese int" );
  4.  scanf("%d", &variablelocal);
  5.  
  6.  // agregar logica aqui que use la variable local
  7.  
  8. ...
  9.  
  10.  // y al final
  11.  *punteroaint = variablelocal;
  12. }

Solucion 3a:
1 sola funcion que lee ints y floats

Código
  1. void mifuncionlectoraparatodos( void * punteroadato, int esEntero)  {
  2.  if( esEntero == 1 ) {
  3.     printf("Ingrese int" );
  4.     scanf("%d", (int *) punteroadato);
  5.     int valoringresado =*(int *) punteroadato;
  6.     // logica especifica para int, usando valoringresado
  7.  } else {
  8.     printf("Ingrese float" );
  9.     scanf("%f", (float *) punteroadato);
  10.     float valoringresado = *(float *) punteroadato;
  11.     // logica especifica para float, usando valoringresado
  12.  }
  13. }

Se invoca de todos lados indicando si lo que se quiere leer es int o no, mas la direccion de memoria

Solucion 3b.
Lo mismo anterior, pero usar una variable local, y solo asignar al final, parecido a la solucion 2b.




Grandee hermano!!!! me pondré a estudiar duro con eso!!

Muchísimas gracias!!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error en programa
.NET (C#, VB.NET, ASP)
zhynar_X 4 3,521 Último mensaje 8 Mayo 2007, 15:35 pm
por zhynar_X
error de programa
Windows
hardyan2 3 6,953 Último mensaje 2 Agosto 2010, 08:48 am
por NSaneBMX
Un programa me da un error
Dudas Generales
Mikroscopik0 4 2,905 Último mensaje 29 Septiembre 2010, 09:08 am
por Mikroscopik0
Error en programa c++
Programación C/C++
z_ane_666 1 3,295 Último mensaje 9 Diciembre 2010, 15:50 pm
por winroot
programa en c++ el programa me da un error dice que la llave correspondiente a {
Programación C/C++
eduardo17445 2 4,453 Último mensaje 5 Junio 2012, 19:51 pm
por eduardo17445
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines