27 febrero 2015

C++ para C# 4: Datos básicos, arrays y listas

Vamos a ver otros tipos de datos (como los números reales), el manejo básico de arrays y de listas no ordenadas

Un programa que probara todo esto en C# podría ser así:

 1: using System;
 2: using System.Collections.Generic;
 3: 
 4: class DatosArraysListas
 5: {
 6:    
 7:     public static void Main()
 8:     {
 9:         // Algunos tipos de datos simples
10:         int i = 1;
11:         short s = 2;
12:         byte b = 3;
13:         long l = 4;
14:        
15:         float f = 1.0f;
16:         double d = 2.0;
17:        
18:         bool z = true;
19:        
20:         // Lectura de reales desde teclado
21:         Console.Write("Introduce un real (simple precisión): ");
22:         float f2 = Convert.ToSingle(Console.ReadLine());
23:         Console.Write("Y uno de doble: ");
24:         double d2 = Convert.ToDouble(Console.ReadLine());
25:        
26:         // Arrays
27:         int[] a1 = new int[3];
28:         a1[0] = 200;      // Les damos valores
29:         a1[1] = 150;
30:         a1[2] = 100;
31:         Console.WriteLine("a1 contiene: ");
32:         foreach (int n in a1)
33:             Console.WriteLine(n);
34:        
35:         int[] a2 = { 50, 30, 10};
36:         Console.WriteLine("a2 contiene: ");
37:         for (int j=0; j<a2.Length; j++)
38:             Console.WriteLine(a2[j]);
39:        
40:         int[,] a3 ={
41:             { 10, 20, 30},
42:             { 11, 21, 31}
43:         };
44:        
45:         Console.WriteLine("El primer dato de la segunda fila de a3 es "+
46:             a3[1,0]);
47:          
48:         // Lista de varios datos
49:         List<string> datos = new List<string>();
50:         datos.Add("Hola");
51:         datos.Insert(0,"Como estas?");
52:         datos.Add("Adios");
53:         datos.RemoveAt(1);
54:         Console.WriteLine("La lista contiene: ");
55:         foreach (string dato in datos)
56:             Console.WriteLine(dato);
57: 
58:    }
59: }

En C++ los cambios son:

  • Ya sabemos usar "cin" para entrada y "cout" para salida.
  • En general, los tipos de datos básicos se llaman igual en C++ que en C#.
  • En los arrays, los corchetes se ponen después del nombre de la variable y no se usa "new" para reservarles espacio: int a[2];
  • No hay una forma directa de saber el tamaño (cantidad de elementos) de un array: deberemos memorizarlo en una variable o constante, o bien calcular los bytes que ocupa toda la estructura y dividirlo entre los bytes que ocupa cada dato: (sizeof(a)/sizeof(*a))
  • Los arrays bidimensionales se separan con corchetes, no con comas: "int b[5][3];"  Si vamos a especificar los valores, aun así habrá que indicar el tamaño de todas las partes (excepto, como mucho, la primera): "int b[][3] = { ... } "
  • Las estructuras dinámicas en general son más incómodas de manejar en C++: El equivalente a una "List" de C# es un "vector". Se añade un elemento al final con "push_back", se podrían quitar del final con "pop_back", se inserta en una posición específica con "insert" y se borra con "erase". En estas operaciones, la posición se deberá indicar usando iteradores, a partir de "miVector.begin()". No existe "foreach", así que habrá que recorrer el vector con un "for" (el tamaño se obtiene con ".size()") o con un iterador. La clase "vector" internamente usa un array, de modo que se puede acceder con [] y este acceso es muy rápido, pero a cambio las operaciones "insert" son costosas porque hay que copiar todo el array. Como alternativa, también existe una clase "list", que se usaría de manera muy similar pero que no permite el acceso con [], sino que hay que recorrer de forma secuencial empleando iteradores. 

El resultado sería:

 1: #include <iostream>
 2: #include <vector>
 3: using namespace std;
 4:  
 5: int main () 
 6: {
 7:     // Algunos tipos de datos simples
 8:     int i = 1;
 9:     short s = 2;
10:     char b = 3;
11:     long l = 4;
12:    
13:     float f = 1.0f;
14:     double d = 2.0;
15:    
16:     bool z = true;
17:    
18:     // Lectura de reales desde teclado
19:     cout << "Introduce un real (simple precisión): ";
20:     float f2;
21:     cin >> f2;
22:     cout << "Y uno de doble: ";
23:     double d2;
24:     cin >> d2;
25:    
26:     // Arrays
27:     int a1[3];
28:     a1[0] = 200;      // Les damos valores
29:     a1[1] = 150;
30:     a1[2] = 100;
31:     cout << "a1 contiene: " << endl;
32:     for (int j=0; j<3; j++)
33:         cout << a1[j] << endl;
34:    
35:     int a2[] = { 50, 30, 10};
36:     cout << "a2 contiene: " << endl;
37:     int tamanyo = (sizeof(a2)/sizeof(*a2));
38:     for (int j=0; j<tamanyo; j++)
39:         cout << a2[j] << endl;
40:    
41:     int a3[][3] ={
42:         { 10, 20, 30},
43:         { 11, 21, 31}
44:     };
45:    
46:     cout << "El primer dato de la segunda fila de a3 es " << 
47:         a3[1][0]  << endl;
48:      
49:     // Lista de varios datos
50:     vector<string> datos;
51:     vector<string>::iterator iterad;    
52:     datos.push_back("Hola");
53:     datos.insert(datos.begin(),"Como estas?");
54:     datos.push_back("Adios");
55:     iterad=datos.begin();
56:     iterad++;
57:     datos.erase(iterad);
58:     cout << "La lista contiene: " << endl;
59:     for (unsigned j=0; j<datos.size(); j++)
60:         cout << datos[j] << endl;
61:     cout << "O con iteradores: " << endl;
62:     
63:     for (iterad=datos.begin(); iterad<datos.end(); iterad++)
64:         cout << *iterad << endl;
65: }

Dentro de poco, acceso a ficheros en C++...