Skip to content

Instantly share code, notes, and snippets.

@danirod
Created September 21, 2013 21:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danirod/6654598 to your computer and use it in GitHub Desktop.
Save danirod/6654598 to your computer and use it in GitHub Desktop.
ejemplo structs memoria estática
#include <stdio.h>
#include <stdlib.h>
/* Estructura de un producto */
typedef struct {
int codigo_producto; /* código del producto */
char descripcion[20]; /* descripción del producto */
float precio_unitario; /* precio del producto sin IVA */
} t_producto;
/* Imprime los datos de un producto */
void imprimir_producto(t_producto t)
{
printf("%10d %-20s %.2f\n", t.codigo_producto, t.descripcion, t.precio_unitario);
}
/* Genera un saludo */
void emitir_saludo()
{
printf("* * * * * * * * * * * * * * * * * * * * * *\n");
printf("* * SUPERMERCADOS MARCADONA * *\n");
printf("* * Porque la calidad, no es lo primero * *\n");
printf("* * * * * * * * * * * * * * * * * * * * * *\n");
}
/* Lee un producto */
t_producto leer_producto()
{
t_producto p;
char entrada[80];
/* leer el código de producto */
printf("Código de producto: ");
fgets(entrada, 10, stdin); /* fgets es una función que lee de un archivo
un conjunto de caracteres. en este caso le
pedimos que lea de stdin (la entrada, el
teclado). como máximo puede leer 10
caracteres y lo que vuelque lo guardará en
entrada */
/* a veces fgets incluye el \n final. lo quitamos. para ello debemos ver
cuál es la última letra de la cadena. strlen es una función para
ver cuántas letras tiene una cadena. */
if(entrada[strlen(entrada) - 1] == '\n') /* si la última letra es \n... */
entrada[strlen(entrada) - 1] = '\0'; /* la dejamos en \0. */
/* strtol es una función que convierte una cadena en un número long int.
su segundo parámetro no nos interesa así que lo dejamos como NULL.
su tercer parámetro es la base, como es un número decimal, es 10. */
p.codigo_producto = (int) strtol(entrada, NULL, 10);
/* leer la descripción. el código es parecido al de lectura anterior */
printf("Descripción: ");
fgets(p.descripcion, 20, stdin);
if(p.descripcion[strlen(p.descripcion) - 1] == '\n');
p.descripcion[strlen(p.descripcion) - 1] = '\0';
/* leer el precio. sigue siendo lo mismo que anteriormente. */
printf("Precio: ");
fgets(entrada, 10, stdin);
if(entrada[strlen(entrada) - 1] == '\n')
entrada[strlen(entrada) - 1] = '\0';
/* en este caso la función se llama strtof para convertir a floats*/
p.precio_unitario = strtof(entrada, NULL);
return p;
}
/* Aplica el IVA */
float aplicar_iva(float precio_base)
{
// return precio_base * 1.16;
// return precio_base * 1.18;
return precio_base * 1.21; // RAJOY Y U MAD
}
int main(int argc, char** argv)
{
t_producto productos[4];
t_producto producto;
char decision;
int i, cantidad = 0;
float total = 0.0;
emitir_saludo(); /* buenos días */
while(cantidad < 4)
{
do
{
printf("Hay %d productos en el carrito. ¿Pasamos otro? [s/n] ", cantidad);
decision = getchar(); /* leemos un caracter */
while(getchar() == EOF); /* necesario para que se coma el \n */
}
while(decision != 's' && decision != 'S' && decision != 'n' && decision != 'N');
if(decision == 'n' || decision == 'N') break; /* si elige N, se acabó */
producto = leer_producto();
productos[cantidad++] = producto;
}
for(i = 0; i < cantidad; i++)
{
imprimir_producto(productos[i]);
total += productos[i].precio_unitario;
}
printf("Total productos: %d\n", cantidad);
printf("Precio total sin IVA: %.2f\n", total);
printf("Precio total con IVA: %.2f\n", aplicar_iva(total));
printf("\n\nBuenos días.\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment