elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Perfeccionar código escrito en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Perfeccionar código escrito en C  (Leído 3,454 veces)
diegoCmC

Desconectado Desconectado

Mensajes: 177



Ver Perfil
Perfeccionar código escrito en C
« 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 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.  


« Última modificación: 22 Agosto 2012, 22:05 pm por diegoCmC » En línea

a todas las que me abrieron su coraza traeles suerte
ya no creo en el amor pero querria volver a verte
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Perfeccionar código escrito en C
« Respuesta #1 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

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.


En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
тαптяα


Desconectado Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: Perfeccionar código escrito en C
« Respuesta #2 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.  
En línea

diegoCmC

Desconectado Desconectado

Mensajes: 177



Ver Perfil
Re: Perfeccionar código escrito en C
« Respuesta #3 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
En línea

a todas las que me abrieron su coraza traeles suerte
ya no creo en el amor pero querria volver a verte
тαптяα


Desconectado Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: Perfeccionar código escrito en C
« Respuesta #4 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
En línea

diegoCmC

Desconectado Desconectado

Mensajes: 177



Ver Perfil
Re: Perfeccionar código escrito en C
« Respuesta #5 en: 22 Agosto 2012, 23:53 pm »

algo le pasa al foro, no escribo año escribo a_n_i_o todo junto jajajaj
En línea

a todas las que me abrieron su coraza traeles suerte
ya no creo en el amor pero querria volver a verte
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Perfeccionar código escrito en C
« Respuesta #6 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.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Perfeccionar código escrito en C
« Respuesta #7 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.  
« Última modificación: 23 Agosto 2012, 03:23 am por avesudra » En línea

Regístrate en
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Escrito sobre VMWare.
Tutoriales - Documentación
NemeSys 0 6,809 Último mensaje 3 Febrero 2005, 07:22 am
por NemeSys
Servidor web escrito en C
Programación C/C++
Psicotron 7 5,024 Último mensaje 8 Septiembre 2016, 19:48 pm
por AlbertoBSD
Algoritmo escrito en C
Programación C/C++
Kyon-san 7 5,563 Último mensaje 25 Noviembre 2010, 22:04 pm
por ace332
Ayuda perfeccionar programa
Programación C/C++
novatus84 0 1,234 Último mensaje 15 Diciembre 2014, 19:02 pm
por novatus84
Crear arbol sintactico para analizar un codigo fuente escrito en C++
Programación C/C++
Ytsejam92 3 2,804 Último mensaje 29 Septiembre 2016, 20:40 pm
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines