Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: ryukay en 31 Enero 2018, 21:35 PM

Título: no entiendo como hacerlo en c++ me podrian ayudar
Publicado por: ryukay en 31 Enero 2018, 21:35 PM
 Elabora un programa que determine como es el puntaje obtenido tras lanzar tres monedas al aire en función de la cantidad de caras obtenidas, de acuerdo
  a lo siguiente:
     • Tres caras, excelente
     • Dos caras, muy bien
     • Una cara, regular
     • Ninguna cara, pésimo
Título: Re: no entiendo como hacerlo en c++ me podrian ayudar
Publicado por: Serapis en 1 Febrero 2018, 01:51 AM
Por mal camino vas, si no sabes ni por donde empezar...
Deja por un momento de pensar en que tienes que programar... esencialmente lo primero es pensar, discurrir, buscar una solución incluso mecánica, luego es cuetión de traducirlo a código...

Imagina eso, 3 monedas... las lanzas al aire (al gusto, las 3 ala vez o una tras otra), luego cuentas el resultado y replicas: han salido 3 caras, dos caras, 1 cara, ninguna cara... luego cuando eso  sucede, en vez de decir eso, lo cambias por el adejtivo que te reclaman...

Esto mismo se plasma aquí:

constante c_MONEDAS = 3, c_FACETAS = 2, c_SOLUCION = 1

funcion Lanzamiento3Monedas
   entero caras
   string respuesta

   Hacer
       caras = LanzarMonedas(c_MONEDAS, c_FACETAS, c_SOLUCION)
       Seleccionar casos para caras
           caso 3; respuesta = "excelente"
           caso 2; respuesta = "muy bien"
           caso 1; respuesta = "regular"
           caso 0; respuesta = "pésima"
       fin seleccion
       MostrarMensaje ("Tu tirada ha sido " + respuesta)
       respuesta = PreguntarAlJugador("Desea jugar otra vez? (S/N).")
   Repetir mientras Respuesta = "s" o respuesta ="S"
fin funcion


Se lanzan 3 monedas. Cada moneda tiene 2 facetas. la que se da por buena es la 1 (cara, la 2 sería cruz) // ó 0 y 1...
Interesa usar el parámetro facetas, porque si nos piden tirar un dado de 6 caras, o de 12, ó de 3, 5, etc... no requiere modificar la función, solo cambiar los valores  asignados a las constantes.
entero = funcion LanzarMonedas(entero cantidad, entero facetas, entero facetaEsperada)
   entero k, cuenta, valor

   bucle para k desde 1 hasta cantidad
       valor = random(entre 1 y facetas) // ó entre 0 y facetas-1
       si (valor = facetaesperada) luego
           cuenta +=1
       fin si
   fin bucle
   devolver cuenta
fin funcion


Hale, a tu esfuerzo queda entenderlo y pasarlo desde pseudocódigo a código...
Título: Re: no entiendo como hacerlo en c++ me podrian ayudar
Publicado por: ryukay en 1 Febrero 2018, 02:06 AM
lo que sucde que el profesor que me estaba enseñando programacion en c++ no explicaba nada y mas bien cuando el explicaba los ejercicios se equivocaba a cada rato, nosostros lo teniamos que corregir a el en las clases y lo unico que decia era que lo hacia a drede para que uno buscara el error por eso pedi ayuda del ejercicio de esa forma
Título: Re: no entiendo como hacerlo en c++ me podrian ayudar
Publicado por: ryukay en 1 Febrero 2018, 02:07 AM
gracias por explicar ya tengo una idea de como hacerlo
Título: Re: no entiendo como hacerlo en c++ me podrian ayudar
Publicado por: dijsktra en 1 Febrero 2018, 16:34 PM
A ver si puede valerte esto...




#include <stdio.h>
#include <assert.h>

/*
  P : \forall i : 0 <= i < 3 : w[i]='c' or w[i]='+'
  Q : #i : 0 <= i < 3 : w[i]='c'
  O(1)
  I : P[3/n] and 0 <= n <= 3
  C(n) = 3 - n
*/
int eval(const char w[])
{
 int n,s;
 for(n=s=0;n<3;n++)
     s+=(w[n]=='c');
 return s;
}

/* Mapping int -> const char[]  */
const char *banner[] = {"bad", "medium","very good","excellent"};

int main(int argc, char *args[])
{
 char w[512];
 char *c;
 while (scanf("%s",w)!=EOF)
   {
     /* check protocol  O(1) */
     int n,l;
     for(n=l=0,c=w ; (n<3) && *c; n++,c++)
      l+=(*c=='+' ||*c=='c');
     assert((*c==0) && (n==3) && (l==3));
     /* P */
     printf("%s : %s \n",banner[eval(w)], w);
   }
 return 0;
}


Si estás empezando, fíjate solo en la funcion eval()... El resto (comentarios) se entiende en cursos más avanzados.
El programa lee resultados de lanzamientos de 3 monedas. no se exige que estos sean generados por el programa, pero SI que sean resultados de lanzamientos de 3 monedas. En otro caso, se aborta el programa.
Se acaba el programa con Ctr-D sobre un terminal Linux, o Ctr-Z + Intro en Windows. esto es es la salida,


ccc
excellent : ccc
cc+
very good : cc+
+cc
very good : +cc
++c
medium : ++c
c+c
very good : c+c
c++
medium : c++
+++
bad : +++
+-+
main: main.c:33: main: Assertion `(*c==0) && (n==3) && (l==3)' failed.
Aborted