Ayuda con ejercicio de bucles.

Iniciado por eveelynn24, 7 Noviembre 2014, 19:33 PM

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

eveelynn24

¿Podríais ayudarme con este ejercicio de bucles? Tengo exámen el lunes y está siendo un quebradero de cabeza ya que todos los ejercicios que hago tienen algún problema. Os dejo el ejercicio y mi código. Os estaré eternamente agradecida si me ayudáis a corregirlo correctamente. Gracias.


Un satélite meteorológico envía diariamente a la tierra una serie de datos indicando la temperatura (0-100) y la humedad (0-100) medidas en distintas zonas del planeta donde cada zona del planeta se representa mediante una letra del alfabeto (A..Z) (sólo mayúsculas). Diseñar un programa que lea desde el teclado una serie de t-uplas compuestas por <zona, temperatura, humedad> y diga cuál es la zona del planeta que tiene la temperatura más alta y la humedad más baja. La serie de datos termina cuando la zona coincide con el carácter '@'.

Por ejemplo, ante una secuencia como:

A 30 10
B 40 70
C 20 20
D 40 80
E 25 70
F 38 10
G 40 30
H 20 33
I 28 56
J 40 10
K 20 10
@

La salida es:

ZONA: J
TEMPERATURA: 40
HUMEDAD: 10



#include <iostream>
using namespace std;

int main ()

{
char zona1, zona2;
int temp1, temp2, hum1, hum2;

do {
cout << "\nIntroduce la zona (Mayúsculas): ";
cin >> zona1;
}
while (((zona1<'A') || (zona1>'Z'))&& zona1!='@');

do {
cout << "\nIntroduce la temperatura (entre 0 y 100): ";
cin >> temp1;
}
while ((temp1<0) || (temp1>100));

do {
cout << "\nIntroduce la humedad (entre 0 y 100): ";
cin >> hum1;
}
while ((hum1<0) || (hum1>100));


while ( (zona1!='@') || (zona2!='@'))
{
do {
cout << "\nIntroduce otra zona (Mayúsculas): ";
cin >> zona2;
}
while (((zona2<'A') || (zona2>'Z'))&& zona2!='@');

do {
cout << "\nIntroduce la temperatura (entre 0 y 100): ";
cin >> temp2;
}
while ((temp2<0) || (temp2>100));

do {
cout << "\nIntroduce la humedad (entre 0 y 100): ";
cin >> hum2;
}
while ((hum2<0) || (hum2>100));

if (temp1<temp2)
{
temp1 = temp2;
hum1 = hum2;
zona1 = zona2;
}
else if (temp1 == temp2)
{
if (hum1>hum2)
{
hum1 = hum2;
zona1 = zona2;
}
}
}
cout << "\n\nZona: " << zona1 << "\nTemperatura: " << temp1 << "\nHumedad: " << hum1;

system ("pause");
}


lluvplay

Buenas tardes Sr. eveelynn24.

Tengo una observación sobre su codificación y es la siguiente. He logrado comprobar que cuando la variable zona2 = @ no sale del while es por eso que he añadido la siguiente parte de código:

Citar
  //SOLUCION
if (zona2 == '@')
   break;

Estas 2 lineas logran ver que su programa esta correctamente y realiza el trabajo como usted lo indica en el ejemplo descrito arriba.

En conclusión seria el siguiente código:


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

int main ()

{
char zona1, zona2;
int temp1, temp2, hum1, hum2;

do {
cout << "\nIntroduce la zona (Mayúsculas): ";
cin >> zona1;
}
while (((zona1<'A') || (zona1>'Z'))&& zona1!='@');

do {
cout << "\nIntroduce la temperatura (entre 0 y 100): ";
cin >> temp1;
}
while ((temp1<0) || (temp1>100));

do {
cout << "\nIntroduce la humedad (entre 0 y 100): ";
cin >> hum1;
}
while ((hum1<0) || (hum1>100));


while ( (zona1!='@') || (zona2!='@'))
{
do {
cout << "\nIntroduce otra zona (Mayúsculas): ";
cin >> zona2;
}
while (((zona2<'A') || (zona2>'Z'))&& zona2!='@');

//SOLUCION
        if (zona2 == '@')
        break;

do {
cout << "\nIntroduce la temperatura (entre 0 y 100): ";
cin >> temp2;
}
while ((temp2<0) || (temp2>100));

do {
cout << "\nIntroduce la humedad (entre 0 y 100): ";
cin >> hum2;
}
while ((hum2<0) || (hum2>100));

if (temp1<temp2)
{
temp1 = temp2;
hum1 = hum2;
zona1 = zona2;
}
else if (temp1 == temp2)
{
if (hum1>hum2)
{
hum1 = hum2;
zona1 = zona2;
}
}

}
cout << "\n\nZona: " << zona1 << "\nTemperatura: " << temp1 << "\nHumedad: " << hum1;
getchar();
//system ("pause");
}



Si he comprendido mal el problema, podemos seguir discutiéndolo.

Cordiales Saludos.
* Determinismo Causal !! Estamos Programados Para Necesitar Respuestas!!

* No deberías copiar un código, sin antes haber comprendido porque funciona de esa manera !

plataplomo2948

#2
Hola amiga, estaba aburrido hoy y trabaje un poquito en eso. Espero ayudarla con lo siguiente (eso solo es mi opinion en como yo lo haria, puede hacer como quiera):

Es proyecto tiene 2 objectivo principales:

1. Aceptar input del teclado del "stdin" y guardar el input en una manera en que la programa puede analizarla

2. Analiza la informacion para identificar

   A. La temperatura mas alta

   B. La humedad mas baja

Con eso dicho, su codigo y instruciones tienen varias problemas. Primera, no hay "tuplas" en C ni C++. Eso es de python. Segunda, su codigo no esta analizando los temp y humedades mas bajas/altas. Tercera, no esta inicializando sus variables para guardar el input para analizar. Hay otros problemas tambien, muchos, y en mi opinion es mejor impesar de nuevo porque ese codigo no lograra los objectivo principales de su proyecto.

Aun que en es caso (windows espacio usuario) la estatica inicializacion puede funcionar - no es buen habito. Cuando inicializa un variable estatica, los bytes van en el stack, en en muchas sistemas (kernel, embedido, y mas) su tamano de stack es limitada. Por eso, yo voy a usar alocaciones dinamicas. Estoy usando malloc/free estilo C, pero si quiere hacerlo estila C++ puede poner new/delete.

Yo he hecho mas o menos 30-40% del proyecto, y no hare todo porque usted tiene que aprender a hacerlo. Ese codigo puede aceptar el input por zona y temperatura, y averiguar la temp mas baja. Aun tiene que poner la humedad, y averiguar la humedad mas alta. Suerte.

pd - Cuando acepta cualquier tipo de input, es muy muy importante a hacer un checkeo de errores para evitar buffer overflows, para que no le chingan ; )




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


int main ()
{
   
       int Conta = 0;
       // A - K
       int NumeroDeEntradas = ('L' - 'A');
       int NumeroDeElementos = (sizeof(char**) * 5);

char** Zona = (char**)malloc(NumeroDeElementos);
char** Temp  = (char**)malloc(sizeof(int**) * NumeroDeEntradas);
char** Humedad  = (char**)malloc(sizeof(int**) * NumeroDeEntradas);

for (int i = 0; i < NumeroDeEntradas; i++)
{
           Zona[i] = (char*)malloc(4);
           Temp[i] = (char*)malloc(4);
       
           printf("Introduzca la zona:\n");
       
           // despues de cada llama a scanf tiene que checkear por errores, algo asi
           // si Zona[i] > 4, libera y salga
           scanf("%[^\n]%*c", Zona[i]);
           //fgets(Zona[i], 2, stdin);
       
           //if (memcmp(Zona[i], (char*)'@', 1) == 0)
           //goto FINAL;
       
TEMPDENUEVO:        
           printf("Introduzca la temp:\n");
           scanf("%[^\n]%*c", Temp[i]);
           int VerificaTemp = atoi(Temp[i]);

           if (VerificaTemp < 0 || VerificaTemp > 100)
           {
               printf("[!] Temperatura Invalido. Introduzcala de nuevo...\n");
               goto TEMPDENUEVO;                
           }
       
           printf("Zona #%i: %s - Temp: %i\n", i, Zona[i], VerificaTemp);
       
           Conta += 1;
   }
   
FINAL:    
   
       for (int b = 0; b < Conta; b++)
           printf("temp%i = % i\n" , Conta, atoi(Temp[b]));
   
   
int LaMasBaja = atoi(Temp[0]);
for (int c = 1; c < Conta; c++)
{
           int Num = atoi(Temp[c]);
           //printf("Num = %i LaMasBaja = %i\n", Num, LaMasBaja);
           if (Num < LaMasBaja)
               LaMasBaja = Num;
       
       }
printf("la mas baja = %i\n", LaMasBaja);
/*for (int i = 0; i < 11; i++)
{
       printf("Zona: %i = %s\n", i, Zona[i]);
           
   }*/
printf("Conta = %d\n", Conta);
for (int i = 0; i < Conta; i++)
{
       printf("liberando %i...\n", i);
       free(Zona[i]);
       free(Temp[i]);    
   }
free(Zona);
free(Temp);
free(Humedad);


_getch ();
//system ("pause");
}