[C] Chonificador (Pasa de legible a Choni)

Iniciado por cypascal, 30 Abril 2013, 00:12 AM

0 Miembros y 1 Visitante están viendo este tema.

cypascal

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

El programa lo tengo en este sitio web (Un poco de autobombo).
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:

/*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.
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES

mr.blood

Si la C va seguida de I o E no la cambies a K.

Sa1uDoS

cypascal

Gracias Mr.Blood, tienes toda la razón.
Modifico el mensaje inicial con la corrección (creo que esta vez ya bien)

Salu10.
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES

amchacon

Mola, parece muy depurado. Me ha traducido esto:
CitarCosa grande y hermosa

A:

CitarKoShaaa 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:

if ((C1=='C')||(C1=='c'))
           {
               fscanf(dat,"%c",&C1);                      
               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?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

flony

me da estos errores, alguna libreria esta como fuera de moda, uso visual c++ 2012
Citarerror 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
si un problema no tiene solucion entonces no es un problema...es algo inevitable

amchacon

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

cypascal

@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:

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.
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES

rir3760

Cita de: flony en  1 Mayo 2013, 04:37 AM
me da estos errores, alguna libreria esta como fuera de moda, uso visual c++ 2012

Citarerror 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

BlackM4ster

#8
He hecho un arreglo en PHP  ;-)

http://zonaisc.com/web/?q=node/17
- Pásate por mi web -
https://codeisc.com

cypascal

Está muy bién, yo ya lo he probado jeje, subo el enlace a mi blog.
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES