[C con Clase] Primer programa problema 10.1

Davidson, Steven srd4121 en njit.edu
Mar Mayo 5 23:03:04 CEST 2015


Hola Alejandro,

2015-05-04 16:54 GMT-04:00 Alejandro D. <druikeltoi en gmail.com>:

> Hola, este es mi primer programa en C++ y me aparecen un par de dudas.
>
>
Genial. Veamos las dudas.

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?
>

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:

10 -23 4 19 2[ENTER]

el búfer del teclado contendrá la cadena,

"10 -23 4 19 2\n"

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:
10[ENTER]
-23[ENTER]
4[ENTER]
19[ENTER]
2[ENTER]

2.El valor medio lo he sacado también con decimales. Hay alguna forma mejor
> para pasar entero a float?
>
>
El compilador puede hacer esto implícitamente. Si necesitas hacer esto
explícitamente, por ahora, usa el "cásting"; por ejemplo,

int n = 10;
float f = (float) n;


Vamos a ver el programa. Te voy comentando a medida que vaya viendo el
código fuente.


> PROGRAMA
>
> #include <iostream>
> using namespace std;
>
> int main()
> {
>    int vector[10];                      //Matriz de 10 enteros
>

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,

const int TAM_VECTOR = 10;

int main()
{
  int vector[TAM_VECTOR];
  ...
}

Podríamos cambiar el valor de 'TAM_VECTOR' de 10 á 100, por ejemplo, y el
resto del programa funcionaría debidamente.

   int i;                               //Valor auxiliar para bucles
>    int suma, Vmedio, mayor, menor;      //Variables para resultados
>    float SumaFloat, VmedioFloat;
>
>    cout <<"Introduce 10 numeros enteros separados por espacios"<< endl;
>    cin >> vector[0] >> vector[1] >> vector[2] >> vector[3] >> vector[4]
>        >> vector[5] >> vector[6] >> vector[7] >> vector[8] >> vector[9] ;
>
>
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.

//Muestra la matriz introducida
>    cout <<"La matriz introducida es:"<< endl;
>    for (i=0; i<=9; i++)
>

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,

for( i=0; i<TAM_VECTOR; i++ )

   cout << vector[i] << " ";
>    cout << endl;
>
> //Muestra la suma de los valores
>    cout <<"La suma de valores de la matriz es:"<< endl;
>    suma=0;
>    for (i=0; i<=9; i++)
>    suma=suma+vector[i];
>

Intenta acostumbrarte a usar los operadores de "operación y asignación". En
este caso, usa +=,

suma += vector[i];

   cout << suma << endl;
>
> //Muestra el valor medio
>    cout <<"El valor medio de los valores es:"<< endl;
>
>    Vmedio = suma/10;
>    SumaFloat=suma;  //Para convertir INT en FLOAT
>    VmedioFloat=SumaFloat/10.0;
>
>
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,

VmedioFloat = suma / (float) TAM_VECTOR;

   cout << Vmedio << endl;
>    cout << VmedioFloat << endl;
>
> //Muestra el mayor y el menor valor
>      mayor=vector[0], menor=vector[0];
>

Puedes hacer las dos asignaciones en una sola sentencia; esto es,

mayor = menor = vector[0];

     for (i=1; i<=9; i++){
>           if (vector[i] > mayor) mayor = vector[i];
>
>           if (vector[i] < menor) menor = vector[i];
>

Esto es correcto, pero sería mejor usar 'else' para representar la relación
de "exclusividad mutua"; el esquema sería,

if( ... )  {...}
else if( ... )  {...}

        }
>      cout <<"El mayor de los valores es:"<< endl;
>      cout << mayor << endl;
>      cout <<"El menor de los valores es:"<< endl;
>      cout << menor << endl;
>
>    return 0;
> }
>
>
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.


Epero que esto aclare las dudas y te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150505/62f92a0a/attachment.html>


Más información sobre la lista de distribución Cconclase