/* 060208-1.c
 * 45 min
 */
#include <stdio.h>

void pedir_precios (float vp [], int n);
void inicializar_cesta (int vc [], int n);
void leer_codigo (int *c);
void leer_cantidad (int *c);
void factura (int vc[], float vp[], int n);
float tipo_iva (int codigo);

int main (void)
{
  float vp [10]; /* Vector de precios */
  int   vc [10]; /* Vector de cantidades */
  int   c, q;

  pedir_precios (vp, 10);
  do {
    inicializar_cesta (vc, 10);
    do {
      leer_codigo (&c);
      if (c > 0) {
        leer_cantidad (&q);
        vc[c-1] += q;
      }
    } while (c > 0);
    if (c == 0)
      factura (vc, vp, 10);
  } while  (c != -95);
  printf ("Hasta luego\n");
  return 0;
}

void pedir_precios (float vp [], int n)
{
  int i;

  printf ("Por favor, introduce los precios (en euros):\n");
  for (i = 0; i < n; i++) {
    printf ("Código %d: ", i+1);
    scanf ("%f", &vp [i]);
  }
}

void inicializar_cesta (int vc [], int n)
{
  int i;

  for (i = 0; i < n; i++)
    vc[i] = 0;
  printf ("Nueva cesta\n");
}

void leer_codigo (int *c)
{
  do {
    printf ("Código de producto: ");
    scanf ("%d", c);
    if (*c != -95 && (*c < 0 || *c > 10))
      printf ("Código de producto incorrecto: %d\n", *c);
  } while (*c != -95 && (*c < 0 || *c > 10));
}

void leer_cantidad (int *c)
{
  printf ("Unidades: ");
  scanf ("%d", c);
}

void factura (int vc[], float vp[], int n)
{
  int i;
  float pp;
  float iva;
  float suma;

  printf ("\nFactura\n\n"
          "Código  Cant.  Precio  IVA   Subtotal\n");
  suma = 0.0;
  for (i = 0; i < n; i++)
    if (vc [i] != 0) {
      pp = vc [i] * vp [i];
      iva = pp * tipo_iva (i);
      printf ("%4d %5d x %6.2f + %5.2f  %5.2f\n",
              i+1, vc[i], vp[i], iva, pp + iva);
      suma += pp + iva;
    }
  printf ("Total %28.2f\n", suma);
}

  /* Cuidado, internamente decrementamos en uno los códigos */
float tipo_iva (int codigo)
{
  if (codigo >= 0 && codigo <= 2) return 0.04;
  if (codigo >= 3 && codigo <= 6) return 0.07;
  return 0.16;
}