Reto Universidad [C++].

Iniciado por bigfu, 20 Julio 2011, 13:04 PM

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

Kherom

Cita de: bigfu en 11 Agosto 2011, 17:20 PM
¿qué IDE estás usando? Yo lo acabo de comprobar y va bien.
Si al ejecutarlo te sale una ventana tipo MS-DOS, lo que seguramente pase es que se ejecute bien pero se cierra justo al terminar de hacerlo, sin dar tiempo a mostrar el resultado, de ahi que parezca que se cierra de forma inesperada.

Probablemente sea eso, aunque de todas formas en el ejercicio decía de hacer un bucle, habría que añadir un while. Uso el Visual C++ 2010 Express.

bigfu

Cita de: Kherom en 11 Agosto 2011, 18:04 PM
Probablemente sea eso, aunque de todas formas en el ejercicio decía de hacer un bucle, habría que añadir un while. Uso el Visual C++ 2010 Express.

Tanto la estructura while como la do-while son iterativas (bucles), al igual que la estructura for. Asi que puedes hacerlas con la estructura que prefieras, aunque la estructura for se usa más en los casos en los que conoces el número de iteraciones, pero creo que la puedes "transformar" y usarlas como las otras dos.
A reader lives a thousand lives before he dies. The man who never reads lives only one

Kherom

#42
Cita de: bigfu en 11 Agosto 2011, 18:10 PM
Tanto la estructura while como la do-while son iterativas (bucles), al igual que la estructura for. Asi que puedes hacerlas con la estructura que prefieras, aunque la estructura for se usa más en los casos en los que conoces el número de iteraciones, pero creo que la puedes "transformar" y usarlas como las otras dos.

Había leído mal el enunciado xD, pensaba que el programa tenía que ejecutarse en bucle, no sólo tener un bucle que vaya leyendo caracteres.

PD: He llegado hasta el ejercicio 6, creo que es un método más rápido y sencillo, a ver que os parece (el Sleep está sólo para que de tiempo a ver el resultado, no se si sería necesario pero creo que no entra en el tema del ejercicio):

Citar// 6.- Desarrolla un algoritmo para el siguiente juego:
// El usuario introduce un límite inferior, un límite superior y piensa un número en ese rango.
// El ordenador tiene que acertarlo. Para ello el ordenador propone un número y el usuario responde
// con >, < o = (correspondiente a acertado y el programa acaba). Si la respuesta es > o <, el ordenador
// propondrá otro número hasta que lo acierte.
// (Si mal no recuerdo, para este ejercicio, el profesor indicó que tanto el usuario como el ordenador,
// somos nosotros, sino sería más complicado hacerlo con lo visto hasta ahora XD)

#include <iostream>
using namespace std;
#include <Windows.h>

int main()
{
   int liminf=0, limsup=0, num=0, numsuger=0;
   bool final = false;
   char respuesta;
   cout << "Piense en un número entre un limite inferior y uno superior." << endl;
   cout << "Introduzca el limite inferior y pulse intro: ";
   cin >> liminf;
   cout << "Introduzca el limite superior y pulse intro: ";
   cin >> limsup;
   while (final == false)
   {
      numsuger= (limsup+liminf)/2;
      cout << "El numero es " << numsuger << "?" << endl;
      cout << "Contesta con '=', '<' si es menor o '>' si es mayor y pulsa intro: ";
      cin >> respuesta;
      if (respuesta == '<')
         limsup = numsuger;
      else if (respuesta == '>')
         liminf = numsuger;
      else if (respuesta == '=')
      {
         cout << "Numero adivinado!";
         final = true;
      }
   }
   Sleep(15000);
   return 0;
}

bigfu

Ya están colgadas todas las soluciones del tema 3.

Os querría pedir un favor, a ver si podéis echarle un vistazo a este código y decidme si está bien o mal o cómo podría hacerlo mejor. Es que este tipo de ejercicios (algo más complejo, claro está) es uno de los que suelen caer en el examen y siempre he tenido "problemas" con ellos. Para ver si más o menos le voy cogiendo el hilo...

CitarUna farmacia desea almacenar sus productos (TProducto) en una estructura. De cada producto hay que almacenar la siguiente información: código (unsigned), nombre (string), precio (float), fecha de caducidad (definir un tipo de registro para la fecha). Diseña la estructura de datos (TFarmacia) para almacenar un máximo de MAX (una constante) productos y realiza los siguientes subalgoritmos: (son los subprogramas que he puesto más abajo).
Código (cpp) [Seleccionar]
#include <iostream>
#include<string>
using namespace std;

const unsigned MAX = 50;
struct TFecha{
   unsigned dia,mes,anyo;
};
struct TProducto{
   unsigned codigo;
   string nombre;
   float precio;
   TFecha fecha_cad;
};
typedef TProducto TMedicamentos[MAX];
struct TFarmacia{
   TMedicamentos med;
   unsigned num;
};

void LeerProducto(TProducto& p){
   cout << "Introduzca codigo: ";
   cin >> p.codigo;
   cout << "Introduzca nombre: ";
   getline(cin,p.nombre);
   cout << "Introduzca precio: ";
   cin >> p.precio;
   cout << "FECHA: " << endl;
   cout << "Introduzca dia: ";
   do{
      cin >> p.fecha_cad.dia;
   }while((p.fecha_cad.dia<1)||(p.fecha_cad.dia>31));
   cout << "Introduzca mes: ";
   do{
      cin >> p.fecha_cad.mes;
   }while((p.fecha_cad.mes<1)||(p.fecha_cad.mes>12));
   cout << "Introduzca año: ";
   cin >> anyo;
}

void EscribirProducto(const TProducto& p){
   cout << "Codigo: " << p.codigo << endl;
   cout << "Nombre: " << p.nombre << endl;
   cout << "Precios: " << p.precio << endl;
   cout << "Fecha: " << p.fecha_cad.dia << "/" << p.fecha_cad.mes << "/" << p.fecha_cad.anyo << endl;
}

void inicializarFarmacia(TFarmacia& f){
   f.num = 0;
}

void insertarProducto(TFarmacia& f, const TProducto& p){
   f.med[f.num] = p;
   f.num++;
}

void BorrarProducto(TFarmacia& f, unsigned codigo){
   bool esta = false;
   unsigned i;
   for(i=0;i<f.num;i++){
      if(f.med[i].codigo == codigo){
         esta = true;
         break;
      }
   }
   if(esta){
      f.med[i] = f.med[f.num-1];
      f.num--;
   }else{
      cout << "No esta" << endl;
   }
}

void BuscarProductoCodigo(const TFarmacia& f, unsigned codigo, bool& encontrado, TProducto& p){
   encontrado = false;

   for(unsigned i=0;i<f.num;i++){
      if(f.med[i].codigo == codigo){
         p = f.med[i];
         encontrado = true;
         break;
      }
   }
}

void BuscarProductoNombre(const TFarmacia& f, const string& nombre, bool& encontrado, TProducto& p){
   encontrado = false;

   for(unsigned i=0;i<f.num;i++){
      if(f.med[i].nombre == nombre){
         p = f.med[i];
         encontrado = true;
         break;
      }
   }
}

void ListarFarmacia(const TFarmacia& f){
   for(unsigned i=0;i<f.num;i++){
      EscribirProducto(f.med[i]);
      cout << endl;
   }
}


Gracias!!
A reader lives a thousand lives before he dies. The man who never reads lives only one

PiroskY

No se puede usar archivos?

bigfu

Cita de: PiroskY en 15 Agosto 2011, 16:21 PM
No se puede usar archivos?

No, eso se da en otra asignatura.
A reader lives a thousand lives before he dies. The man who never reads lives only one

ANTRUCK

#46
Imposible de ganarle a la PC  :¬¬ no he podido ganar ni una sola vez  :-( hahaha cuando trate de hacer fraude de algun modo poniendo 1,2 se puso loco el juego  :xD

Código (cpp) [Seleccionar]
#include<iostream>
using namespace std;

int main()
{
   int num,turno=1,resto,aux;
   do
   {
       cout<<"Introduzca numero: ";
       cin>>num;
   }
   while(num<=0);
   if(num%4==1)
       turno=0;
   do
   {
       cout<<num<<" Objetos"<<endl;
       switch(turno)
       {
           case 0: do
                   {
                       cout<<"Quitar [1] [2] [3] objetos: ";
                       cin>>resto;
                   }
                   while(resto<1 || resto>3 || resto>num);
                   turno=2;
                   break;
           case 2: resto=4-resto;
                   cout<<"Computador quita "<<resto<<" objetos"<<endl;
                   turno=0;
                   break;
           case 1: for(int j=num-1;j>=num-3;j--)
                       if(j%4==1)
                           aux=j;
                   resto=num-aux;
                   cout<<"Computador quita "<<resto<<" objetos"<<endl;
                   turno=0;
                   break;
       }
       num-=resto;
   }
   while(num!=0);
   cout<<"Computador Wins... user sucks!!!"<<endl;
}

Kherom

Creo que tengo una solución más sencilla para el 4º ejercicio del tema 2, a ver que os parece:

#include <iostream>
#include <Windows.h>
using namespace std;

void cuenta (int& num, int& cont)
{
int contaux=0;
int numant=0;
while (numant<=num&&num<2)
{
contaux++;
numant=num;
cin >> num;
}

if (contaux>cont)
cont=contaux;
}


void main ()
{
int num;
int cont=0;
cout << "Escribe ceros y unos separados por espacios y con un 2 al final: " << endl;
cin >> num;
while(num<2)
cuenta(num, cont);
cout << "La mayor sucesion ordenada es de: " << cont << endl;
Sleep(50000);
}

Kherom

#48
Bigfu, tu solución al 5º ejercicio del segundo tema no funciona bien, considera una pendiente ascendente suelta como montaña o valle y las condiciones del problema no lo permiten. Por otro lado en caso de llanura debería ignorar todo el trozo ya que según las condiciones cada número tiene que ser superior o inferior al anterior hasta h y tu código simplemente ignora los repetidos.

Yo he hecho otro código que funciona bien con valles pero no se por qué en en caso de las montañas no suma la parte descendente o algo (la cosa es que siguiendo las instrucciones en un papel funciona... :S). El otro problema es que tampoco tiene en cuenta las llanuras, a ver si los soluciono. De momento lo dejo a ver si ve alguien el fallo:

Código (cpp) [Seleccionar]
/*5.- Decimos que una sucesión a1,a2,...,an de enteros forma una montaña, si existe un h tal que:
1 <= h <= n y además a1<...ah-1 < ah > ah+1 > ...an
Por ejemplo 24, 13, 6, 15, 50 sería un valle.
Dada una secuencia de enteros terminada en cero (0) que como mínimo contiene una montaña y un valle
(suponemos que la secuencia de enteros de entrada es una secuencia correcta de montañas y valles),
diseña un programa que calcule la longitud de la montaña y el valle más largos.
*/

#include <iostream>
#include <Windows.h>
using namespace std;

void cuentasubida(int& num, int& prevNum, int& subida)
{
subida++;
while (prevNum<num && num!=0)
{
subida++;
prevNum=num;
cin >> num;
}
}

void cuentabajada(int& num, int& prevNum, int& bajada)
{
bajada++;
while (prevNum>num && num!=0)
{
bajada++;
prevNum=num;
cin >> num;
}
}

void main ()
{
int num, prevNum, montaña=0, valle=0, subida=0, bajada=0, aux=0;
cout << "Introduce una sucesion de numeros que incluya al menos una montaña y un valle: " << endl;
cin >> num;
while (num != 0)
{
prevNum=num;
cin >> num;
while (num != 0)
{
if (prevNum<num)
{
cuentasubida(num, prevNum, subida);
if(bajada!=0) //Si antes había una bajada tendrá el valor de la parte descendente, en otro caso es el comienzo de un valle incompleto por lo que se salta esta parte
{
aux=(bajada+subida)-1;
bajada=0; //Como el valle está completo borra la parte de la bajada quedando sólo el valor de la última parte ascendente
if(aux>valle)
valle=aux;
}
}
if (num!=0 && prevNum>num)
{
cuentabajada(num, prevNum, bajada);
if(subida=!0) // Igual que antes, si había un valor de subida es que la montaña estaba empezada
{
aux=(subida+bajada)-1;
subida=0; // Dado que la montaña está completa borra la parte ascendente dejando el final descendente
if (aux>montaña)
montaña=aux;
}
}
}
}
cout << "La montaña mas larga es de " << montaña << endl;
cout << "El valle mas largo es de " << valle << endl;
Sleep(5000000); // para el programa para analizar los resultados
}


La verdad, no se lo qué está mal ya que en teoría si no hay números iguales seguidos debería funcionar bien :S

bigfu

Yo lo probé y me funcionaba... al meterle los datos has tenido en cuenta que debe de haber al menos una montaña y un valle??
De todas formas, mañana volveré a echarle un vistazo.
A reader lives a thousand lives before he dies. The man who never reads lives only one