Duda con While y con If

Iniciado por iAmChapin_, 26 Agosto 2015, 00:02 AM

0 Miembros y 2 Visitantes están viendo este tema.

iAmChapin_

Hola! Recientemente me registré en este grandioso foro y pues vengo a molestar a ver si alguien puede aclararme las dudas sobre un código de otro ejercicio que me dejaron hacer de la universidad. Aclaro: Los ejercicios los hago en Borland (si, me han dicho que es viejo, pero es el que utilizamos en clase) y las funciones puede que algunas no tenga que usarlas o son desactualizadas, pero en si no se preocupen que solo son programas pequeños y solamente es presentar el código a nuestro profesor.

El ejercicio  que tengo que programar va así:



Y el código que  hice en Borland C++ está así:
Código (geshi) [Seleccionar]

#include <iostream.h>
#include <conio.h>

int num1;
int num2;
int i;

int main(){

  cout << "Jugador 1: Ingresa el numero que se va a adivinar: " << endl;
  cin >> num1;

  while (num1 >= 1 && num1 <= 50){

  cout << "El numero que debes ingresar debe estar entre 1 y 50";
  }

  cout << "Ok" << endl << endl << "Jugador 2: Comienza a adivinar!" << endl << endl;
  cout << "Tienes 5 oportunidades, ingresa un numero: " << endl;
  cin >> num2;

  while (num2 == num1){

  if (num2 > num1){
      for (i=0; i<=5; i++){

        cout << "El numero que ingresaste es mayor que el del otro jugador";}
        cout << "Ingresa otro numero";
        i++;
        }
     }
     else if(num2 < num1){
     for (i=0; i<=5; i++){

        cout << "El numero que ingresaste es menor que el del otro jugador";}
        cout << "Ingresa otro numero";
        i++;
        }

     }

  else if (num2 == num1){

  cout << "Sorprendente, felicidades, adivinaste, el numero era:" << num1;

  }

  getch();
  return 0;
}


Pues con los conocimientos que tengo todo debería estar bien, pero a la hora de compilarlo, todo va mal, me saltan errores y ya rebusque en todo el codigo y nada. Quisiera saber que errores tengo y si el programa va bien (porque debido a que no puedo compilarlo, no se si funciona de esta manera como yo lo tengo).

Por si surgen las preguntas otra vez: Solo son ejercicios pequeños, me informaron antes de que algunas funciones que utilizo son desactualizadas o no deben usarse, pero solo son ejercicios de la universidad y utilizo Borland. Saludos a todos  ;D

Mientras

En el while de la linea 13, si ingresas un valor entre 1 y 50 te va a dar "true" y va a hacer ese "cout" en un ciclo infinito. Pero igual si no corre, no es por eso.

Revisa bien tus llaves, tanto de apertura como de cierre. Están mal. Al parecer quieres hacer el "if , else if y else" dentro de ese "while" pero el "else if" está fuera del while.

Creo q tienes una llave de cierre de más.

Si vas a usar "else if", termínalo con "else" para la linea 42.

Trata de usar una llave de cierre en una línea aparte. Por ejemplo el "for" de la linea 25 parece que terminara en la línea 30, pero tienes una llave de cierre al final de la línea 27. Esto complica la lectura de código.

iAmChapin_

Cita de: Mientras en 26 Agosto 2015, 00:51 AM
En el while de la linea 13, si ingresas un valor entre 1 y 50 te va a dar "true" y va a hacer ese "cout" en un ciclo infinito. Pero igual si no corre, no es por eso.

Revisa bien tus llaves, tanto de apertura como de cierre. Están mal. Al parecer quieres hacer el "if , else if y else" dentro de ese "while" pero el "else if" está fuera del while.

Creo q tienes una llave de cierre de más.

Si vas a usar "else if", termínalo con "else" para la linea 42.

Trata de usar una llave de cierre en una línea aparte. Por ejemplo el "for" de la linea 25 parece que terminara en la línea 30, pero tienes una llave de cierre al final de la línea 27. Esto complica la lectura de código.

Excelente mi amigo!! Gracias, de la que me salvaste!! Disculpa si no te conteste luego! Ahora tengo otra duda, después de corregir todo eso, el código me quedó así:
Código (cpp) [Seleccionar]
#include <iostream.h>
#include <conio.h>

int num1;
int num2;
int i;

void main(){

   cout << "Jugador 1: Ingresa el numero que se va a adivinar: " << endl;
   cin >> num1;
   cout << endl;

   //DETERMINAMOS SI EL NUMERO INGRESADO ES DEL 1 AL 50
   while ((num1 < 0) || (num1 > 50))
   {
    cout << "El numero que ingresaste debe estar entre 1 y 50" << endl;
      cin >> num1;
      cout << endl;
   }
   //LIMPIAMOS PANTALLA PARA QUE EL JUGADOR 2 NO VEA EL NUMERO OCULTO
   clrscr();

   //INDICAMOS AL JUGADOR 2 LO QUE DEBE DE HACER
   cout << "Ok" << endl << endl << "Jugador 2: Comienza a adivinar!" << endl << endl;
   cout << "Tienes 5 oportunidades! ";

   //DETERMINAMOS SI EL JUGADOR 2 NO ADIVINA EL NUMERO EN 5 INTENTOS, PIERDE
   for (i = 0; i <= 8; i++){
   cout << "Ingresa otro numero:" << endl;
   cin >> num2;
   cout << endl;
   //DETERMINAMOS SI NUM2 ES MAYOR A NUM1 E IMPRIME UN INDICIO
   if (num2 > num1){
    cout << "El numero es mayor que el numero oculto!" << endl << endl;
      i++;
      }
//DETERMINAMOS SI NUM2 ES MENOR A NUM1 E IMPRIME UN INDICIO
   else if (num2 < num1){
    cout << "El numero es menor que el numero oculto!" << endl << endl;
      i++;
      }
   //SI EL JUGADOR 2 ADIVINA EL NUMERO, GANA Y SALE DEL CICLO CON BREAK
   else if (num2 == num1){
    cout << "Sorprendente!!, felicidades, adivinaste, el numero oculto era: " << num1 << endl;
      break;
      }
   //SI EL JUGADOR 2 NO ADIVINA, JUGADOR 1 GANA Y TERMINA EL PROGRAMA
   else{
    cout << "Perdiste!! Jugador 1 Gana!! El numero oculto era: " << num1 << endl;
      break;
      }
   }

  getch();
}


Todo correcto, me compila y me ejecuta todito! Pero cuando el jugador 2 falla en los 5 intentos, no imprime el ultimo mensaje del else de la linea 49, no se porque!! Podrías ayudarme? Otra cosa: en la linea 29 del for, coloqué 8 a i porque solo de esa manera me podia ingresar 5 intentos a la hora de ejecutarse, si le colocaba 5 solo me dejaba intentar 3 veces!! Por si acaso me preguntas, saludos mi amigo!!

Mientras

La linea 36 y 41 están de más, por que en el "for" con "i++" ya le estás indicando que incremente uno en cada iteración. Por eso te da 3 intentos cuando pones 5, ya que en cada bucle " i " toma el valor de 0,2,4

Un numero puede ser mayor que otro, menor que otro, o igual q el otro, esas son todas las posibilidades. Por eso nunca vas a llegar a la linea 49.

Fuera del "for" puedes usar un "if" para saber con que valor terminó la variable "i". Si terminó con 5 entonces dices que perdió. Es una forma, tal vez se te ocurra otra mejor.

* Si uso "for(int x=0 ; i<=10 ; i++)" eso son 11 vueltas.

iAmChapin_

Cita de: Mientras en 27 Agosto 2015, 02:47 AM
La linea 36 y 41 están de más, por que en el "for" con "i++" ya le estás indicando que incremente uno en cada iteración. Por eso te da 3 intentos cuando pones 5, ya que en cada bucle " i " toma el valor de 0,2,4

Un numero puede ser mayor que otro, menor que otro, o igual q el otro, esas son todas las posibilidades. Por eso nunca vas a llegar a la linea 49.

Fuera del "for" puedes usar un "if" para saber con que valor terminó la variable "i". Si terminó con 5 entonces dices que perdió. Es una forma, tal vez se te ocurra otra mejor.

* Si uso "for(int x=0 ; i<=10 ; i++)" eso son 11 vueltas.

Increíble la falta de conocimiento de mi parte jeje, muchísimas gracias mi amigo!! Todo resuelto!
Disculpa las molestias que te provoco, de verdad muchas gracias!  ;-) ;-) ;-)

Mientras

No hay problema.
Mas bien algo q no me había dado cuenta. Trata de evitar declarar las variables fuera de la función principal. Esto se llama "variables globales".
Y también cuando escribas código dentro de un if,while,etc ponlo "más a la derecha". Esto lo llama identación o sangrado.

iAmChapin_

#6
Cita de: Mientras en 27 Agosto 2015, 05:10 AM
No hay problema.
Mas bien algo q no me había dado cuenta. Trata de evitar declarar las variables fuera de la función principal. Esto se llama "variables globales".
Y también cuando escribas código dentro de un if,while,etc ponlo "más a la derecha". Esto lo llama identación o sangrado.

Te envié un mensaje privado! Espero me contestes y una vez más, muchísimas gracias por ayudarme!!!  ;-)

Publico el código para que me pudas ayudar nuevamente con otro ejercicio porfavor!

Código (cpp) [Seleccionar]
#include <iostream.h>
#include <conio.h>

int n;
int i = 0;
float total = 0;
const float numerador = 1.0;
bool bandera = false;

void main(){


  cout << "Calculemos la suma de (1/N) - (2/N-1) + (3/N-2) - (4/N-3) + (5/N-4) + N/1 " << endl << endl;
  cout << "Ingresa un valor para N:" << endl;
  cin >> n;

  //HASTA QUE I SEA MENOR O IGUAL QUE N EL CICLO TERMINA
  while(i <= n){
  //DETERMINAMOS LA SUMA DEL TOTAL CON I, NUMERADOR Y SUMANDO EL TOTAL
       if( bandera == false){
           total = total + (numerador/n)-i;
           bandera = true;
       }
  //AL INDICAR QUE BANDERA ES TRUE, SUCESIVAMENTE SE VA A RESTAR EL PROCESO ANTERIOR
       else{
           total = total - (numerador/n)-i;
           bandera = false;
       }
  //SE INCREMENTA I HASTA QUE CUMPLA LA CONDICION DEL CICLO WHILE
       i--;

   }

   //IMPRIMIMOS EN PANTALLA EL RESULTADO DE LAS DOS OPERACIONES
   cout<<"Total: "<< total <<endl;
   getch();
}

Mientras

#7
En el numerador no puede ir la variable "numerador" por que vale 1, y la secuencia indica que debe ir incrementando. Por lo que lo más adecuado es que aproveches la variable "i" si está inicializada con "1", o "i+1" si está inicializada con "0".

Con:
(1/N) - (2/N-1) + (3/N-2) - (4/N-3) + (5/N-4) + N/1

No me queda claro si quieren decir  "((2/N)-1)" o "(2/(N-1))".

* la linea 32 no incrementa.

iAmChapin_

Creo que quiere decir ((2/N)-1) porque así esta establecido en el ejercicio, y creo que por ley de signos, la división debe ir primero antes que la resta. Sabes, a pesar de que te copie el codigo y le cambie un par de cosas, lo siento si no te pedi permiso antes, es que vi tan bien tu codigo que decidi quedarme con ese  :-[ y ahora no me esta quedando muy claro lo que indicas, le he cambiado asi como indicas pero no sale igual al del programa que tengo de guía. Te dejo las comparaciones:



El izquierdo es mi programa, y el segundo es el programa guia al que mi programa debe ser igual.

Ahora le hice leves modificaciones al código tratando de lograr un ingenio para ver si lograba el resultado, pues a como esta ahorita es como en mi mente tiene que estar el codigo, observa:

Código (cpp) [Seleccionar]
#include <iostream.h>
#include <conio.h>

int n;
int i = 1;
float total = 0;
float numerador = 0;
bool bandera = false;

void main(){


  cout << "Calculemos la suma de (1/N) - (2/N-1) + (3/N-2) - (4/N-3) + (5/N-4) + N/1 " << endl << endl;
  cout << "Ingresa un valor para N:" << endl;
  cin >> n;

  //HASTA QUE I SEA MENOR O IGUAL QUE N EL CICLO TERMINA
  while(i <= n){
  //DETERMINAMOS LA SUMA DEL TOTAL CON I, NUMERADOR Y SUMANDO EL TOTAL
       if( bandera == false){
           total = total + (i/n);
           i++;
           bandera = true;
       }
  //AL INDICAR QUE BANDERA ES TRUE, SUCESIVAMENTE SE VA A RESTAR EL PROCESO ANTERIOR
       else{
           numerador--;
           total = total - (i/n)-numerador;
           bandera = false;
       }
 
   }

   //IMPRIMIMOS EN PANTALLA EL RESULTADO DE LAS DOS OPERACIONES
   cout<<"Total: "<< total <<endl;
   getch();
}


Pero como viste anteriormente no me da el resultado que yo quiero... Podrías presentarme una solucion para el codigo porfavor? Ya no se me ocurre nada :(

Mientras

#9
En el post anterior quise decir que en vez de i-- es i++.

Si haces esto:
numerador--;
total = total - (i/n)-numerador;
la variable "numerador" va a tomar valores negativos, y luego cuando restas, se va a efectuar una suma. Esto es por ley de signos.


"(1/N-0) - (2/N-1) + (3/N-2) - (4/N-3) + (5/N-4) + N/1"

Para arreglar la fórmula fíjate que el numero que le vas restando a cada fracción es "1 menos" que el numerador. Entonces si arriba tienes "i" el número que le vas a restar sería "(i-1)".