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);
}
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
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);
}
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!!!
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 ...