algun metodo alternativo al codigo que hice??

Iniciado por adriana13, 28 Enero 2019, 21:28 PM

0 Miembros y 2 Visitantes están viendo este tema.

adriana13

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>
#include<stdlib.h>
FILE *fd;
void leer_letras ();

int main(){


leer_letras();

return 0;}

void leer_letras (){
int i; char let[5];
FILE *fd;
char direccion[]="C:\\Users\\adria\\Downloads\\hola2.txt";
fd= fopen(direccion, "w");
if (fd==NULL){
    printf("error");
    }
    for (i=0; i<5; i++){
printf("\ningrese una letra: ");
scanf("%c",&let[i]);
fflush (stdin);
fprintf(fd, "%c", let[i]);

if(let[0]=='a'&&let[1]=='a'){printf("dato no valido");
exit(-1);}
if(let[1]=='a'&& let[2]=='a'){printf("dato no valido");
exit(-1);}
if(let[2]=='a'&& let[3]=='a'){printf("dato no valido");
exit(-1);}
if(let[3]=='a'&& let[4]=='a'){printf("dato no valido");
exit(-1);}
if(let[4]=='a'&& let[5]=='a'){printf("dato no valido");
exit(-1);}
   }

fclose(fd);

}


K-YreX

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

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
Código (cpp) [Seleccionar]

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

MAFUS

#2
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.

#include <stdio.h>

int main() {
   char car_anterior = '\0';
   char car_actual;
   FILE *fp;
   char *ruta = "C:\\Users\\adria\\Downloads\\hola2.txt";

   fp = fopen(ruta, "w");

   car_actual = getchar();
   while(!(car_anterior == 'a' && car_anterior == car_actual)) {
       fputc(car_actual, fp);
       car_anterior = car_actual;
       car_actual = getchar();
   }

   fseek(fp, -1, SEEK_END); // Esto es para borrar la 'a' que se queda
   fputc('\0', fp);           // colgando al final del archivo.
   puts("\n*** FIN DE LA ENTRADA DE DATOS");

   fclose(fp);
}

adriana13

Cita de: YreX-DwX 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):

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!!!

adriana13

Cita de: 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.

#include <stdio.h>

int main() {
   char car_anterior = '\0';
   char car_actual;
   FILE *fp;
   char *ruta = "C:\\Users\\adria\\Downloads\\hola2.txt";

   fp = fopen(ruta, "w");

   car_actual = getchar();
   while(!(car_anterior == 'a' && car_anterior == car_actual)) {
       fputc(car_actual, fp);
       car_anterior = car_actual;
       car_actual = getchar();
   }

   fseek(fp, -1, SEEK_END); // Esto es para borrar la 'a' que se queda
   fputc('\0', fp);           // colgando al final del archivo.
   puts("\n*** FIN DE LA ENTRADA DE DATOS");

   fclose(fp);
}




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