★ Curso de C++ ★

Topic created · 4 Mensajes · 1475 Visitas
  • Bueno, me han pedido que deje ya C y empiece directamente con C++. He decidido hacer caso, a ver si así lo sigue más gente. Ahora mismo no tengo micro (se me ha roto), pero en cuanto pueda me compro uno y el curso lo haré con videotutoriales (que también me lo habéis pedido). A diferencia del curso de C, este no empieza desde 0, va dirigido a aquellos que ya sepan programar a un nivel básico (con haber seguido el curso de C hasta los bucles o así es suficiente).

    No voy a hacer nuevos hilos de dudas y ejercicios, os responderé en los mismos:
    --> Hilo de dudas

  • Post #2

    Ya sé que se os hace más pesado leer que ver un videotutorial, y lo tengo en cuenta, pero sigo sin micro.

    Bien, vamos a ver más cosas nuevas que tiene C++. Para empezar, ahora podemos crear variables dentro de un bucle for. Antes primero teníamos que poner "int i;" para poder usarla dentro del for. Ahora podemas hacerlo directamente dentro del for. Sin embargo, como la variable se crea dentro del for, al salir de él desaparece. Vamos a ver un ejemplo:

    Crea un programa que pida al usuario un número, y cuente desde el 0 hasta ese número.

    #include 
    using namespace std;
    
    int main() {
        int numero;
        cin >> numero;
        for(/*Creamos la variable i dentro del bulce for*/int i = 0; i
  • Post #3

    Bueno, perdón a todos por el retraso, aquí viene una nueva entrega. Me compré otro micro pero se me fastidió antes de poder grabar el vídeo y se oye MUY flojo, así que este también será escrito.

    Antes de seguir me gustaría explicar bien qué es una estructura, porque parece que cuesta entenderlo. Cuando antes hacíamos:

    struct mi_estructura {
        int num1;
        int num2;
        char array[20];
    };
    

    NO estábamos creando ninguna variable (en este caso mi_estructura NO es una variable), sino un tipo de datos. Eso significa que a partir de ahora podemos hacer variables en vez de de tipo "int" o "float", de tipo mi_estructura. Cada una de esas variables de tipo mi_estructura tendrá dos números enteros (num1 y num2) y un array de 20 caracteres (array). En cierto modo se podría decir que mi_estructura es como una "plantilla" para hacer muchas variables que tengan determinados "campos". Espero que esto quede claro, porque las clases son muy parecidas a las estructuras. Otra forma de verlo es la siguiente: si los arrays eran conjuntos de variables que se diferenciaban entre sí por posición (0, 1, 2...), las estructuras con conjuntos de variables que se diferencian entre sí por nombre (num1, num2, array...).

    Ahora sí, empecemos con las clases. Esta es la diferencia más grande entre C y C++: que C++ es un lenguaje orientado a objetos y por tanto podemos crear clases, en C no. Una clase es algo muy parecido a una estructura, también es una especie de "plantilla" para luego crear variables de ese tipo. Sin embargo, tiene algunas mejoras, por ejemplo podemos restringir a qué campos se puede acceder y a qué campos no. Vamos a verlo con más detalle. Creemos una clase de tipo "aula" con un campo numero_de_alumnos y otro campo nombre_del_profesor.

    class aula {
        int numero_de_alumnos;
        char nombre_del_profesor[40];
    };
    

    Como veis es muy parecido. Este código se pondría encima de main para usarlo después. Primero la palabra clave "class", para indicar que estamos "declarando" una clase. Después el nombre de la clase. En este caso, aula. A continuación una llave de apertura, seguida de todos los campos, cada uno terminado en ";". Y por último, una llave de cierre y otro punto y coma. A partir de ahora podemos crear variables de tipo "aula". Sin embargo, todas las variabes cuyo tipo sea una clase se llaman objetos. Es decir, que si hacemos ahora por ejemplo una variable:

    aula primero_A;
    

    "primero_A" será un objeto. Esto es muy importante y a partir de ahora a las variables cuyo tipo sea una clase siempre las llamaré objetos. Ahora sin embargo, si intentamos acceder al campo número de alumnos del objeto primero_A, de esta forma, nos dará error:

    primero_A.numero_de_alumnos = 26;
    

    A mi el error que me da es este: "error: 'int aula::numero_de_alumnos' is private". Bien, esto es algo complicado. En las clases, podemos restringir desde dónde se pueden usar los campos de la clase y desde donde no se puede. Por defecto, todos los campos son privados a no ser que se indique lo contrario, es decir, que solo se puede acceder a esos campos desde dentro de la clase. Es decir, si tenemos alguna función que pertenezca a la clase, esa función podrá acceder a esos campos, sin embargo fuera de la clase no se pueden usar. Para hacer que se pueda acceder a los campos desde cualquier sitio, tenemos que poner en la clase la palabra clave "public" seguida del signo dos puntos (:). A partir de ahí, y hasta que no se indique lo contrario, todos los campos de la clase son privados. Por ejemplo, vamos a hacer que se pueda acceder al campo número de alumnos desde fuera de la clase, pero al campo "nombre_del_profesor" no:

    #include 
    using namespace std;
    
    class aula {
        char nombre_del_profesor[40];//como no se ha indicado lo contrario, este campo es privado por defecto
    public://ya hemos indicado que los campos que declaremos aquí debajo serán públicos (pero los de encima no)
        int numero_de_alumnos;
    };
    
    int main() {
        aula primero_A;//creamos un objeto (primero_A) de tipo aula
        primero_A.numero_de_alumnos = 26;//no da ningún error
        cout << primero_A.numero_de_alumnos << endl;//tampoco da error aquí
        return 0;
    }
    

    Supongamos que queremos hacer un campo que sea privado, pero no queremos ponerlo encima de los públicos. ¿Adivináis que palabra clave hay que poner? Exacto, "private" seguido de dos puntos (:). Tiene sentido, ¿no?
    Aunque todavía no lo vamos a ver, hay otra palabra clave: protected.

    Ahora estoy falto de inspiración, más tarde editaré y pondré ejercicios. PREGUNTAD todas las dudas que tengáis, es importante entenderlo todo bien!!

  • Post #4

    Strings en C++

    Bueno, creo que esto urgía más por lo del concurso, que seguir con las clases, así que voy a explicar ahora cómo se trabaja con strings en C++. Antes de nada como siempre os recuerdo que podéis trabajar con las strings de C incluyendo la librería . Sin embargo las strings en C++ son mucho más cómodas de usar porque no son arrays de caracteres, sino que son objetos, que facilita mucho las cosas. En C++ existe una clase llamada string, que está en la librería . Si creamos objetos de esa clase tendremos cadenas de caracteres donde guardar palabras, textos o lo que queramos. vamos a ver un ejemplo, donde creamos una cadena, guardamos en ella una frase y la mostramos con cout:

    #include  //para usar cin y cout
    #include  //para usar la clase string de C++, no confundir con 
    using namespace std;
    
    int main() {
        string frase; //también podíamos haber puesto directamente string frase = "Hola mundo!";
        frase = "Hola mundo!";
        cout << frase << endl; //mostramos Hola mundo! y un salto de línea
    }
    

    Además, las strings de C++ tienen algunas propiedades que no tenían los arrays de caracteres en 😄

    • Podemos copiar el contenido de una string A a otra string B sin necesidad de usar strcpy(), simplemente poniendo esto: "B = A;".
    • Podemos comparar el contenido de dos cadenas, A y B sin necesidad de usar strcmp(), simplemente poniendo "A == B" dentro de un bucle, un if o lo que queramos.
    • Si queremos concatenar dos cadenas (añadir una al final de la otra) podemos hacerlo sin necesidad de usar strcat(), simplemente usando += como haríamos con un entero. Por ejemplo supongamos que queremos añadir el contenido de una string A a otra string B, pues se haría así: "B += A;". Sirve también con caracteres sueltos entre comillas simples ('a','x','B') o con cadenas entre comillas dobles("hola","Hawkings","C++"). Es decir, que podemos hacer A += "ABC"; y ABC se añadirá al final de A, sin dejar ningún espacio por enmedio.
    • Podemos conocer la longitud de una cadena A sin necesidad de usar strlen(), simplemente llamando a su función length() (vale, esto es casi lo mismo, pero no intentéis usar strlen() con una string de C++). Si lo preferimos también podemos usar size(). Ambas hacen lo mismo. Por ejemplo para crear un entero num cuyo valor sea la longitud de A simplemente ponemos "int num = A.length()" o bien "int num = A.size()". Yo suelo usar length(), porque es como se llama el método en java, pero size() hace exactamente lo mismo.
    • Podemos leer una línea entera de la entrada (cin) o de cualqueir sitio sin miedo a salirnos del array, porque esto no es un array. Para ello en vez de gets usaremos getline(), que está en la librería string. Más adelante explico su uso.
    • Si queremos leer de cin con >> una cadena podemos, pero parará de leer en cuanto se encuentre un espacio en blanco a no ser que configuremos cin de otra manera (que aún no sabemos).
    • Podemos mostrar una cadena tranquilamente con "cout <
      Otra cosa importante es que podemos acceder al carácter que esté en la posición N de la cadena con corchetes como si fuera un array, por ejemplo, si A = "¡ola!", después de hacer "A[0] = 'H';" A valdría "Hola!".

    Ahora vamos a aprender a usar getline(). Es una función que recibe dos argumentos, el primero, de dónde va a leer la cadena (normalmente de cin) y el segundo es en qué cadena los va a guardar. Y ya está. Vamos a ver un ejemplo grande con strings en C++:

    #include  //para usar cin y cout
    #include  //para usar la clase string de C++, no confundir con 
    using namespace std;
    
    int main() {
        string cad1, cad2;
        cad1 = "abc";
        cad2 = cad1; //ahora tanto cad1 como cad2 valen "abc"
        cad2 = "Abc"; //ahora cad2 vale "Abc" pero cad1 sigue valiendo "abc"
        if(cad1 != cad2) { //si cad1 es diferente de cad2...
            cout << cad1 << " es diferente de " << cad2 << endl; //esto muestra:
            //abc es diferente de Abc
        }
        cad1 = "Abc";
        if(cad1 == cad2) { //si cad1 es igual a cad2
            //ahora sí entrarán aquí porque ambas valen Abc
            cout << cad1 << " es igual a " << cad2 << endl;
        }
        cad1 += cad2; //ahora cad1 vale "AbcAbc"
        /*
        Ahora vamos a leer datos de la entrada estándar (cin)
        */
        cin >> cad1; //si el usuario introduce "hola que tal?" solo se guardará "hola" (hasta
        //el primer espacio en blanco)
        getline(cin, cad2); //sin embargo aquí se guardaría "hola que tal?" todo entero
        //mi recomendacion es leer las cadenas siempre con getline. Y tened cuidado si antes habíais leido con cin >>
        //porque os puede dar problemas con getline. Ambos no se llevan bien, pero para arrelgarlo solo tenees que poner
        //el getline dos veces seguidas.
        /*
        Ahora vamos a mostrar cad2 letra por letra, para ver cómo se opera con caracteres
        sueltos de una cadena
        */
        for(int i = 0; i < cad2.length(); i++) {//esta línea nos dará un warning, si queremos evitar que
            //salga el warning solo tenemos que poner esto en lugar de la linea anterior
            // for(unsigned int i = 0; i < cad2.length(); i++) {
            //y a está. Sin embargo a pesar del warning no debería haber ningún problema en ponerlo así
    
            cout << cad2[i]; //mostramos carácter a carácter la cadena
        }
        return 0;
    }
    
    Creo que no me dejo nada importante excepto los iteradores, que ya los veremos más adelante. Ahora procedo a postear el concurso propuesto por Lunnaris, creo que con eso ya tenéis suficiente para practicar xD.[/i]