Programas de A. Naya

Abel Naya: Mis 10 programas

Decimal a romano

/*
Programa que transforma un numero en número romano.
*/

#include <iostream>//cout cin
#include <stdlib.h>

using namespace std;

char datos[]= {'I','V','X','L','C','D','M'}; //datos

int main ()
{
  int num=4000;
  while(num<1 || num>3999) //debido a que los romanos no tienen '5000' el limite es 3999
    {
      cout<<"Introduce el numero, debe estar entre 0 y 4000 (no incluidos)"<<endl;
      cin>>num;
    }

  cout<<endl<<num<<" es: ";

  for(int i=4; i>0; i--)
    {
      int exp=1,prov;
      for(int j=0; j<i-1; j++) exp*=10; //potencia de 10

      prov=num/exp % 10; //digito en la posicion i

      switch(prov) //selector
        {
        case 1:
        case 2:
        case 3:
          for(int j=0; j<prov; j++) cout<<datos[i*2-2];
          break;
        case 4:
          cout<<datos[i*2-2]<<datos[i*2-1];
          break;
        case 5:
          cout<<datos[i*2-1];
          break;
        case 6:
        case 7:
        case 8:
          cout<<datos[i*2-1];
          for(int j=0; j<prov-5; j++) cout<<datos[i*2-2];
          break;
        case 9:
          cout<<datos[i*2-2]<<datos[i*2];
          break;
        }
    }
    cout<<endl<<endl;
    system("PAUSE");
  return 0;
}

DNI

/*
Programa que calcula el dato que falta en un dni tanto si es la letra como si es un numero
Lo que hace es comprobar todas las opciones posibles hasta que una sea correcta.
La letra se calcula haciendo numero.dni%23 con un orden preestablecido

Existen muchos programas de este tipo, pero éste no solo te dice la letra, te dice cualquier dígito que no sepas (solo uno, puesto que si no habria varias soluciones)
*/

#include <iostream> //cout y cin
#include <math.h> //pow

using namespace std;

int main()
{

  int numero,iletra; // variables
  char letra[]= {'t','r','w','a','g','m','y','f','p','d','x','b','n','j','z','s','q','v','h','l','c','k','e','t'}; //orden definido

  int numint[9]; //almacena los datos tipo int
  char numchar[9]; //almacena los mismos datos tipo char
  int calcular=10; //el indice del elemento a calcular

cout<<"Escribe el DNI con una '?' en el lugar que no sepas.\n Ejemplo: 12345?78a  12345678? (letras en minusculas)"<<endl;

  for(int i=0; i<9; i++) //para cada elemento del dni
    {
      cin>>numchar[i]; //almacena cada dato introducido tipo char
      if (numchar[i]=='?') calcular=i; //cuando encuentra el '?' lo marca en 'calcular'
      else if (numchar[i]<='9' && numchar[i]>='0') numint[i]=numchar[i]-'0'; //si es un numero almacena el numero en int
      else if (numchar[i]<='z' && numchar[i]>='a') numint[i]=numchar[i]-'a'; //si es una letra almacena el ascii en int
      else //si no es ninguno de ellos cancela el programa (para evitar problemas)
        {
          cout<<"Dato malo";
          return 0;
        }
    }

  for(int p=0; p<23; p++) //hay 23 combinaciones de letras y 10 de numeros, 23=max{23,10} ; p sera el dato que cambia
    {
      int provint=0; //entero provisional
      char provchar='?'; //caracter provisional

      for(int pp=0; pp<8; pp++) //para cada numero del dni
        {
          if(pp==calcular) numint[pp]=p%10; //si el numero es la incognita se coloca 'p' en su lugar
          provint+=numint[pp]*pow(10,(7-pp)); //para convertir en int el dni separado 12345678=1*10^7+2*10^6...
        }

      provint=provint%23;
      provchar=letra[provint]; //provchar contendra la letra que DEBERIA tener el dni

      if(calcular==8) numint[8]=p; //si la letra es la incognita se coloca el indice p

      if('a'+numint[8]==provchar) break; //si la letra que deberia tener es la misma que la que se ha obtenido se corta el bucle

    }

  cout<<"El digito que no conocias es el: '";
  ( calcular==8 ? cout<<char('a'+numint[8]) : cout<<numint[calcular] ); //si no se sabia la letra se imprime ella, y si no el numero
  cout<<"'\nEl numero completo es: ";
  for(int v=0; v<8; v++) cout<<numint[v]; //se imprime el numero completo
  cout<<char('a'+numint[8]);              //con la letra
return 0;
}

Cifrado/descifrado romano

/*
INPUT:
texto
numero

OUTPUT:
texto en  el que cada letra se ha desplazado en el alfabeto 'numero' veces

Opcional: si 'numero'=0 te muestra las 26 combinaciones
*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

#define LARGO 71
using namespace std;

char texto[LARGO],cadena[LARGO];
int posiciones;

int mueve(int numero)
{
  unsigned char prov;  //si no pones unsigned da errores (compruebalo)
  for(int i=0; i<LARGO; ++i)
    {
      if(cadena[i]>='a'&&cadena[i]<='z')
        {
          prov=cadena[i]+numero;
          while(prov>'z')prov=prov-26; //26 letras tiene el alfabeto
          cadena[i]=prov;
        }
      if(cadena[i]>='A'&&cadena[i]<='Z')
        {
          prov=cadena[i]+numero;
          while(prov>'Z')prov=prov-26; //26 letras tiene el alfabeto
          cadena[i]=prov;
        }
      if(cadena[i]>='0'&&cadena[i]<='9')
        {
          prov=cadena[i]+numero;
          while(prov>'9')prov=prov-10; //10 numeros existen
          cadena[i]=prov;
        }
    }

  return 0;
}

int main()
{

  cout<<"Para cifrar escribe el texto (sin espacios, puedes utilizar otro símbolo) y luego las posiciones (en positivo).\nIndica 0 para que salgan todas"<<endl;
  cin>>texto;
  cin>>posiciones;

  for(int i=0; i<LARGO; ++i)cadena[i]=texto[i]; //cadena=texto;
  if(posiciones!=0)mueve(posiciones);
  else
    {
      for(int i=1;i<=26;++i)
      {
        mueve(i);
        cout<<i<<"-"<<cadena<<endl;
        for(int i=0; i<LARGO; ++i)cadena[i]=texto[i]; //cadena=texto;

      }
    }
  cout<<endl<<cadena<<endl<<endl;

  system("PAUSE");
}

Deconfig

/*
Funcion que permite cambiar los valores de variables char[] dados por un archivo config.txt
En el archivo debe escribirse en una línea el valor inicial + '=' + valor que tomará. Todo seguido.
Si no se encuentra el valor o el fichero, el propio programa crea lo que necesita y lo inicializa (opcional: con valor dado por el usuario)
*/

#include <stdio.h> //FILE, print,scan...
#include <string.h> //strings

void deconfig(char* variable,char nombre[],char valorinicial[] = "") //variable que contendra el valor , nombre a buscar , inicializador si no se encuentra
{

  FILE *archivo; //archivo
  if( (archivo=fopen("config.txt","r+")) == NULL ){
    archivo=fopen("config.txt","w");
    fputs("Este es un ejemplo de fichero que utiliza la funcion config\n",archivo);
    fputs("Para usarlo debes escribir en alguna línea:\n",archivo);
    fputs("nombre_de_variable=valor_de_variable\n",archivo);
    fputs("Sin espacios entre los valores y el = (a no ser que quieras que esten)\n",archivo);
    fclose(archivo);
    deconfig(variable,nombre,valorinicial);
    return; //si no se encuentra se crea el archivo y se añade la variable mediante recursividad
  }

int MAX=100; // si se tienen nombres mas largos cambiar este parametro
  char cadena[MAX],antes[MAX],despues[MAX]; //variables

  while(1)
    {
      fgets(cadena,MAX,archivo); //coge una línea
      if(cadena[strlen(cadena)-1]=='\n') cadena[strlen(cadena)-1] ='\0'; //Evita el salto de linea

      int hasalido,i;
      hasalido=0;
      antes[0]='\0';
      despues[0]='\0';

      for(i=0; i<strlen(cadena); i++) //para cada valor de la cadena extraida
        {
          if(cadena[i]=='=') //si el caracter es '=' pasa a la segunda parte
            {
              antes[i]='\0'; //finaliza antes
              hasalido=i+1; //posicion tras la que debe empezar en la segunda parte
              continue;
            }
          if(hasalido==0) //primera parte
            {

              antes[i]=cadena[i]; //copia la cadena
            }
          else //segunda parte
            {
              despues[i-hasalido]=cadena[i]; //copia la cadena desde el '='
            }
        }

      antes[i]='\0'; //finaliza la cadena si no se ha encontrado el '='
      despues[i-hasalido]='\0'; //finaliza la cadena

//fscanf(archivo,"%s=%s\n",antes,despues); //no funciona

//printf("\n%s==%s/%s/%s\n",antes,despues,cadena,nombre);

      if(strcmp(antes,nombre)==0)//si es lo que buscabamos
        {
          strcpy(variable,despues);//cambia el valor a lo extraido
          //printf("\n%s==%s/%s/%s\n",antes,despues,cadena,nombre);
          fclose(archivo);
          return;
        }

      //printf("siguiente\n");

      if(feof(archivo))//si se llega al final del fichero se crea la variable en el fichero
        {
          fprintf(archivo,"\n-Variable autogenerada-\n%s=%s\n",nombre,valorinicial); //Puedes omitir o cambiar el texto por el que te interese
          strcpy(variable,valorinicial);
          fclose(archivo);
          return;
        }
    }

  return;//por si acaso, en principio el programa nunca deberia llegar aqui
}

/*

Uso de la funcion:
void deconfig(char* variable,char nombre[],char valorinicial[] = "")

Entradas:
  -variable: lugar donde se almacenará el resultado obtenido
  -nombre: nombre a buscar (lo que va antes del igual) en el archivo
  -valorinicial: En el caso de que no se encuentre, el valor que tomara la variable y lo que aparecera en el fichero(despues del igual). Este parámetro es opcional y en su defecto tomara el string NULL ""

Salidas:
  -Ninguna.

*/

int main()
{
  char unvalor[100]="holahola",dosvalores[20]="adiosadios";

  deconfig(unvalor,"nombre1","defecto");
  deconfig(dosvalores,"nombre2");

  printf("-%s-%s-",unvalor,dosvalores);

}

3Draw

/*

Versión aparte del programa que permite dibujar en la pantalla.
Ahora puedes pulsar las teclas AvPag y RePag para cambiar en la tercera dimensión.
Lo que deberia verse por detras aparece sombreado.

*/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h> //Para getch
using namespace std;

#define longitud 10

int dibujo[longitud][longitud][longitud]={0};

//definicion de los caracteres utilizados
#define puntos 5
#define difuminado (char)177

//definicion de las teclas utilizadas
#define arriba 72
#define abajo 80
#define derecha 77
#define izquierda 75
#define pintar_borrar 32 //barra espaciadora
#define avpag 81
#define repag 73

int d3=0;
int x=0,y=0; //posicion pincel

void dibujar() //redibuja el lienzo
{
  system("cls"); //borra pantalla

  for(int j=0; j<longitud ; j++)
    {
      for(int i=0; i<longitud ; i++)
        {
          if(x==i && y==j) //dibuja el pincel sin sobreescribir la variable dibujo
            {
              cout<<(char)puntos;
            }
          else
            {
              if(dibujo[d3][j][i]) cout<<(char)219;
              else
              {
                int rec = d3;
                while(rec>=0)
                {
                  if(dibujo[rec][j][i]) cout<<difuminado,rec=-2;
                  rec--;
                }
                if(rec==-1)cout<<" ";
              }

            }
        }
      cout<<endl;//si el lienzo coincide con el tamaño de la pantalla es posible que tengas que quitar esto
    }

  cout<<"    V:"<<(int)dibujo[d3][y][x]<<" x:"<<x<<" y:"<<y<<" 3d:"<<d3; //para comprobar errores
}

int main()
{

char tecla;
cout<<"Programa que permite pintar en la pantalla"<<endl<<endl
      <<"-Para pintar pulsa la barra espaciadora, pulsala de nuevo para borrar"<<endl
      <<"-Usa las flechas para mover el 'pincel' por la pantalla"<<endl
      <<"-Para cambiar entre las dimensiones pulsa las teclas AvPag y RePag"<<endl
      <<"-Pulsa escape para salir, pero cuidado pues se perdera el dibujo"<<endl<<endl
      <<"El parpadeo es normal (no se como quitarlo)"<<endl<<endl<<endl<<endl
      <<"Pulsa una tecla para seguir...";
      getch();

 while(1)
    {
tecla=getch();

switch(tecla) //analiza la tecla
        {
        case arriba:
          y>0 ? y-- : y=longitud-1; //gracias al ? podemos comprimir el codigo en una línea: mueve el pincel hacia arriba, y si esta en la cima lo pone al final
          break;
        case abajo:
          y<longitud-1 ? y++ :y=0;
          break;
        case derecha:
          x<longitud-1 ? x++ :x=0;
          break;
        case izquierda:
          x>0 ? x-- :x=longitud-1;
          break;
        case avpag:
         d3<longitud-1 ? d3++ : d3=0;
        break;
        case repag:
          d3>0 ? d3-- : d3=longitud-1;
        break;

        case pintar_borrar:
          dibujo[d3][y][x]= (dibujo[d3][y][x] ? 0 : 1);
          break;
        case 27: //tecla escape
          return 0;
          break;

        default://Las flechas activan dos getch() por lo que de esta forma nos evitamos redibujar el lienzo dos veces (y si se pulsa una tecla falsa tampoco se redibuja)
          continue;
        }
      dibujar(); //actualiza la pantalla con los cambios realizados
    }
}

Bingo

/*
Juego del bingo.

Este es uno de los primero programas que hice cuando empezé a aprender C, así que es posible que determinadas funciones puedan ser reconsruidas con otras mñas complejas. Pero como funciona y me hace ver lo que hacía, lo dejo tal cual.
*/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

using namespace std;

int i,j,numero,total=0,ch;
string matriz[100]; //contiene todas las casillas de la tabla (valor inicial en main)
char tecla,numchar[3]="  ";

int imprimirtabla(); //definida mas adelante

int main()
{

//matriz[0]="XX";
  matriz[0]="\261\261";
  for(i= 1; i < 100; i++)
    {
      matriz[i]="  ";
    };

  while(1==1)
    {
      imprimirtabla();
      if (total>=99)
        {
          cout<<"FIN";
          getch();
          return 0;
        };//evita el desbordamiento
      tecla=getch();

      if (tecla==32)  //tecla espacio
        {
          numero=0;
          while(matriz[numero]!="  ")
            {
              numero=1+(rand() %99);
            }

          if (numero<10)
            {
              sprintf(numchar,"0%d",numero);
            }
          else
            {
              sprintf(numchar,"%d",numero);
            };
          matriz[numero]=numchar;
          total++;
        };
      if (tecla==13)  //tecla enter
        {
          //menu
        };
      if (tecla==27)
        {
          return 0;
        }; //tecla escape

    }
  return 0;

};

int imprimirtabla()
{

  system("cls");

  cout<<"*************BINGO*************                -"<<numchar<<"-"<<endl<<endl;

  cout<<char(218)<<char(196)<<char(196);
  for(ch=0; ch<9; ch++)cout<<char(194)<<char(196)<<char(196);
  cout<<char(191)<<endl;

  for(i=9; i>=0; i=i-1)
    {
      //cout<<"-------------------------------"<<endl; //31 barras
      if(i!=9)
        {
          cout<<char(195)<<char(196)<<char(196);
          for(ch=0; ch<9; ch++) cout<<char(197)<<char(196)<<char(196);
          cout<<char(180)<<endl;
        }

      for(j=0; j<=9; j++)
        {
          cout<<char(179);
          cout<<matriz[i*10+j];
        };
      cout<<char(179)<<endl;

      // if(i=)

    };
//cout<<"-------------------------------"<<endl;
  cout<<char(192)<<char(196)<<char(196);
  for(ch=0; ch<9; ch++)cout<<char(193)<<char(196)<<char(196);
  cout<<char(217)<<endl;
}

Conversor

/*
Este programa lo hice a principio de curso.
Es un poco lioso, lo se; pero me costó bastante y funciona (creo) así que lo dejo como está.
*/

/*
funciones útiles
string a int -->   strtol ("char",NULL,-base en la que esta escrito-)
int a string -->   cout<<hex<<numero;
                   itoa ( numero, cadena_final, base );
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <cstring>

using namespace std;

bool resultado_a_memoria = true;
bool entrada_de_memoria = false;

char proceso[25];

char *hexabin(char operacion[],char operando1[],char operando2[],char output[])
{

char caracteres[9],provisional[9];
int num;

//----------------OPERATE

  //operacion
  if(strcmp(operacion,"add")==0)strcat(proceso,"00");
  if(strcmp(operacion,"sub")==0)strcat(proceso,"01");
  if(strcmp(operacion,"mul")==0)strcat(proceso,"10");
  if(strcmp(operacion,"div")==0)strcat(proceso,"11");

//operandos
bool hacerlo = true;

//operando1
if(entrada_de_memoria)
{
  if(strcmp(operando1,"lugara")==0){strcat(proceso,"100000000");hacerlo=false;}
  if(strcmp(operando1,"lugarb")==0){strcat(proceso,"100000001");hacerlo=false;}
  if(hacerlo)strcat(proceso,"0");
}
if(hacerlo)
{
  num = strtol(operando1,NULL,16);
itoa(num,caracteres,2);
while(strlen(caracteres)<8)
      {
        strcpy(provisional,"0");
        strcat(provisional,caracteres);
        strcpy(caracteres,provisional);
        //cout<<" -"<<caracteres<<"- ";
      }
strcat(proceso,caracteres);
}

caracteres={0,0,0,0,0,0,0,0,0};//reiniciar la variable

hacerlo=true;
//operando2
if(entrada_de_memoria)
{
  if(strcmp(operando2,"lugara")==0){strcat(proceso,"100000000");hacerlo=false;}
  if(strcmp(operando2,"lugarb")==0){strcat(proceso,"100000001");hacerlo=false;}
  if(hacerlo)strcat(proceso,"0");
}
if(hacerlo)
{

num = strtol(operando2,NULL,16);
itoa(num,caracteres,2);
while(strlen(caracteres)<8)
      {
        strcpy(provisional,"0");
        strcat(provisional,caracteres);
        strcpy(caracteres,provisional);
        //cout<<" -"<<caracteres<<"- ";
      }
strcat(proceso,caracteres);
}

//resultado a memoria
if(resultado_a_memoria)
{
  if(strcmp(output,"lugara")==0) strcat(proceso,"0");
  if(strcmp(output,"lugarb")==0) strcat(proceso,"1");
}

//-----------------OUTPUT
while(strlen(proceso)<24)strcat(proceso,"0");

return proceso;

}

char *binahex(char binario[25])
{

char hexastring[9],caracteres[3],provisional[3];
int hexanum,i=0;

//--------------------OPERATE

strcpy(proceso,"Ox");
for(i=0;i<8;i++){hexastring[i]=binario[i];}
hexanum=strtol(hexastring,NULL,2);
itoa(hexanum,caracteres,16);
while(strlen(caracteres)<2)
      {
        strcpy(provisional,"0");
        strcat(provisional,caracteres);
        strcpy(caracteres,provisional);
        //cout<<" -"<<caracteres<<"- ";
      }

strcat(proceso,caracteres);

strcat(proceso," Ox");
for(i=0;i<8;i++){hexastring[i]=binario[i+8];}
hexanum=strtol(hexastring,NULL,2);
itoa(hexanum,caracteres,16);
while(strlen(caracteres)<2)
      {
        strcpy(provisional,"0");
        strcat(provisional,caracteres);
        strcpy(caracteres,provisional);
        //cout<<" -"<<caracteres<<"- ";
      }
strcat(proceso,caracteres);

strcat(proceso," Ox");
for(i=0;i<8;i++){hexastring[i]=binario[i+16];}
hexanum=strtol(hexastring,NULL,2);
itoa(hexanum,caracteres,16);
while(strlen(caracteres)<2)
      {
        strcpy(provisional,"0");
        strcat(provisional,caracteres);
        strcpy(caracteres,provisional);
        //cout<<" -"<<caracteres<<"- ";
      }
strcat(proceso,caracteres);

return proceso;

}

int main ()
{

char siono;
cout<<"Quieres que se puedan introducir datos de memoria? (s-si)";
cin>>siono;
entrada_de_memoria = (siono=='s');
cout<<endl<<"Quieres que el resultado se pase a memoria? (s-si)";
cin>>siono;
resultado_a_memoria = (siono=='s');
cout<<endl<<endl;
char a[4],b[7],c[7],d[7];

//---------------------INPUT
  cout<<"Introduce los datos:"<<endl<<
  " no debes escribir '0x' \n las variables son de la forma lugara,lugarb \n las operaciones iniciales van en minuscula (add, sub, mul, div)"<<endl;
  cin>>a>>b>>c;
if(resultado_a_memoria)cin>>d;

char resultado[25];
strcpy(resultado,hexabin(a,b,c,d));
cout<<"Binario: "<<resultado<<endl;

cout<<"Hexadecimal: "<<binahex(resultado)<<endl;
  return 0;
}

Ahorcado

/*
Juego del ahorcado
*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

#define DIM 30 //longitud máxima frase
#define enie -92 //ñ

struct structfrase //realmente no haria falta, pero bueno. Mas chulo
{
  char vis[DIM]; //almacenara la frase real
  char oc[DIM]; //almacenara la frase que se escribirá por pantalla
} frase;

using namespace std;

int main()
{

  bool seguir=true;
  while(seguir) //entrada de la frase
    {
      system("CLS");
      cout<<"Escribe la frase que adivinara tu compa"<<(char)enie<<"ero. \nUsa solo minusculas. \nMaximo "<<DIM<<" caracteres\n-->";
      fflush(stdin); //borra el buffer
      fgets (frase.vis, DIM, stdin); //lee toda una línea, cin lee solo una palabra
      for(int i=0; i<DIM; i++)
        {
          if(frase.vis[i]=='\0')
            {
              frase.oc[i]='\0';  //fin de cadena = terminar
              break;
            }
          else if(frase.vis[i]=='\n')
            {
              frase.vis[i]='\0';
              frase.oc[i]='\0';  //salto de linea=terminar
              break;
            }
          else if( frase.vis[i]>='a' && frase.vis[i]<='z')
            {

              frase.oc[i]=22; //letra OK
            }
          else if(frase.vis[i]==enie)
            {
              frase.oc[i]=22;  //la ñ OK
            }
          else if(frase.vis[i]==' ')
            {
              frase.oc[i]=' '; // espacio permitido
            }
          else
            {
              frase.vis[i]=frase.oc[i]=' ';  //caracter ilegal = espacio
            }

        }

      cout<<"La frase que se usara es: \n-->"<<frase.vis<<"<--"<<"\nEs correcta? Si lo es pulse ENTER, si no otra tecla";
      if(getch()==13) seguir=false; //por si se ha metido mal
    }

//------------inicio programa en si-------------

  int fallos = 0; //fallos cometidos
  char letrasfalladas[28]="                           "; //lista con un hueco para cada letra ordenada alfabeticamente (26) + la ñ + \0 que va al final
  bool igualess=false; //para saber si ya has acertado la frase
  bool falloo=false;  //para no contar dos veces el mismo fallo
  char tecla;

//inicializa oculto

  while(1)
    {
      system("CLS");

      cout<<"    "<<frase.oc<<" "<<endl<<endl<<endl;

//dibujito
{

      if(fallos>1)
        {

          if(fallos>2)
            {
              cout<<"    "<<(char)218<<"---------";
              if(fallos>3)
                {
                  cout<<(char)191;
                }
            }
          else
            {
              cout<<"    |";
            }

          cout<<endl<<"    |";

          if(fallos>3)
            {
              cout<<"         |";
            }

          cout<<endl<<"    |";

          if(fallos>4)
            {
              cout<<"         "<<(char)1;
            }

          cout<<endl<<"    |";

          if(fallos>6)
            {
              cout<<"        "<<(char)28;
            }
          else
            {
              cout<<"         ";
            }

          if(fallos>5)
            {
              cout<<"|";
            }
          if(fallos>7)
            {
              cout<<(char)170;
            }

          cout<<endl<<"    |";
          if(fallos>8)
            {
              cout<<"         |";
            }
          cout<<endl<<"    |";
          if(fallos>9)
            {
              cout<<"        /";
            }
          if(fallos>10)
            {
              cout<<" \\";
            }
          cout<<endl<<"    |";
          cout<<endl<<"    |";
          cout<<endl<<"----"<<(char)193<<"----"<<endl;
        }
      else
        {
          cout<<"\n\n\n\n\n\n\n\n";
          if(fallos>0)
            {
              cout<<"---------"<<endl;
            }
          else
            {
              cout<<endl;
            }
        }

}
//fin dibujito

      cout<<endl<<"Fallos: "<<fallos<<endl<<"Letras falladas: "<<letrasfalladas<<endl;

      if(igualess) //si son iguales...
        {
          cout<<endl<<"Enhorabuena, lo has adivinado"<<endl;
          system("Pause");
          return 0;
        }
      if(fallos>10) //si hay muchos fallos...
        {
          cout<<endl<<"Ooo, has fallado mas de 10 veces. Has perdido"<<endl;
          system("Pause");
          return 0;
        }

      tecla=getch();

      igualess=true; //inicializa
      falloo=true;

      for(int i=0; frase.vis[i]!='\0'; i++) //comprueba en cada caracter si se ha acertado o no
        {
          if(frase.vis[i]==tecla)
            {
              frase.oc[i]=tecla;//si se acierta se hace la letra visible
              falloo=false;
            }
          if(frase.vis[i]!=frase.oc[i]) igualess=false;
        }

      if(falloo && letrasfalladas[tecla-'a']==' ' ) //si se ha fallado...
        {
          fallos++;
          letrasfalladas[tecla-'a']=tecla;
        }
      if(falloo && letrasfalladas[26]==' ' && tecla==enie) //idem con la ñ
        {
          fallos++;
          letrasfalladas[26]=tecla;
        }
    }
}

Une-puntos

/*
Programa que permite 'dibujar' en la pantalla. Utiliza las flechas para moverte y + - para pintar/borrar
Debido a que el programa tiene que borrar la pantalla y redibujarla tarda bastante, pero al menos de momento no conozco otra manera.

Este programa es un excelente ejemplo de proyecto, en el cual se pueden separar las funciones, los defines y demás;
sin embargo de esa manera no podría enviarlo (se perderían los enlaces a los archivos) por ello he preferido meterlo todo en un archivo
*/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h> //Para getch
#include <string.h>

//Definicion del tamaño del lienzo
#define ancho 79
#define largo 24

//definicion de los caracteres utilizados
#define puntos 177

#define patrones 5
char palos[patrones][17]= {{255,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219},
  {255,250,179,196,192,179,179,218,195,196,217,196,193,191,180,194,197},
  {255,250,186,205,200,186,186,201,204,205,188,205,202,187,185,203,206},
  {255,197,194,180,191,193,196,217,250,195,218,179,250,192,250,250,250},
  {255,206,203,185,187,202,205,188,250,204,201,186,250,200,250,250,250}
}; //toda esta maraña de numeros corresponde a los diferentes chars a utilizar, el primer indice es el patron, el segundo es el caracter

int patron=0;

//definicion de las teclas utilizadas
#define arriba 72
#define abajo 80
#define derecha 77
#define izquierda 75
#define pintar_borrar 32 //barra espaciadora
#define guarda 's'
#define carga 'l'
#define ayuda 'h'

using namespace std;

int lienzo[largo][ancho]; //lienzo

int x=1,y=1; //posicion pincel

void dibujar(); //redibuja el lienzo
void cargar();
void guardar();
void ayudar() //ayuda en pantalla
{
  system("CLS");
  cout<<"Programa que permite pintar en la pantalla, version 2.2"<<endl<<endl
      <<"-Para pintar pulsa la barra espaciadora, pulsala de nuevo para borrar"<<endl
      <<"-Usa las flechas para mover el 'pincel' por la pantalla"<<endl
      <<"-Para cambiar entre los diferentes patrones pulsa los numeros del 1 al "<<patrones<<endl
      <<"-Pulsa "<<ayuda<<" para mostrar otra vez este mensaje."<<endl
      <<"-Pulsa "<<carga<<" para cargar un lienzo guardado en un archivo."<<endl
      <<"-Pulsa "<<guarda<<" para guardar el lienzo en un archivo."<<endl
      <<"-Pulsa escape para salir."<<endl
      <<"El parpadeo es normal (no se como quitarlo)"<<endl<<endl<<endl<<endl
      <<"Pulsa una tecla para seguir...";
      getch();
}
int main2();
void alsalir()
{
  system("CLS");
  cout<<"Seguro que quieres salir?\nSe perderan los datos no guardados. (s-si)";
  if(getch()=='s') return; else main2();
  alsalir();
}

int main()
{

atexit(alsalir);

  for(int i=0; i<ancho; i++) for(int j=0; j<largo; j++) lienzo[j][i]=-1 ; //prepara el lienzo

  ayudar();

  main2();
}

int main2()
{
  dibujar();
  char tecla; //almacenara la tecla pulsada
  while(1)
    {

      tecla=getch();

      switch(tecla) //analiza la tecla
        {
        case arriba:
          y>1 ? y-- : y=largo-2; //gracias al ? podemos comprimir el codigo en una línea: mueve el pincel hacia arriba, y si esta en la cima lo pone al final
          break;
        case abajo:
          y<largo-2 ? y++ :y=1;
          break;
        case derecha:
          x<ancho-2 ? x++ :x=1;
          break;
        case izquierda:
          x>1 ? x-- :x=ancho-2;
          break;
        case pintar_borrar:
          if(lienzo[y][x]==-1)
            {
              //en este caso pinta
              lienzo[y][x]=0;
              if(lienzo[y+1][x]!=-1) lienzo[y+1][x]+=1,lienzo[y][x]+=4 ;
              if(lienzo[y][x-1]!=-1) lienzo[y][x-1]+=2,lienzo[y][x]+=8 ;
              if(lienzo[y-1][x]!=-1) lienzo[y-1][x]+=4,lienzo[y][x]+=1 ;
              if(lienzo[y][x+1]!=-1) lienzo[y][x+1]+=8,lienzo[y][x]+=2 ;

            }
          else
            {
              //en este caso borra
              lienzo[y][x]=-1;

              if(lienzo[y+1][x]!=-1) lienzo[y+1][x]-=1 ;
              if(lienzo[y][x-1]!=-1) lienzo[y][x-1]-=2 ;
              if(lienzo[y-1][x]!=-1) lienzo[y-1][x]-=4 ;
              if(lienzo[y][x+1]!=-1) lienzo[y][x+1]-=8 ;
            }
          break;

        case ayuda:
          ayudar();
          break;
        case carga:
          cargar();
          break;
        case guarda:
          guardar();
          break;

        case 27:
          return 0;
          break;

        default://Las flechas activan dos getch() por lo que de esta forma nos evitamos redibujar el lienzo dos veces (y si se pulsa una tecla falsa tampoco se redibuja)
          if(tecla>'0' && tecla<=patrones+'0') patron=tecla-'0'-1; //los patrones
          else continue;

        }
      dibujar(); //actualiza la pantalla con los cambios realizados
    }

}
/* NOTA:
Existe la función gotoxy(a,b) pero no es estandar y no existe en muchos compiladores (en concreto en el que yo utilizo)
*/

void cargar()
{
  system("CLS");
  cout<<"Cargar archivo:"<<endl<<"Escribe el nombre del fichero (maximo 20 caracteres)"<<endl<<"Se sobreescribira el dibujo actual"<<endl<<"Escribe 'no' para cancelar"<<endl<<"-->";
  char nombre[20];

  fflush(stdin);
  cin>>nombre;
  fflush(stdin);
  if(!strcmp(nombre,"no"))return;

  FILE* archivo;
  if((archivo=fopen(nombre,"rb"))==NULL){cout<<"El archivo no se ha podido cargar.";getch(); return;}
  for(int i=0;i<largo;i++)fread(lienzo[i],sizeof(int),ancho,archivo);

  fclose(archivo);
  cout<<"El archivo se ha cargado correctamente.";
  getch();
}
void guardar()
{
  system("CLS");
  cout<<"Guardar archivo:"<<endl<<"Escribe el nombre del fichero (maximo 20 caracteres)"<<endl<<"Se sobreescribira el existente"<<endl<<"Escribe 'no' para cancelar"<<endl<<"-->";
  char nombre[20];

  fflush(stdin);
  cin>>nombre;
  fflush(stdin);
  if(!strcmp(nombre,"no"))return;

  FILE* archivo;
  if((archivo=fopen(nombre,"wb"))==NULL){cout<<"El archivo no se ha podido guardar.";getch(); return;}
  for(int i=0;i<largo;i++)fwrite(lienzo[i],sizeof(int),ancho,archivo);
  fclose(archivo);
  cout<<"El archivo se ha guardado correctamente.";
  getch();
}

void dibujar() //redibuja el lienzo
{
  system("cls"); //borra pantalla

  for(int j=0; j<largo ; j++)
    {
      for(int i=0; i<ancho ; i++)
        {
          if(x==i && y==j) //dibuja el pincel sin sobreescribir la variable lienzo
            {
              cout<<(char)puntos;
            }
          else
            {
              if(patron>=patrones || j>=largo || i>=ancho) cout<<"ERROR GRAVE";
              cout<<palos[patron][lienzo[j][i]+1 ];
            }
        }
      cout<<endl;//si el lienzo coincide con el tamaño de la pantalla es posible que tengas que quitar esto
    }

  for(int prov=0; prov<patrones; prov++) //pinta el numero de patrones y cual esta activado
    {
      cout<<(prov==patron ? ">" : prov==patron+1 ? "<" : " ") //sucesion de if/else con ?:
          <<prov+1;
    }
  cout<<(patron==patrones-1 ? "<" : " ") //para el ultimo patron
      <<"      "<<ayuda<<"-ayuda";

  //cout<<"    -"<<lienzo[y][x]; //para comprobar errores
}

Crypt/Decrypt

/*
Programa que sirve para encryptar archivos (aunque de una forma muy sencilla)
Para encryptarlos:
  -Selecciona los archivos y arrástralos sobre el ejecutable (.exe)

Para desencriptarlos:
  -$$$$
  Adivínalo.

Mis 9 programas (puesto que este es el décimo) estan comprimidos. De esta manera solo alguien que conozca C puede descomprimirlos. 🙂
*/

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define coche 28
#define fprintf(X,Y) fprintf(X,"%c",Y)

using namespace std;

int main(int argc, char** argv)
{

  if(argc>1)
    {
      //cout<<(int)argv[1][0];
      if(argv[1][0]>21&&argv[1][0]<23)
        {
          FILE *ent,*sal;
          ent=fopen("archivos.crypt","r");
           char c=fgetc(ent);
          while(!feof(ent))
            {
              char asdf[100];
int asdfg =0;
while((c=fgetc(ent))!=(('\n'+coche)%256)) {asdf[asdfg]=(c-coche)%256;asdfg++;};
asdf[asdfg]='\0';
              //fscanf(ent,"%s\n",asdf);
              sal=fopen(asdf,"w");
              c=fgetc(ent);
              while (c!=(coche+coche)%256)
                {
                  fprintf(sal,(c-22+argv[1][0]-coche)%256);
                  c=fgetc(ent);
                  //cout<<(char)(256+c);
                }
              fclose(sal);
              c=fgetc(ent);
            }
          fclose(ent);
          return 0;
        };
      if(strlen(argv[1])>3)
        {
          printf("Desea encriptar estos archivos:\nCuidado, se sobreescribiran los archivos ya encryptados si existen (s-si) \n\n");
          for(int i=1; i<argc; i++) printf("%s\n",argv[i]);
          if(getchar()=='s')
            {
              FILE *entrada,*salida;
              salida=fopen("archivos.crypt","w");
              for(int i=1; i<argc; i++)
                {
                  fprintf(salida,coche);
                  entrada=fopen(argv[i],"r");
                  char asdf[100];
                  int j,k;
                  for(k=0,j=0; argv[i][j]!='\0'; j++,k++)
                    {
                      if(argv[i][j]=='\\')k=-1;
                      else asdf[k]=argv[i][j];
                    }
                  asdf[k]='\0';
                  for(int l=0;l<k;l++)
                  fprintf(salida,(asdf[l]+coche)%256);
fprintf(salida,('\n'+coche)%256);
                  unsigned char c;
                  c=fgetc(entrada);
                  while(!feof(entrada))
                    {
                      fprintf(salida,(c+coche)%256);//256-
                      c=fgetc(entrada);
                    }
                  fprintf(salida,(coche+coche)%256);
                  fclose(entrada);
                }
              fclose(salida);
            };
        }
    }

  //system("PAUSE");
  return 0;
}
Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s