[ Foro de C ]

Fichero de estructura.

27-Jun-2011 14:30
Lucas Matias Guardón
11 Respuestas

Hola a todos. Disculpen mi ignorancia, pero soy nuevo en esto. venia bien en el curso pero le tope con algo; no me doy cuenta como cargar una estructura como fichero.
Quiero hacer un programita simple que me controle el stock de herramientas para tornos, y lo que quiero hacer basicamente un fichero modificable con una estructura que contenga, el nombre de la herramienta y la cantidad de stock (eso para la carga) y despues ir modificando ese fichero a medida que voy entregando los insertos (decrementar el stock).
Gracias, saludos.


27-Jun-2011 16:10
Lucas Matias Guardón

Nacho, te pongo lo que hice hasta ahora. Me podrias decir si voy bien encaminado? Gracias.
#include<stdio.h>
#include<conio.h>
char cargastock(char fin);
char entregamate(char fini);
void main()
{
struct{
char material[40];
int canti;
}materiales[30];
FILE* fichero;
int opc=0;
char sig;
clrscr();
flushall();
gotoxy(40;11);
printf("Bienvenido al sistema de control de Insertos de NILSO TORRE S.A\n");
do{
gotoxy(50,11);
printf("Ingrese una opcion:\n 1-PARA CARGAR DE STOCK\n 2-ENTREGA DE MATERIAL\n");
scanf("%d",&opc);
if(opc==1)
sig=cargastock();
else if(opc==2)
sig=entrgamate();
else
printf("Opcion Inexistente, elgina Opcion 1 u Opcion 2\n");
}while(sig=='n');
}
char cargastock(char fin)
{
printf("Eliga un material de la siguiente lista, en caso que no encuentre el deseado agreguelo:\n");
(ES OVIO QUE TODAVIA FALTA; PERO QUIERO SABER SI HASTA ACA ESTA BIEN)


29-Jun-2011 20:59
Nacho Cabanes (+83)

Como no hay comentarios, hay partes del programa que no entiendo. Por ejemplo:

- ¿Qué devuelve la función "cargastock"?

- ¿Qué es ese parámetro "fin" que recibe la función "cargastock"?

- ¿Por qué no pasas ese parámetro cuando llamas a la función?

- ¿Cual es la misión de la variable "sig"?

En general, la estructura del programa principal se parece a lo que debería ser (creo): una parte repetitiva que muestra un menú, pide una opción al usuario y actúa según la opción que se escoja, pero faltan detalles por pulir, como lo que te he indicado antes y algún detalle relacionado con la lógica del programa:

- Si la variable "materiales" pertenece a "main", no podrás usarla desde "cargastock". Deberá ser global o estar pasada como parámetro.

- ¿Cuándo se sale de la ejecución del programa?

- ¿Cuándo y cómo se ha creado ese fichero que vas a cargar en "cargastock"?

- ¿No hay una función que grabe la información en fichero?


05-Jul-2011 17:21
Lucas Matias Guardón

Nacho, gracias por contestar, debido a que tenia mas problemas de lo que yo pensaba decidí comenzarlo nuevamente y hacerlo mas estructurado, pero como siempre surgen problemas, ya que se me complica un poco el tema de funciones. (te aclaro que los ficheros todavía no se los puse, ya que pienso agregarlos después, una vez que vea el programa funcione bien sin estos, no se si es lo adecuado)Esto es lo que tengo hasta ahora, pero me tira error y no se por que:
#include<stdio.h>
#include<conio.h>
saludo();
menu();
int main()
{
saludo();
menu();
getche();
return 0;
}
saludo()
{
gotoxy(10,11);
printf("BIENVENIDOS AL SISTEMA DE CONTROL DE SALIDA DE INSERTOS DE NILSO TORRE S.A.\n");
return 0;
}
menu()
{
int opc=0;
gotoxy(10,11);
printf("ELIJA UNA OPCION DEL MENU: \n 1-CARGA DE STOCK\n 2-SALIDA DE INSERTO\n");
scanf("%d",&opc);
switch(opc){
case 1:
printf("elegiste cargar el stock");
break;
case 2:
printf("Elegiste salida de material");
break;
}
return 0;

Gracias, saludos.


05-Jul-2011 21:52
Nacho Cabanes (+83)

A ojo, veos varios fallos:

- En vez de "saludo()", deberías poner "void saludo()" para dejar claro que no va a devolver nada, y entonces quitar el "return 0".

- Por lo mismo, en vez de "menu()", deberías poner "void menu()".

- Sobra el "return 0" del final del programa, que no pertenece a ninguna función.

- Las órdenes gotoxy, getche y el include de "conio.h" fallarán en general, si usas un compilador que no sea de Borland.


06-Jul-2011 14:33
Lucas Matias Guardón

Nacho, buen día, te vuelvo a molestar.
Corregí los errores que me marcaste lo probé y me funciono ok; ahora lo seguí, y vuelven aparecer errores, y ahora trate de revisar bien todo para no cometer errores menores como los anteriores pero no se en donde me estoy equivocando.
Te paso el código.
#include<stdio.h>
#include<conio.h>
void saludo();
void menu();
void stock();
void salida();
int material[30];
void main()
{
saludo();
menu();
}
void saludo()
{
gotoxy(4,11);
printf("BIENVENIDOS AL SISTEMA DE CONTROL DE SALIDA DE INSERTOS DE NILSO TORRE S.A.\n");
gotoxy(25,14);
printf("(Oprima una tecla para continuar)\n");
getche();
clrscr();
}
void menu()
{
int opc=0;
gotoxy(10,11);
printf("ELIJA UNA OPCION DEL MENU:\n 1-CARGA DE STOCK\n 2-SALIDA DE INSERTO\n");
scanf("%d",&opc);
switch(opc){
case 1:
void stock();
break;
case 2:
void salida();
break;
}
clrscr();
}
void stock()
{
int op,i=0;
char sigue;
printf("ELIJA EL MATERIAL QUE DESEE CARGAR:\n");
gotoxy(4,13);
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d%",op);
while(sigue!='n')
{
if(op==1)
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",material[i]);
i++;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
else if(op==2)
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",material[i]);
i++;
printf("Desea cargar el stock de otro material?: ");
scanf("%c\n",&sigue);
else if(op==3)
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",material[i]);
i++;
printf("Desea cargar el stock de otro material?: ");
scanf("%c\n",&sigue);
else if(op==4)
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",material[i]);
i++;
printf("Desea cargar el stock de otro material?: ");
scanf("%c\n",&sigue);
}
clrscr();
}
void salida()
{
int canti=0,opci;
char sigue;
printf("ELIJA EL MATERIAL QUE VA A ENTREGAR:\n");
gotoxy(4,13);
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d%",opci);
while(sigue!='n')
{
if(opci==1)
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",canti);
material[0]-=canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
else if(opci==2)
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",canti);
material[1]-=canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
else if(opci==3)
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",canti);
material[2]-=canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
else if(opci==4)
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",canti);
material[3]-=canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}
clrscr();
}
Y LOS ERRORES QUE ME TIRA.

Compiling NONAME03.CPP:
Warning NONAME03.CPP 45: Possible use of 'op' before definition in function stock()
Warning NONAME03.CPP 46: Possible use of 'sigue' before definition in function stock()
Error NONAME03.CPP 54: Misplaced else in function stock()
Error NONAME03.CPP 60: Misplaced else in function stock()
Error NONAME03.CPP 66: Misplaced else in function stock()
Warning NONAME03.CPP 82: Possible use of 'opci' before definition in function salida()
Warning NONAME03.CPP 83: Possible use of 'sigue' before definition in function salida()
Error NONAME03.CPP 91: Misplaced else in function salida()
Error NONAME03.CPP 97: Misplaced else in function salida()
Error NONAME03.CPP 103: Misplaced else in function salida()


06-Jul-2011 15:19
Lucas Matias Guardón

Nacho,hola y disculpa. Me imprimi el codigo y comenze a ilar mas fino, y puse ver algunos errores por falta de atencion, el problema ahora es que el programa me llega hasta donde me pide que elija cargar stock o entrgar material, cuando elijo una opcion (cualquiera de las dos)se me sale el programa.
TE PASO EL CODIGO

#include<stdio.h>
#include<conio.h>
void saludo();
void menu();
void stock();
void salida();
int material[30];
void main()
{
saludo();
menu();
}
void saludo()
{
gotoxy(4,11);
printf("BIENVENIDOS AL SISTEMA DE CONTROL DE SALIDA DE INSERTOS DE NILSO TORRE S.A.\n");
gotoxy(25,14);
printf("(Oprima una tecla para continuar)\n");
getche();
clrscr();
}
void menu()
{
int opc=0;
gotoxy(10,11);
printf("ELIJA UNA OPCION DEL MENU:\n 1-CARGA DE STOCK\n 2-SALIDA DE INSERTO\n");
scanf("%d",&opc);
switch(opc){
case 1:
void stock();
break;
case 2:
void salida();
break;
}
clrscr();
}
void stock()
{
int op,i=0,stk;
char sigue;
printf("ELIJA EL MATERIAL QUE DESEE CARGAR:\n");
gotoxy(4,13);
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d",&op);
while(sigue!='n')
{
if(op==1){
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",&stk);
material[i]=stk;
i++;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}
else if(op==2){
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",&stk);
material[i]=stk;
i++;
printf("Desea cargar el stock de otro material?: ");
scanf("%c\n",&sigue);
}
else if(op==3){
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",&stk);
material[i]=stk;
i++;
printf("Desea cargar el stock de otro material?: ");
scanf("%c\n",&sigue);
}
else if(op==4){
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",&stk);
material[i]=stk;
i++;
printf("Desea cargar el stock de otro material?: ");
scanf("%c\n",&sigue);
}
}
clrscr();
}
void salida()
{
int canti=0,opci;
char sigue;
printf("ELIJA EL MATERIAL QUE VA A ENTREGAR:\n");
gotoxy(4,13);
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d",&opci);
while(sigue!='n')
{
if(opci==1){
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",&canti);
material[0]=material[0]-canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}
else if(opci==2){
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",&canti);
material[1]=material[1]-canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}
else if(opci==3){
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",&canti);
material[2]=material[2]-canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}
else if(opci==4){
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",&canti);
material[3]=material[3]-canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}
}
clrscr();
}
Y EL UNICO ERROR QUE ME APARECE Y NO SE POR QUE

Compiling NONAME03.CPP:
Warning NONAME03.CPP 46: Possible use of 'sigue' before definition in function stock()
Warning NONAME03.CPP 91: Possible use of 'sigue' before definition in function salida()


07-Jul-2011 09:54
Nacho Cabanes (+83)

Decías

> Y EL UNICO ERROR QUE ME APARECE Y NO SE POR QUE

> Compiling NONAME03.CPP:
> Warning NONAME03.CPP 46: Possible use of 'sigue' before definition in function stock()

Claro que te da ese error. Mira lo que hace tu programa:

> char sigue;
> while(sigue!='n')

¿Cuanto vale "sigue" cuando llegas al while? No lo has indicado, así que contiene basura, lo que hubiera en esa posición de memoria.

Deberías darle un valor inicial, por ejemplo así:

char sigue = 's';

Aun así, ese código es MUY mejorable, enormemente repetitivo. Una estructura que repite algo varias veces deberías intentar hacerla con "for" o con "while", en vez de poner el mismo fragmento 5 veces.


07-Jul-2011 14:32
Lucas Matias Guardón

Profesor Nacho, optimicé el código tal como me lo recomendó, aunque quedo mas lindo sigue sin andar jaja. También le asigne a sigue un valor. El problema es que no me corre las funciones void stock() y void salida(); puede ser que no las corra y las pase por alto por que no devuelven ningún valor a la función void menu? Hasta donde me pide que seleccione una opción en la función void menu() funciona perfecto, pero hasta ahí llega.
CÓDIGO:
#include<stdio.h>
#include<conio.h>
void saludo();
void menu();
void stock();
void salida();
int material[30];
void main()
{
saludo();
menu();
}
void saludo()
{
gotoxy(4,11);
printf("BIENVENIDOS AL SISTEMA DE CONTROL DE SALIDA DE INSERTOS DE NILSO TORRE S.A.\n");
gotoxy(25,14);
printf("(Oprima una tecla para continuar)\n");
getche();
clrscr();
}
void menu()
{
int opc=0;
gotoxy(10,11);
printf("ELIJA UNA OPCION DEL MENU:\n 1-CARGA DE STOCK\n 2-SALIDA DE INSERTO\n");
scanf("%d",&opc);
if(opc==1)
void stock();
else if(opc==2)
void salida();
else
printf("LA OPCION NO ES VALIDA, ELIJA ENTRE LA OPCION 1-CARGA DE STOCK U 2-SALIDA DE INSERTO\n");
}
void stock()
{
int op,i=0,stk=0;
char sigue='s';
while(sigue!='n'){
printf("ELIJA EL MATERIAL QUE DESEE CARGAR:\n");
gotoxy(4,13);
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d",&op);
i=op-1;
printf("Ingrese la cantidad de stock: ");
scanf("%d\n",&stk);
material[i]=stk;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}
void salida()
{
int canti=0,opci=0,i=0;
char sigue='s';
while(sigue!='n'){
printf("ELIJA EL MATERIAL QUE VA A ENTREGAR:\n");
gotoxy(4,13);
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d",&opci);
i=opci-1;
printf("Ingrese la cantidad a entregar: ");
scanf("%d\n",&canti);
material[i]=material[i]-canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
scanf("%c\n",&sigue);
}


08-Jul-2011 14:14
Lucas Matias Guardón

Profesor Nacho, una vez mas necesito de sus conocimientos.
Ahora pasa esto:(le adjunto código con las descripciones del problema como comentario en los lugares que surge)


#include<stdio.h>
#include<conio.h>
void saludo();
void menu();
stock();
salida();
int material[30];
void main()
{
saludo();
menu();
}
void saludo()
{
gotoxy(4,11);
printf("BIENVENIDOS AL SISTEMA DE CONTROL DE SALIDA DE INSERTOS DE NILSO TORRE S.A.\n");
gotoxy(25,14);
printf("(Oprima una tecla para continuar)\n");
getche();
clrscr();
}
void menu()
{
int opc=0;
gotoxy(10,11);
printf("ELIJA UNA OPCION DEL MENU:\n 1-CARGA DE STOCK\n 2-SALIDA DE INSERTO\n");
scanf("%d",&opc);
switch(opc){
case 1:stock();
break;
case 2:salida();
break;
default:printf("LA OPCION NO ES VALIDA, ELIJA ENTRE LA OPCION 1-CARGA DE STOCK U 2-SALIDA DE INSERTO\n");
break;
}
}
stock()
{
clrscr();
int op,i=0,stk;
char sigue='\0';
do{
gotoxy(6,12);
printf("ELIJA EL MATERIAL QUE DESEE CARGAR:\n");
gotoxy(2,13);
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d",&op);
i=op-1;
clrscr();
gotoxy(4,13);
printf("Ingrese la cantidad de stock: ");
/*HASTA ESTA PARTE EL PROGRAMA FUNCIONA BIEN*/
scanf("%d\n",&stk);
/*INGRESO LA CANTIDAD EN NUMEROS, PERO HASTA QUE NO OPRIMO UNA CARACTER LETRA NO HACE NADA*/
material[i]=stk;
gotoxy(4,13);
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
/*CUANDO ELIJO 's'QUEDA LA PREGUNTA, NO VUELVE AL PRINCIPIO DE LA INTERACION,
CUANDO OPRIMO 2 VECES 'n' RECIEN AHI SE CORTA EL PROGRAMA*/
scanf("%c\n",&sigue);
}while(sigue!='n');
return 0;
}
salida()
{
int canti=0,opci=0,i=0;
char sigue='s';
clrscr();
while(sigue!='n'){
printf("ELIJA EL MATERIAL QUE VA A ENTREGAR:\n");
printf("1-TRIGON NEG. FINO\n 2-TRIGON NEG. GRUESO\n 3-TRIANGULAR\n 4-INTERIOR\n");
scanf("%d",&opci);
i=opci-1;
printf("Ingrese la cantidad a entregar: ");
/*IDEM ANTERIOR, HASTA ACA TODO OK*/
scanf("%d\n",&canti);
/*INGRESO CANTIDAD PERO HASTA QUE NO OPRIMO UNA CARACTER(LETRA) NO ME DEJA SEGUIR*/
material[i]=material[i]-canti;
printf("Desea cargar el stock de otro material?('s'=SI;'n'=NO): ");
/*SI LE PONGO, ME VUELVE ARRIBA, PERO CON LA PREGUNTA PISANDOME PARTE DEL TEXTO PERO ME DEJA HACER UNA NUEVA
CARGA, SI LE PONGO 2 VECES QUE NO SE CORTA*/
scanf("%c\n",&sigue);
}
return 0;
}


08-Jul-2011 15:52
Lucas Matias Guardón

Nacho, uno de los errores pude solucionar, es el del carácter que necesitaba ingresar para que me siguiera el programa, era por el \n que le había puesto en el scanf, sigue hasta el final pero cuando pongo 's' no pasa nada queda el mismo mensaje fina y para que quede inactivo el programa tengo que oprimir 2 veces el 'n'


13-Jul-2011 22:51
Nacho Cabanes (+83)

Para evitar problemas, intenta no leer un solo carácter, sino una cifra numérica o una cadena de texto.

Si haces cosas como

scanf("%d",&canti);
scanf("%c",&sigue);

La pulsación de "intro" después del número se quedará en el buffer del teclado, y hará que leas ese "intro" en vez de la tecla posterior.

Es preferible algo como

scanf("%d",&canti);
scanf("%s",&sigue);

(siendo "sigue" un char[] en vez de un char).

Por cierto, ¿por que pones los \n en líneas como ésta? Eso también puede provocar comportamientos raros.

scanf("%c\n",&sigue);






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)