Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: diegoCmC en 22 Agosto 2012, 21:59 pm



Título: Perfeccionar código escrito en C
Publicado por: diegoCmC en 22 Agosto 2012, 21:59 pm
Hola buenas, acabo de aprender el manejo de estructuras en lenguaje C, y me gustaría que me dierais vuestra opinión sobre un código
La función de esto seria saber que cosas hago y no debería hacer, o que no hago y debería de hacer, mas que nada para  no ir cogiendo vicios que no sean adecuados
Muchas gracias a todos.

Acabo de ver el post http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html) tendre que echarle un ojo jeje
Código
  1. #include<stdio.h>
  2.  
  3. //Estructuras para los datos personales
  4. struct nombre_completo{
  5.    //Datos personales: Nombre Apellido Apellido
  6.    char nombre[40], apellido1[40], apellido2[40];
  7. };
  8.  
  9. struct fecha_nacimiento{
  10.    int dia, mes, año;
  11. };
  12.  
  13. //Estructura en la que se almacenaran todos los datos de una persona
  14. struct datos{
  15.    //Datos personales (estructura externa)
  16.    struct nombre_completo persona;
  17.    //Fecha de nacimiento (estructura externa)
  18.    struct fecha_nacimiento nacimiento;
  19.    long telefono;
  20.  
  21. };
  22.  
  23. //Funciones de asignacion de datos
  24. struct nombre_completo nuevo_nombre(){
  25.    struct nombre_completo nombre1;
  26.  
  27.    printf("Datos personales\n");
  28.    printf("Dime tu nombre: ");
  29.    fflush(stdin);
  30.    gets(nombre1.nombre);
  31.    printf("Primer apellido: ");
  32.    fflush(stdin);
  33.    gets(nombre1.apellido1);
  34.    printf("Segundo apellido: ");
  35.    fflush(stdin);
  36.    gets(nombre1.apellido2);
  37.  
  38.  
  39.    return nombre1;
  40. }
  41.  
  42. struct fecha_nacimiento nueva_fecha(){
  43.    struct fecha_nacimiento fecha1;
  44.  
  45.    printf("\nFecha de nacimiento\n");
  46.    printf("Dia: ");
  47.    fflush(stdin);
  48.    scanf("%d", &fecha1.dia);
  49.    printf("Mes: ");
  50.    fflush(stdin);
  51.    scanf("%d", &fecha1.mes);
  52.    printf("Año: ");
  53.    fflush(stdin);
  54.    scanf("%d", &fecha1.año);
  55.  
  56.    return fecha1;
  57. }
  58.  
  59. //Funcion que asigna todos los datos personales por medio de llamadas a las otras funciones
  60. struct datos nuevos_datos(){
  61.    struct datos usuario;
  62.  
  63.    //Llamada a la funcion que asigna Nombre y apellidos
  64.    usuario.persona=nuevo_nombre();
  65.  
  66.    //Llamada a la funcion que asigna la fecha de nacimiento
  67.    usuario.nacimiento=nueva_fecha();
  68.  
  69.    //Peticion del telefono al usuario
  70.    printf("\nTelefono: ");
  71.    fflush(stdin);
  72.    scanf("%d",&usuario.telefono);
  73.  
  74.    return usuario;
  75. }
  76.  
  77. //Funcion que imprime por pantalla los datos
  78. void mostrar_datos(struct datos asignado){
  79.    printf("\n\nLos datos que se han introducido son los siguientes:");
  80.    printf("\n----------------------------------------------------\n");
  81.    printf("Nombre completo: %s %s %s\n", asignado.persona.nombre, asignado.persona.apellido1, asignado.persona.apellido2);
  82.    printf("Fecha de nacimiento: %d/%d/%d\n", asignado.nacimiento.dia, asignado.nacimiento.mes, asignado.nacimiento.año);
  83.    printf("Numero de telefono: %d", asignado.telefono);
  84.  
  85. }
  86.  
  87.  
  88. int main(){
  89.    struct datos persona1;
  90.  
  91.    //Asignacion de datos a persona1
  92.    persona1=nuevos_datos();
  93.  
  94.    //LLamada a la funcion que muestra los datos por pantalla
  95.    mostrar_datos(persona1);
  96.  
  97.    return 0;
  98. }
  99.  


Título: Re: Perfeccionar código escrito en C
Publicado por: soyloqbuskas en 22 Agosto 2012, 22:38 pm
Buenas diegoCmC,

Para mejorar tu codigo yo cambiaria la funcion gets() por fgets(), de hecho si lees el enlace que has puesto, lo primero que te explica es "porque no usar gets()"

Por lo demas no veo que este mal....(tampoco lo he compilado y ejecutado...)

Pero si quieres aprender un par de cositas mas sobre C....Puedes escribir todas las funciones debajo de la funcion main() siempre y cuando escribas encima del main() las interfaces de las funciones.

Y tambien podrias escribir tus funciones en un fichero llamado misFunciones.c crear otro fichero llamdo misFunciones.h con las interfaces de las funciones y por ultimo un fichero llamado main.c donde tienes que poner un #include "misFunciones.h"
Mas info aqui: http://www.chuidiang.com/clinux/herramientas/librerias.php (http://www.chuidiang.com/clinux/herramientas/librerias.php)

Estos 2 ultimos apuntes te van a ayudar a aprender un poco mas sobre C, y sobre todo, a la hora de hacer un programa con mucho codigo es muy necesario para mejorar su legibilidad. Seria horrible tener que leer un fichero.c con 1000 lineas de codigo.


Título: Re: Perfeccionar código escrito en C
Publicado por: тαптяα en 22 Agosto 2012, 23:16 pm
Errores que tenias, en C y C++ la letra ñ no la puedes usar en variables y estructuras.

Ya esta todo retocado. Ahora funciona de 10

Código
  1. #include<stdio.h>
  2.  
  3. //Estructuras para los datos personales
  4. struct nombre_completo{
  5.    //Datos personales: Nombre Apellido Apellido
  6.    char nombre[40], apellido1[40], apellido2[40];
  7. };
  8.  
  9. struct fecha_nacimiento{
  10.    int dia, mes, ano;
  11. };
  12.  
  13. //Estructura en la que se almacenaran todos los datos de una persona
  14. struct datos{
  15.    //Datos personales (estructura externa)
  16.    struct nombre_completo persona;
  17.    //Fecha de nacimiento (estructura externa)
  18.    struct fecha_nacimiento nacimiento;
  19.    long telefono;
  20.  
  21. };
  22.  
  23. //Funciones de asignacion de datos
  24. struct nombre_completo nuevo_nombre(){
  25.    struct nombre_completo nombre1;
  26.  
  27.    printf("Datos personales\n");
  28.    printf("Dime tu nombre: ");
  29.    fflush(stdin);
  30.    gets(nombre1.nombre);
  31.    printf("Primer apellido: ");
  32.    fflush(stdin);
  33.    gets(nombre1.apellido1);
  34.    printf("Segundo apellido: ");
  35.    fflush(stdin);
  36.    gets(nombre1.apellido2);
  37.  
  38.  
  39.    return nombre1;
  40. }
  41.  
  42. struct fecha_nacimiento nueva_fecha(){
  43.    struct fecha_nacimiento fecha1;
  44.  
  45.    printf("\nFecha de nacimiento\n");
  46.    printf("Dia: ");
  47.    fflush(stdin);
  48.    scanf("%d", &fecha1.dia);
  49.    printf("Mes: ");
  50.    fflush(stdin);
  51.    scanf("%d", &fecha1.mes);
  52.    printf("Año: ");
  53.    fflush(stdin);
  54.    scanf("%d", &fecha1.ano);
  55.  
  56.    return fecha1;
  57. }
  58.  
  59. //Funcion que asigna todos los datos personales por medio de llamadas a las otras funciones
  60. struct datos nuevos_datos(){
  61.    struct datos usuario;
  62.  
  63.    //Llamada a la funcion que asigna Nombre y apellidos
  64.    usuario.persona=nuevo_nombre();
  65.  
  66.    //Llamada a la funcion que asigna la fecha de nacimiento
  67.    usuario.nacimiento=nueva_fecha();
  68.  
  69.    //Peticion del telefono al usuario
  70.    printf("\nTelefono: ");
  71.    fflush(stdin);
  72.    scanf("%d",&usuario.telefono);
  73.  
  74.    return usuario;
  75. }
  76.  
  77. //Funcion que imprime por pantalla los datos
  78. void mostrar_datos(struct datos asignado){
  79.    printf("\n\nLos datos que se han introducido son los siguientes:");
  80.    printf("\n----------------------------------------------------\n");
  81.    printf("Nombre completo: %s %s %s\n", asignado.persona.nombre, asignado.persona.apellido1, asignado.persona.apellido2);
  82.    printf("Fecha de nacimiento: %d/%d/%d\n", asignado.nacimiento.dia, asignado.nacimiento.mes, asignado.nacimiento.ano);
  83.    printf("Numero de telefono: %d", asignado.telefono);
  84.  
  85. }
  86.  
  87.  
  88. int main(){
  89.    struct datos persona1;
  90.  
  91.    //Asignacion de datos a persona1
  92.    persona1=nuevos_datos();
  93.  
  94.    //LLamada a la funcion que muestra los datos por pantalla
  95.    mostrar_datos(persona1);
  96.  
  97.    return 0;
  98. }
  99.  


Título: Re: Perfeccionar código escrito en C
Publicado por: diegoCmC en 22 Agosto 2012, 23:25 pm
Gracias a los 2 por las respuestas, tendre que mirarme bien lo de fgets(), y lo de escribir las funciones fuera del codigo
Lo de año me lo debio copiar mal, por que en mi codigo tengo escrito año  :o
Un saludo


Título: Re: Perfeccionar código escrito en C
Publicado por: тαптяα en 22 Agosto 2012, 23:33 pm
Gracias a los 2 por las respuestas, tendre que mirarme bien lo de fgets(), y lo de escribir las funciones fuera del codigo
Lo de año me lo debio copiar mal, por que en mi codigo tengo escrito año  :o
Un saludo
No es "año" sino "año" o "ano" como quieras


Título: Re: Perfeccionar código escrito en C
Publicado por: diegoCmC en 22 Agosto 2012, 23:53 pm
algo le pasa al foro, no escribo año escribo a_n_i_o todo junto jajajaj


Título: Re: Perfeccionar código escrito en C
Publicado por: 0xDani en 23 Agosto 2012, 00:30 am
Si dices que acabas de aprender a manejar estructuras, seguramente no habras visto los punteros, pero la estructura nombre_completo la podrias dejar asi:
Código
  1. struct nombre_completo{
  2. char* nombres[3];
  3. };
  4.  
Asi, nombres[0] apuntaria al nombre, nombres[1] al apellido1 y nombres[2] al apellido2.

Despues, con la cantidad de respuestas que has tenido, me extraña que nadie te haya desaconsejado usar fflush(stdin).En el post de lo que no hay que hacer en C/C++ lo veras mejor explicado. En vez de esto te aconsejo usar while(getchar()!='\n')

Por lo demas esta bastante bien.

Saludos.


Título: Re: Perfeccionar código escrito en C
Publicado por: avesudra en 23 Agosto 2012, 00:47 am
Despues, con la cantidad de respuestas que has tenido, me extraña que nadie te haya desaconsejado usar fflush(stdin).En el post de lo que no hay que hacer en C/C++ lo veras mejor explicado. En vez de esto te aconsejo usar while(getchar()!='\n')

Por lo demas esta bastante bien.

Saludos.

Se lo iba a decir fíjate.Pero de todas maneras fgets + sscanf para introducir bien los valores y que no haga falta limpiar el buffer , que ya dijo en su momento Eternal Idol aquí:
Citar
Zanjado: NO USAR JAMAS.

fgets
+
sscanf

Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.    int opcion;
  7.  
  8.    do{
  9.        printf("Opcion: ");
  10. char linea[80];
  11. fgets(linea, sizeof(linea), stdin);
  12.        sscanf(linea, "%d",&opcion);
  13.    }while(opcion!=0);
  14.  
  15.    return 0;
  16. }
  17.