Mas C ++
Como ya habrán visto. C++ no es el mas sencillo de los idiomas de programación, ¿Por que se estudia entonces, Para complicar la vida?. Nooooo... se estudia porque es un idioma que permite hacer desde un sistema operativo, hasta las mas vistosas aplicaciones visuales, claro que para eso, hay que saber bastante mas y ya no van alcanzar las pestañas quemadas.
Por eso, para seguir avanzando sobre el tema, hice esta subpágina, para los que quieran especializarse en ello. Manejaremos conceptos bastante más complicados.
Ahora veremos algunas cosas que ocurren comúnmente es C++
Cuando de usa la entrada desde teclado. sobre todo cuando se mezclan la librería stdio.h y conio.h ocurre que el programa sigue de largo sin detenerse en los pedido de ingreso de datos, esto ocurre, porque previamente a ello ha quedado cargado el buffer de teclado con el Enter que se da para finalizar la toma de datos, entonces la próxima orden, interpreta que ese Enter es un dato y lo carga como un dato o produce un error resultando en ambos caso el mal funcionamiento del programa.
Para evitar esto, después de cada ingreso de datos, es conveniente limpiar el buffer de teclado, lo que se hace con la orden fflush(stdin); de la librería stdio.h esta orden vacía el buffer de entrada estándar, o sea el teclado.
Otro error común ocurre al operar matemáticamente con distinto tipo de datos, ya que C++ convierte los datos al de menor tamaño, resultado imprecisión o perdida de la exactitud en la operación.
Al operar con cadenas de caracteres, debemos recordar que el ultimo carácter es un fin de cadena '0'
y dejar este lugar para que la función que cargue el dato pueda hacerlo. Si lo hacemos poniendo letra por letra, debemos asegurarnos que ese carácter esté presente antes de usarlo como cadena
Cuando la cadena esta dentro de una estructura, entonces tendremos que usar 'x0' como carácter de fin de string
Vease aplicación en este ejemplo:
#include <stdlib.h>
#include <stdio.h>
struct escuela
{
int nota[5];
char nombre[20];
char Apell[10];
}curso[40];
int i, j, posimax, posimin;
float min, max;
char old;
main()
{
FILE *Arch;
system("mode con: Lines=60");//pantalla mas larga
system("CLS"); //clrscr();
printf(" ############### BIENVENIDO A COLEGIO CALIFIKERS ############nn ");
printf("VA A OPERAR CON REGISTROS ANTERIORES? (S)==>S¡nr POR NUEVOS (N)==>Nuevos: ");
scanf("%c", &old); printf("n");
if (old=='s'||old=='S')
{
if ((Arch=fopen("COLEGIO.TXT","r+"))==NULL)//abriendo fila
printf("nr ¡¡¡¡ ATENCION !!!! EL REGISTRO NO SE HA PODIDO ABRIRnr");
else
{
fread(&curso,sizeof(curso), 1, Arch);
fclose(Arch);
}
}// fin del abrir archivo para leer
else
{
for(i=0; i<40; i=i+1)
{
system("CLS");
fflush(stdin);
printf("INGRESE EL NOMBRE DEL %i ALUMNO: ",i+1);
gets(curso[i].nombre);
fflush(stdin);
printf("INGRESE EL APELLIDO DEL %i ALUMNO: ",i+1);
gets(curso[i].Apell);
fflush(stdin);
if(curso[i].nombre[0]=='0')break;
for(j=0;j<5;j++){
printf("INGRESE LA NOTA: %d DEL %i ALUMNO: ",j+1,i+1);
scanf("%i", &curso[i].nota[j]);
fflush(stdin);
}
}
}//fin del cargardato
if ((Arch=fopen("COLEGIO.TXT","w+"))==NULL)
printf("nr ¡¡¡¡ ATENCION !!!! EL REGISTRO NO SE HA PODIDO ABRIRnr");
else
{
fwrite(&curso,sizeof(curso), 1, Arch);
fclose(Arch);
}// fin del abrir archivo para escribir
max=0;
min=3000; /*maximo para un entero*/
float sumanota, aux;
for(i=0; i<40; i=i+1)
{if(curso[i].nombre[0]=='n'|| curso[i].nombre[0]=='x0') break;
sumanota=curso[i].nota[0] + curso[i].nota[1] + curso[i].nota[2] + curso[i].nota[3] + curso[i].nota[4];
if (max < sumanota / 5){ max=sumanota/5;posimax=i;}
if (min > sumanota / 5){ min=sumanota/5;posimin=i;}
}
printf("nnEl PROMEDIO MAS ALTO ES DEL ALUMNO: %s; y es : %4.2f",curso[posimax].nombre, max);
printf("nnLA PROMEDIO MAS BAJO ES DEL ALUMNO: %s; y es : %4.2f",curso[posimin].nombre, min);
printf("nnALUMNOS QUE APROBARON LA MATERIA EN ESTE A¥O Notasn");
aux=(curso[i].nota[0] + curso[i].nota[1] + curso[i].nota[2] + curso[i].nota[3] + curso[i].nota[4]);
for(i=0; i<40; i++){ if(curso[i].nombre[0]=='n'|| curso[i].nombre[0]=='x0') break;
aux=(curso[i].nota[0] + curso[i].nota[1] + curso[i].nota[2] + curso[i].nota[3] + curso[i].nota[4]);
if(aux / 5 >= 3)
printf("Alumno: s s Notas: %d; %d; %d; %d; %dn", curso[i].nombre, curso[i].Apell, curso[i].nota[0], curso[i].nota [1], curso[i].nota[2], curso[i].nota[3], curso[i].nota[4]);
}
printf("nnALUMNOS QUE REPROBARON LA MATERIA EN ESTE A¥O Notasn");
for(i=0; i<40; i++){if(curso[i].nombre[0]=='n'|| curso[i].nombre[0]=='x0') break;
aux=(curso[i].nota[0] + curso[i].nota[1] + curso[i].nota[2] + curso[i].nota[3] + curso[i].nota[4]);
if(aux / 5 < 3)
printf("Alumno: s s Notas: %d; %d; %d; %d; %dn", curso[i].nombre, curso[i].Apell, curso[i].nota[0], curso[i].nota [1], curso[i].nota[2], curso[i].nota[3], curso[i].nota[4]);
}
printf("nnn");
system("PAUSE");
}//fin del programa
Supongo que ya habrán bajado los manuales y los estuvieron leyendo, y que en el segundo de los casos, ese que viene en un documento de Word de 143 páginas, se habrán encontrado con cosas muy difíciles de digerir, así que cuando tenga que tocar un tema de este manual, lo llamaré por su página, referencia de DocWord.
En la primera parte de este avance, no tendremos en cuenta las notaciones de la POO, sino que trataremos de habituarnos a la programación modular y luego veremos lo otro.
El compilador que usamos, tiene la posibilidad de usar archivos de cabecera, para gráficos, esto es salir del modo de texto y trabajar en una ventana de n x m pixeles, y de incluir al mouse como interfaz de usuario, cosa que hasta ahora, no habíamos hecho.
Para eso, lo mejor es familiarizarse con la librería gráfica, así que haciendo click con el derecho sobre la escritura graphics.h iremos al detalle de las funciones disponibles en la misma, entraremos en la primera función, la que permite usar un arco de círculo, y comenzaremos yendo abajo, donde están los ejemplos y abriremos el ejemplo de código que trae la ayuda.
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
int midx, midy;
int stangle = 45, endangle = 135;
int radius = 100;
/* initialize graphics and local
variables */
initgraph(&gdriver, &gmode, "");
/* read result of initialization */
errorcode = graphresult();
/* an error occurred */
if (errorcode != grOk)
{
printf("Graphics error: %sn", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
midx = getmaxx() / 2;
midy = getmaxy() / 2;
setcolor(getmaxcolor());
/* draw arc */
arc(midx, midy, stangle, endangle, radius);
/* clean up */
getch();
closegraph();
return 0;
}
Nos posicionamos sobre DETECT y con el click izquierdo, veremos de que se trata y en la tabla vemos que este valor se ajustará según el adaptador de gráfico que tengamos, ahora es solo el nombre de una variable que se cargará cuando intentemos inicializar el entorno gráfico. Esto se hace con la función initgraph(&gdriver, &gmode, "texto encabezado vetana");
donde gdriver, es un valor que se cargó cuando se inicializó la variable con DETECT, el otro valor gmode, dependerá del tipo de pantalla, en nuestro caso como es VGA
Graphics driver
graphics_modes│Value│Column x Row │ Palette │Pages
═════════Ï══════════════Ï═════Ï════════════Ï═════════Ï══════════VGA
VGALO │ 0 │ 640 x 200 │ 16 color│ 2
VGAMED │ 1 │ 640 x 350 │ 16 color│ 2
VGAHI │ 2 │ 640 x 480 │ 16 color│ 1
Esta tabla esta en la descripción de la función initgraph donde se habla del mode y allí en graphics_modes
Vemos que inmediatamente en el código, se lee el valor resultante de la aplicación de la función, para saber si se ha iniciado el entorno correctamente o dió error.
Luego se define las coordenadas del medio de la pantalla gráfica y se traza un arco con los valores prefijados, por último se pausa para mostrar, y luego se sale del entorno gráfico
Si copiamos el ejemplo y lo ponemos en un nuevo cpp vemos el resultado al ejecutarlo, y podemos probar variando los valores
Y así para funciones similares
Vemos algunas cosas que se pueden lograr con C++ en este compilador, en la página
http://aemarchivos.es.tl/Codigos-Turbo-C++-sobre-DOS--k1-a-k2-.htm
Y luego, en esta misma página, en el menú vamos a C++ editores y compiladores y descargamos el DevC++ ya instalado con sus librerías gráficas
http://www.4shared.com/rar/CoHmb4OO/Dev-Cpp.html
Este compilador, ya permite usar librerías sobre Windows y aplicaciones del mismo, y también el uso del entorno gráfico, con los Pack de librerías no estándar, luego veremos aplicaciones para el mismo con las diferencias del caso con el compilador anterior, Para saber de que se trata, podemos ver en:
http://es.wikipedia.org/wiki/Dev-C++
Allí tenemos incluso un enlace para la página de presentación de la ultima versión oficial, que es sobre la cual trabajaremos.
No comencé con este compilador, por el tema de la ayuda y el control de errores, que tiene el primero, y yo sugeriría tenerlo siempre a mano, para probar porciones de código antes de complicarnos la vida directamente con el DevC++
La instalación de los dos compiladores, es totalmente compatible, no así si tenemos otra versión de DevC++ por lo que es aconsejable eliminar totalmente la primera instalación de DevC++ antes de instalar una nueva.
De la misma página podemos descargar algunos códigos de muestra, e ir viendo como funciona.
Tiene algunas diferencias de sintaxis en funciones con aleatorios, y en los pack de winBGIm también, se superponen declaraciones en el pack de conio2.h que imita al conio.h de TC++ de Borland, y la grafica, por lo que hay que modificarla para poder usarlas juntas, en esto, yo generé una nueva version del conio2 que llamé la coniog.h (para usar con la graphics.h)
La diferencia mas importante, es que ya no se trabaja con una pagina cpp, sino con un proyecto.
El proyecto conviene guardarlo en una carpeta, y alli tambien todos los archivos necesarios, para poder hacerlo portable (llevarlo de una Pc a otra y que funcione sin problemas)
Ademas, se declaran en el proyecto, los links a los archivos *.lib correspondientes a cada libreria, en nuestro caso, en el proyecto declararemos para coniog.h y para graphics.h los vinculos necesarios.
Estos archivos *.lib, estan codificados, es decir no son legibles al usuario en la mayoría de los casos y son el desarrollo de las funciones declaradas en la pagina de los archivos de cabecera correspondientes, que estan en la carpeta de los include, con la extensión *.h
Para los que no tienen experiencia con este tipo de compilador, como iniciar un proyecto.
a) Iniciamos el compilador lo hacemos desde devcpp.exe que esta en la carpeta que descomprimimos, y de ese ejecutable podemos hacer un acceso directo al escritorio.
b)Nuevo --> Proyecto Se abre una ventana con varias pestañas, en la Basic tenemos el compilador básico, luego si hemos agregado otras cosas, tendremos pestañas como la de multimedia, y la de winBGIm, ademas una de un ejemplo clasico como el Hello Word en la pestaña Introduction
En Basic, tenemos las opciones de aplicacion de windows, de aplicación para consola, libreria estática, libreria dinámica y vacío, usaremos la de consola para usar el codigo semejante al que veníamos usando en Turbo C++.
C) Ponemos un nombre (importante para no confundirnos despues) a nuestro proyecto segun lo que vamos a hacer y elegimos el idioma (c++ en nuestro caso)
Aceptamos y se nos abrira en el compilador un proyecto con un signo mas y un codigo en la pagina, que corresponde a la hoja main
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
system("PAUSE");
return EXIT_SUCCESS;
}
#include <coniog.h> //hubo que agregar -Lconio en herr opc/comp lin com linker
#include <stdio.h>
//#include <iostream>
#include <cstdlib>
#include <graphics.h>
using namespace std;
float Tabla[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int i, y, k=0, j=0, f=0, c=0;
float fl;
char cad[80];
int main(){
char cad[5], nume[8];
int gm,gd=DETECT;
//initgraph (&gd,&gm,"winBGIm");//"E:Dev-CppBGI");
initwindow(860, 640,"Graficar 15 valores entre -10 y +20");
setbkcolor(9);
setcolor(15);
cleardevice();
delay(10);
for(i=0; i<15; i++){
sprintf(cad, "Ingrese la lectura n°: %d ===> :", i+1);
outtextxy(10, 10, cad );
for(int z=0; z<6; z++)//lee y muestra dato ingresado por teclado
{
nume[z]=getch(); nume[z+1]='';
if(nume[z]=='r') break;
outtextxy(220 ,10, " ");//borra
outtextxy(220 ,10, nume); //escribe ingreso
}
Tabla[i]=atof(nume);
}
for(i=0; i<30; i++){
sprintf(cad, "%3d --", 19-i);
outtextxy(10, 30 + i*20, cad);
outtextxy(35+ i*25, 414, "¦");
sprintf(cad, "%2d", i);
outtextxy(35+ i*25, 425, cad);
}
int LF, LC, NF, NC;
line(35, 30, 35, 620);
line(35,418, 800,418);
//muestra las coordenadas
LF = 415; //antes 418
LC = 30;
for(i=0; i<15; i++){
NC=60+ i*25; NF= int(414 - Tabla[i]*20 );
setcolor(12);
outtextxy(NC-3, NF-4, "+");
sprintf(cad,"%i",j);
outtextxy(10,10, cad);
line(LC+2,LF+3, NC, NF+3);
LC=NC;
LF=NF;
}
fflush(stdin);
getch(); //pausa
closegraph();
}
y con el boton de abajo, buscamos la ../libconio.a que esta en la carpeta Lib de la carpeta del compilador, o podemos hacer na copia y ponerla en nuestra carpeta, y se nos añadira a las anteriores.
Ahora si podemos compilarlo (probar si anda) lo hacemos con los cuadraditos parecidos al logo de windows en la barra de herramienta, el primero (el de los cuadraditos separados) es el de compilar, el segundo de ejecutar ejecutar, el tercero ambas cosas.
Si hay un error (podemos probar metiendo uno a propósito) nos indicara el mismo y abajo un detalle del mismo Por ejemplo, agregenle una coma adentro de una función, para ver que muestra y verán que la ayuda es bastante mas complicada de entender que la del TC++, pero que está, está.
Vemos el grafico que se forma, y luego guardamos todo dentro de la misma carpeta con el nombre referido al proyecto, y probamos con otra cosa
Codigos de prueba Dev C++
aemarchivos.es.tl/Codigos-y-Proyectos-de-ejemplo-para-DevC%2B%2B.htm
http://www.4shared.com/rar/CfYDEPT5ce/GrafiBarr.html
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
const int na=5; //poner cantidad de alumnos maxima
const int nn=5; //4 notas y un subtotal
using namespace std;
char nombre[na][30], nombgan[30], nombper[30];
int nota[na][nn+1], i, j, sutot,maxtot, mintot, acumi, acumc, acumb, puntosmx, puntosmi;
main(){
system("CLS");
acumi=0; acumc=0; acumb=0;maxtot = 0; mintot = 100;puntosmx = 0; puntosmi = 0;
for(i=0; i<na; i++){
sutot = 0;
cout<<"Escriba el "<<i+1<<"ø Nombre y Apellido: ";
gets(nombre[i]);
if(nombre[i][0]== '\0')break; //fin de ingreso menos de na
for(j=0;j<nn; j++){
cout<<" Escriba su "<<j+1<<"º nota: ";
cin>>nota[i][j];
fflush(stdin);
sutot=sutot+nota[i][j];
}
nota[i][nn]= sutot / nn; //promedio x alumno
acumi=i;
acumb=acumb + nota[i][nn];
if( sutot > maxtot ) { maxtot = sutot; strcpy(nombgan, nombre[i]); puntosmx=sutot;}
if( sutot < mintot ) { mintot = sutot; strcpy(nombper, nombre[i]); puntosmi=sutot;}
}
cout<<" Mayor Promedio para : "<<nombgan<<" con "<<puntosmx /nn <<" de promedio\n";
cout<<" Menor Puntaje para : "<<nombper<<" con "<<puntosmi /nn <<" de promedio\n";
cout<<"\nALUMNOS QUE APROBARON LA MATERIA EN ESTE AÑO \n";
for(i=0; i<acumi+1; i++){
if( nota[i][nn] > 5){
printf("Alumno: %20s Notas: ", nombre[i]);
for(j=0;j<nn;j++)printf("%2d;", nota[i][j]);
printf("Pro: %d\n", nota[i][nn]);
}
}
cout<<"\nALUMNOS QUE REPROBARON LA MATERIA EN ESTE AÑO \n";
for(i=0; i<acumi+1; i++){
if(nota[i][nn] < 6){
printf("Alumno: %20s Notas: ", nombre[i]);
for(j=0;j<nn;j++)printf("%2d;", nota[i][j]);
printf("Pro: %d\n", nota[i][nn]);
}
}
cout<<"\nPROMEDIO TOTAL DEL CURSO: "<<acumb /acumi-1 <<"\n\n";
system("PAUSE");
return 0;
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Siempre en TurboC++ version 3 o inferior
//MOUSE.CPP - Permite emplear laas funciones b sicas del raton
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
//PROTOTIPOS DE FUNCION
int mtest(void); //testea raton
void mver(void); //visualiza puntero del raton
void mocultar(void); //oculta puntero del raton
int mposx(int modo); //obtiene coordenada x
int mposy(int modo); //obtiene coordeanada y
void msituar(int modo, int x, int y); //situa puntero del raton
int mclick(void); //detecta boton pulsado
void mlimitar(int modo, int x1, int y1, int x2, int y2); //limita area de pantalla para el raton
//fin lista protos de raton
union REGS r, o; //VARIABLE PARA ACCESAR PARAMETROS DEL RATON
main ()
{
clrscr();
//verificando la existencia del raton
if (!mtest()) //si devuelve cero no esta instalado
printf("No hay raton instalado");
else {
gotoxy(25,21);printf("Rat¢n de %d botones", mtest());
}
mver(); //visualiza el puntero del raton
msituar(8, 1, 1); //situa le raton en una coordnada espec[ifica
//mensaje en pantalla para poder salir o limitar area de raton
gotoxy(32,15);textcolor(RED);cprintf("S"); textcolor(14);cprintf("alir");
gotoxy(32,9);textcolor(RED);cprintf("L");textcolor(14);cprintf("imitar area");
for ( ;!kbhit();) //al presionar una tecla terminara ejecucion
{
switch ( mclick()) { //se verifica boton pulsado
case 1: //se presiono boton izquierdo del raton
textcolor(5);gotoxy(2,20);cprintf ("presionas boton izquierdo..");
delay(10);
gotoxy(2,20); cprintf (" "); //borra letrero
if(mposx(8)==31 && mposy(8)==14) { //verifica si desea salir
mocultar(); //oculta el raton
exit(0); //abandona el programa
}
break;
case 2: //se presiono boton derecho del raton
textcolor(7); gotoxy(50,20); cprintf ("presionas boton derecho..");
delay(10); gotoxy(50,20); cprintf (" "); //borra letrero
if(mposx(8)==31 && mposy(8)==8) //Verificar si desea limitar area
mlimitar(8, 20, 10, 50, 16);
break;
}
//estatus de las coordenadas del puntero del mouse
textcolor(3);gotoxy(2,7); cprintf ("x=%d ",mposx(8));
gotoxy(2,8); cprintf ("y=%d ",mposy(8));
if(mposx(8)==31 && mposy(8)==14) { //mensaje para salir
textcolor(BLUE);
gotoxy(20,16); cprintf ("Si haces click IZQUIERDO saldras de aqui");
delay(10);
textcolor(YELLOW);
gotoxy(20,16); printf (" ");
}
if(mposx(8)==31 && mposy(8)==8) { //Mensaje para limitar area
textcolor(BLUE);
gotoxy(20,10);cprintf("Si haces click DERECHO limitaras area del raton");
delay(10);
gotoxy(20,10);cprintf(" ");
}
}
return 0;
}
///////////////////////////////////////////////////
// INICIA LA CONSTRUCCION DE LAS FUNCIONES //
// DEL RATON //
///////////////////////////////////////////////////
/******************************************************/
/* LA FUNCION mtest */
/* Esta funci¢n sirve para testear (PROBAR) el rat¢n. */
/* No es necesario enviar ning£n parametro. */
/* Retorna: 0 => no hay rat¢n instalado. */
/* n => el n£mero de botones del rat¢n. */
/******************************************************/
int mtest(void)
{
reg.x.ax = 0x0;
int86(0x33, ®,® );
if (reg.x.ax > 0) return reg.x.bx; /* n£mero de botones */
else return 0;
}
/*************************************************/
/* LA FUNCION mver */
/* Muestra el puntero del rat¢n. */
/* No es necesario enviar ning£n par metro. */
/* No retorna ning£n valor. */
/*************************************************/
void mver(void)
{
reg.x.ax = 0x1;
int86(0x33, ®, ®);
}
/*************************************************/
/* LA FUNCION mocultar */
/* Oculta el puntero del rat¢n. */
/* No es necesario enviar ning£n par metro. */
/* No retorna ning£n valor. */
/*************************************************/
void mocultar(void)
{
reg.x.ax = 0x2;
int86(0x33, ®, ®);
}
/*************************************************/
/* LA FUNCION mposx */
/* Nos dice la coordenada X del rat¢n. */
/* La primera coordenada es cero */
/* Es necesario enviar un parametro. */
/* 1 => modo grafico. */
/* 8 => modo texto. */
/* Retorna la posici¢n horizontal del rat¢n. */
/*************************************************/
int mposx(int modo)
{
reg.x.ax = 0x3;
int86(0x33, ®, ®);
return reg.x.cx/modo;
}
/*************************************************/
/* LA FUNCION mposy */
/* Nos dice la coordenada Y del rat¢n. */
/* La primera coordenada es cero */
/* Es necesario enviar un par metro. */
/* 1 => modo gr fico. */
/* 8 => modo texto. */
/* Retorna la posici¢n vertical del rat¢n. */
/*************************************************/
int mposy(int modo)
{
reg.x.ax = 0x3;
int86(0x33, ®, ®);
return reg.x.dx/modo;
}
/*************************************************/
/* LA FUNCION msituar */
/* Situamos el rat¢n en las coordenadas deseadas */
/* Es necesario enviar tres par metros. */
/* modo => 1 => modo grafico. */
/* 8 => modo texto. */
/* x => posici¢n horizontal. */
/* y => posici¢n vertical. */
/* No retorna ning£n valor. */
/*************************************************/
void msituar(int modo, int x, int y)
{
reg.x.ax = 0x4;
reg.x.cx = x*modo;
reg.x.dx = y*modo;
int86(0x33, ®, ®);
}
/*************************************************/
/* LA FUNCION mclick */
/* Nos dice si hay alg£n bot¢n presionado. */
/* No es necesario enviar ning£n par metro. */
/* Retorna: 0 => ning£n bot¢n presionado. */
/* 1 => bot¢n izquierdo presionado. */
/* 2 => bot¢n derecho presionado. */
/*************************************************/
int mclick(void)
{
int r = 0;
reg.x.ax = 0x5;
reg.x.bx = 0;
int86(0x33, ®, ®);
if ((reg.x.ax) & 1) r = 1;
else if ((reg.x.ax>>1) & 1) r = 2;
return r;
}
/*************************************************/
/* LA FUNCION mlimitar */
/* Limitamos el espacio de movilidad del rat¢n. */
/* Es necesario enviar cinco parametros. */
/* modo => 1 => modo gr fico. */
/* 8 => modo texto. */
/* x1 => l¡mite arriba. */
/* y1 => l¡mite izquierda. */
/* x2 => l¡mite abajo. */
/* y2 => l¡mite derecha. */
/* No retorna ning£n valor. */
/*************************************************/
void mlimitar(int modo, int x1, int y1, int x2, int y2)
{
reg.x.ax = 0x7;
reg.x.cx = x1*modo;
reg.x.dx = x2*modo;
int86(0x33, ®, ®);
reg.x.ax = 0x8;
reg.x.cx = y1*modo;
reg.x.dx = y2*modo;
int86(0x33, ®, ®);
}
Un codigo para jugar a los barquitos:
#include <conio.h>
#include <stdlib.h>
const int NMAX=10; //numero maximo de filas y de columnas
const int NCASILLASBARCOS=4*1+3*2+2*3+1*4;// sumatoria de "cantidad de casillas de un barco" x "cantidad de barcos"
void clrscr(){
system("CLS");
}
/*
GRAFICAR_TABLERO:
Dibuja cualquiera de los tableros segun su contenido grafica "@"=agua "X"= tocado etc.
el parametro que le llega puede ser cualquier Tablero que es una matriz de 10x10
*/
void GRAFICAR_TABLERO(int T[NMAX][NMAX])
{
int i,j;
printf("\n\n ");
for (j=0;j<NMAX;j++)
{
printf("%2d",j);
}
printf("\n-----------------------\n");
for (i=0;i<NMAX;i++)
{
printf("%2d%c", i, char(179) );
for (j=0;j<NMAX;j++)
{
switch(T[i][j])
{
case 0: printf("%c%c", ' ', char(179)); break;//nada
case 1: printf("#%c", char(179)); break;//barco
case 2: printf("@%c", char(179)); break;//agua
case 3: printf("X%c", char(179)); break;//tocado
case 5: printf("H%c", char(179)); break;//se dibuja con H los barcos hundidos
}
}
printf("\n-----------------------\n");
}
printf("\n\n");
}
/*
HAY_ROCE:
Segun la ubicacion(nf.nc), si es vertical u horizontal(op), el tablero (la matriz) y el tamaño del barco
hace el calculo si choca un barco con otro o si choca con los bordes
devuelve verdadero(1) si toca con algo y falso(0) en caso contrario
*/
int HAY_ROCE(int nf,int nc,char op,int T[NMAX][NMAX],int tamanioBarco)
{
int roce,i,j;
roce=0;
if(op!='v')
{
if(nc+tamanioBarco>NMAX)
{
roce=1;
}
else
{
for (i=nf-1;((i<nf+2)&&(i<NMAX));i++)
{
for (j=nc-1;((j<tamanioBarco+nc+1)&&(j<NMAX));j++)
{
if(T[i][j]!=0)
{
roce=1;
}
}
}
}
}
else
{
if(nf+tamanioBarco>NMAX)
{
roce=1;
}
else
{
for (i=nf-1;((i<tamanioBarco+nf+1)&&(i<NMAX));i++)
{
for (j=nc-1;((j<nc+2)&&(j<NMAX));j++)
{
if(T[i][j]!=0)
{
roce=1;
}
}
}
}
}
if(roce)
{
printf("\nEl Barco se ha superpuesto con otro o sobrepasa los bordes,\nIntentelo nuevamente\n");
getch();
}
return roce;
}
/*
PONER_BARCO_EN_EL_TABLERO:
Segun el tamaño del barco(tamanioBarco) y el tablero que llega como parametro(T)
se agrega el barco ya sea vertical u horizontal siempre tomando como referencia el numero de filas
y numero de columnas
si es vertical
OXXX
si es horizontal
O
X
X
X
siendo O la posicion puesta con numero de filas(nf) y numero de columnas(nc)
*/
void PONER_BARCO_EN_EL_TABLERO(int tamanioBarco,int T[NMAX][NMAX],char jugador[NMAX])
{
int nc,nf,k;
char op;
do
{
clrscr();
printf("Tablero del %s",jugador);
GRAFICAR_TABLERO(T);
printf("Tama¤o del barco %d. Ingrese nro de fila y luego nro de columna\n",tamanioBarco);
scanf("%d",&nf);
scanf("%d",&nc);
printf("Ingresar v=Vertical o cualquier otro valor para Horizontal\n");
op=getch();
}
while(HAY_ROCE(nf,nc,op,T,tamanioBarco));
if (op=='v')
{
for(k=0;k<tamanioBarco;k++)
T[nf+k][nc]=1;
}
else
{
for(k=0;k<tamanioBarco;k++)
T[nf][nc+k]=1;
}
clrscr();
printf("El Barco del %s se ha cargado con exito quedo de la siguiente forma",jugador);
GRAFICAR_TABLERO(T);
getch();
}
/*
CARGAR_BARCOS
Solo llama varias veces a la funcion PONER_BARCO_EN_EL_TABLERO
llega como parametros el jugador y el tablero a llenar
*/
void CARGAR_BARCOS(char jugador[NMAX],int T[NMAX][NMAX])
{
PONER_BARCO_EN_EL_TABLERO(4,T,jugador);//barco de 4 casillas
PONER_BARCO_EN_EL_TABLERO(3,T,jugador);//barco de 3 casillas
PONER_BARCO_EN_EL_TABLERO(3,T,jugador);//barco de 3 casillas
PONER_BARCO_EN_EL_TABLERO(2,T,jugador);//barco de 2 casillas
PONER_BARCO_EN_EL_TABLERO(2,T,jugador);//barco de 2 casillas
PONER_BARCO_EN_EL_TABLERO(2,T,jugador);//barco de 2 casillas
PONER_BARCO_EN_EL_TABLERO(1,T,jugador);//barco de 1 casillas
PONER_BARCO_EN_EL_TABLERO(1,T,jugador);//barco de 1 casillas
PONER_BARCO_EN_EL_TABLERO(1,T,jugador);//barco de 1 casillas
PONER_BARCO_EN_EL_TABLERO(1,T,jugador);//barco de 1 casillas
}
////////////////////////////////////////////////////////
//////// COMIENZO DE LA SEGUNDA PARTE, J1 VS J2 ///
////////////////////////////////////////////////////////
/*
BARCOS_ALREDEDOR
Se le mandan las coordenadas del disparo y se serciora si alrededor hay alguna continuacion del barco
de ser asi devuelve verdadero si lo hay y falso de lo contrario
sirve mas que nada para saber si el barco se ha hundido
*/
int BARCOS_ALREDEDOR(int inicioFilas,int inicioColumnas,int Tablero[NMAX][NMAX],int TableroEnemigo[NMAX][NMAX])
{
int i,j;
int barcoAlrededor=0;
int nFilas=inicioFilas+3;
int nColumnas=inicioColumnas+3;
if(inicioFilas<0)
inicioFilas++;
if(inicioColumnas<0)
inicioColumnas++;
for (i=inicioFilas;((i<nFilas)&&(i<NMAX));i++)
{
for (j=inicioColumnas;((j<nColumnas)&&(j<NMAX));j++)
{
if((TableroEnemigo[i][j]==1)&&(Tablero[i][j]!=3))
{
barcoAlrededor=1;
}
}
}
return barcoAlrededor;
}
/*
GRAFICAR_REGLAS
Solo escribe los simbolos que se grafican en un tablero
*/
void GRAFICAR_REGLAS()
{
printf("\n\n");
printf("Simbologia\n");
printf("#: mi casillero\n");
printf("@: agua\n");
printf("X: barco que fue tocado\n");
printf("H: casilleros de barcos hundidos\n");
printf("\n\n");
}
/*
PINTAR_ZONA_HUNDIDO
Esta funcion lo que hace es cambiar valores de la tabla para que al graficar el tablero escriba
una "H" en el lugar de las "X" cuando el barco esta hundido
*/
void PINTAR_ZONA_HUNDIDO(int inicioI,int inicioJ,int Tablero[NMAX][NMAX])
{
//verificar a izquierda
while ((inicioI-1>=0)&&(Tablero[inicioI-1][inicioJ]==3))
inicioI--;
//verificar hacia arriba
while ((inicioJ-1>=0)&&(Tablero[inicioI][inicioJ-1]==3))
inicioJ--;
//pintar a derecha
while (Tablero[inicioI][inicioJ+1]==3)
{
Tablero[inicioI][inicioJ]=5;
inicioJ++;
}
//pintar hacia abajo
while (Tablero[inicioI+1][inicioJ]==3)
{
Tablero[inicioI][inicioJ]=5;
inicioI++;
}
Tablero[inicioI][inicioJ]=5;
}
/*
TURNO_JUGADOR
Esta funcion se encarga de llamar al resto de las funciones para que se pinte una interfaz, de esa forma el jugador podra
ingresar las coordenadas de disparo, lleva el control de las balas y de los tableros
*/
void TURNO_JUGADOR(int &balas,int MiTablero[NMAX][NMAX],int TableroAnotador[NMAX][NMAX],int TableroEnemigo[NMAX][NMAX],
char jugador[NMAX],char mensaje[50])
{
int nf,nc;
clrscr();
printf("%s\n\n",jugador);
GRAFICAR_REGLAS();
printf("Mi Tablero\n");
GRAFICAR_TABLERO(MiTablero);
printf("Tablero Anotacion de Barcos enemigos\n");
GRAFICAR_TABLERO(TableroAnotador);
printf("Ingrese fila y columna a disparar\n");
scanf("%d",&nf);
scanf("%d",&nc);
clrscr();
if (TableroEnemigo[nf][nc]==1)
{
TableroAnotador[nf][nc]=3;
if (!BARCOS_ALREDEDOR(nf-1,nc-1,TableroAnotador,TableroEnemigo))
{
printf("Barco Hundido!\n");
PINTAR_ZONA_HUNDIDO(nf,nc,TableroAnotador);
}
}
else
TableroAnotador[nf][nc]=2;
balas--;
printf("Quedan %d balas",balas);
GRAFICAR_TABLERO(MiTablero);
GRAFICAR_TABLERO(TableroAnotador);
printf("Presione una tecla para que juegue el siguiente jugador");
getch();
clrscr();
printf("Presione una tecla para comenzar tu turno");
getch();
}
/*
GANADOR
devuelve verdadero si en el tablero de anotacion se ha encontrado todos los casilleros con el valor que corresponde
a la "H" de hundidos como son
4 barcos de 1 casillero
3 barcos de 2 casilleros
2 barcos de 3 casilleros
1 barco de 4 casilleros
lo que da un total de NCASILLASBARCOS=20 si estan las 20 "H" significa que el jugador ha ganado y devuelve verdadero(1)
en caso contrario devuelve falso(0)
*/
int GANADOR(int T[NMAX][NMAX])
{
int i,j;
int cantidadDeHundidos=0;
for(i=0;i<NMAX;i++)
{
for(j=0;j<NMAX;j++)
{
if(T[i][j]==5)
{
cantidadDeHundidos++;
}
}
}
if (cantidadDeHundidos==NCASILLASBARCOS)
return 1;
else
return 0;
}
main()
{
system("MODE CON lines=45 cols=80");
system("COLOR 1F");
//balas de cada jugador
int balasJ1=10;
int balasJ2=10;
//Todos los tableros tienen 0 en cada posicion significa que no posee nada cargado
//Tableros del jugador 1
int J1TMisBarcos[NMAX][NMAX]= {0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,};
int J1TBarcosEnemigo[NMAX][NMAX]={0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,};
//Tablero del Jugador 2
int J2TMisBarcos[NMAX][NMAX]= {0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,};
int J2TBarcosEnemigo[NMAX][NMAX]={0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,};
char mensaje[20];
int turnoAlternado=1;//cambia a 1 y a 2 dependiendo el turno de cada jugador
CARGAR_BARCOS("Jugador 1",J1TMisBarcos);//llama a cargar para poner los barcos de jugador 1
CARGAR_BARCOS("Jugador 2",J2TMisBarcos);//llama a cargar para poner los barcos de jugador 1
while ((balasJ1!=0)&&(balasJ2!=0))
{
if (turnoAlternado==1)
{
//aca llama todo para que el jugador uno juegue una vez terminado cambia turnoAlternado para que la proxima le toque al jugador 2
TURNO_JUGADOR(balasJ1,J1TMisBarcos,J1TBarcosEnemigo,J2TMisBarcos,"Jugador 1",mensaje);
turnoAlternado=2;
if(GANADOR(J1TBarcosEnemigo))
balasJ2=0;
}
else
{
//aca llama todo para que el jugador dos juegue una vez terminado cambia turnoAlternado para que la proxima le toque al jugador 1
TURNO_JUGADOR(balasJ2,J2TMisBarcos,J2TBarcosEnemigo,J1TMisBarcos,"Jugador 2",mensaje);
turnoAlternado=1;
if(GANADOR(J2TBarcosEnemigo))
balasJ1=0;
}
}
clrscr();
if (balasJ1>balasJ2)
{
printf("EL GANADOR ES EL JUGADOR 1");
}
else
{
printf("EL GANADOR ES EL JUGADOR 2");
}
getch();
}
PROGRAMA PARA GRAFICAR LOCALIDADES EN UN ESPECTACULO
Realizar un circo que al ingresar cuantos asientos quiere comprar, me muestre el total de venta, cuantos asientos se vendieron y cual de las clases vendio mas, tomando en cuenta que hay 80 asientos vip(20),a=(30),b=(30)#include <stdio.h>
#include <stdlib.h>
char matriz[8][10];
int i,j;
void mostrar()
{
system("cls");
printf("\n P R E S E N T A C I O N E S C E N A R I O Y U B I C A C I O N E S \n");
for (i=0;i<6;i++){
printf(" ");
for (j=0;j<10;j++){
printf("%c%c%c%c%c%c%c", char(176), char(176), char(176), char(176), char(176), char(176), char(176));
}
printf("\n");
}
for (i=0;i<8;i++){
printf("%d", i);
printf("%c", char(179));
for (j=0;j<10;j++){
printf(" [ %c ]%c", matriz[i][j], char(179) );
}
printf("\n ");
for(int h=0; h<71; h++){
if (h%7 == 0) printf("%c", char(197));
else if (h%70 == 0) printf("%c", char(180));
else printf("%c", char(196));
}
printf("\n");
}
printf(" %c", char(179));
for (j=0;j<10;j++){
printf(" %d %c", j, char(179) );
}
printf("\n ");
printf("\n\n");
}/*fin del mostrar*/
void resultado(){
int vip=0, A=0, B=0;
for(i=0; i<8; i++){
for(j=0; j<10; j++){
if(matriz[i][j]=='O' && i<2) vip++;
if(matriz[i][j]=='O' && i>1 && i<5) A++;
if(matriz[i][j]=='O' && i>4 ) B++;
}}
printf("\nResumen Localidades vendidas:\nClaseVip = %2d\nClase A = %2d\nClase C = %2d", vip, A, B);
}/*fin de resultado*/
void cargar(){
char op;
do{
printf("Ingrese Fila a seleccionar (0 al 7): ");
scanf("%i", &i); fflush(stdin);
printf("Ingrese Columna a seleccionar (0 al 9): ");
scanf("%i", &j); fflush(stdin);
matriz[i][j]= 'O';
mostrar();
printf("Ingresará otra ubicacion?(S / N0)");
scanf("%c", &op); fflush(stdin);
}while(op != 'n' && op != 'N');
}/*fin del cargar*/
main() {
system("MODE CON lines=45 cols=80"); /*tamaño ventana consola*/
system("COLOR 1F"); /*1 azul F blanco brillante */
for(i=0; i<8; i++){/*inicializacion localidades*/
for(j=0; j<10;j++){
matriz[i][j]='L';
}}
mostrar();
cargar();
resultado();
getchar();
}