Monthly Archives: October 2009

Encontrar el número mayor de un conjunto

Es en realidad muy simple, se trata de pedir un conjunto de números e ir comparandalos para obtener el mayor. Un problema es que no sabemos la cantidad de números que se van a pedir, por lo que al principio del programa tenemos que pedir este valor.

#include<iostream>
using namespace std;

int main()
{
  int n_num=0,num=0,elmayor=0,c=0;
  cout <<"Introduce el numero de numeros: "; cin >> n_num;
  for(c=1;c<=n_num;c++)
  {
    cout <<"nIntroduce el numero " << c <<": "; cin >> num;
    if(num>elmayor)
    {
      elmayor=num;
    }
  }
  cout <<"ntEl numero mayor fue el " << elmayor;
  cin.get();cin.get();

  return 0;
}

Una parte importante es la estructura del ciclo:
for(c=1;c<=n_num;c++)
Significa que el ciclo va de 1 hasta ‘lo-que-nos-diga-el-usuario’.

Otra cosa es que usamos iostream y no usamos conio.h.

Advertisements

Cómo empezar a usar iostream

Programar es como pensar, cada quien lo hace diferente, y el mismo lenguaje c++ nos facilita diversas formas de hacer las mismas cosas. Por ejemplo, el programa Hola Mundo que hicimos al principio podemos hacerlo utilizando la librería <iostream> en lugar de <stdio.h>:

#include<iostream>
using namespace std;  // Esta línea es necesaria cuando
                     // utilizamos la librería iostream

int main()
{
  cout << "Hola Mundo!";  //cout es el equivalente de printf,
                         //si se fijan la sintáxis es muy parecida.
  cin.get();  // cin.get es el equivalente de getch, detiene la ejecución del programa.

  return 0;  // No es necesaria para que el programa funcione,
            // pero es una buena costumbre indicar que nuestro programa terminó
           // sin errores.
}

La sintáxis de cout es:
cout << "mensaje" ;
Mostrando una variable:
cout << "El promedio es:" << prom ;
El siguiente mensaje aparecerá en una línea nueva:
cout << "mensaje" << endl;

¿Y cómo leo datos (scanf)?

Para sustituir scanf() usamos cin, por ejemplo:
cin >> edad;
Lee los caracteres introducidos y los guarda en la variable edad.

Un programita muy simple:

#include<iostream>
using namespace std;

int main()
{
  int edad;
  cout<<"Cual es tu edad?: "; cin >> edad;
  cout<<"ntTu edad es " << edad;
  cin.get();cin.get();

  return 0;
}

En este caso necesitamos usar dos cin.get para detener el programa. Esto se debe al uso de cin.

Cómo dejar de usar conio.h

La librería <conio.h>, es propiedad de Borland y sólo sus compiladores pueden usarla. Por lo tanto significa que conio.h, no es una librería estandar.

La librería conio se utiliza más que nada por sus comandos: getch(), clrscr(), gotoxy(), textcolor(), y textbackground(), los cuales usamos para darle mejor presentación a nuestros programas. Pero pensandolo bien, ¿en verdad necesitamos que los programas en consola se vean bien? La verdad es que no, lo que importa es que funcionen.

Aún así, algunas funciones de la librería conio.h se pueden sustituir con funciones estándares, por ejemplo.

  • Para sustituir getch(), solo necesitamos: cin.get(); la cual está en <stdio.h>. Si no funciona entonces tendremos que ponerla dos veces: cin.get();cin.get();, la cuestión es algo complicada de explicar.
  • Para sustituir clrscr(), solo necesitamos escribir system(“cls”); la cual está en <iostream> (es sin .h, se definiría así: #include<iostream>).
  • Gotoxy() es algo vanal, y además se puede sustituir usando n (espacio hacia abajo) y t (espacio hacia la derecha) dentro de un printf();
  • Y la verdad es que cualquiera te agradecerá que no le pongas fondo rosa y letras amarillas a tus programas.

Como usar ciclo While en C++

Ya dijimos en el post anterior que los ciclos infinitos for son muy parecidos a los ciclos while, pero quedó en duda cómo es un ciclo while.

While” significa “mientras“, así que nuestro ciclo while se repetira mientras una cierta condición siga siendo verdadera.El ejemplo del post anterior quedaría así:

#include<stdio.h>
#include<conio.h>
 int main()
 {
  char end=0;
  while(end!='y')
  {
    gotoxy(5,5);printf("Ya quieres salir? (y/n): ");scanf("%c",&end);
    clrscr();
  }
}

En español el programa dice: “Mientras end sea diferente de y voy a seguir preguntando si quieres salir.

Mas adelante veremos más programas que utilicen ciclos while.

El break y el ciclo infinito

Ya vimos hace poco el ciclo for, y vimos que su estructura era así:

for ( inicio ; fin ; aumento )

¿Qué pasa si no ponemos ni inicio ni fin? Pues obtenemos un ciclo infinito, así:

for(;;)

¿Y cómo se detiene? Pues con un break, así:

for(;;)
{
break;
}

¿Y esto de que me sirve? Pues la idea es repetir las instrucciones hasta que el usuario quiera, es decir:

#include<stdio.h>
#include<conio.h>
int main()
{
  char end=0;
  for(;;)
  {
    gotoxy(5,5);printf("Ya quieres salir? (y/n): ");scanf("%c",&end);
    if(end=='y')
      break;
    clrscr();
  }
}

Creo que no les había mencionado que si dentro de una condición if sólo va una instrucción no es necesario poner llaves, y también aplica con los ciclos.

Si el usuario no introduce una ‘y’, el programa nunca se detendrá. Luego vamos a ver que las propiedades de un ciclo for infinito son muy parecidas a las del ciclo while que veremos más adelante.

Programa: Porcentaje de Hombres y Mujeres

Supongamos que nos preguntan qué porcentaje de hombres y qué porcentaje de mujeres hay un salón de clases. Lo primero que tenemos que hacer es preguntar el total de personas que hay, luego hacer un ciclo que en cada iteración pregunte el sexo de cada alumno. En base a esos datos se calculan los porcentajes.

El programa en c++ sería así:

#include<stdio.h>
#include<conio.h>
int main()
{
  float total=0,ciclo=0,conta_h=0,conta_m=0,porc_h=0,porc_m=0;
  char mof;
  gotoxy(5,5);printf("Cuantos alumnos hay en este grupo?: ");scanf("%f",&total);
  for(ciclo=1;ciclo<=total;ciclo++)
  {
    clrscr();
    PREG: gotoxy(10,6);printf("Sexo de alumno %.f? (M o F): ",ciclo);scanf("%c",&mof);
    if(mof=='m' || mof=='M')
      conta_h++;
    else if(mof=='f' || mof=='F')
      conta_m++;
    else
      goto PREG;
   }
  //Calculos
  porc_h=conta_h/total*100;
  porc_m=conta_m/total*100;
  //
  gotoxy(5,5);printf("El porcentaje de hombres es %.1f (%.f de %.f)",porc_h,conta_h,total);
  gotoxy(5,6);printf("El porcentaje de mujeres es %.1f (%.f de %.f)",porc_m,conta_m,total);
  getch();
}

Cómo usar goto en C++

Goto significa ir a y en c++ nos sirve para que mandar al compilador a alguna parte arbitrariamente, es decir nada más porque sí. No se suele usar mucho pero nos puede sacar de algunos apuros.

Su uso es más o menos así:

codigo codigo

  LUGAR: codigo
  mas codigo
  codigo

  goto LUGAR;

codigo

Primero tenemos que definir un marcador, en este caso yo usé LUGAR (recuerden que ‘LUGAR’ no es lo mismo que ‘lugar’) e inmediatamente después poner dos puntos (:). Cuando sea necesario escribiremos goto seguido de nuestro identificador y punto y como (;).

¿Para qué nos podría servir? Pues en el siguiente post veremos un programa que usa goto.

if else anidados en c++

Ya había escritos varios posts sobre las condiciones if else en c++, pero algo que hace falta saber es que dentro de una estructura if puede haber otra estructura if tantos veces como sea necesario. Es decir:

if ( condicion )
{
  instrucciones
  if ( condicion )
  {
    instrucciones
  }
}
else
{
  if ( condicion )
  {
    instrucciones
  }
  else
  {
    instrucciones
  }
  instrucciones
}

¿Y como para qué? Pues hay algunas situaciones que así lo requieren. Por ejemplo:

“Si un alumno tiene un promedio mayor o igual a 9 se le hara un 20% de descuento en la colegiatura, si tiene un promedio mayor o igual a 8 pero menor que 9 el descuento será del 10%, si su promedio es menor que 8 pero mayor o igual a 7 el descuento será del 5% y si promedia con 7 o menos no tendrá descuento.”

La solución de este problema en c++ sería así:

Continue reading if else anidados en c++