Buen día. Estoy estudiando programación, apenas iniciando.
Nos pidieron un programa donde usemos struct. Consultando ejemplos hice un programa, pero no compila. Me marca errores en la linea final. La verdad no se donde esta el problema. Los errores y el codigo completo abajo. ¿Podrían ayudarme para que el programa compile? Gracias por adelantado.
Errores:
error: expected `while' at end of input
error: expected `(' at end of input
error: expected primary-expression at end of input
error: expected `)' at end of input
error: expected `;' at end of input
error: expected `}' at end of input
Codigo:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
main(){
struct prod{
char nomProd[30];
char fecha[10];
char categoria[20];
float costo;
float pVenta;
} prod[50];
int cv=0, opc, clave; /*Arreglo de tipo estructura*/
do{
printf ("Abarrotes Bel-Yes - Registro de Productos \n\n");
printf ("Opciones \n");
printf ("1) Registrar producto \n");
printf ("2) Buscar prudcto \n");
printf ("3) Salir \n\n");
printf ("Elige una opcion");
scanf ("%d", &opc);
switch (opc){ /*Opciones*/
case 1: /*Entrada de datos del producto*/
if (cv>=50)
printf ("No hay espacio para mas productos en el abarrotes \n");
else {
printf ("Ingresa los datos del producto \n");
printf ("Clave %d \n", cv);
printf ("Nombre del Producto: ");
fflush (stdin);
gets (prod[cv].nomProd);
printf ("Fecha de Entrada: [dd/mm/aa]");
gets (prod[cv].fecha);
printf ("Categoria del Producto: ");
gets (prod[cv].categoria);
printf ("Costo del Producto: ");
scanf ("%f", &prod[cv].costo);
cv=cv+1;
}
break;
case 2: /*Busqueda de producto por clave*/
printf ("introduzca la clave a buscar \n");
scanf ("%d", &clave);
while (clave<0 || clave>=50){
printf ("Nombre del Producto: %s \n", prod[clave].nomProd);
printf ("Fecha de Entrada: %s \n", prod[clave].fecha);
printf ("Categoria: %s \n", prod[clave].categoria);
printf ("Costo del Producto: %f \n", prod[clave].costo);
break;
case 3:
break;
default:
printf ("Esa es una opcion invalida \n");
break;
system("pause");
}
}while (opc!='3');
}
Existe algo llamado GESHI
1) No tienes todas las llaves cerradas. Revísalas
2) Eso no es programación estructurada, eso son muchos espacios. Usa el tabulador y estructura bien el código.
3) Tienes faltas de ortografía en los printf ();
4) Usas las funciones inseguras fflush () y gets ().
5) El código es muy largo, se puede acortar.
6) NUNCA uses Conio.
7) Main se debe declarar como un "int main".
PS: La próxima vez usa las etiquetas GeShi
#include <stdio.h>
int main ()
{
printf ("Esto es un ejemplo de etiqueta GeShi.\n");
printf ("A que se ve mejor?\n");
return 0;
}
Un saludo. Sagrini
Eso no es C++. Así me compila sin problemas y creo que hace lo que deseas. Como te han dicho, si no tabulas correctamente, se hace complicado leer. No incluyas cabeceras por que suenen bien si luego no haces uso de ellas... :xD (conio!)
#include <stdio.h>
#include <stdlib.h>
main(){
struct prod
{
char nomProd[30];
char fecha[10];
char categoria[20];
float costo;
float pVenta;
} prod[50];
int cv=0, opc, clave;
do
{
printf ("Abarrotes Bel-Yes - Registro de Productos \n\n");
printf ("Opciones \n");
printf ("1) Registrar producto \n");
printf ("2) Buscar prudcto \n");
printf ("3) Salir \n\n");
printf ("Elige una opcion");
scanf ("%d", &opc);
switch (opc)
{
case 1: if (cv>=50) printf ("No hay espacio para mas productos en el abarrotes \n");
else
{
printf ("Ingresa los datos del producto \n");
printf ("Clave %d \n", cv);
printf ("Nombre del Producto: ");
fflush (stdin);
gets (prod[cv].nomProd);
printf ("Fecha de Entrada: [dd/mm/aa]");
gets (prod[cv].fecha);
printf ("Categoria del Producto: ");
gets (prod[cv].categoria);
printf ("Costo del Producto: ");
scanf ("%f", &prod[cv].costo);
cv=cv+1;
}
break;
case 2: /*Busqueda de producto por clave*/
printf ("introduzca la clave a buscar \n");
scanf ("%d", &clave);
while (clave>0 || clave<=50){
printf ("Nombre del Producto: %s \n", prod[clave].nomProd);
printf ("Fecha de Entrada: %s \n", prod[clave].fecha);
printf ("Categoria: %s \n", prod[clave].categoria);
printf ("Costo del Producto: %f \n", prod[clave].costo);
break;
default:
printf ("Esa es una opcion invalida \n");
break;
system("pause");
}
}
}
while(opc!='3');
}
Hola, soy nuevo en esto y quería pedir ayuda.
Sabriaís como puedo insertar un espacio en un string cuando detecte "_"
____________________________________________________
...
..
.
else {
if(depth==1)
{
cout<<n->info.get_label()<<"_[ ";
}
El problema es que no se como se puede declarar n->info.get_label() a string y posteriormente tratarlo, de modo que si encuentra una barra_baja haga una cosa u otra.
Gracias de antemano.
Un saludo
Gracias a todos por sus respuestas.
Encontre que le faltaba una llave antes del último while.
Apenas tengo unos meses estudiando C++ (y programación en realidad), así que estoy en pañales aun. Espero ir mejorando mis códigos.
Dos duda solamente:
1) ¿Es posible crear una version modular (usando funciones) de ese programa?
2) ¿Como uso GESHI? Ya lo descargue pero no se como instalarlo o usarlo. Disculpen mi ignorancia, pero si no pregunto no voy a saber como hacerlo.
Saludos
Cita de: rjobel en 7 Abril 2011, 19:58 PM
Gracias a todos por sus respuestas.
Encontre que le faltaba una llave antes del último while.
Apenas tengo unos meses estudiando C++ (y programación en realidad), así que estoy en pañales aun. Espero ir mejorando mis códigos.
Dos duda solamente:
1) ¿Es posible crear una version modular (usando funciones) de ese programa?
2) ¿Como uso GESHI? Ya lo descargue pero no se como instalarlo o usarlo. Disculpen mi ignorancia, pero si no pregunto no voy a saber como hacerlo.
Saludos
Estas son las Etiquetas GeSHi:
(http://i56.tinypic.com/34erlw6.png)
Las encuentras en el editor de texto del foro, y te generaran unas etiquetas para poner tu codigo.
Y si puedes resolver cualquier problema de manera funcional o modular (imagino que hasta cierto grado de complejidad, donde otro paradigma seria más efectivo y flexible), por ejemplo, y es solo un ejemplo porque no he visto el código puedes convertir el proceso lógico de cada una de las operaciones correspondientes a cada item del menú en una función diferente.
Saludos
Remarcaré mi respuesta, seguís teniendo fallos ya indicados. Y de paso ya indico lo del GeShi...
Cita de: Sagrini en 6 Abril 2011, 10:09 AM
1) No tienes todas las llaves cerradas. Revísalas
2) Eso no es programación estructurada, eso son muchos espacios. Usa el tabulador y estructura bien el código.
3) Tienes faltas de ortografía en los printf ();
4) Usas las funciones inseguras fflush () y gets ().
5) El código es muy largo, se puede acortar.
6) NUNCA uses Conio.
7) Main se debe declarar como un "int main".
PS: La próxima vez usa las etiquetas GeShi
#include <stdio.h>
int main ()
{
printf ("Esto es un ejemplo de etiqueta GeShi.\n");
printf ("A que se ve mejor?\n");
return 0;
}
[/b]
Y luego... sí, piensa cómo quieres dividirlas. Mira ejemplos, no hay forma...
Bueno, aqui esta de nuevo el código pero ahora con funciones. El programa compila, pero no funciona, pues no ejecuta cada una de las funciones.
Como les comenté antes, soy nuevo en esto y no dispongo de un profesor (estudio online), así que si ven donde está el error les voy a agradecer mucho me lo hagan saber.
Se supone que mañana durante el día debo enviar esta tarea y de verdad necesito su ayuda.
Se que aun tengo que mejorar en las tabulaciones, pero al menos ahora si use GESHI.
Este es el código.
#include <stdio.h>
#include <stdlib.h>
/*Declaración de Variables*/
struct prod{
char nomProd[30];
char fecha[10];
char categoria[20];
float costo;
} prod[50];/*Arreglo de tipo estructura*/
int entrada(void);
int buscar(void);
int precio(void);
main()
{
int c=0, opc, clave;
do{
printf ("Abarrotes Bel-Yes - Registro de Productos \n\n");
printf ("Opciones \n");
printf ("1) Registrar producto \n");
printf ("2) Buscar producto \n");
printf ("3) Precio de venta \n");
printf ("4) Salir \n\n");
printf ("Elige una opcion: \n");
scanf ("%d", &opc);
}
while (opc!=4); {
switch (opc){ /*Opciones*/
case 1:
entrada();
break;
case 2:
buscar();
break;
case 3:
precio();
break;
default:
printf ("Esa es una opcion invalida \n");
return 0;
break;
}
}
}
/*Declaracion de Funciones*/
int entrada()
{
int c=0;
if (c>=50)
printf ("No hay espacio para mas productos en el abarrotes \n");
else {
printf ("Ingresa los datos del producto \n");
printf ("Clave %.2d \n", c);
printf ("Nombre del Producto: ");
fflush (stdin);
gets (prod[c].nomProd);
printf ("Fecha de Entrada[dd/mm/aa]: ");
gets (prod[c].fecha);
printf ("Categoria del Producto: ");
gets (prod[c].categoria);
printf ("Costo del Producto: ");
scanf ("%f", &prod[c].costo);
c=c+1;
}
system ("pause");
system ("cls");
}
int buscar()
{
int clave;
printf ("Ingresa la clave a buscar [0-50] \n");
scanf ("%d", &clave);
while (clave<=50 || clave>0){
printf ("Nombre del Producto: %s \n", prod[clave].nomProd);
printf ("Fecha de Entrada: %s \n", prod[clave].fecha);
printf ("Categoria: %s \n", prod[clave].categoria);
printf ("Costo del Producto: %.2f pesos\n\n\n", prod[clave].costo);
system ("pause");
system ("cls");
} }
int precio()
{
int clave;
printf ("Ingresa la clave a buscar [0-50] \n");
scanf ("%d", &clave);
while (clave<=50 || clave>0){
printf ("Nombre del Producto: %s \n", prod[clave].nomProd);
printf ("El precio sugerido de Venta es: %.2f pesos\n\n\n", (prod[clave].costo)*1.30);
system ("pause");
system ("cls");
break;
}
}
Tu do while está mal organizado, me da la impresión:
ejemplo:
do{
lo_que_sea()
}while(algo);
//todo lo que siga no tiene que ver con el bucle
Mientras que tu código se organiza de la siguiente manera:
do{
imprimir
}while(opción!=4);
switch(opcion)
Resultado? Cuando salgas del bucle, tu programa sale, porque la propia opción 4, es la que según tu switch finaliza el programa.
Corrección? el switch debería ir dentro del do:while
do{
printf ("Abarrotes Bel-Yes - Registro de Productos \n\n");
printf ("Opciones \n");
printf ("1) Registrar producto \n");
printf ("2) Buscar producto \n");
printf ("3) Precio de venta \n");
printf ("4) Salir \n\n");
printf ("Elige una opcion: \n");
scanf ("%d", &opc);
}
switch (opc){ /*Opciones*/
case 1:
entrada();
break;
case 2:
buscar();
break;
case 3:
precio();
break;
default:
printf ("Esa es una opcion invalida \n");
return 0;
break;
}
}while (opc!=4);
Y a menos que me haya dejado alguna llave por abrir o cerrar al copiar y corregir la posición del switch, eso debería funcionarte.
Gracias por la observacion Akai.
Modifiqué le código y ahora no compila. Se traba en la declaración de las funciones.
¿Alguna idea de cual sea el problema?
#include <stdio.h>
#include <stdlib.h>
/*Declaracion de Variables*/
struct prod{
char nomProd[30];
char fecha[10];
char categoria[20];
float costo;
} prod[50];/*Arreglo de tipo estructura*/
int entrada(void);
int buscar(void);
int precio(void);
int salir(void);
main()
{
int c=0, opc, clave;
do{
printf ("Abarrotes Bel-Yes - Registro de Productos \n\n");
printf ("Opciones \n");
printf ("1) Registrar producto \n");
printf ("2) Buscar producto \n");
printf ("3) Precio de venta \n");
printf ("4) Salir \n\n");
printf ("Elige una opcion: \n");
scanf ("%d", &opc);
switch (opc){ /*Opciones*/
case 1:
entrada();
break;
case 2:
buscar();
break;
case 3:
precio();
break;
case 4:
salir();
default:
printf ("Esa es una opcion invalida \n");
return 0;
break;
}
while (opc!=4);
}
/*Declaracion de Funciones*/
int entrada()
{
int c=0;
if (c>=50)
printf ("No hay espacio para mas productos en el abarrotes \n");
else {
printf ("Ingresa los datos del producto \n");
printf ("Clave %.2d \n", c);
printf ("Nombre del Producto: ");
fflush (stdin);
gets (prod[c].nomProd);
printf ("Fecha de Entrada[dd/mm/aa]: ");
gets (prod[c].fecha);
printf ("Categoria del Producto: ");
gets (prod[c].categoria);
printf ("Costo del Producto: ");
scanf ("%f", &prod[c].costo);
c=c+1;
}
system ("pause");
system ("cls");
}
int buscar()
{
int clave;
printf ("Ingresa la clave a buscar [0-50] \n");
scanf ("%d", &clave);
while (clave<=50 || clave>0){
printf ("Nombre del Producto: %s \n", prod[clave].nomProd);
printf ("Fecha de Entrada: %s \n", prod[clave].fecha);
printf ("Categoria: %s \n", prod[clave].categoria);
printf ("Costo del Producto: %.2f pesos\n\n\n", prod[clave].costo);
system ("pause");
system ("cls");
} }
int precio()
{
int clave;
printf ("Ingresa la clave a buscar [0-50] \n");
scanf ("%d", &clave);
while (clave<=50 || clave>0){
printf ("Nombre del Producto: %s \n", prod[clave].nomProd);
printf ("El precio sugerido de Venta es: %.2f pesos\n\n\n", (prod[clave].costo)*1.30);
system ("pause");
system ("cls");
break;
}}
int salir()
{
return 0;
}
Si, tu problema está en que tanto precio, buscar y clave son funciones de tipo int y no tienen return.
Si pretendes que no devuelvan nada, decláralas como void.
Por otro lado, no se que clase de compilador estás usando, pero como mínimo, se le podría prestar un poco de atención a los avisos y /o errores, y de paso, cuando preguntes, ponerlos aquí.
el problema aquí también está en el cierre de un bloque, al parecer no has leido atento el anterior mensaje de Akai, ya que el problema se encuentra en el do-while en donde falta una llave, aparte de eso a continuación dejo la la salida de la compilación con parametros -Wall y -Wextra para que mires en que partes del código tienes fallas:
oo.c:20: warning: return type defaults to 'int'
oo.c: In function 'main':
oo.c:21: warning: unused variable 'clave'
oo.c:21: warning: unused variable 'c'
oo.c: In function 'precio':
oo.c:107: warning: control reaches end of non-void function
oo.c: In function 'buscar':
oo.c:94: warning: control reaches end of non-void function
oo.c: In function 'entrada':
oo.c:79: warning: control reaches end of non-void function
oo.c: In function 'main':
oo.c:52: warning: control reaches end of non-void function
/tmp/ccEQ4tAC.o: In function `entrada':
oo.c:(.text+0x144): warning: the `gets' function is dangerous and should not be used.
Como podrás ver casi todo es porque las funciones no retornan un entero siendo declaradas como tal, debes retornar un valor al final de cada función según el tipo correspondiente, como podrás ver también se advierte sobre la omision de la declaración del tipo de main que debería ser entero y que además no tiene valor de retorno, unas cuantas variables que declaras y no usas, y por último los riesgos de usar 'gets'
Saludos
Gracias a todos por su ayuda.
El programa ya jala bien. Espero ir mejorando para no caer en errores tan simples.
Saludos
Te vendría bien organizarte el cógido.
Si usas las funciones de esa manera usalas asi:
void buscar(void){ }
void quiere decir que no devuelve nada, y void entre paréntesis quiere decir que no se le pasa ningún parámetro a la funcion
Por otro lado, para organizarte el código es mejor que declares las funciones arriba, antes del main, quedándote de tal manera:
#include ...las librerias...
// DECLARAS AQUI LOS PROTOTIPOS DE LAS FUNCIONES
void buscar(void);
void precio(void);
int main{
...TU PROGRAMA...
// Como ves, cuando declaras una funcion o el cuerpo con INT (podrias hacerlo tambien con void) tienes que hacer return 0; para que el programa sepa que termina bien.
return 0;
}
void buscar(){
LA FUNCION
}
void precio(){
LA FUNCION
}
Declarando las funciones con el prototipo arriba podras usarlas en cualquier parte del programa.
Cuando metas en una variable el valor de lo que devuelve la función solo tienes que aplicarle un poco de lógica.
#include <stdio.h>
int funcion();
int main()
{
int variable;
variable=funcion();
printf("%d",variable);
return 0;
}
int funcion()
{
int a=5, b=2;
return (a+b);
}
Este programa lo que hace es sumar a+b por lo que cuando ejecute la funcion() lo que devuelva se meterá dentro de variable y al hacer printf %d variable nos saldrá un 7. Como ves declaramos la función con INT porque "variable" esta declarada como INT, por lo que trabajara con números enteros y ambas deben ser del mismo tipo, tanto la función como la variable que recoge los datos de la función.
Espero te sirva un poco. Cuando manejes esto, mira el tema de pasar parametros a las funciones. Para programar hay que aprender tambien a simplificar el main.
Un saludo.