Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: adriana13 en 28 Enero 2019, 21:28 pm



Título: algun metodo alternativo al codigo que hice??
Publicado por: adriana13 en 28 Enero 2019, 21:28 pm
Hola, tenia que hacer un subprograma que lea letras y las incorpore a un archivo, el programa finaliza si ingreso 2 letras "a" seguidas. El codigo que hice funciona pero me parece muy engorroso, quisiera que me explicaran alguna manera alternativa que no tenga q escribir tanto codigo. gracias



#include <stdio.h>
Código
  1. #include<stdlib.h>
  2. FILE *fd;
  3. void leer_letras ();
  4.  
  5. int main(){
  6.  
  7.  
  8. leer_letras();
  9.  
  10. return 0;}
  11.  
  12. void leer_letras (){
  13. int i; char let[5];
  14. FILE *fd;
  15. char direccion[]="C:\\Users\\adria\\Downloads\\hola2.txt";
  16. fd= fopen(direccion, "w");
  17. if (fd==NULL){
  18.    printf("error");
  19.    }
  20.    for (i=0; i<5; i++){
  21. printf("\ningrese una letra: ");
  22. scanf("%c",&let[i]);
  23. fflush (stdin);
  24. fprintf(fd, "%c", let[i]);
  25.  
  26. if(let[0]=='a'&&let[1]=='a'){printf("dato no valido");
  27. exit(-1);}
  28. if(let[1]=='a'&& let[2]=='a'){printf("dato no valido");
  29. exit(-1);}
  30. if(let[2]=='a'&& let[3]=='a'){printf("dato no valido");
  31. exit(-1);}
  32. if(let[3]=='a'&& let[4]=='a'){printf("dato no valido");
  33. exit(-1);}
  34. if(let[4]=='a'&& let[5]=='a'){printf("dato no valido");
  35. exit(-1);}
  36.   }
  37.  
  38. fclose(fd);
  39.  
  40. }
  41.  
  42.  


Título: Re: algun metodo alternativo al codigo que hice??
Publicado por: K-YreX en 28 Enero 2019, 22:19 pm
Existirán muchas formas de hacerlo y según los conocimientos que tengas y lo eficiente que lo quieras hacer tendrás unas alternativas a mano u otras.
Por ejemplo el bloque de la 26 a la 36 me parece muy ineficiente además de limitado a un número determinado de caracteres.
Te doy una idea sencilla que no requiere manejarse en el interior de un fichero y tú verás si eres capaz de implementarlo o usarlo para crear tu propia idea (cuando escribes dos 'a' seguidas no sé si deben guardarse ambas en el fichero o sólo la primera, para estos ejemplos supongo que sólo la primera):
Código:
char anterior != 'a', actual
pedir dato -> actual
si anterior != 'a' || actual != 'a'
    anterior = actual
    guardar anterior en fichero
sino
    fin del programa

Si tienes alguna duda para implementar este algoritmo ya me dirás. Suerte :-X


Título: Re: algun metodo alternativo al codigo que hice??
Publicado por: MAFUS en 28 Enero 2019, 22:21 pm
La presente solución necesitará que pulses INTRO cada vez que introduzcas un párrafo pues, por defecto, los terminales no evalúan a cada pulsación de tecla. Este efecto depende del terminal y se deben programar de diferente forma según cuál sea.

Por lo demás hace lo que dices.

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    char car_anterior = '\0';
  5.    char car_actual;
  6.    FILE *fp;
  7.    char *ruta = "C:\\Users\\adria\\Downloads\\hola2.txt";
  8.  
  9.    fp = fopen(ruta, "w");
  10.  
  11.    car_actual = getchar();
  12.    while(!(car_anterior == 'a' && car_anterior == car_actual)) {
  13.        fputc(car_actual, fp);
  14.        car_anterior = car_actual;
  15.        car_actual = getchar();
  16.    }
  17.  
  18.    fseek(fp, -1, SEEK_END); // Esto es para borrar la 'a' que se queda
  19.    fputc('\0', fp);           // colgando al final del archivo.
  20.    puts("\n*** FIN DE LA ENTRADA DE DATOS");
  21.  
  22.    fclose(fp);
  23. }


Título: Re: algun metodo alternativo al codigo que hice??
Publicado por: adriana13 en 28 Enero 2019, 22:29 pm
Existirán muchas formas de hacerlo y según los conocimientos que tengas y lo eficiente que lo quieras hacer tendrás unas alternativas a mano u otras.
Por ejemplo el bloque de la 26 a la 36 me parece muy ineficiente además de limitado a un número determinado de caracteres.
Te doy una idea sencilla que no requiere manejarse en el interior de un fichero y tú verás si eres capaz de implementarlo o usarlo para crear tu propia idea (cuando escribes dos 'a' seguidas no sé si deben guardarse ambas en el fichero o sólo la primera, para estos ejemplos supongo que sólo la primera):
Código:
char anterior != 'a', actual
pedir dato -> actual
si anterior != 'a' || actual != 'a'
    anterior = actual
    guardar anterior en fichero
sino
    fin del programa

Si tienes alguna duda para implementar este algoritmo ya me dirás. Suerte :-X




ESto era justamente lo que queria hacer!! Estoy recien aprendiendo por eso lo desastroso de mis codigos jjja pero muchas gracias!!!


Título: Re: algun metodo alternativo al codigo que hice??
Publicado por: adriana13 en 28 Enero 2019, 22:33 pm
La presente solución necesitará que pulses INTRO cada vez que introduzcas un párrafo pues, por defecto, los terminales no evalúan a cada pulsación de tecla. Este efecto depende del terminal y se deben programar de diferente forma según cuál sea.

Por lo demás hace lo que dices.

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    char car_anterior = '\0';
  5.    char car_actual;
  6.    FILE *fp;
  7.    char *ruta = "C:\\Users\\adria\\Downloads\\hola2.txt";
  8.  
  9.    fp = fopen(ruta, "w");
  10.  
  11.    car_actual = getchar();
  12.    while(!(car_anterior == 'a' && car_anterior == car_actual)) {
  13.        fputc(car_actual, fp);
  14.        car_anterior = car_actual;
  15.        car_actual = getchar();
  16.    }
  17.  
  18.    fseek(fp, -1, SEEK_END); // Esto es para borrar la 'a' que se queda
  19.    fputc('\0', fp);           // colgando al final del archivo.
  20.    puts("\n*** FIN DE LA ENTRADA DE DATOS");
  21.  
  22.    fclose(fp);
  23. }



Muchas gracias! queria hacer algo asi utilizando anterior , actual pero no sabia cómo!! recien estoy aprendiendo ...