elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  algun metodo alternativo al codigo que hice??
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: algun metodo alternativo al codigo que hice??  (Leído 1,635 veces)
adriana13

Desconectado Desconectado

Mensajes: 14


Ver Perfil
algun metodo alternativo al codigo que hice??
« 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.  


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: algun metodo alternativo al codigo que hice??
« Respuesta #1 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


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: algun metodo alternativo al codigo que hice??
« Respuesta #2 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. }
« Última modificación: 28 Enero 2019, 22:24 pm por MAFUS » En línea

adriana13

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: algun metodo alternativo al codigo que hice??
« Respuesta #3 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!!!
En línea

adriana13

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: algun metodo alternativo al codigo que hice??
« Respuesta #4 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 ...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines