Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sheva777 en 31 Marzo 2013, 00:08 am



Título: Suma de ascii
Publicado por: sheva777 en 31 Marzo 2013, 00:08 am
Lo que pasa es que tengo que crear un programa que lea un archivo de entrada y me genere otro de salida el código de dispersión de cada una de las cadenas calculado de la siguiente forma: Sume los ASCII de los caracteres de cada cadena y al final saque módulo 131. Por ejemplo, para la cadena "enero" los ASCII son 101, 110, 101, 114 y 111, por lo que la suma es 537 y al sacar módulo 131 se obtiene 13.

He creado el programa pero solo me saca el resultado de enero correctamente y los demas ya no, mi duda es por que es que pasa esto. Les dejo el codigo que he creado, espero y me puedan orientar para resolver la duda, de ante mano muchas gracias.

archivo de entrada

enero
febrero
marzo
abril

me genera este archivo de salida

13 ese valor es el único correcto
99
128
126
40

codigo

#include<stdio.h>
#include<math.h>
#include<string.h>

char cadena[30];
int y;
int i;
int resultado;
int l;
main()
{

        int i=0;
        int y=0;
        char nombreArchivoLectura[10];
        char nombreArchivoEscritura[10];
        FILE *archivoLectura=NULL;
        FILE *archivoEscritura=NULL;

       
        archivoLectura=fopen("entrada.txt","r");
       
       
        archivoEscritura = fopen("salida.txt","w");
       
        while(archivoLectura == NULL)
   {
    printf("El archivo no pudo abrirse\n");
    printf("Nombre de arcivo de Lectura con extension:");
    scanf("%s",&nombreArchivoLectura);
         }

        while(!feof(archivoLectura))
   {
           fscanf(archivoLectura,"%[^\n]\n",cadena);
   l=strlen(cadena);
        for(i=0;i<l+1;i++)
        {
                y=y+cadena;         
       
        }
        printf("---------------------------------------\n");
        resultado=y%131;   
       fprintf(archivoEscritura,"%d\n",resultado);
       
}       
fclose(archivoLectura);
fclose(archivoEscritura);   
       


}



Título: Re: Suma de ascii
Publicado por: BatchianoISpyxolo en 31 Marzo 2013, 03:16 am
Fíjate que la y sólo la inicializas cuando la declaras, por eso para el primer caso te funciona. Luego vas arrastrando el valor de y en cada solución... Recuerda que sumas los valores ascii de caracteres... (cadena)

Ahora debería funcionar...

Código
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<string.h>
  4.  
  5. char cadena[30];
  6. int y;
  7. int i;
  8. int resultado;
  9. int l;
  10. int main() {
  11.  
  12.    int i=0;
  13.    int y;
  14.    char nombreArchivoLectura[10];
  15.    char nombreArchivoEscritura[10];
  16.    FILE *archivoLectura=NULL;
  17.    FILE *archivoEscritura=NULL;
  18.    archivoLectura=fopen("in.txt","r");
  19.    archivoEscritura = fopen("salida.txt","w");
  20.  
  21.    while(!feof(archivoLectura)) {
  22.        y=0;
  23.        fscanf(archivoLectura,"%[^\n]\n",cadena);
  24.        l=strlen(cadena);
  25.        printf("%s: ", cadena);
  26.        for(i=0;i<l+1;i++) y+=(int)cadena[i];
  27.        printf("\n---------------------------------------\n");
  28.        resultado=y%131;
  29.        fprintf(archivoEscritura,"%d\n",resultado);
  30.    }
  31.    fclose(archivoLectura);
  32.    fclose(archivoEscritura);
  33.    return 0;
  34. }
  35.  


Título: Re: Suma de ascii
Publicado por: sheva777 en 31 Marzo 2013, 04:35 am
tenias razon ese era mi error, muchas gracias por resolverme la duda, ya quedo  ;-)


Título: Re: Suma de ascii
Publicado por: do-while en 31 Marzo 2013, 11:59 am
¡Buenas!

Revisa el código.

A parte de lo que ya te han dicho, aquí tienes un posible bucle infinito:
Código
  1. while(archivoLectura == NULL)
  2. {
  3.    printf("El archivo no pudo abrirse\n");
  4.    printf("Nombre de arcivo de Lectura con extension:");
  5.    scanf("%s",&nombreArchivoLectura);
  6. }
  7.  

Si el archivo desde el que lees los datos no puede abrirse, por mucho que leas el nuevo nombre de fichero,  si no intentas abrir de nuevo el fichero el puntero seguirá siendo NULL.

¡Saludos!