SABERMASJUSTODARACT
SABERMASJUSTODARACT Por una Facultad de provecho a la comunidad

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;
}

En este main podríamos escribir un código entre el primer corchete y el system("PAUSE") y lo ejecutaría en forma similar al TC++, pero como ya tengo un código hecho, voy a borrarlo todo y pegar el código mío

#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();
}

Este código me permite ingresar 15 valores entre -10 y +20 y los grafica mediante una linea, pero para que funcione antes tenemos que poner los links al proyecto para lo que nos vamos a la solapa proyecto, alli al submenú Opciones de proyecto y alli en la pestaña Argumentos en la casilla derecha ponemos
-lbgi
-lgdi32
-lcomdlg32
-luuid
-loleaut32
-lole32
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

Un codigo de ejemplo:
#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, &reg,&reg );
    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, &reg, &reg);
}


/*************************************************/
/* 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, &reg, &reg);
}


/*************************************************/
/* 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, &reg, &reg);
    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, &reg, &reg);
    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, &reg, &reg);
}


/*************************************************/
/* 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, &reg, &reg);
    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, &reg);
    reg.x.ax = 0x8;
    reg.x.cx = y1*modo;
    reg.x.dx = y2*modo;
    int86(0x33, &reg, &reg);
}

 

Un codigo para jugar a los barquitos:

#include <stdio.h>
#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();

}    
 

 Seguir-->

 

 

Este sitio web fue creado de forma gratuita con PaginaWebGratis.es. ¿Quieres también tu sitio web propio?
Registrarse gratis