25 noviembre 2014

C++ para C# 2: Condiciones y bucles

Ahora vamos a ver una serie de cosas que sí se parecen mucho en C# y C++: la comprobación de condiciones y las estructuras repetitivas. Vamos a ver un único fuente en C# que use la mayoría de estas estructuras, junto con variables de tipo "int" y "char", y luego miraremos los (pocos) cambios al convertirlo a C++.

using System;
 
class CondicionesBucles
{
 
    public static void Main()
    {
        int num1=5, num2=-3;
 
        if (( num1 > 0) && (num2 > 0))
            Console.WriteLine ("Los dos numeros son positivos");
        else if (( num1 > 0) || (num2 > 0))
            Console.WriteLine ("Uno es positivo");
        else
            Console.WriteLine ("Ninguno es positivo");
 
        // ----------------
 
        char letter = 'e';
 
        switch(letter)
        {
            case 'A':
                    Console.Write("A Mayusc");
                    goto case 'a';
            case 'E':
            case 'I':
            case 'O':
            case 'U':
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                    Console.WriteLine("Es una vocal");
                    break;
            case '.':
                    Console.WriteLine("Es un punto");
                    break;
            default:
                    Console.WriteLine("No es vocal ni punto");
                    break;
        }
 
        // ----------------
        int a=3, b=-5;
        int cantidadDePositivos =
             (a>0) && (b>0)  ? 2
                :  (a>0) || (b>0)  ? 1 : 0;
        Console.WriteLine("Positivos: {0}",
            cantidadDePositivos);
 
        // ----------------
        int first = 5;
        int last = 12;
        int i;
 
        // --- for ---
        for (i = first; i <= last; i++)  {
            Console.Write("{0} ",i);   
 
        }
        Console.WriteLine();
 
        // --- while ---
        i = first;
        while ( i <= last)  {
            Console.Write("{0} ",i);   
            i++;
        }
        Console.WriteLine();
 
        // --- do...while ---
        i = first;
        do  {
            Console.Write("{0} ",i);   
            i++;
        }
        while ( i <= last);
        Console.WriteLine();
 
   }
}


En C++ sería muy similar:


// Condiciones y bucles
#include <iostream>
using namespace std;
 
int main () 
{
    int num1=5, num2=-3;
 
    if (( num1 > 0) && (num2 > 0))
        cout << "Los dos numeros son positivos" << endl;
    else if (( num1 > 0) || (num2 > 0))
        cout << "Uno es positivo" << endl;
    else
        cout << "Ninguno es positivo" << endl;
 
    // ----------------
 
    char letter = 'e';
 
    switch(letter)
    {
        case 'A':
                cout << "A Mayusc" << endl;
        case 'E':
        case 'I':
        case 'O':
        case 'U':
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
                cout << "Es una vocal" << endl;
                break;
        case '.':
                cout << "Es un punto" << endl;
                break;
        default:
                cout << "No es vocal ni punto" << endl;
                break;
    }
 
    // ----------------
    int a=3, b=-5;
    int cantidadDePositivos =
         (a>0) && (b>0)  ? 2
            :  (a>0) || (b>0)  ? 1 : 0;
    cout << "Positivos: " <<
        cantidadDePositivos << endl;
 
    // ----------------
    int first = 5;
    int last = 12;
    int i;
 
    // --- for ---
    for (i = first; i <= last; i++)  
    {
        cout <<  i << " " ; 
    }
    cout << endl;
 
    // --- while ---
    i = first;
    while ( i <= last)  
    {
        cout << i << " " ; 
        i++;
    }
    System.out.println();
 
    // --- do...while ---
    i = first;
    do  
    {
        cout <<  i << " "; 
        i++;
    }
    while ( i <= last);
 
    cout << endl;
 
    return 0;
}


Los parecidos son:


  • El tipo de datos "int" representa un número entero, igual que en C#, y se le pueden dar valores en el momento de declarar o después. El manejo del tipo "char" también es igual que en C#.
  • Las condiciones se pueden comprobar con "if" (sencillas), "switch" (múltiples) y con el operador condicional (abreviadas).
  • Podemos repetir bloques de programa usando "for", "while" y "do-while", de igual manera que en C#.


Las diferencias (porque apenas hay dos que no nos hayamos encontrado antes):


  • Cuando un "case" de la orden "switch" delega en otro distinto, en C++ no hace falta indicar "goto case": si no hay un "break" al final, el control pasa automáticamente al siguiente caso (lo que puede dar lugar a errores difíciles de descubrir en caso de que "olvidemos" algún "break").
  • Si queremos escribir varias cosas en pantalla usando una misma orden, no se usa {0}, {1} y sucesivos, sino que separamos los distintos elementos con "<<".


¿Y ahora qué? En la siguiente sesión hablaremos de las cadenas de texto y de cómo leer desde teclado, para pasar después a hablar de arrays y structs, y más adelante a funciones. (También puedes leer la toma de contacto).

24 noviembre 2014

C++ para C# 1: Hola, Mundo

¿Por qué C++ para C#?


Porque C# me parece más razonable para comenzar a programar que C++, porque C# tiene una curva de aprendizaje más progresiva, pero permite adquirir buenos fundamentos. Eso no quita que algunos estudiantes que se hayan formando en C# deban trabajar con C++ más adelante, durante su vida laboral. Este texto pretende ayudarles.

¿Cómo cambia un "Hola, Mundo" de C# a C++?


Escribir un texto en pantalla es el primer ejercicio que se suele realizar en casi cualquier lenguaje de programación, cuando uno está comenzando a aprender. En C# se haría con


class HolaMundo {
    public static void Main()  {
        System.Console.WriteLine("Hola, Mundo");
    }
}


y el equivalente en C++ es


#include <iostream>
int main () 
{
    std::cout << "Hola, mundo" << std::endl;
    return 0;
}

Las diferencias son:


  • Como vamos a usar órdenes de entrada (desde teclado) y salida (por pantalla), deberemos incluir "iostream", y de eso se encarga la orden "#include <iostream>"
  • El cuerpo del programa se llamará "main", en minúsculas.
  • Para escribir el texto en pantalla se usa "std::cout", y los datos que queremos escribir se indican separados por símbolos de "<<". El simbolo especial "std::endl" representa un avance de línea.
  • El programa terminará con "return 0;", para indicar que todo ha funcionado correctamente.



Si no queremos tener que escribir "std::" antes de cada orden "cout" y antes de "endl", podemos incluir la línea "using namespace std;" tras los "include", así:

#include <iostream>
using namespace std;
 
int main () 
{
    cout << "Hola, mundo" << endl;
    return 0;
}


¿Y para probar este programa que hemos creado en C++?


La recomendación es usar una máquina virtual de Linux, por ejemplo usando VirtualBox. Yo suelo usar Linux Mint, y en su gestor de paquetes Synaptic podemos encontrar editores avanzados como Geany, o incluso el compilador de C++ de Gnu ("g++") si es que no viene preinstalado en nuestra distribución.

Aquí tienes los detalles: nachocabanes.blogspot.com.es/2013/10/compilar-c-en-linux-con-geany.html

Si prefieres compilar desde Windows (aunque me parece menos razonable), también puedes ver cómo usar CodeLite o Visual C++.

Dentro hablaremos de variables, condiciones y bucles... Si hay dudas, usa los comentarios del blog o acude al foro de C++ de AprendeAProgramar:

http://www.aprendeaprogramar.com/mod/forum/view.php?id=337