Dos Ejercicios en C

Iniciado por Saberuneko, 21 Enero 2011, 13:12 PM

0 Miembros y 1 Visitante están viendo este tema.

Saberuneko

Bueno, ya empezamos con C en clase. Tengo hechos ya cuatro ejercicios, pero dos de ellos no consigo que funcionen bien, son los siguientes:

3.- En una estación de autobuses se requiere un programa que contabilice los billetes vendidos al cabo del día. Teniendo en cuenta que existen tres trayectos A,B,C cuyas tarifas con 6,12,18 € respectivamente.
El programa pedirá al viajero que introduzca el número de billetes que desea y el trayecto, finalizando la emisión de billetes al introducir $ en el trayecto. Una vez terminada dicha emisión, el programa visualizará:
NºBILLETES              TOTAL EUROS
A:..............                 ................
B:..............                 ................
C:.............                 .................


Esto es lo que tengo hasta el momento, no quiero que me lo resuelvan, sino que me digan qué está mal y me orienten un poco sobre qué hay que corregir sin decírmelo literalmente:

#include <stdio.h>
main()
{
char opcion;
int a=0,b=0,c=0,ap,bp,cp,x;
   printf("Introduzca un trayecto\n");
   opcion=getchar();
   printf("Introduzca cantidad\n");
scanf("%d",&x);
   while(opcion!='$')
   {
    switch(opcion)
   {
    case 'a':
      a=a+x;
          break;
      case 'b':
        b=b+x;
         break;
      case 'c':
    c=c+x;
         break;
      default:
      printf("Opcion erronea\n");
   }
         printf("Introduzca un trayecto\n");
opcion=getchar();
   printf("Introduzca cantidad\n");
scanf("%d",&x);
   }
   ap=a*6;
   bp=b*12;
   cp=c*18;
   printf("\tNºBILLETES\tTOTAL EUROS");
   printf("A\t%d\t%d",a,ap);
   printf("B\t%d\t%d",b,bp);
   printf("C\t%d\t%d",c,cp);
}


4.- Programa que visualice cuantos números de los N primeros (N introducido por teclado) cumplen las siguientes condiciones:
- El producto de sus divisores es múltiplo de 5
- La suma de sus divisores es múltiplo de 3
- Cumple ambas condiciones anteriores a la vez


Esto es lo que tengo de momento, lo mismo que en el anterior, quiero ver dónde he fallado para intentar corregirlo, no quiero que me lo den hecho:

#include <stdio.h>
main()
{
int cont,actual,n,res5,res3;
   printf("Introduzca n\n");
   scanf("%d",&n);
   for(actual=1;actual<=n;actual++)
   {
    res5=0;
      res3=0;
      while(cont<=actual/2)
      {
      if(actual%cont==0)
         {
          res5=res5*cont;
            res3=res3+cont;
         }
      }
      if(res5%5==0)
      {
        printf("El producto de los divisores de %d es multiplo de 5\n",actual);
      }
      else
      {
        printf("El producto de los divisores de %d no es multiplo de 5\n",actual);
      }
      if(res3%3==0)
      {
        printf("La suma de los divisores de %d es multiplo de 3\n",actual);
      }
      else
      {
        printf("La suma de los divisores de %d no es multiplo de 3\n",actual);
    }
      if ((res5%5==0)&&(res3%3==0))
      {
        printf("Cumplen ambas condiciones anteriores a la vez\n");
      }
      else
      {
        printf("No cumplen ambas condiciones anteriores a la vez\n\n");
      }
   }
}


Gracias por adelantado y un saludo, miau!

Shell Root

Joder, hace mucho ratón que no programo en C. Pero recorte y organice un poco el código, no funciona correctamente, pero quizás te servirá de algo...
#include <stdio.h>

int main(){

  char sOption;
  int sCant = 0;
  int a = 0; int b = 0; int c = 0;
  int aT = 0; int bT = 0; int cT = 0;

  while(sOption != '$'){
    printf("Introduzca un trayecto:\n");
    scanf("%c", &sOption);
    printf("Introduzca cantidad:\n");
    scanf("%d", &sCant);
    switch(sOption){
      case 'a':
        a = a + sCant;
        break;
      case 'b':
        b = b + sCant;
        break;
      case 'c':
        c = c + sCant;
        break;
      default:
        printf("Error.\n");
   }
  }
  aT = a * 6;
  bT = b * 12;
  cT = c * 18;

  printf("\tNºBILLETES\tTOTAL EUROS\n");
  printf("A\t%d\t\t%d\n", a, aT);
  printf("B\t%d\t\t%d\n", b, bT);
  printf("C\t%d\t\t%d\n", c, cT);

  return 0;
}


Resultado,
Código (perl) [Seleccionar]
alex@alex:~/Escritorio$ gcc PoC.c
alex@alex:~/Escritorio$ ./a.out
Introduzca un trayecto:
a
Introduzca cantidad:
3

$

NºBILLETES TOTAL EUROS
A 3 18
B 0 0
C 0 0
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

diskontrol

A simple vista se ven un par de errores en el segundo ejercicio; por ejemplo el acumulador res5 debes inicializarlo a 1, o la variable cont que no esta inicializada ni es incrementada.

Saludos!
Siempre ten tus cosas cuando las necesites con @Dropbox. ¡Una cuenta de 2 GB es gratis! http://db.tt/YxRhsCI

Saberuneko

Ahora tienen pinta de funcionar, así me han quedado:

#include <stdio.h>
main()
{
char opcion;
int a=0,b=0,c=0,ap,bp,cp,x;
   printf("Introduzca un trayecto\n");
   scanf("%c",&opcion);
   while (opcion!='a'&& opcion!='b'&& opcion!='c' && opcion!='$')
   {
      printf("Opcion erronea\n");
      printf("Introduzca un trayecto\n");
      scanf("%c",&opcion);
   }
   while(opcion!='$')
   {
      printf("Introduzca cantidad\n");
   scanf("%d",&x);
      getchar();
    switch(opcion)
   {
    case 'a':
      a=a+x;
          break;
      case 'b':
        b=b+x;
         break;
      case 'c':
    c=c+x;
         break;
      default:
      printf("Opcion erronea\n");
   }
      printf("Introduzca un trayecto\n");
      scanf("%c",&opcion);
      while (opcion!='a'&& opcion!='b'&& opcion!='c' && opcion!='$')
      {
      printf("Opcion erronea\n");
         printf("Introduzca un trayecto\n");
         scanf("%c",&opcion);
      }
   }
   ap=a*6;
   bp=b*12;
   cp=c*18;
   printf("\tN BILLETES\tTOTAL EUROS\n");
   printf("A:\t%d\t\t%d\n",a,ap);
   printf("B:\t%d\t\t%d\n",b,bp);
   printf("C:\t%d\t\t%d\n",c,cp);
return 0;
}


El otro:

#include <stdio.h>
main()
{
int cont,actual,n,res5,res3,a=0,b=0,c=0;
   printf("Introduzca n\n");
   scanf("%d",&n);
   for(actual=2;actual<=n;actual++)
   {
    res5=1;
      res3=0;
      cont=2;
      while(cont<=actual)
      {
      if(actual%cont==0)
         {
          res5=res5*cont;
            res3=res3+cont;
         }
         cont=cont+1;
      }
      if(res5%5==0)
          a=a+1;
      if(res3%3==0)
          b=b+1;
    if ((res5%5==0)&&(res3%3==0))
          c=c+1;
   }
   printf("El producto de los divisores es multiplo de 5:\n%d\n",a);
   printf("La suma de los divisores es multiplo de 3:\n%d\n",b);
   printf("Cumplen ambas condiciones anteriores a la vez:\n%d\n",c);
   return 0;
}


Gracias por lo de iniciar res5 a 1 que ya me tenía loco. :3