<div dir="ltr">Hola Alejandro,<br><div class="gmail_extra"><br><div class="gmail_quote">2015-05-04 16:54 GMT-04:00 Alejandro D. <span dir="ltr"><<a href="mailto:druikeltoi@gmail.com" target="_blank">druikeltoi@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hola, este es mi primer programa en C++ y me aparecen un par de dudas.<br>
<br></blockquote><div><br></div><div>Genial. Veamos las dudas.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
1.Cuando meto los valores separados por espacios me deja meter mas de 10 valores y solo cuando aprieto "enter" se ejecuta el resto de programa cogiendo los 10 primeros valores. Sin embargo, si voy introduciendo un número y apretando "enter" cada vez cuando tengo 10 se ejecuta el resto del programa ¿Por qué ocurre esto?<br></blockquote><div><br></div><div>Ten presente que 'cin >>' no lee caracteres directamente desde el teclado; ni otras funciones estándares de lectura. La lectura se realiza en un búfer o "array" de caracteres tomado del teclado. Por ejemplo, si el usuario escribe:<br><br>10 -23 4 19 2[ENTER]</div><div><br></div><div>el búfer del teclado contendrá la cadena,</div><div><br></div><div>"10 -23 4 19 2\n"</div><div><br></div><div>La lectura, a través de 'cin >>', leerá los caracteres según la interpretación dada. En tu caso, leerá tantos caracteres intentando aplicar la representación de un entero. Ocurre el mismo comportamiento si el usuario introduce la siguiente secuencia de caracteres:<br>10[ENTER]</div><div>-23[ENTER]<br></div><div>4[ENTER]<br></div><div>19[ENTER]<br></div><div>2[ENTER]<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
2.El valor medio lo he sacado también con decimales. Hay alguna forma mejor para pasar entero a float?<br>
<br></blockquote><div><br></div><div>El compilador puede hacer esto implícitamente. Si necesitas hacer esto explícitamente, por ahora, usa el "cásting"; por ejemplo,</div><div><br></div><div>int n = 10;<br>float f = (float) n;<br></div><div><br></div><div><br></div><div>Vamos a ver el programa. Te voy comentando a medida que vaya viendo el código fuente.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
PROGRAMA<br>
<br>
#include <iostream><br>
using namespace std;<br>
<br>
int main()<br>
{<br>
   int vector[10];                      //Matriz de 10 enteros<br></blockquote><div><br></div><div>Esto está bien, pero aconsejo definir constantes para representar conceptos importantes. Así podemos usar estas constantes en el resto del programa para crear un código fuente más legible y además crearemos algoritmos más generales que son más fácilmente configurables (o programables) si necesitas realizar cambios durante el diseño. Por ejemplo,</div><div><br></div><div>const int TAM_VECTOR = 10;</div><div><br></div><div>int main()<br>{<br>  int vector[TAM_VECTOR];<br>  ...</div><div>}</div><div><br></div><div>Podríamos cambiar el valor de 'TAM_VECTOR' de 10 á 100, por ejemplo, y el resto del programa funcionaría debidamente.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   int i;                               //Valor auxiliar para bucles<br>
   int suma, Vmedio, mayor, menor;      //Variables para resultados<br>
   float SumaFloat, VmedioFloat;<br>
<br>
   cout <<"Introduce 10 numeros enteros separados por espacios"<< endl;<br>
   cin >> vector[0] >> vector[1] >> vector[2] >> vector[3] >> vector[4]<br>
       >> vector[5] >> vector[6] >> vector[7] >> vector[8] >> vector[9] ;<br>
<br></blockquote><div><br></div><div>Aunque esto realiza la tarea imputada del enunciado, típicamente no es la mejor forma de solucionar el problema. Si en lugar de 10 involucraría 10000 elementos, sería MUY engorroso tener que escribir explícitamente 10000 accesos y lecturas. Además, es más optimizado escribir un solo acceso y una sola lectura en un bucle que realizar cada par de sentencias explícitamente.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
//Muestra la matriz introducida<br>
   cout <<"La matriz introducida es:"<< endl;<br>
   for (i=0; i<=9; i++)<br></blockquote><div><br></div><div>Aconsejo reescribir la condición para basarla en la cantidad de 10 y no en 9; o en nuestro caso, usa 'TAM_VECTOR'. Esto es,</div><div><br></div><div>for( i=0; i<TAM_VECTOR; i++ )</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   cout << vector[i] << " ";<br>
   cout << endl;<br>
<br>
//Muestra la suma de los valores<br>
   cout <<"La suma de valores de la matriz es:"<< endl;<br>
   suma=0;<br>
   for (i=0; i<=9; i++)<br>
   suma=suma+vector[i];<br></blockquote><div><br></div><div>Intenta acostumbrarte a usar los operadores de "operación y asignación". En este caso, usa +=,</div><div><br></div><div>suma += vector[i];</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   cout << suma << endl;<br>
<br>
//Muestra el valor medio<br>
   cout <<"El valor medio de los valores es:"<< endl;<br>
<br>
   Vmedio = suma/10;<br>
   SumaFloat=suma;  //Para convertir INT en FLOAT<br>
   VmedioFloat=SumaFloat/10.0;<br>
<br></blockquote><div><br></div><div>No es necesario crear otra variable de tipo 'float' para guardar la conversión; simplemente realiza todas las operaciones en una sola expresión. Por ejemplo,</div><div><br></div><div>VmedioFloat = suma / (float) TAM_VECTOR;</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
   cout << Vmedio << endl;<br>
   cout << VmedioFloat << endl;<br>
<br>
//Muestra el mayor y el menor valor<br>
     mayor=vector[0], menor=vector[0];<br></blockquote><div><br></div><div>Puedes hacer las dos asignaciones en una sola sentencia; esto es,</div><div><br></div><div>mayor = menor = vector[0];</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
     for (i=1; i<=9; i++){<br>
          if (vector[i] > mayor) mayor = vector[i];<br>
<br>
          if (vector[i] < menor) menor = vector[i];<br></blockquote><div><br></div><div>Esto es correcto, pero sería mejor usar 'else' para representar la relación de "exclusividad mutua"; el esquema sería,</div><div><br></div><div>if( ... )  {...}</div><div>else if( ... )  {...}<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
        }<br>
     cout <<"El mayor de los valores es:"<< endl;<br>
     cout << mayor << endl;<br>
     cout <<"El menor de los valores es:"<< endl;<br>
     cout << menor << endl;<br>
<br>
   return 0;<br>
}<br><br></blockquote><div><br></div><div>Como un ejercicio añadido, podrías diseñar el programa para que use un solo bucle 'for' y no los cuatro que involucraría cada tarea requerida.</div><div><br></div><div><br></div><div>Epero que esto aclare las dudas y te oriente.</div><div><br></div></div>Steven</div><div class="gmail_extra"><br></div></div>