[SOLUCIONADO] Ayuda con un programa en C

Iniciado por wearecarl, Mayo 14, 2013, 10:06:02 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 14, 2013, 10:06:02 AM Ultima modificación: Febrero 08, 2014, 04:51:42 PM por Expermicid
Hola amigos de underc0de ! Me encanta esta comunidad, aunque soy nuevo, pero aprenderé poco a poco los temas que aqui se debaten.

Como nuevo y primer tema, tengo una serie de problemas con un directorio telefonico que debo realizar en C, sobre algo que me mandaron, y no entiendo que debo hacer en ciertas cosas que me pide el planteamiento que debo hacer.

Primero. El planteamiento del programa es el siguiente

directorio telefónico, un directorio telefónico debe constar de al menos los siguientes campos:
Nombre
Apellido
Organización
Teléfonos: Casa, Trabajo, Móvil.
Email
Cualquiera de los campos puede ser nulo, en nuestro caso se pueden realizar búsqueda por nombre, apellido, empresa.
Entre las facilidades que se deben implementar se tienen:
 El acceso al directorio debe estar protegido por una clave.
 Se pueden clasificar y filtrar las entradas del directorio en categorías: todos, personales, trabajo.
 Se deben poder mostrar los registros ordenados por Nombre, Apellidos o por Organización
 Se debe ser capaz de guardar el contenido del directorio encriptado en disco
 Ser pueden realizar búsquedas, mostrando solo los registros que tengan la cadena de caracteres de búsqueda como parte los campos: Nombre, Apellido y Organización.

Debo realizar el programa para ejecutarlo en una Shell de comando en Linux, mas especificamente, Debian 6.

Ahora bien, este es mi codigo o lo que llevo hecho:

Código: c

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

struct datos{
     //char nombre[20];
     //long telno;
     char nombre[20]; //Categoria tambien
     char apellido[20];
     char organizacion[20];
     char email[20];
     int   casa;
     int   trabajo; //Forma parte de categoria
     int   movil;
     int   categoria;
};

void ingresar_data(){
      FILE *fp;
      struct datos obj;
   system("cls");
      fp=fopen("datos.txt","a");
      printf("*****Agregar datos****\n");
      printf("Ingrese Nombre : ");
      scanf("%s",obj.nombre);
      printf("Ingrese Apellido : ");
      scanf("%s",obj.apellido);
      printf("Ingrese Organizacion : ");
      scanf("%s",obj.organizacion);
      printf("Ingrese Email : ");
      scanf("%s",obj.email);
      printf("Ingrese telefono: ");
      scanf("%d",&obj.movil);
      do{
      printf("\nIngrese Categoria :\n 1. Todos \n 2. Personal \n 3. Trabajo ");
      scanf("%d",obj.categoria);
      }while(obj.categoria <= 0 && obj.categoria >= 4);


      fprintf(fp,"%20s %20s %20s %20s %32d %32d",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil,obj.categoria);
      fclose(fp);
}

void  MostrarTodo(){ //Esto es una categoria
      FILE *fp;
      struct datos obj;
      system("cls");
      fp=fopen("datos.txt","r");
      printf("*****Mostrando todos los registros*****\n");
      printf("\n\n\t\tNombre\t\t\tApellido\t\tOrganizacion\t\temail\t\tMovil\t\tCategoria");
      printf("\n\t\t=====\t\t\t===============\t\t\t============\t\t\t===========\t\t\t===========\t\t\t===========\t\t\t===========\n\n");
      while(!feof(fp))
      {
      fscanf(fp,"%20s %20s %20s %20s %32d %32d",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil,&obj.categoria);
      printf("%20s %20s %20s %20s %32d %32d\n",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil,obj.categoria);
      }
      fclose(fp);
      getch();
}

void  personales(){ //Esto es una categoria
      FILE *fp;
      struct datos obj;
      system("cls");
      fp=fopen("datos.txt","r");
      printf("*****Mostrando registros por categoria personal*****\n");
      printf("\n\n\t\tNombre\t\t\tApellido\t\tOrganizacion\t\temail\t\tMovil");
      printf("\n\t\t=====\t\t\t===============\t\t\t============\t\t\t===========\t\t\t===========\t\t\t===========\n\n");
      while(!feof(fp))
      {
      fscanf(fp,"%20s %20s %20s %20s %32d %32d",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil,&obj.categoria);
      if (obj.categoria == 2)
      printf("%20s %20s %20s %20s %32d %32d\n",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil);
      }
      fclose(fp);
      getch();
}

void  trabajo(){ //Esto es una categoria
      FILE *fp;
      struct datos obj;
      system("cls");
      fp=fopen("datos.txt","r");
      printf("*****Mostrando registros por categoria personal*****\n");
      printf("\n\n\t\tNombre\t\t\tApellido\t\tOrganizacion\t\temail\t\tMovil");
      printf("\n\t\t=====\t\t\t===============\t\t\t============\t\t\t===========\t\t\t===========\t\t\t===========\n\n");
      while(!feof(fp))
      {
      fscanf(fp,"%20s %20s %20s %20s %32d %32d",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil,&obj.categoria);
      if (obj.categoria == 3)
      printf("%20s %20s %20s %20s %32d %32d\n",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil);
      }
      fclose(fp);
      getch();
}

/*void findData(){
      FILE *fp;
      struct datos obj;
      char name[20];
      int totrec=0;
     system("cls");
      fp=fopen("data.txt","r");
      printf("*****Display Specific Records*****\n");
      printf("\nEnter Name : ");
      scanf("%s",&name);
      while(!feof(fp))
      {
      fscanf(fp,"%20s %7ld",obj.name,&obj.telno);
         if(strcmpi(obj.name,name)==0){
        printf("\n\nName   :  %s",obj.name);
        printf("\nTelephone No : %ld",obj.telno);
        totrec++;
         }
      }
      if(totrec==0)
         printf("\n\n\nNo Data Found");
      else
         printf("\n\n===Total %d Record found===",totrec);
      fclose(fp);
      getch();
}*/



void main(){
      char choice;
      while(1){
    system("cls");
    printf("*****DIRECTORIO TELEFONICO*****\n\n");
    printf("1) Ingresar datos\n");
    printf("2) Mostrar por categoria\n");
    printf("3) Mostrar registros ordenados\n");
    printf("4) Guardar contenido encriptado\n");
    printf("5) Buscar\n");
    printf("6) salir\n");
    printf("\nOpcion: ");
    fflush(stdin);
    choice = getche();
    switch(choice){
         case'1' : //call append record
            ingresar_data();
            break;
         case'2' : //call find record
             printf("\n\n1) Todos\n");
             printf("2) Personales\n");
             printf("3) Trabajo\n");
             int opc=0;
             fflush(stdin);
             scanf("%d",opc);
             if (opc == 1)
             {
                MostrarTodo();

             }else if (opc == 2){

                     trabajo();

                    } else if (opc == 3){

                             trabajo();

                            }
            break;
         //case'3' : //Read all record
            //RegistrosOrdenados();
           // break;

        // case'4' :

            // GuardarEncriptado();
            // break;

       // case'5' :

             // Buscar();
             // break;

         case '6'  :

             exit(1);
             break;

         default:
            printf("Debe ingresar una opcion valida.");

    }
      }
}



Que me falta? Pues, me falta es esto, que no entiendo como debo hacer, a ver si me podian ayudar a implementarlo en mi codigo :

1. Ser pueden realizar búsquedas, mostrando solo los registros que tengan la cadena de caracteres de búsqueda como parte los campos: Nombre, Apellido y Organización.

y

2. Se debe ser capaz de guardar el contenido del directorio encriptado en disco

Para hacer la busqueda seria algo asi


Código: c++

FILE *fp;     
struct datos obj;     
system("cls");     
fp=fopen("datos.txt","r");
char buscar[20];   
printf("*****Buscar datos*****\n");
printf("Ingresa la palabra Clave a buscar");
scanf("%d",&buscar);
printf("\n\n\t\tNombre\t\t\tApellido\t\tOrganizacion\t\temail\t\tMovil\t\tCategoria");      printf("\n\t\t=====\t\t\t===============\t\t\t============\t\t\t===========\t\t\t===========\t\t\t===========\t\t\t===========\n\n");
while(!feof(fp))     
{
    fscanf(fp,"%20s %20s %20s %20s %32d %32d",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil,&obj.categoria);
    if(strcmp(obj.nombre, buscar) == 0 || strcmp(obj.apellido, buscar) == 0 || strcmp(obj.organizacion, buscar) == 0)
    {
        printf("%20s %20s %20s %20s %32d %32d\n",obj.nombre,obj.apellido,obj.organizacion,obj.email,obj.movil,obj.categoria);     
    }
}     
fclose(fp);     
getch();



Ahora lo de guardar de forma encriptada puedes hacer que a la hora de leer los datos despues los cifres con algun algoritmo sencillo como el cifrado cesar, y luego igualmente cuando lees el archivo para descrifrarlo pues lo descifras con el mismo algoritmo de cesar.


--------------------




Ahora respecto a que dices que el programa debe correr en linux, debes de saber que system("cls"); es solo para windows asi que cando lo vayas a pasar a linux debes usar system("clear");

Gracias por la respuesta, pero no he visto el algoritmo de cesar, y claro, solo que lo estaba probando en windows, para ver que me salia, ya que me resulta mas comodo programar y trabajr en windows que en linux (debian).. Pero bueno, cualquier cosa aviso por aca, aunque si me pudieses decir mas o menos como es ese algoritmo o como funciona te lo agradeceria mucho

Gracias!

Aqui encuentrasinfo sobre como funciona el cifrado cesar y pues algo de historia:
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta

Y aqui un ejemplode uso:
Código: c++

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


// cadenas referenciadoras para el mensaje original y cifrado
char *alfabeto="abcdefghijklmnñopqrstuvwxyz";
char *cifrado ="DEFGHIJKLMNÑOPQRSTUVWXYZABC";

//Prototipo de funciones para cifrar y decibrar el texto
char* cifra(char*);
char* descifra(char*);

//Funcion principal para probar el uso de las funciones
int main(void)
{
  char cadena[300];
  char *res;
  fprintf(stdout,"Ingrese texto a cifrar\t:\n");
  fscanf(stdin,"%s",cadena);
  res=cifra(cadena);
  fprintf(stdout,"\nLa cadena Cifrada es\t:%s\n\n",res);
  res=descifra(res);
  fprintf(stdout,"La cadena Desifrada es\t:%s",res);
  getchar();
  getchar();
  return 0;
}

//Funcion que cifra el mensaje
char* cifra(char *text)
{
    int i,j;
    for(j=0;j<strlen(text);j++)
    {
      for(i=0;i<strlen(alfabeto);i++)
      {
         if(*(text+j)==*(alfabeto+i))
         {
         *(text+j)=*(cifrado+i);
         }
      }
    }
    return text;
}

//Funcion que descifra el mensaje
char* descifra(char *text)
{
    int i,j;
    for(j=0;j<strlen(text);j++)
    {
      for(i=0;i<strlen(alfabeto);i++)
      {
         if((*(text+j))==*(cifrado+i))
         {
         *(text+j)=*(alfabeto+i);

         }
      }
    }
    return text;
}

Gracias nuevamente, y en que parte de mi codigo puedo implementar eso? Deberia crear una funcion?

Mayo 14, 2013, 04:25:24 PM #5 Ultima modificación: Mayo 14, 2013, 04:45:52 PM por mr.blood
Sin animo de ofender s00rk pero me parece que lo hiciste demasiado complicado el ejemplo. Por curiosidad porque usas fprintf y fscanf? Y como recomendacion no uses getchar(); getchar(); limpia el buffer de stdin ;).

Aqui otro, a mi entender, mas sencillo ;).

Código: c
#include <stdio.h>
#include <string.h>

void cifrar(char *cadena);
void descifrar(char *cadena);

int main()
{
char cadena[200];
puts("Texto a cifrar>> ");
scanf("%200[^\n]", cadena);
cifrar(cadena);
printf("Texto cifrado >> %s\n", cadena);
descifrar(cadena);
printf("Texto descifrado >> %s\n", cadena);
setbuffer(stdin, 0, 0);
getchar();
return 0;
}

void cifrar(char *cadena)
{
int i=strlen(cadena)-1;
for(;i>=0;i--)
if(cadena[i]!=' ')
cadena[i]+=3;
}
void descifrar(char *cadena)
{
int i=strlen(cadena)-1;
for(;i>=0;i--)
if(cadena[i]!=' ')
cadena[i]-=3;
}





Dejo otro codigo mas "completo".

Código: c

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

void cifrar(char *cadena);
void descifrar(char *cadena);

int main()
{
char cadena[200];
puts("Texto a cifrar>> ");
scanf("%200[^\n]", cadena);
cifrar(cadena);
printf("Texto cifrado >> %s\n", cadena);
descifrar(cadena);
printf("Texto descifrado >> %s\n", cadena);
setbuffer(stdin, 0, 0);
getchar();
return 0;
}

void cifrar(char *cadena)
{
int i=strlen(cadena)-1;
for(;i>=0;i--)
{
if( (cadena[i]>='a' && cadena[i]<='z') || (cadena[i]>='A' && cadena[i]<='Z'))
{
if(cadena[i]<'w' || cadena[i]<'W')
{
cadena[i]+=3;
}
else
{
cadena[i]-=23;
}
}
}
}
void descifrar(char *cadena)
{
int i=strlen(cadena)-1;
for(;i>=0;i--)
{
if( (cadena[i]>='a' && cadena[i]<='z') || (cadena[i]>='A' && cadena[i]<='Z'))
{
if(cadena[i]>'c' || cadena[i]>'c')
{
cadena[i]-=3;
}
else
{
cadena[i]+=23;
}
}
}
}


EDITO: Cambio el codigo para que no encripte los espacios, si solo quieres encriptar letras, cambia el IF ;)

Sa1uDoS

En realidad si, estaba algo complicado, apenas me inicio en lenguaje C, hay cosas que no he visto aun... Pero sin embargo, a pesar de todo, mr.blood me parecio mas sencillo tu ejemplo, aunque mi pregunta sigue en pie, en donde deberia implementar ese codigo? Me podrian si se puede, a ayudarme a completar lo que falta? Porque creo que todo funciona bien.

Mayo 14, 2013, 04:51:46 PM #7 Ultima modificación: Mayo 14, 2013, 04:57:21 PM por mr.blood
Quieres encriptar el contenido en el disco?

Te dejo algo super simple.

Código: c

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

void cifrar(char *cadena);

int main()
{
char cadena[200];
puts("Texto a cifrar>> ");
scanf("%200[^\n]", cadena);
cifrar(cadena);
printf("Texto cifrado >> %s\n", cadena);
cifrar(cadena);
printf("Texto descifrado >> %s\n", cadena);
setbuffer(stdin, 0, 0);
getchar();
return 0;
}

void cifrar(char *cadena)
{
int i=strlen(cadena)-1;
for(;i>=0;i--)
cadena[i]^=2;
}


Utiliza el operando XOR que tiene "truco". Si tu haces A xor 2 te quedara C y si luego haces C xor 2 te quedara A de nuevo ;).

Deberias implementar esto justo antes de guardar los datos en el fichero y justo antes de cargar los datos del fichero en memoria ;).




EDITO: Por favor, quita conio.h y en vez de getch() usa getchar().
No uses system("cls") porque entonces solo te funcionara bajo Windows, puedes usar algo como puts("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n..."); y pones \n hasta que la pantalla quede limpia.

Sa1uDoS

Gracias nuevamente, amigo mr.blood, voy a intentar acomodarlo al codigo a ver que tal sale..! Aunque faltan otras cosas como esta que dice

Se debe ser capaz de guardar el contenido del directorio encriptado en disco

Que esa no la entiendo tampoco a ver si me podias ayudar en esa.

Cualquier cosa escribo en este mismo post, a ver que tal me fué, y volveré a poner el codigo

Investiga primero y avanza un poco los chicos ya  te hecharon una mano ahora pon de tu parte el de guardar en disco puede usar un txt como base de datos y guardarlo cifrado .

Regards,
Snifer
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta


Llaman traidor a la persona que evito que caiga el foro, gente bruta!



hehehehe sorry es que la verdad ese no lo hice yo, simplemente hice un copy and paste sobre el algoritmo, personalmente prefiero hacer uso de cout para mostrar y cin para hacer la lectura y para detener: cin.get();


heheheh
la próxima intentare hacerlo por mi, solo lo hice rápido porque andaba en la uni en clase y pues solo entre un rato vi e intente ayudar rapido antes que el profe llegara a checar xD


Saludos*!