viernes, 25 de julio de 2014

Clase - C++: Selector de opciones

Selector de opciones


Bueno, hola a todos. Esta entrada va a estar orientada un poco más a los nuevos en la programación. Haré uso de string y vector,así que quién no los conozca en nada, puede ver una entrada pasada sobre ellos :p

Bueno, para empezar, veamos qué es lo que vamos a hacer:
Haremos una clase, donde guardaremos 2 variables:
  • Título
  • Un vector con opciones
El título, será el título del selector que haremos. Las opciones, serán, pues eso, las opciones que el programador que use la clase (nosotros en este caso), dará a elegir al usuario final.
El programa ha de saber qué opción se escoge, así que haremos una de dos: que al llamar al método que muestra las opciones, o retorne un entero con el índice escogido (índice del vector de opciones), o que retorne el texto de la opción escogida. Bueno, eso lo veremos al final. Vamos a ello...

Lo primero, es poner la base: colocar includes, declarar la clase, colocar las variables y un main para probarlo. Ya de paso, colocaré los métodos que tendrá:

#include <iostream>
#include <cstdlib>
#include <vector>
#include <conio.h>

class opciones{
public:
    vector<string> opciones;
    string titulo;  
    int mostrar();
};

int main(){
    opciones op;
    op.titulo = "Que edad tienes?";
    op.opciones.push_back("Menos de 18");
    op.opciones.push_back("18 o mas");
    int seleccion = op.mostrar();
}


Usaré la librería conio.h. Esta librería no es una librería estándar, así que no es recomendable usarla. Yo la usaré por la función getch(). getch() retorna un char, sacado del teclado. Es interesante, porque no es necesario pulsar ENTER.

Vamos con la función mostrar:


int opciones::mostrar()const{
        int index = 0;
        char c = 0;
        while(c!='\r' && c!='\n'){
            system("cls");
            cout << titulo << endl << endl;
            for(int i=0; i<opciones.size(); i++){
                cout << '[' << (i==index?'X':' ') << "] " << opciones[i] << endl;
            }
            c = getch();
            if((c=='w' || c=='W') && index>0)
                --index;
            if((c=='s' || c=='S') && index<opciones.size()-1)
                ++index;
        }
        return index;
    }


La idea es que el selector sea manejable con W y S, como si fueran flechas.
Vamos a descomponer el código: "index" y "c" son las variables donde guardaremos el índice de la selección actual y el último caracter pulsado.
Hacemos un while, ya que no saldrá del código hasta que se pulse ENTER.
Empezamos limpiando la pantalla son una llamada al sistema system(), y couteamos el título. Simple.
Ahora la parte más interesante: Hacemos un for, couteando cada función. Pero antes, colocamos la cajita de "marcado", con un par de corchetes. i==index?'X':' ' si el índice es igual a i, significa que es la marcada, así que ponemos una X. Sinó, un espacio vacío.
Lo último: capturar las pulsaciones de las teclas, con getch(). Si es W, subímos, así que diminuímos el índice (siempre que sea mayor que 0 claro, para evitar números negativos). Con S, lo mismo.

Y bueno, esta es la clase. Es sencillita, solo hay que entenderla. El efecto es curioso, y evita tener que andar escribiendo el número de la opción.

Venga, dadle un buen uso a esta clase, y buenos días ;D

1 comentario: