Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: cypascal en 30 Abril 2013, 00:12 am



Título: [C] Chonificador (Pasa de legible a Choni)
Publicado por: cypascal en 30 Abril 2013, 00:12 am
Bueno, pues como nunca se sabe cuando vamos a necesitar escribir como un auténtico Choni, y como aprender Choni es muy complicado y puede causar problemas secundarios, dejo el siguiente programa para facilitaros esa tarea comunicativa, que tan difícil puede resultar.

Por si alguien no sabe que es un choni, para eso está la Frikipedia:
http://www.frikipedia.es/friki/Jessi (http://www.frikipedia.es/friki/Jessi)

El programa lo tengo en este sitio web (Un poco de autobombo).
http://cypascal.blogspot.com.es/2013/04/chonificador-en-cc.html (http://cypascal.blogspot.com.es/2013/04/chonificador-en-cc.html)


Pero como siempre también os lo dejo aquí:

DESCRIPCIÓN PROGRAMA:

Este programa convierte un texto escrito correctamente, a otro texto semejante, pero esta vez escrito por un Choni (Llámese Choni, Pituti, Nini, Macarra, Bacala...).
Se introduce el nombre del fichero de texto a convertir y ya está. Este programa sirve para ver el uso de los ficheros de texto, y trabajar con caracteres ASCII.

Y por si algún Choni le da por hacer algo útil:

ESteee PrOgrAmaaa KoNvIerTEEE un texTOOO ESKritOOO KoRreKtaMEnTE, AAA OTRooo TExTOOO shEMEJanTE, pErooo EstAAA VeZ eSKriTooo PoR Un XonIII (LLámeshEEE Xoni, PITuti, NINI, MaKaRrA, BAKaLA...).
ShEEE INTrODUKeee eL NOmbrEEE dEL fIXeRooo deee texTOOO AAA KoNVertIr Y yAAA eSTá. EstEEE pROGRAMAAA shirVEEE Paraaa ver eL UShOOO DEEE LOS fIXErOS dEEE TExTO, Y TRaBaJaR Kon KarAKterEs ASKII.

(¡¡Oh Dios!! ¡Cuántas cosas subrayadas en rojo!)


Las chonificaciones realizadas son:
    1º) Alternancia de mayúsculas y minúsculas.
    2º) Cambio de C por K (cuando acompaña a A,O y U).
    3º) Cambio de QU por Q.
    4º) Cambio de CH por X.
    5º) Multiplicar el numero de vocales al final de una palabra.
    6º) Introduce H entre S y vocal. (Doy fe de que lo he visto por ahí)



Aquí el código:

Código:
/*Programa para convertir de lenguaje de humano, a lenguaje Choni*/

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

int main(void)
{
FILE *dat,*dat2;
int const ascii='a'-'A';

char nombre[50],C1,Voc,antVoc,mayus,antS,antQ,imp,leida;
int a;

printf("Nombre del fichero a leer (Con la extension .txt): ");
    scanf("%s", &nombre);


if (fopen(nombre,"r")==NULL)
printf("\nEl fichero no existe.\n\n");
else
    {
dat=fopen(nombre,"r");
dat2=fopen("SalidaChoni.txt","w");
fscanf(dat,"%c",&C1);
antS=antVoc=antQ=imp=leida=0;
while (!feof(dat))
{
            /*Sortea si se pasa de minus a myus*/
            mayus=(rand()%7)+1;
            imp=0;

            /*Chonifica minúsculas a mayúsculas*/ 
if (((C1<='z')&&(C1>='a'))&&(mayus<5)) C1=C1-ascii;
           
           
             
            /*Imprime en fichero de salida*/
            /*Mete H entre S y vocal*/
            if ((antS==1)&&((C1=='A')||(C1=='E')||(C1=='I')||(C1=='O')||(C1=='U')
            ||(C1=='a')||(C1=='e')||(C1=='i')||(C1=='o')||(C1=='u')))
            {
               fprintf(dat2,"%c",'h');
               fprintf(dat2,"%c",C1);
               imp=1;
            }
           
            /*Si la última letra de la palabra es una vocal, la multiplica por 3*/
            if ((antVoc==1)&&(C1==' '))
            {
               fprintf(dat2,"%c",Voc);fprintf(dat2,"%c",'h');
               fprintf(dat2,"%c",C1);
               imp=1;
            }
           
            /*Quita la u a la partícula qu*/
            if (antQ==1) imp=1;
           
            /*Pasa de ch a x*/
            if ((C1=='C')||(C1=='c'))
            {
                fscanf(dat,"%c",&C1);                       
                if ((C1=='H')||(C1=='h')) fprintf(dat2,"%c",'X');
                else
                {
                    leida=1;
                    if ((C1=='A')||(C1=='O')||(C1=='U')||(C1=='a')||(C1=='o')||
                    (C1=='u')) fprintf(dat2,"%c",'K');
                    else fprintf(dat2,"%c",'C');
                    if (!feof(dat)) fprintf(dat2,"%c",C1);
                }
                imp=1;
            }
           
            /*Imprime en el caso de que se tenga que imprimir*/
            if (imp==0) fprintf(dat2,"%c",C1);
           
            antS=antVoc=antQ=imp=leida=0;
           
            /*Actualiza valor de anteriores*/
            if ((C1=='A')||(C1=='E')||(C1=='I')||(C1=='O')||(C1=='U')
            ||(C1=='a')||(C1=='e')||(C1=='i')||(C1=='o')||(C1=='u'))
            {
                antVoc=1;
                Voc=C1;
            }
           
            if ((C1=='q')||(C1=='Q')) antQ=1;
           
            if ((C1=='S')||(C1=='s')) antS=1;
           
            if (leida==0) fscanf(dat,"%c",&C1);
}
fclose(dat);
        fclose(dat2);
}
return 0;
}


El código es libre para modificaciones si alguien se sabe más Chonerías.

Salu10.

1ª Edición: Corrección del uso de la K en vez de C.
2ª Edición: Mejora en el uso de las diferentes banderas, pasándolas de enteros a caracteres. Declaración como constante de Ascii en vez de como variable.
3ª Edición: Añade una h al final de las palabras que acaben con vocal.


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: mr.blood en 30 Abril 2013, 17:45 pm
Si la C va seguida de I o E no la cambies a K.

Sa1uDoS


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: cypascal en 30 Abril 2013, 18:32 pm
Gracias Mr.Blood, tienes toda la razón.
Modifico el mensaje inicial con la corrección (creo que esta vez ya bien)

Salu10.


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: amchacon en 30 Abril 2013, 20:33 pm
Mola, parece muy depurado. Me ha traducido esto:
Citar
Cosa grande y hermosa

A:

Citar
KoShaaa GRaNdeee y hERmOsha

¿Cosas que cambiaría? Un código más independiente y modular... Puedes crearte una función que te genere una cadena "traducida". Y luego esa cadena la puedes escribir en un archivo o mostrarla por pantalla.

Las variables que no cambies deberían ser declaradas como constantes. Además las banderas (AntVoc) pueden ser declaradas como char en vez de int, te ahorras bastantes bytes de memoria.

Por último:

Código
  1. if ((C1=='C')||(C1=='c'))
  2.            {
  3.                fscanf(dat,"%c",&C1);                      
  4.                if ((C1=='H')||(C1=='h')) fprintf(dat2,"%c",'X');

Hay un problema con esto, que pasa si en ese fscanf se llega al final del archivo?


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: flony en 1 Mayo 2013, 04:37 am
me da estos errores, alguna libreria esta como fuera de moda, uso visual c++ 2012
Citar
error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.   c:\users\administrador\documents\visual studio 2012\projects\project2\project2\source.cpp   20


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: amchacon en 1 Mayo 2013, 11:32 am
Lo pone ahi,  cambia fopen por fopen_s


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: cypascal en 1 Mayo 2013, 15:21 pm
@Amchacon:
Gracias por los consejos. Cambio Ascii para declararlo como constante en vez de variable, y las banderas las paso todas a caracteres.


Lo que no acabo de ver es el fallo que comentas en la siguiente parte:

Código:
if ((C1=='C')||(C1=='c')) 
            {
                fscanf(dat,"%c",&C1);                       
                if ((C1=='H')||(C1=='h')) fprintf(dat2,"%c",'X');
                else
                {
                    leida=1;
                    if ((C1=='A')||(C1=='O')||(C1=='U')||(C1=='a')||(C1=='o')||
                    (C1=='u')) fprintf(dat2,"%c",'K');
                    else fprintf(dat2,"%c",'C');
                    fprintf(dat2,"%c",C1);
                }
                imp=1;
            }

Creo que si se lee un final de fichero no pasa nada, ya que la variable imp (indica si se ha imprimido caracter o no) se pone a 1, y por lo tanto, se considera como si se hubiera imprimido, y ya no se vuelve a imprimir antes de llegar a la comprobación de final de fichero del while.

@Flony: Yo uso el IDE DevCpp. He probado con fopen_s y me dice que no existe. No se sí habrá que llamar a otra biblioteca.

Vuelvo a editar para correcciones.

Salu10.


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: rir3760 en 1 Mayo 2013, 17:44 pm
me da estos errores, alguna libreria esta como fuera de moda, uso visual c++ 2012

Citar
error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.   c:\users\administrador\documents\visual studio 2012\projects\project2\project2\source.cpp   20
No es un error. Es un "detallito" del compilador de Microsoft.

Este indica que un conjunto de funciones parte de la biblioteca estándar de C pueden ser peligrosas (si lo son o no depende del código fuente) y, en su lugar, recomienda alternativas que son extensiones del compilador.

Ello sucede (en Visual C++ 2008, habrá que revisar las siguientes versiones) aun cuando se utilice la opción "/Za" que, al menos en teoría, desactiva las extensiones del compilador.

La solución es:

A) Si se trata de desarrollar un programa en C estándar solo hay que definir la macro _CRT_SECURE_NO_WARNINGS o bien hacer caso omiso al mensaje de advertencia (después de todo la única función realmente insegura es gets).

B) Si se trata de un programa para MS Windows utilizando solo ese compilador basta con cambiar el uso de fopen por fopen_s.

Un saludo


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: BlackM4ster en 5 Mayo 2013, 18:37 pm
He hecho un arreglo en PHP  ;-)

http://zonaisc.com/web/?q=node/17


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: cypascal en 5 Mayo 2013, 23:07 pm
Está muy bién, yo ya lo he probado jeje, subo el enlace a mi blog.


Título: Re: [C] Chonificador (Pasa de legible a Choni)
Publicado por: BlackM4ster en 6 Mayo 2013, 15:08 pm
Gracias a ti, por la idea jajajaja  ;-)