¿Alguien puede mirar este código? No se resolver los fallos
/*desarrollar un programa en C que implemente la gestión de ventas de la multinacional
"Toys S.A." encargada de la distribución de juguetes. La empresa almacena información
sobre todos los juguetes que se encuentran en su catálogo, también conserva todos los
pedidos de ventas realizados por cada juguete. Para conservar esta información utiliza
dos ficheros de texto, "juguetes.txt" y "ventas.txt"*/
#include<stdio.h>
#include <conio.h>
#include<string.h>
#define N 20
#define M 20
int MAX_JUGUETES=0;
struct juguete{
char nombre [30];
char compania[30];
int edadmin;
int edadmax;
int univentas;
}lista[20];
struct pedido{
int identificador;
char nombre[30];
int univentas;
}ventas[50];
void meterdato (struct juguete lista[20],int MAX_JUGUETES, FILE *fp1);
void leerdatosventas(struct pedido ventas[50], FILE *fp2);
void leerdatosjuguetes(struct juguete lista[20], FILE *fp1);
void menu1();
void menu2();
void main()
{
menu1();
}//fin main()
void menu1()
{
FILE *fp1;
int a;
fp1=fopen ("juguetes.txt","a+");
while (!feof(fp1)){
fscanf(fp1,"%s %s %d %dn",&lista[MAX_JUGUETES].nombre,&lista[MAX_JUGUETES].compania,&lista[MAX_JUGUETES].edadmin,&lista[MAX_JUGUETES].edadmax);
MAX_JUGUETES++;
}//fin while
do{
clrscr();
gotoxy(15,1);
printf("Elige una opcion de las siguientes:n");
gotoxy(15,2);
printf("-----------------------------------n");
printf("n1.- Mostrar los archivos por pantallan");
printf("2.- Ordenar el archivo de juguetesn");
printf("3.- Cambiar la ruta de los archivosn");
printf("4.- Añadir un juguete o una ventan");
gotoxy(60,23);
printf("Opcion:");
fflush(stdin);
scanf("%d",&a);
}while(a<1 || a>4);
switch (a){
case 1:
menu2();
break;
case 2:
//ordenararchivo();
break;
case 3:
//cambiarruta();
break;
case 4:
meterdato(lista,MAX_JUGUETES,fp1);
break;
}//fin switch
}//fin menu1()
void menu2()
{
char a;
int b;
FILE *fp1; FILE *fp2;
fp1=fopen ("juguetes.txt","a+");
fp2=fopen ("ventas.txt", "r+");
do{
clrscr();
printf("1.- Mostrar los archivos por pantallan");
gotoxy(10,3);
printf("1.- Mostrar el fichero de juguetesn");
gotoxy(10,4);
printf("2.- Mostrar el fichero de ventasn");
gotoxy(10,5);
printf("3.- Volver al menu");
gotoxy(60,23);
printf("Opcion:");
fflush(stdin);
scanf("%d",&b);
}while(b<1||b>3);
switch (b){
case 1:
leerdatosjuguetes (lista, fp1);
break;
case 2:
leerdatosventas (ventas, fp2);
printf("nVolver al menu anterior");
fflush(stdin);
scanf("%c",&a);
menu2();
case 3:
menu1();
break;
}//fin switch
}//fin menu()
void leerdatosjuguetes(struct juguete lista[20], FILE *fp1)
{
int i=4,j=4,k=4,l=4,m=4;
char a;
clrscr();
gotoxy(1,1);
printf("Nombre");
gotoxy(18,1);
printf("Compañia");
gotoxy(34,1);
printf("Edad Min.");
gotoxy(47,1);
printf("Edad Max.");
gotoxy(60,1);
printf("U. vendidas");
gotoxy(1,2);
printf("----------------------------------------------------------------------n");
while (!feof(fp1)){
fscanf(fp1,"%s %s %d %d %dn",&lista[MAX_JUGUETES].nombre,&lista[MAX_JUGUETES].compania,&lista[MAX_JUGUETES].edadmin,&lista[MAX_JUGUETES].edadmax,&lista[MAX_JUGUETES].univentas);
gotoxy(1,i++);
printf("%s",lista[MAX_JUGUETES].nombre);
gotoxy(18,j++);
printf("%s",lista[MAX_JUGUETES].compania);
gotoxy(37,k++);
printf("%d",lista[MAX_JUGUETES].edadmin);
gotoxy(50,l++);
printf("%d",lista[MAX_JUGUETES].edadmax);
gotoxy(65,m++);
printf("%d",lista[MAX_JUGUETES].univentas);
MAX_JUGUETES++;
}//fin while
gotoxy(0,22);
printf("Pulse intro para volver al menu anteriorn");
fflush(stdin);
scanf("%c",&a);
menu2();
}//fin funcion leerdatosjuguetes()
void leerdatosventas(struct pedido ventas[50], FILE *fp2)
{
int j=0,i=3,k=3,z=3;
char resp;
clrscr();
gotoxy(1,1);
printf("Identificador");
gotoxy(20,1);
printf("Nombre");
gotoxy(40,1);
printf("Uni. vendidasn");
gotoxy(1,2);
printf("-----------------------------------------------------n");
while (!feof(fp2)){
fscanf(fp2,"%d %s %d",&ventas[j].identificador, &ventas[j].nombre,&ventas[j].univentas);
gotoxy(1,i++);
printf("%d",ventas[j].identificador);
gotoxy(20,k++);
printf("%s",ventas[j].nombre);
gotoxy(45,z++);
printf("%dn",ventas[j].univentas);
j++;
if(j==18){
printf("nPulse una tecla para continuar");
fflush(stdin);
scanf("%c",&resp);
clrscr();
gotoxy(1,1);
printf("Identificador");
gotoxy(20,1);
printf("Nombre");
gotoxy(40,1);
printf("Uni. vendidasn");
gotoxy(1,2);
printf("-----------------------------------------------------n");
i=3;k=3;z=3;
gotoxy(1,i++);
printf("%d",ventas[j].identificador);
gotoxy(20,k++);
printf("%s",ventas[j].nombre);
gotoxy(40,z++);
printf("%dn",ventas[j].univentas);
}//fin if
}//fin while
}//fin funcion leerdatosventas()
void meterdato (struct juguete lista[20],int MAX_JUGUETES, FILE *fp1)
{
char cad[N],cad2[M],a,b;
int i=0,max,min;
if(MAX_JUGUETES<20){
clrscr();
printf("1.- Nombre del juguete:n");
fflush(stdin);
scanf("%s",cad);
for(i=0;i<MAX_JUGUETES;i++){
if(strcmp(lista[i].nombre,cad)==0){
printf("Error: El juguete que quiere introducir ya existen");
printf("nPulse intro para volver al menu anteriorn");
fflush(stdin);
scanf("%c",&a);
menu1();
}//fin if
}//fin for
printf("2.- Compañia que lo fabrica:n");
fflush(stdin);
scanf("%s",cad2);
printf("3.- Edad minima aconsejada:n");
fflush(stdin);
scanf("%d",&min);
printf("4.- Edad maxima aconsejada:n");
fflush(stdin);
scanf("%d",&max);
fprintf(fp1,"%s ", cad);
fprintf(fp1,"%s ", cad2);
fprintf(fp1,"%d ", min);
fprintf(fp1,"%d ", max);
MAX_JUGUETES++;
/*printf("Introducir otro juguete:");
fflush(stdin);
scanf("%c",&b);
meterdato(lista,MAX_JUGUETES,fp1);*/
}//fin if
else if(MAX_JUGUETES==20){
clrscr();
printf("El fichero esta lleno no puede introducir mas juguetesn");
printf("nPulse intro para volver al menu principaln");
fflush(stdin);
scanf("%c",&a);
menu1();
}//fin else if
}//fin funcion meterdato()
Primero aclarar que solo están implementados dos puntos del menu, no todos.
Me crea problemas en varios puntos:
1.- En la opcion 1 del menu, a la hora de mostrar las ventas por páginas, me muestra una linea con 0 que no se como hacer para que desaparezca.
2.- En la opcion 4 del menu, al meter los datos en el fichero todos me los crea en la misma linea del fichero, no se como ponerlo para que cada vez que se guarde un juguete, cambie de linea.
3.- Cuando introducen un juguete que ya existe y vuelve al menu anterior, al entrar otra vez el programa salta directamente a pedir el nombre de la compañia en vez del nombre.
Bueno espero que alguien me pueda resolver alguna de las dudas, que ya se que son muchas pero lo agradeceria mucho, jeje.
PD:Perdon por escribir tanto
"Toys S.A." encargada de la distribución de juguetes. La empresa almacena información
sobre todos los juguetes que se encuentran en su catálogo, también conserva todos los
pedidos de ventas realizados por cada juguete. Para conservar esta información utiliza
dos ficheros de texto, "juguetes.txt" y "ventas.txt"*/
#include<stdio.h>
#include <conio.h>
#include<string.h>
#define N 20
#define M 20
int MAX_JUGUETES=0;
struct juguete{
char nombre [30];
char compania[30];
int edadmin;
int edadmax;
int univentas;
}lista[20];
struct pedido{
int identificador;
char nombre[30];
int univentas;
}ventas[50];
void meterdato (struct juguete lista[20],int MAX_JUGUETES, FILE *fp1);
void leerdatosventas(struct pedido ventas[50], FILE *fp2);
void leerdatosjuguetes(struct juguete lista[20], FILE *fp1);
void menu1();
void menu2();
void main()
{
menu1();
}//fin main()
void menu1()
{
FILE *fp1;
int a;
fp1=fopen ("juguetes.txt","a+");
while (!feof(fp1)){
fscanf(fp1,"%s %s %d %dn",&lista[MAX_JUGUETES].nombre,&lista[MAX_JUGUETES].compania,&lista[MAX_JUGUETES].edadmin,&lista[MAX_JUGUETES].edadmax);
MAX_JUGUETES++;
}//fin while
do{
clrscr();
gotoxy(15,1);
printf("Elige una opcion de las siguientes:n");
gotoxy(15,2);
printf("-----------------------------------n");
printf("n1.- Mostrar los archivos por pantallan");
printf("2.- Ordenar el archivo de juguetesn");
printf("3.- Cambiar la ruta de los archivosn");
printf("4.- Añadir un juguete o una ventan");
gotoxy(60,23);
printf("Opcion:");
fflush(stdin);
scanf("%d",&a);
}while(a<1 || a>4);
switch (a){
case 1:
menu2();
break;
case 2:
//ordenararchivo();
break;
case 3:
//cambiarruta();
break;
case 4:
meterdato(lista,MAX_JUGUETES,fp1);
break;
}//fin switch
}//fin menu1()
void menu2()
{
char a;
int b;
FILE *fp1; FILE *fp2;
fp1=fopen ("juguetes.txt","a+");
fp2=fopen ("ventas.txt", "r+");
do{
clrscr();
printf("1.- Mostrar los archivos por pantallan");
gotoxy(10,3);
printf("1.- Mostrar el fichero de juguetesn");
gotoxy(10,4);
printf("2.- Mostrar el fichero de ventasn");
gotoxy(10,5);
printf("3.- Volver al menu");
gotoxy(60,23);
printf("Opcion:");
fflush(stdin);
scanf("%d",&b);
}while(b<1||b>3);
switch (b){
case 1:
leerdatosjuguetes (lista, fp1);
break;
case 2:
leerdatosventas (ventas, fp2);
printf("nVolver al menu anterior");
fflush(stdin);
scanf("%c",&a);
menu2();
case 3:
menu1();
break;
}//fin switch
}//fin menu()
void leerdatosjuguetes(struct juguete lista[20], FILE *fp1)
{
int i=4,j=4,k=4,l=4,m=4;
char a;
clrscr();
gotoxy(1,1);
printf("Nombre");
gotoxy(18,1);
printf("Compañia");
gotoxy(34,1);
printf("Edad Min.");
gotoxy(47,1);
printf("Edad Max.");
gotoxy(60,1);
printf("U. vendidas");
gotoxy(1,2);
printf("----------------------------------------------------------------------n");
while (!feof(fp1)){
fscanf(fp1,"%s %s %d %d %dn",&lista[MAX_JUGUETES].nombre,&lista[MAX_JUGUETES].compania,&lista[MAX_JUGUETES].edadmin,&lista[MAX_JUGUETES].edadmax,&lista[MAX_JUGUETES].univentas);
gotoxy(1,i++);
printf("%s",lista[MAX_JUGUETES].nombre);
gotoxy(18,j++);
printf("%s",lista[MAX_JUGUETES].compania);
gotoxy(37,k++);
printf("%d",lista[MAX_JUGUETES].edadmin);
gotoxy(50,l++);
printf("%d",lista[MAX_JUGUETES].edadmax);
gotoxy(65,m++);
printf("%d",lista[MAX_JUGUETES].univentas);
MAX_JUGUETES++;
}//fin while
gotoxy(0,22);
printf("Pulse intro para volver al menu anteriorn");
fflush(stdin);
scanf("%c",&a);
menu2();
}//fin funcion leerdatosjuguetes()
void leerdatosventas(struct pedido ventas[50], FILE *fp2)
{
int j=0,i=3,k=3,z=3;
char resp;
clrscr();
gotoxy(1,1);
printf("Identificador");
gotoxy(20,1);
printf("Nombre");
gotoxy(40,1);
printf("Uni. vendidasn");
gotoxy(1,2);
printf("-----------------------------------------------------n");
while (!feof(fp2)){
fscanf(fp2,"%d %s %d",&ventas[j].identificador, &ventas[j].nombre,&ventas[j].univentas);
gotoxy(1,i++);
printf("%d",ventas[j].identificador);
gotoxy(20,k++);
printf("%s",ventas[j].nombre);
gotoxy(45,z++);
printf("%dn",ventas[j].univentas);
j++;
if(j==18){
printf("nPulse una tecla para continuar");
fflush(stdin);
scanf("%c",&resp);
clrscr();
gotoxy(1,1);
printf("Identificador");
gotoxy(20,1);
printf("Nombre");
gotoxy(40,1);
printf("Uni. vendidasn");
gotoxy(1,2);
printf("-----------------------------------------------------n");
i=3;k=3;z=3;
gotoxy(1,i++);
printf("%d",ventas[j].identificador);
gotoxy(20,k++);
printf("%s",ventas[j].nombre);
gotoxy(40,z++);
printf("%dn",ventas[j].univentas);
}//fin if
}//fin while
}//fin funcion leerdatosventas()
void meterdato (struct juguete lista[20],int MAX_JUGUETES, FILE *fp1)
{
char cad[N],cad2[M],a,b;
int i=0,max,min;
if(MAX_JUGUETES<20){
clrscr();
printf("1.- Nombre del juguete:n");
fflush(stdin);
scanf("%s",cad);
for(i=0;i<MAX_JUGUETES;i++){
if(strcmp(lista[i].nombre,cad)==0){
printf("Error: El juguete que quiere introducir ya existen");
printf("nPulse intro para volver al menu anteriorn");
fflush(stdin);
scanf("%c",&a);
menu1();
}//fin if
}//fin for
printf("2.- Compañia que lo fabrica:n");
fflush(stdin);
scanf("%s",cad2);
printf("3.- Edad minima aconsejada:n");
fflush(stdin);
scanf("%d",&min);
printf("4.- Edad maxima aconsejada:n");
fflush(stdin);
scanf("%d",&max);
fprintf(fp1,"%s ", cad);
fprintf(fp1,"%s ", cad2);
fprintf(fp1,"%d ", min);
fprintf(fp1,"%d ", max);
MAX_JUGUETES++;
/*printf("Introducir otro juguete:");
fflush(stdin);
scanf("%c",&b);
meterdato(lista,MAX_JUGUETES,fp1);*/
}//fin if
else if(MAX_JUGUETES==20){
clrscr();
printf("El fichero esta lleno no puede introducir mas juguetesn");
printf("nPulse intro para volver al menu principaln");
fflush(stdin);
scanf("%c",&a);
menu1();
}//fin else if
}//fin funcion meterdato()
Primero aclarar que solo están implementados dos puntos del menu, no todos.
Me crea problemas en varios puntos:
1.- En la opcion 1 del menu, a la hora de mostrar las ventas por páginas, me muestra una linea con 0 que no se como hacer para que desaparezca.
2.- En la opcion 4 del menu, al meter los datos en el fichero todos me los crea en la misma linea del fichero, no se como ponerlo para que cada vez que se guarde un juguete, cambie de linea.
3.- Cuando introducen un juguete que ya existe y vuelve al menu anterior, al entrar otra vez el programa salta directamente a pedir el nombre de la compañia en vez del nombre.
Bueno espero que alguien me pueda resolver alguna de las dudas, que ya se que son muchas pero lo agradeceria mucho, jeje.
PD:Perdon por escribir tanto
Como diría Jack el destripador, vayamos por partes.
1.- No acabo de comprender bien que quieres decir en este caso, mirate otra vez la función menu2 y veras que tienes dos opciones con el mismo número:
printf("1.- Mostrar los archivos por pantallan");
gotoxy(10,3);
printf("1.- Mostrar el fichero de juguetesn");
gotoxy(10,4);
Quizá venga por ahi tu problema.
2.- Para escribir un salto de línea en el fichero tienes que hacerlo escribiendo n como si fuese un printf.
Quedaría una cosa como:
fprintf(fp1,"%s ", cad);
fprintf(fp1,"%s ", cad2);
fprintf(fp1,"%d ", min);
fprintf(fp1,"%d ", max);
fprintf (fp1, "n");
3.- Lo que te pasa es que cuando encuentras un juguete repetido llamas a menu1. Eso está bien, pero cuando acabes la ejecución de menu1 vuelves a ese punto de la función. Puedes poner un return después de esa llamada a menu1 para obligar a que termine la ejecución. Pero siempre dentro del bloque if.
scanf("%c",&a);
menu1();
return;
}//fin if
}//fin for
Espero que te sirva de ayuda. Un saludo.
1.- No acabo de comprender bien que quieres decir en este caso, mirate otra vez la función menu2 y veras que tienes dos opciones con el mismo número:
printf("1.- Mostrar los archivos por pantallan");
gotoxy(10,3);
printf("1.- Mostrar el fichero de juguetesn");
gotoxy(10,4);
Quizá venga por ahi tu problema.
2.- Para escribir un salto de línea en el fichero tienes que hacerlo escribiendo n como si fuese un printf.
Quedaría una cosa como:
fprintf(fp1,"%s ", cad);
fprintf(fp1,"%s ", cad2);
fprintf(fp1,"%d ", min);
fprintf(fp1,"%d ", max);
fprintf (fp1, "n");
3.- Lo que te pasa es que cuando encuentras un juguete repetido llamas a menu1. Eso está bien, pero cuando acabes la ejecución de menu1 vuelves a ese punto de la función. Puedes poner un return después de esa llamada a menu1 para obligar a que termine la ejecución. Pero siempre dentro del bloque if.
scanf("%c",&a);
menu1();
return;
}//fin if
}//fin for
Espero que te sirva de ayuda. Un saludo.
