Gracias a todos por su apoyo
Programemos Un Poco En C++
[ADVERTENCIA]Este tutorial asume que ya se tienen conocimientos de conceptos básicos de programación en C++ así como un uso mediano de estos[/ADVERTENCIA]
Hola a toda la comunidad de programadores de T!.
Por pedido de la comunidad en el Post
Me he animado a trabajar más en el uso de las librerías Curses, NCurses, PDcurses o como quieran llamarlas.
La cuestion es ayudar a los programadores más novatos, porque yo no soy experto ni gurusito, a usar librerias que les ayuden a implementar estilos gráficos en sus programas sin ningun problema, y con una facilidad de uso impresionante, así que empecemos.
Como este Tuto está enfocado a Linux Lo haremos todo desde allí.
1. Lo primero será conseguir Code::Blocks un IDE derivado de Dev-cpp OpenSource y SL ovbiamente....
Code::Blocks
Para su instalación desde los repositorios se hace lo siguiente:
-*Abrimos un Terminal
-*Tecleamos los Siguientes Comandos:
Sistemas Basados en empaquetación DEB(Debian):
dijo:# apt-get install codeblocks*
o
dijo:# aptitude install codeblocks*
Sistemas basados en empaquetación RPM (Fedora):
dijo:# yum install codeblocks*
Sistemas basados en empaquetación RPM (Mandriva):
dijo:# urpmi codeblocks*
PD: El codigo debería funcionar en cualquier IDE, pero Code:Blocks es Muy Comodo.
Con lo anterior ya tendriamos instalado Code::Blocks con sus herramientas y dependencias.
nCurses
Aquí no entrare mucho en detalles, ya que todo sistema GNU/Linux trae integradas nativamente, ya que el Kernel hace uso de estas, así que ya todos deberíamos tenerlas instaladas. Pero Contemos algo de historia. Ncurses es una biblioteca de programación que provee una API que permite al programador escribir interfaces basadas en texto, TUIs. También optimiza el refresco de la pantalla, lo que permite reducir la latencia experimentada cuando se usan intérpretes de comandos remotos.
Ncurses significa «new curses», ya que es un reemplazo del descontinuado curses clásico de 4.4BSD.
El proyecto provee APIs oficiales en C, C++ y Ada.
Forma parte del proyecto GNU. Es uno de los pocos programas de GNU que no se distribuye bajo la GPL ni bajo la LGPL, sino bajo la licencia MIT.
Como Compilar
Los botones que nos sirven para compilar son los que se uncuentran en la esquina superior izquierda, los que tienen forma de piñon, piñon y play xD y solo play
Piñon --> COmpilar
Piñon y Play --> Compilar y ejecutar
Play --> Ejecutar
Los siguientes pasos son importantisimos para un buen funcionamiento del codigo así que siguelos al pié de la letra.
En gcc para poder compilar con los ncurses debemos agregaar un flag, para hacer esto debemos hacer los siguiente:
Settings -> Compiler and Debugger -> Abrimos la pestaña de inker Settings, y en el recuadro Other Linker Settings EScribimos lo siguiente:
dijo:-lncurses
y Si preferimos compilar desde el terminal Hacemos:
dijo:g++ codigo.cpp -lncurses -o codigo
y para ejecutar:
dijo:./codigo
Le damos a OK y Listo podremos compilar sin Problemas.....
Vayamos al Grano
Lo primero será abrir nuestro flamante Code::Blocks, así que desde una consola pueden ejecutar:
dijo:codeblocks &
O si lo desean pueden ir a Aplicaciones -> Programación -> Code::Blocks
Cuando tengamos abierto el IDE, iremos a File -> New -> Empty File para proseguir a guardarlo en File -> Save as.. Con el nombre que queramos (*.cpp).
Bueno, se biene lo bueno, esta mañana la pase toda haciendo una calculadora que por cierto quedo muy bonita, y es lo que bamos a hacer:
Lo primero será incluir los siguientes encabezados:
dijo:#include<ncurses.h>
#include<math.h>
La primera es para incluir las ncurses que nos permitira crear la TUI.
Aunque siempre se uvica la función main de primera, como mi programa implementa funciones lo primero será declarar los prototipos:
dijo://Prototipos de las Funciones
void menu(void);
int suma();
int resta();
int multiplicacion();
int division();
int pitagoras();
void error();
void errordiv();
void salir();
//
PD: No se emocionen no todas las citas van a tener Colores.
Las anteriores son las que conforman el programa
Ahora la función Main:
dijo:int main() //Funcion main
{
initscr(); //inicialización de las curses
if (has_colors()) //Comprobacion de colores
{
start_color(); //inicializacion de colores
}
move(8,35); //funcion de movimiento de cursor
//inicializacion de pares de colores
init_pair(1,COLOR_RED,COLOR_BLACK);
init_pair(2,COLOR_BLUE,COLOR_BLACK);
init_pair(3,COLOR_GREEN,COLOR_BLACK);
init_pair(4,COLOR_MAGENTA,COLOR_BLACK);
init_pair(5,COLOR_WHITE,COLOR_RED);
//
//Funciones para el uso de colores, movimiento de cursor, movimiento de cursosr y escritura del mensage
attron(COLOR_PAIR(1));
printw("B"; attron(COLOR_PAIR(2)); printw("ienvenid"
; attron(COLOR_PAIR(1)); printw("o\n\n"
;
attron(COLOR_PAIR(1));
move(10,15);
printw("|\\ | |XXXX |\\ | | / |XXXX |\\ | | |\\ /\\ / \n";
attron(COLOR_PAIR(3));
move(11,15);
printw("|/ | | | \\ | | / | | \\ | | | \\ / \\ / \n";
attron(COLOR_PAIR(4));
move(12,15);
printw("|\\ | |XX | \\ | | / |XX | \\ | | | / \\ / \\ \n";
attron(COLOR_PAIR(2));
move(13,15);
printw("|/ | |XXXX | \\| |/ |XXXX | \\| | |/ \\/ / \n";
attroff(COLOR_PAIR(2));
move(16,20);
printw("Presiona Cualquier Tecla Para Continuar";
getch();
erase();
menu();
refresh();
getch();
endwin();
return 0;
}
PD: Perdon por los emoticones, envés de estos debería ir un caracter ')' Sin Comillas claro está
Analisemos el Codigo.
initscr() -->Esto inicializa el modo curses, si el modo curses no es inicializado nada funcionará. Siempre hacerlo
if (has_colors()) //Comprobacion de colores
{
start_color(); //inicializacion de colores
}
--> No todos los terminales tienen colores, así que lo que hace el if es comprobar que hayan colores, en el caso de que hayan se inicializan con la función start_color().
PD: La comprobación no es necesaria.
move(8,35)
--> Esta función es similar al gotoxy de la porqueria de conio.h (Perdon xD)
mueve el cursor a los puntos indicados, la diferencia entre esta y gotoxy es esta:
move(y,x)
gotoxy(x,y)
init_pair(1,COLOR_RED,COLOR_BLACK);
init_pair(2,COLOR_BLUE,COLOR_BLACK);
init_pair(3,COLOR_GREEN,COLOR_BLACK);
init_pair(4,COLOR_MAGENTA,COLOR_BLACK);
init_pair(5,COLOR_WHITE,COLOR_RED);
--> Estas funciones nicializan pares de colores para su uso futuro
indicando el numero del par, lo hare más explícito:
init_pair -->Inicializa el par
(1, --> El número del par, ninguno puede ser igual
COLOR_BLUE, --> Color de la Letra
COLOR_BLACK --> Color de fondo, como notamos es negro, lo que quiere decir que no hay fondo, que es sólo el color de letra (diferente al par 5 por ejemplo)
attron --> Indica la forma en que irán las sentencias siguientes, así por ejemplo un attron(A_BOLD) antes de un printw(""

hará que las cadenas de texto aparezcan en Negrita, en la mayoría de casos para asignar los pares de colores a las cadenas.
printw --> Es el usado para mostrar mensajes por pantalla Su funcionamiento es el mismo que printf
scanw --> Usado para leer información por teclado, Su funcionamiento es el mismo de scanf
getch() --> Hace lo mismo que haria cin.get() pero usando cualquier caracter del teclado.
erase() --> Limpia la pantalla
menu() --> Función del menú que desarrollaremos más adelante.
refresh() --> Refresca la pantalla y la actualiza con las sentencias anteriores, así que es posible que no aparezca nada si omitimos esta función.
attroff --> Elimina los cambios hechos por attron, así por ejemplo attroff(A_BOLD) Hara que los siguientes textos ya no aparescan en negrita.
Bueno, ya hemos visto todas las funciones y sentencias básicas e importantes en nuestro programa, por eso ahora les mostrare el codigo entero para que puedan tener su calculadora completa (Espero que sepan Switch, es básico):
dijo:#include<ncurses.h>
#include<math.h>
//Prototipos de las Funciones
void menu(void);
int suma();
int resta();
int multiplicacion();
int division();
int pitagoras();
void error();
void errordiv();
void salir();
//
int main() //Funcion main
{
initscr(); //inicialización de las curses
if (has_colors()) //Comprobacion de colores
{
start_color(); //inicializacion de colores
}
move(8,35); //funcion de movimiento de cursor
//inicializacion de pares de colores
init_pair(1,COLOR_RED,COLOR_BLACK);
init_pair(2,COLOR_BLUE,COLOR_BLACK);
init_pair(3,COLOR_GREEN,COLOR_BLACK);
init_pair(4,COLOR_MAGENTA,COLOR_BLACK);
init_pair(5,COLOR_WHITE,COLOR_RED);
//
//Funciones para el uso de colores, movimiento de cursor, movimiento de cursosr y escritura del mensage
attron(COLOR_PAIR(1));
printw("B"; attron(COLOR_PAIR(2)); printw("ienvenid"
; attron(COLOR_PAIR(1)); printw("o\n\n"
;
attron(COLOR_PAIR(1));
move(10,15);
printw("|\\ | |XXXX |\\ | | / |XXXX |\\ | | |\\ /\\ / \n";
attron(COLOR_PAIR(3));
move(11,15);
printw("|/ | | | \\ | | / | | \\ | | | \\ / \\ / \n";
attron(COLOR_PAIR(4));
move(12,15);
printw("|\\ | |XX | \\ | | / |XX | \\ | | | / \\ / \\ \n";
attron(COLOR_PAIR(2));
move(13,15);
printw("|/ | |XXXX | \\| |/ |XXXX | \\| | |/ \\/ / \n";
attroff(COLOR_PAIR(2));
move(16,20);
printw("Presiona Cualquier Tecla Para Continuar";
getch();
erase();
menu();
refresh();
getch();
endwin();
return 0;
}
void menu(void)
{
int op;
refresh();
erase();
attron(COLOR_PAIR(3));
attron(A_BOLD);
move(2,5);
printw(" ------------------------------------------------------------------\n";
move(3,5);
printw("| |\n";
move(4,5);
printw("| ...::: M E N U :::... |\n";
move(5,5);
printw("| |\n";
move(6,5);
printw(" ------------------------------------------------------------------\n";
attroff(A_BOLD);
attron(COLOR_PAIR(4));
move(8,8);
printw("1 - - > S u m a \n";
move(9,8);
printw("2 - - > R e s t a \n";
move(10,8);
printw("3 - - > M u l t i p l i c a c i o n \n";
move(11,8);
printw("4 - - > D i v i s i o n \n";
move(12,8);
printw("5 - - > P i t a g o r a s \n";
move(13,8);
printw("6 - - > S A L I R \n";
attron(COLOR_PAIR(2));
move(14,10);
printw("Y T u O p c i o n E s : ";
scanw("%d" ,&op);
if(op > 7)
{
error();
}
refresh();
switch(op)
{
case 1:
suma();
break;
case 2:
resta();
break;
case 3:
multiplicacion();
break;
case 4:
division();
break;
case 5:
pitagoras();
break;
case 6:
salir();
break;
}
refresh();
}
int suma()
{
int num1, num2, suma;
erase();
attron(COLOR_PAIR(3));
attron(A_BOLD);
move(2,5);
printw(" ------------------------------------------------------------------\n";
move(3,5);
printw("| |\n";
move(4,5);
printw("| ...::: S U M A :::... |\n";
move(5,5);
printw("| |\n";
move(6,5);
printw(" ------------------------------------------------------------------\n";
attroff(A_BOLD);
attroff(COLOR_PAIR(3));
attron(COLOR_PAIR(4));
move(8,8);
printw("Introduce un Primer numero: ";
scanw("%d" ,&num1);
move(10,8);
printw("Introduce un Segundo numero: ";
scanw("%d" ,&num2);
suma = num1 + num2;
attron(COLOR_PAIR(2));
attron(A_BOLD);
move(12,10);
printw("El Resultado es : %d", suma);
attroff(COLOR_PAIR(2));
attroff(A_BOLD);
move(14,13);
printw("Presiona culquier tecla Para Continuar";
getch();
refresh();
menu();
}
int resta()
{
int num1, num2, resta;
erase();
attron(COLOR_PAIR(3));
attron(A_BOLD);
move(2,5);
printw(" ------------------------------------------------------------------\n";
move(3,5);
printw("| |\n";
move(4,5);
printw("| ...::: R E S T A :::... |\n";
move(5,5);
printw("| |\n";
move(6,5);
printw(" ------------------------------------------------------------------\n";
attroff(A_BOLD);
attroff(COLOR_PAIR(3));
attron(COLOR_PAIR(4));
move(8,8);
printw("Introduce un Primer numero: ";
scanw("%d" ,&num1);
move(10,8);
printw("Introduce un Segundo numero: ";
scanw("%d" ,&num2);
resta = num1 - num2;
attron(COLOR_PAIR(2));
attron(A_BOLD);
move(12,10);
printw("El Resultado es : %d", resta);
attroff(COLOR_PAIR(2));
attroff(A_BOLD);
move(14,13);
printw("Presiona culquier tecla Para Continuar";
getch();
refresh();
menu();
}
int multiplicacion()
{
int num1, num2, multiplicacion;
erase();
attron(COLOR_PAIR(3));
attron(A_BOLD);
move(2,5);
printw(" ------------------------------------------------------------------\n";
move(3,5);
printw("| |\n";
move(4,5);
printw("| ...::: M U L T I P L I C A C I O N :::... |\n";
move(5,5);
printw("| |\n";
move(6,5);
printw(" ------------------------------------------------------------------\n";
attroff(A_BOLD);
attroff(COLOR_PAIR(3));
attron(COLOR_PAIR(4));
move(8,8);
printw("Introduce un Primer numero: ";
scanw("%d" ,&num1);
move(10,8);
printw("Introduce un Segundo numero: ";
scanw("%d" ,&num2);
multiplicacion = num1 * num2;
attron(COLOR_PAIR(2));
attron(A_BOLD);
move(12,10);
printw("El Resultado es : %d", multiplicacion);
attroff(COLOR_PAIR(2));
attroff(A_BOLD);
move(14,13);
printw("Presiona culquier tecla Para Continuar";
getch();
refresh();
menu();
}
int division()
{
float num1, num2, division;
erase();
attron(COLOR_PAIR(3));
attron(A_BOLD);
move(2,5);
printw(" ------------------------------------------------------------------\n";
move(3,5);
printw("| |\n";
move(4,5);
printw("| ...::: D I V I S I O N :::... |\n";
move(5,5);
printw("| |\n";
move(6,5);
printw(" ------------------------------------------------------------------\n";
attroff(A_BOLD);
attroff(COLOR_PAIR(3));
attron(COLOR_PAIR(4));
move(8,8);
printw("Introduce un Primer numero: ";
scanw("%d" ,&num1);
move(10,8);
printw("Introduce un Segundo numero: ";
scanw("%d" ,&num2);
if (num2 == 0)
{
errordiv();
}
division = num1 / num2;
attron(COLOR_PAIR(2));
attron(A_BOLD);
move(12,10);
printw("El Resultado es : %d", division);
attroff(COLOR_PAIR(2));
attroff(A_BOLD);
move(14,13);
printw("Presiona culquier tecla Para Continuar";
getch();
refresh();
menu();
}
int pitagoras()
{
int num1, num2, pitagoras, hipo;
erase();
attron(COLOR_PAIR(3));
attron(A_BOLD);
move(2,5);
printw(" ------------------------------------------------------------------\n";
move(3,5);
printw("| |\n";
move(4,5);
printw("| ...::: P I T A G O R A S :::... |\n";
move(5,5);
printw("| |\n";
move(6,5);
printw(" ------------------------------------------------------------------\n";
attroff(A_BOLD);
attroff(COLOR_PAIR(3));
attron(COLOR_PAIR(4));
move(8,8);
printw("Introduce la medida del primer cateto: ";
scanw("%d" ,&num1);
move(10,8);
printw("Introduce la medida del Segundo cateto: ";
scanw("%d" ,&num2);
pitagoras = pow(num1, 2) + pow(num2, 2);
hipo = sqrt(pitagoras);
attron(COLOR_PAIR(2));
attron(A_BOLD);
move(12,10);
printw("El Resultado es : %d", hipo);
attroff(COLOR_PAIR(2));
attroff(A_BOLD);
move(14,13);
printw("Presiona culquier tecla Para Continuar";
getch();
refresh();
menu();
}
void error()
{
erase();
attron(COLOR_PAIR(5));
move(2,4);
printw(" ----------------------------------------------------------------------\n";
move(3,4);
printw("| |\n";
move(4,4);
printw("| E R R O R !!! |\n";
move(5,4);
printw("| I N T R O D U C E U N A O P C I O N C O R R E C T A |\n";
move(6,4);
printw("| |\n";
move(7,4);
printw(" ----------------------------------------------------------------------\n";
attroff(A_BOLD);
attroff(COLOR_PAIR(5));
move(9,6);
printw("Presiona culquier tecla Para Continuar";
getch();
refresh();
erase();
menu();
}
void errordiv()
{
erase();
attron(COLOR_PAIR(5));
move(2,4);
printw(" ----------------------------------------------------------------------\n";
move(3,4);
printw("| |\n";
move(4,4);
printw("| E R R O R !!! |\n";
move(5,4);
printw("| I N T R O D U C E U N A O P C I O N C O R R E C T A |\n";
move(6,4);
printw("| |\n";
move(7,4);
printw(" ----------------------------------------------------------------------\n";
attroff(A_BOLD);
attroff(COLOR_PAIR(5));
move(9,6);
printw("Presiona culquier tecla Para Continuar";
getch();
refresh();
erase();
division();
}
void salir()
{
erase();
move(9,6);
printw("Presiona culquier tecla Para Salir";
}
Descarga el Código Fuente
NO ES RECOMENDABLE QUE COPIES Y PEGUES EL TEXTO DE LAS CITAS, YA QUE POR CUESTIONES DE FORMATO DE T! ESTE ELIMINA ESPACIOS IMPORTANTES E INCLUYE EMOTICONES EN DIVERSAS ZONAS DEL CODIGO, ASÍ QUE PARA TU COMODIDAD ACONTINUACIÓN TE DEJO EL CÓDIGO:
Espero haya hecho tu vida más fácil....
ScreenShots
Les Gusta??
ATENCIÓN, SI YA BAJASTE EL CÓDIGO VUELVE HA HACERLO, YA QUE EL ANTERIOR TENIA UN BUG QUE YA FUE CORREGIDO...
JIJIJI MI PRIMER UPDATE [Septiembre 27 de 2008 21:02:07]
SEGUNDO UPDATE [Septiembre 28 de 2008 11:21:42]
Solucionados algunos problemas visuales.....

PERDONA LAS MOLESTIAS, PERO.. NINGUN CÓDIGO ES PERFECTO
APedido Del Usuario Aress2k7:
Si quieres aprender de una manera más tecnica explícita y entendible te recomiiendo los siguientes documentos:
***AGRADECER NO CUESTA NADA***