﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <description><![CDATA[Comments for Programmers' pets]]></description>
    <title><![CDATA[Comments for Programmers' pets]]></title>
    <link>http://dn.codegear.com/article/26428</link>
    <!-- source: http://dn.codegear.com/article/26428/feed-->
    <dc:date>2008-11-19T04:39:43-08:00</dc:date>
    <item>
      <description><![CDATA[// El siguiente programa efectua problema "Torres de Hanoi"// Usando el modo grafico de Turbo C++ 3.0// Funciones de validacion// Archivos de encabezado#include &lt;stdio.h&gt;#include &lt;conio.h&gt;#include &lt;iostream.h&gt;#include &lt;string.h&gt;#include &lt;dos.h&gt;#include &lt;ctype.h&gt;#include &lt;stdlib.h&gt;#include &lt;graphics.h&gt;#include &lt;math.h&gt;// Constantesconst int MAX_MOV    = 255; // Incluye posicion inicialconst int MAX_DISCOS = 7;const int NUM_TORRES = 3;const int MARGEN     = 100;const int ESCALA     = 5;const int SALIDA     = 2;// Tipos de datosstruct THanoiRec{  int desde,hasta;};enum bool {true,false};// Objetosclass THanoi {  public :    int        contador,ejey,discos,poste_1,poste_2,poste_3,contmov;    int        secuencia[MAX_MOV][NUM_TORRES][MAX_DISCOS];    THanoiRec  hanoiarray[MAX_MOV];    THanoi(int );    ~THanoi();    void escribir(int , int );    void mover_torre(int , int, int, int );    void hanoiproc(int );    void dibujar();    void run();};void THanoi::escribir(int desde, int hasta){  contador++;  hanoiarray[contador].desde = desde;  hanoiarray[contador].hasta = hasta;}void THanoi::mover_torre(int discos, int poste_1, int poste_2, int poste_3){  if (discos == 1)    escribir(poste_1,poste_3);  else    {      mover_torre(discos - 1,poste_1,poste_3,poste_2);      escribir(poste_1,poste_3);      mover_torre(discos - 1,poste_2,poste_1,poste_3);    }}void THanoi::hanoiproc(int discos){  contador = -1;  mover_torre(discos,1,2,3);}THanoi::THanoi(int num_discos){  int  i,j,k,temp,movimientos;  bool moved,siteddown;  // Iniciar variable global  discos = num_discos;  hanoiproc(discos);  // movimientos = 2^discos - 1;  movimientos = pow(2,discos) - 1;  // Iniciar matriz de secuencias  for (i = 0; i &lt; MAX_MOV; i++)    for (j = 0; j &lt; NUM_TORRES; j++)      for (k = 0; k &lt; MAX_DISCOS; k++)secuencia[i][j][k] = 0;  // Valores iniciales de secuencia  for (k = 0; k &lt; discos; k++)    secuencia[0][0][k] = discos - k;  // Generar arreglo de secuencia de movimientos  for (i = 1; i &lt;= movimientos; i++)    {      // Transladar datos de anterior secuencia      for (j = 0; j &lt; NUM_TORRES; j++)for (k = 0; k &lt; MAX_DISCOS; k++)  secuencia[i][j][k] = secuencia[i - 1][j][k];       // Buscar el elemento mas proximo diferente de cero       // desde el extremo de la torre hasta la base       j     = discos - 1;       moved = false;       while (moved == false) {   if (secuencia[i][hanoiarray[i - 1].desde - 1][j] != 0)     {       // Intercambiar datos       temp = secuencia[i][hanoiarray[i - 1].desde - 1][j];       secuencia[i][hanoiarray[i - 1].desde - 1][j]    = 0;       // Insertar disco encima del ultimo elemento       // o hasta el fondo de la torre       siteddown = false;       k         = discos - 1;       while (siteddown == false) {   if (secuencia[i][hanoiarray[i - 1].hasta - 1][k] != 0)     {       secuencia[i][hanoiarray[i - 1].hasta - 1][k + 1] = temp;       siteddown                                        = true;     }   else     {       k--;       if (k == -1) {   secuencia[i][hanoiarray[i - 1].hasta - 1][k + 1] = temp;   siteddown                                        = true; }     } }       moved = true;     }   else     {       if (j == -1) moved = true;       else j--;     } }    }}THanoi::~THanoi(){  // Cerrar el modo grafico  closegraph();}void THanoi::dibujar(){  int    i,j,x1,x2,y1,y2,radio;  char   *estado,*strcount;  bool   vacio;  COLORS color;  // Borrar fondo  if (contmov &gt; 0)    clearviewport();  // Dibujar Titulo  moveto(100,50);  setcolor(BROWN);  outtext(" TORRES DE HANOI");  setcolor(WHITE);  // Dibujar estado de la figura  itoa(contmov - 1,strcount,10);  strcpy(estado,"Movimiento #");  strcat(estado,strcount);  moveto(100,400);  outtext(estado);  moveto(100,450);  outtext("Digite cualquier tecla para continuar ...");  // Dibujar discos  for (i = 0; i &lt; NUM_TORRES; i++)    {      vacio = true;      for (j = 0; j &lt; discos; j++){   // Si existe numero, graficar disco   if (secuencia[contmov - 1][i][j] != 0)     {       radio = secuencia[contmov - 1][i][j]*ESCALA;       x1    = (getmaxx()/4)*(i + 1) - radio;       y1    = ejey - (radio/2) - (j + 1)*ESCALA;       x2    = (getmaxx()/4)*(i + 1) + radio;       y2    = ejey + (radio/2) - (j + 1)*ESCALA;       ellipse(x1 + (x2 - x1)/2,y1 + (y2 - y1)/2,0,360,x2 - x1,y2 - y1);       if ((secuencia[contmov - 1][i][j]) != WHITE) color = COLORS(secuencia[contmov - 1][i][j]);       else color = BLACK;      setfillstyle(SOLID_FILL,color);      // Rellenar lado izquierdo      floodfill(x1 + (x2 - x1)/2 - 1,y1 + (y2 - y1)/2 - 1,WHITE);      // Rellenar lado derecho      floodfill(x1+ (x2 - x1)/2 + 1,y1 + (y2 - y1)/2 + 1,WHITE);      vacio = false;     }}      setcolor(LIGHTBLUE);      if (vacio == false){ // Dibujar torres discontinuas  moveto((getmaxx()/4)*(i + 1),MARGEN);  lineto((getmaxx()/4)*(i + 1),y1);}      else{ // Dibujar torre continua  moveto((getmaxx()/4)*(i + 1),MARGEN);  lineto((getmaxx()/4)*(i + 1),ejey - (secuencia[0][0][MAX_DISCOS]*ESCALA)/2 - ESCALA);}      setcolor(WHITE);    }  contmov++;  getch();}void THanoi::run(){  int i,gdriver = DETECT,gmode,margen,tab,sangria;  // Escribir secuencia de movimientos  clrscr();  _setcursortype(_NOCURSOR);  textcolor(BROWN);  cprintf("\n  Movimientos para %d Discos",discos);  cout&lt;&lt;"\n  ---------------------------";  cout&lt;&lt;"\n";  textcolor(WHITE);  // Escribir secuencia de movimientos  margen  = 0;  tab     = 0;  sangria = 3;  for (i = 0; i &lt;= contador; i++)    { // Pasar a la siguiente columna      if (wherey() &gt; 48){  tab++;  margen += 13;  gotoxy(margen + sangria,5);}      elsegotoxy(margen + sangria,(i + 5) - 45*tab);      textcolor(RED);      cprintf("%d",i + 1);      textcolor(WHITE);      gotoxy((margen + sangria) + sangria,(i + 5) - 45*tab);      cout&lt;&lt;" : "&lt;&lt;hanoiarray[i].desde&lt;&lt;"-&gt;"&lt;&lt;hanoiarray[i].hasta;    }  getch();  _setcursortype(_NORMALCURSOR);  // Detectar modo grafico  initgraph(&amp;gdriver,&amp;gmode,"");  // Dibujar discos  ejey = getmaxy() - MARGEN*2 - secuencia[0][0][discos - 1];  // Dibujar secuencia  contmov = 1;  for (i = 0; i &lt;= contador + 1; i++)    dibujar();}// Declaracion de funcionesvoid datos();void sonido();char valcarnum(unsigned int ,unsigned int );int  valnumero(unsigned int );int  valnum(int , int , unsigned int );// Programa principalvoid main(){  int opcion;  while (opcion != SALIDA)    {       textmode(C4350);       clrscr();       cout&lt;&lt;"\n";       textcolor(BROWN);       cprintf("\n TORRES DE HANOI");       textcolor(WHITE);       cout&lt;&lt;"\n";       cout&lt;&lt;"\n MENU PRINCIPAL";       cout&lt;&lt;"\n";       cout&lt;&lt;"\n 1. Ingresar Datos.";       cout&lt;&lt;"\n";       cout&lt;&lt;"\n 2. Salir.";       cout&lt;&lt;"\n";       cout&lt;&lt;"\n Digite Opcion : ";       opcion = valnum(1,SALIDA,1);       switch (opcion){ case 1 : datos();   break;       };    }  // Restaurar la pantalla  clrscr();  textmode(C80);}// Implementacion de funcionesvoid datos(){  unsigned short int discos;  clrscr();  cout&lt;&lt;"\n";  textcolor(BROWN);  cprintf("\n  TORRES DE HANOI");  textcolor(WHITE);  cout&lt;&lt;"\n";  cout&lt;&lt;"\n  Ingresar Datos.";  cout&lt;&lt;"\n";  cout&lt;&lt;"\n  Digite Discos (M x "&lt;&lt;MAX_DISCOS&lt;&lt;"): ";  discos = valnum(1,MAX_DISCOS,1);  THanoi Hanoi(discos);  Hanoi.run();}void sonido(){  sound(500);  delay(50);  nosound();}char valcarnum(unsigned int contador, unsigned int maxlong){  unsigned int x,y;  char         caracter;  bool         correcto;  x        = wherex();  y        = wherey();  correcto = false;  // Ciclo de validacion de tipo  while (correcto == false)    { // Limpiar linea en curso      gotoxy(x,y);      clreol();      caracter = getch();      // Determinar si el caracter leido es numerico      if (((isdigit(caracter) != 0) &amp;&amp; (contador &lt; maxlong)) ||   ((caracter == '\b') &amp;&amp; (contador &gt; 0))            ||   ((caracter == '\r') &amp;&amp; (contador &gt; 0))) correcto = true;      else{  correcto = false;  sonido();}    }  if (caracter != '\r')    cout&lt;&lt;caracter;  return(caracter);}int valnumero(unsigned int maxlong){  char         caracter;  unsigned int numero,contador;  char         *cadena;  // Mientras no se digite &lt;enter&gt;, lea tecla  cadena   = "\0";  contador = 0;  do {    caracter = valcarnum(contador,maxlong);    // Corregir entrada    if (caracter == '\b')      {gotoxy(wherex(),wherey());contador--;cadena[contador] = '\0';      }    else      {if (caracter != '\r')  {    cadena[contador]     = caracter;    cadena[contador + 1] = '\0';    contador++;  }      }  } while ((caracter != '\r') &amp;&amp; (contador &lt;= maxlong));  numero = atoi(cadena);  return(numero);}int valnum(int min, int max, unsigned int maxlong){  unsigned int x,y,numero;  x = wherex();  y = wherey();  numero = max + 1;  // Ciclo de validacion de rango  while ((numero &lt; min) || (numero &gt; max))    { // Limpiar linea en curso      gotoxy(x,y);      clreol();      // Ciclo de validacion de tipo      numero = valnumero(maxlong);    }  return(numero);}]]></description>
      <title><![CDATA[This is my pet : Hanoi Towers Problem (Use Turbo C++ 3.0)]]></title>
      <managingEditor>
	 (Pablo Alejandro Perez Acosta)
</managingEditor>
      <guid isPermaLink="true">http://threads.codegear.com/threads/threads.exe/view?commentid=29787</guid>
      <dc:date>2001-08-30T14:06:19-07:00</dc:date>
      <pubDate>2001-08-30T14:06:19-07:00</pubDate>
      <source url="http://dn.codegear.com/article/26428/feed">Comments for Programmers' pets</source>
    </item>
    <generator>Atom 1.0 XSLT Transform v1 (http://atom.geekhood.net)</generator>
  </channel>
</rss>