[C con Clase] Problemas con arrays

Davidson, Steven srd4121 en njit.edu
Dom Mayo 4 06:42:09 CEST 2014


Hola Giselle,

2014-05-03 22:22 GMT-04:00 Giselle <giselleskyers en gmail.com>:

> Muchísiamas gracias por la ayuda y la explicación. En efecto el problema
> radicaba en que no había hecho el segundo bucle for para recorrer el array
> y mostrar los resultados. Ahora funciona perfectamente.
>
> Sin embargo me ha quedado una duda sobre el uso del break. yo escribí algo
> así en el bucle for, quisiera por favor que me explicaran si es un buen uso
> o no del break y cuando es una buena opción usarlo.
>
>    for(contador=0; contador<20; contador++)
> {
> cout<<"Ingrese un salario: "<<endl;
>  cin>>salario_ingresado;
>  if(salario_ingresado<0)
>  {
> break;
> }
> salarios[contador] = salario_ingresado;
>  }
>
> Agradezco mucho su ayuda, pues si bien estoy estudiando a través de un
> libro de texto, lo cierto es que la experiencia siempre vale más que todo.
>
>
Bueno. Esto ya lo expliqué en el correo-e anterior, pero adaptaré la
explicación al código fuente que nos mandas.

En este caso, vemos que hay dos formas de salir del bucle 'for'. La forma
"natural" es por "su condición": contador < 20. El problema es que hay otra
posibilidad de salir del bucle, que no es tan aparente, porque está
contenida en el bucle. Nos interesa leer la información que controla el
bucle en su cabecera. Sin embargo, sólo vemos una condición y no las dos
que controlan el bucle.

En general, no deberíamos usar 'break', por muy fácil que sea su uso. Nos
interesa escribir un código legible, porque su mantenimiento es mucho más
fácil a largo plazo; y así seremos menos propensos a cometer errores. A
veces, por legibilidad, sí elegimos usar 'break', o incluso por razones
importantes de optimización; pero no es la norma.

Para el código anterior, nos interesa escribir ambas condiciones en la
cabecera del bucle 'for' para ver rápida y claramente cuáles son los
criterios que gobiernan el bucle. Reescribiríamos el código reordenando las
sentencias. Esto es el comportamiento que queremos,

cout << "Ingrese un salario: " << endl;
cin >> salario_ingresado;
if( salario_ingresado<0 )
{
  terminar
}
else
  salarios[0] = salario_ingresado;

cout << "Ingrese un salario: " << endl;
cin >> salario_ingresado;
if( salario_ingresado<0 )
{
  terminar
}
else
  salarios[1] = salario_ingresado;
...
cout << "Ingrese un salario: " << endl;
cin >> salario_ingresado;
if( salario_ingresado<0 )
{
  terminar
}
else
  salarios[19] = salario_ingresado;

Lo que hacemos es ver el patrón de las sentencias después de leer el
salario. También cambiamos la condición escrita: salario_ingresado<0 para
que sea falsa en el bucle 'for', para así seguir iterando; esto es,

cout << "Ingrese un salario: " << endl;
cin >> salario_ingresado;

for( contador=0; contador<19 && salario_ingresado>=0; contador++ )
{
  salarios[contador] = salario_ingresado;

  cout << "Ingrese un salario: " << endl;
  cin >> salario_ingresado;
}

// Caso especial: contador = 19
if( 19 == contador && salario_ingresado>=0 )
salarios[19] = salario_ingresado;


Aparte del uso de 'break' en bucles, se considera buena práctica usar
'break' para salir de cualquier caso en una sentencia 'switch/case'; por
ejemplo,

int eleccion;

cin >> eleccion;

switch( eleccion )
{
  case 0:
    cout << "elegiste 0" << endl;
  break;

  case 1:
    cout << "elegiste 1" << endl;
  break;

  case 2:
    cout << "elegiste 2" << endl;
  break;
}

Sin el uso de 'break', este uso de 'switch/case' sería algo complicado e
ilegible, dificultando el mantenimiento del código.


Espero que esto aclare un poco más el tema.

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


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