Perfeccionar código escrito en C

Iniciado por diegoCmC, 22 Agosto 2012, 21:59 PM

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

diegoCmC

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
#include<stdio.h>

//Estructuras para los datos personales
struct nombre_completo{
   //Datos personales: Nombre Apellido Apellido
   char nombre[40], apellido1[40], apellido2[40];
};

struct fecha_nacimiento{
   int dia, mes, año;
};

//Estructura en la que se almacenaran todos los datos de una persona
struct datos{
   //Datos personales (estructura externa)
   struct nombre_completo persona;
   //Fecha de nacimiento (estructura externa)
   struct fecha_nacimiento nacimiento;
   long telefono;

};

//Funciones de asignacion de datos
struct nombre_completo nuevo_nombre(){
   struct nombre_completo nombre1;

   printf("Datos personales\n");
   printf("Dime tu nombre: ");
   fflush(stdin);
   gets(nombre1.nombre);
   printf("Primer apellido: ");
   fflush(stdin);
   gets(nombre1.apellido1);
   printf("Segundo apellido: ");
   fflush(stdin);
   gets(nombre1.apellido2);


   return nombre1;
}

struct fecha_nacimiento nueva_fecha(){
   struct fecha_nacimiento fecha1;

   printf("\nFecha de nacimiento\n");
   printf("Dia: ");
   fflush(stdin);
   scanf("%d", &fecha1.dia);
   printf("Mes: ");
   fflush(stdin);
   scanf("%d", &fecha1.mes);
   printf("Año: ");
   fflush(stdin);
   scanf("%d", &fecha1.año);

   return fecha1;
}

//Funcion que asigna todos los datos personales por medio de llamadas a las otras funciones
struct datos nuevos_datos(){
   struct datos usuario;

   //Llamada a la funcion que asigna Nombre y apellidos
   usuario.persona=nuevo_nombre();

   //Llamada a la funcion que asigna la fecha de nacimiento
   usuario.nacimiento=nueva_fecha();

   //Peticion del telefono al usuario
   printf("\nTelefono: ");
   fflush(stdin);
   scanf("%d",&usuario.telefono);

   return usuario;
}

//Funcion que imprime por pantalla los datos
void mostrar_datos(struct datos asignado){
   printf("\n\nLos datos que se han introducido son los siguientes:");
   printf("\n----------------------------------------------------\n");
   printf("Nombre completo: %s %s %s\n", asignado.persona.nombre, asignado.persona.apellido1, asignado.persona.apellido2);
   printf("Fecha de nacimiento: %d/%d/%d\n", asignado.nacimiento.dia, asignado.nacimiento.mes, asignado.nacimiento.año);
   printf("Numero de telefono: %d", asignado.telefono);

}


int main(){
   struct datos persona1;

   //Asignacion de datos a persona1
   persona1=nuevos_datos();

   //LLamada a la funcion que muestra los datos por pantalla
   mostrar_datos(persona1);

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

soyloqbuskas

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.
"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

тαптяα

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

#include<stdio.h>

//Estructuras para los datos personales
struct nombre_completo{
   //Datos personales: Nombre Apellido Apellido
   char nombre[40], apellido1[40], apellido2[40];
};

struct fecha_nacimiento{
   int dia, mes, ano;
};

//Estructura en la que se almacenaran todos los datos de una persona
struct datos{
   //Datos personales (estructura externa)
   struct nombre_completo persona;
   //Fecha de nacimiento (estructura externa)
   struct fecha_nacimiento nacimiento;
   long telefono;

};

//Funciones de asignacion de datos
struct nombre_completo nuevo_nombre(){
   struct nombre_completo nombre1;

   printf("Datos personales\n");
   printf("Dime tu nombre: ");
   fflush(stdin);
   gets(nombre1.nombre);
   printf("Primer apellido: ");
   fflush(stdin);
   gets(nombre1.apellido1);
   printf("Segundo apellido: ");
   fflush(stdin);
   gets(nombre1.apellido2);


   return nombre1;
}

struct fecha_nacimiento nueva_fecha(){
   struct fecha_nacimiento fecha1;

   printf("\nFecha de nacimiento\n");
   printf("Dia: ");
   fflush(stdin);
   scanf("%d", &fecha1.dia);
   printf("Mes: ");
   fflush(stdin);
   scanf("%d", &fecha1.mes);
   printf("Año: ");
   fflush(stdin);
   scanf("%d", &fecha1.ano);

   return fecha1;
}

//Funcion que asigna todos los datos personales por medio de llamadas a las otras funciones
struct datos nuevos_datos(){
   struct datos usuario;

   //Llamada a la funcion que asigna Nombre y apellidos
   usuario.persona=nuevo_nombre();

   //Llamada a la funcion que asigna la fecha de nacimiento
   usuario.nacimiento=nueva_fecha();

   //Peticion del telefono al usuario
   printf("\nTelefono: ");
   fflush(stdin);
   scanf("%d",&usuario.telefono);

   return usuario;
}

//Funcion que imprime por pantalla los datos
void mostrar_datos(struct datos asignado){
   printf("\n\nLos datos que se han introducido son los siguientes:");
   printf("\n----------------------------------------------------\n");
   printf("Nombre completo: %s %s %s\n", asignado.persona.nombre, asignado.persona.apellido1, asignado.persona.apellido2);
   printf("Fecha de nacimiento: %d/%d/%d\n", asignado.nacimiento.dia, asignado.nacimiento.mes, asignado.nacimiento.ano);
   printf("Numero de telefono: %d", asignado.telefono);

}


int main(){
   struct datos persona1;

   //Asignacion de datos a persona1
   persona1=nuevos_datos();

   //LLamada a la funcion que muestra los datos por pantalla
   mostrar_datos(persona1);

   return 0;
}

diegoCmC

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
a todas las que me abrieron su coraza traeles suerte
ya no creo en el amor pero querria volver a verte

тαптяα

Cita de: 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
No es "año" sino "año" o "ano" como quieras

diegoCmC

algo le pasa al foro, no escribo año escribo a_n_i_o todo junto jajajaj
a todas las que me abrieron su coraza traeles suerte
ya no creo en el amor pero querria volver a verte

0xDani

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 (cpp) [Seleccionar]

struct nombre_completo{
char* nombres[3];
};

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.
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

#7
Cita de: daniyo en 23 Agosto 2012, 00:30 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í:
CitarZanjado: NO USAR JAMAS.

fgets
+
sscanf

Código (cpp) [Seleccionar]


#include <stdio.h>

int main(int argc, char **argv)
{
   int opcion;

   do{
       printf("Opcion: ");
char linea[80];
fgets(linea, sizeof(linea), stdin);
       sscanf(linea, "%d",&opcion);
   }while(opcion!=0);

   return 0;
}

Regístrate en