Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JoneDawson en 5 Diciembre 2020, 13:00 pm



Título: Esta bien elaborado este codigo?
Publicado por: JoneDawson en 5 Diciembre 2020, 13:00 pm
holaa,
Me podeis corregir este codigo ,aunque compila y ejecuta bien pero no estoyy segura si la sintaxis es correcta y el programa es eficiente o no.Os dejo el enunciado del ejercicio.
Estos son los enunciados del codigo :

Introduccion del ejercicio
(https://imagizer.imageshack.com/img923/7663/zdJpH0.jpg)
(https://imagizer.imageshack.com/img923/6591/02lpyR.jpg)
(https://imagizer.imageshack.com/img924/7493/SDODH3.jpg)
(https://imagizer.imageshack.com/img922/1486/3k9J76.jpg)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h >
  3.  
  4. #define MAX_LONG 25 //tamaño maximo
  5. #define MAX_DRONES 50 //tamaño maximo de drones
  6.  
  7.  
  8. /* Declaramos las estructuras*/
  9. struct tipoFecha{ //registra cuando fue la ultima inspeccion
  10. int mes;
  11. int year;
  12. };
  13. struct tipoCoordenadaGPS{
  14. float latitud;
  15. float longitud;
  16. float altitud;
  17. };
  18. struct tipoDron {
  19. int numSerie;
  20. char modelo[MAX_LONG];
  21. float precio; //Precio de coste (en euros)
  22. float altura; //Altura a la que puede volar (en metros)
  23. int autonomia; //Autonomía de Vuelo (en minutos)
  24. float pesoMax; //Peso máximo que puede transportar
  25. struct tipoFecha fechaUltimaRev; //Fecha de la ultima revisión (mes, year)
  26. struct tipoCoordenadaGPS ptoEntrega;//Coordenadas del lugar de entrega
  27. int enReparto; //Identifica si el dron está en reparto o no)
  28. };
  29.  
  30. //Declaraciones de funciones
  31. void  mostrarDronesARevisar(struct tipoDron flota[MAX_DRONES], int numdrones);
  32. void mostrarDatosDron (struct tipoDron flota[MAX_DRONES], int numdrones);
  33. struct tipoDron leerDatosDron(void);
  34. void mostrarFlota(struct tipoDron flota[MAX_DRONES],int numdrones);
  35. void mostrarDronesEnReparto ( struct tipoDron flota[MAX_DRONES], int numdrones);
  36.  
  37. //funcion main
  38. int main(int argc, char *argv[]) {
  39. struct tipoDron dron;
  40.  
  41. struct tipoDron flota[MAX_DRONES];
  42. int orden,numdrones=0;
  43. int menu;
  44.  
  45. do{
  46. printf("*****************************************\n");
  47.        printf("MENU PRINCIPAL.\n");
  48.        printf("*****************************************\n");
  49. printf("Anadir dron (1)\n");
  50. printf("Mostrar flota (2)\n");
  51. printf("mostrar drones en reparto(3)\n");
  52. printf("mostrar drones a revisar (4)\n");
  53. printf("salir (0)\n");
  54. scanf("%i",&orden);
  55. //Pedimos los datos segun el numero
  56. switch(menu){
  57.  
  58.     case 1:
  59. dron =leerDatosDron();
  60. printf("\n");
  61. flota[numdrones]=dron;
  62. numdrones++;
  63.     break;
  64.  
  65.     case 2:
  66.     mostrarFlota(flota, numdrones);
  67.     break;
  68.  
  69.     case 3:
  70.    mostrarDronesEnReparto(flota, numdrones);
  71.    break;
  72.  
  73. case 4:
  74. mostrarDronesARevisar(flota, numdrones);
  75. break;
  76.    case 0:
  77. return 0;
  78.        break;
  79.     }
  80.  
  81.    }while(menu!=0)&&(numdrones<MAX_DRONES);
  82.  
  83. return 0;
  84. }
  85.  
  86. //Funcion de tipo structura para pedir los datos del dron
  87. struct tipoDron leerDatosDron(void){
  88.  
  89. struct tipoDron dron;
  90.  
  91. printf("Por favor introduzca el numero de serie del dron  :");
  92. scanf("%i",&dron.numSerie);
  93. printf("Por favor introduzca el modelo del dron:");
  94. scanf("%s",&dron.modelo);
  95. printf("Por favor introduzca elprecio del dron:");
  96. scanf("%f",&dron.precio);
  97. printf("Por favor introduzca la altura del dron:");
  98. scanf("%f",&dron.altura);
  99. printf("Por favor introduzca la autonomia del dron:");
  100. scanf("%i",&dron.autonomia);
  101. printf("Por favor introduzca el peso del dron :");
  102. scanf("%f",&dron.pesoMax);
  103. printf("Por favor introduzca el mes de la ultima revision :");
  104. scanf("%i",&dron.fechaUltimaRev.mes);
  105. printf("Por favor introduzca el year de la ultima revision :");
  106. scanf("%i",&dron.fechaUltimaRev.year);
  107. printf("Por favor indique si el dron esta en reparto (si=1)(no=0):  ");
  108. scanf("%i",&dron.enReparto);
  109.  
  110. if(dron.enReparto==1){
  111.  
  112. printf("introduzca la altitud del dron: ");
  113. scanf("%f",&dron.ptoEntrega.altitud);
  114.  
  115. do{
  116. printf("introduzca la latitud del dron: ");
  117. scanf("%f",&dron.ptoEntrega.latitud);
  118.     }while(dron.ptoEntrega.latitud<-90||dron.ptoEntrega.latitud>90);
  119.  
  120. do{
  121. printf("introduzca la longitud del dron: ");
  122. scanf("%f",&dron.ptoEntrega.longitud);
  123. }while(dron.ptoEntrega.longitud<-180||dron.ptoEntrega.longitud>180);
  124.  
  125. }
  126. return dron;
  127. }
  128.  
  129. void  mostrarDronesARevisar(struct tipoDron flota[MAX_DRONES], int numdrones){
  130.  
  131. int i, mes, year ;
  132. printf("Por favor introduzca el mes en el que estas actualmente");
  133. scanf("%i",&mes);
  134. printf("Por favor introduzca el año en el que estas actualmente");
  135. scanf("%i",&year);
  136.  
  137. for(i=0;i<numdrones;i++){
  138. if((mes+24)-(flota[i].fechaUltimaRev.mes+12)>6|| (year-flota[i].fechaUltimaRev.year)>2){
  139. printf("el dron con numero de serie %i y modelo  %s necesita una revision \n", flota[i].numSerie,flota[i].modelo);
  140. }
  141.  
  142. }
  143.  
  144. return ;
  145. }
  146.  
  147. void mostrarDatosDron (struct tipoDron flota[MAX_DRONES],int numdrones){
  148. int contador, numserie,i;
  149. printf("Por favor introduzca el numero de serie del dron por el cual quieres ver los datos ");
  150. scanf("%i",&numserie);
  151.  
  152. for(i=0;i<numdrones;i++){
  153. contador++;
  154. if (flota[i].numSerie==numserie){
  155. i=numdrones+1;
  156.     }
  157.    }
  158.  
  159. contador=contador-1;
  160. printf("El numero de serie del dron es : %i \n",flota[contador].numSerie);
  161. printf("El modelo del dron es : %s \n",flota[contador].modelo);
  162. printf("El precio del dron es :%f \n",flota[contador].precio);
  163. printf("La altura maxima del dron es:%f \n",flota[contador].altura);
  164. printf("La autonomia del dron es:%i \n",flota[contador].autonomia);
  165. printf("El peso maximo que puede llevar el dron es:%f \n",flota[contador].pesoMax);
  166. printf("La ultima revision fue el : %i/%i \n",flota [contador].fechaUltimaRev.mes,flota[contador].fechaUltimaRev.year);
  167.  
  168. if(flota[contador].enReparto==1){
  169. printf("la latitud del dron es :%f \n",flota[contador].ptoEntrega.latitud);
  170. printf("la altitud del dron es:%f \n",flota[contador].ptoEntrega.altitud);
  171. printf("la longitud del dron es :%f \n",flota[contador].ptoEntrega.longitud);
  172. }
  173.  
  174. return ;
  175. }
  176.  
  177. void mostrarFlota(struct tipoDron flota[MAX_DRONES],int numdrones){
  178. int i,respuesta,numserie;
  179.  
  180. for(i=0;i<numdrones;i++){
  181. printf("El dron con numero de serie %i modelo %s\n",flota[i].numSerie,flota[i].modelo);
  182. }
  183.  
  184. printf("Deseas saber los datos de alguno de los drones si(1) o no(otro)?");
  185. scanf("%i",&respuesta);
  186.  
  187. if (respuesta==1){
  188. mostrarDatosDron (flota, numdrones);
  189. }
  190.  
  191. return ;
  192. }
  193.  
  194. void mostrarDronesEnReparto ( struct tipoDron flota[MAX_DRONES], int numdrones) {
  195. int i;
  196. for(i=0;i<numdrones;i++){
  197. if(flota[i].enReparto==1){
  198. printf("El dron con numero de serie %i y modelo %s esta en reparto\n", flota[i].numSerie, flota[i].modelo);
  199. }
  200. }
  201.  
  202. return ;
  203. }







MOD: No hacer doble post. Para incluir información a un mensaje que nadie ha respondido, modificar el mensaje original
MOD: Los links a las imágenes del enunciado no se ven


Título: Re: Esta bien elaborado este codigo?
Publicado por: K-YreX en 5 Diciembre 2020, 18:19 pm
A grandes rasgos el programa está bastante bien:
  • Uso de constantes para hacerlo fácilmente escalable.
  • Nombres de variables/funciones significativos.
  • Bien estructurado.
...

Sin embargo, hay algunas cosas corregibles y algunos consejos siempre se pueden dar:

ALGUNOS ERRORES O COSAS IMPORTANTES:
  • En la función main() mezclas el uso de <orden> y <menu>. Guardas el valor en <orden> pero utilizas el switch con <menu>. Dudo que esto te esté funcionando por lo que supongo que será un error de formateo.
  • El programa finaliza al crear todos los drones. ¿Una vez que los he almacenado todos ya no puedo consultarlos? Es mejor que la condición de (numDrones < MAX_DRONES) se ponga dentro del case para crear un dron. Que no permita crear más pero que sí permita seguir consultando los creados.
  • Además la condición de (menu != 0) nunca llega a usarse. El <return 0> de la línea 77 hace que acabe el programa sin que llegue a comprobarse la condición. Es mejor que elimines el <case 0:>. Cuando sea 0 no hagas nada especial y ya se encarga el do-while() de hacer que el bucle acabe.
  • En la línea 94 vas a tener problemas si se introduce una cadena demasiado larga. La forma correcta y recomendada de leer cadenas de caracteres en C es mediante fgets(). Además después de cada scanf() (o al menos justo antes de usar fgets()) tendrás que limpiar el buffer para que funcione correctamente.
Código
  1. #define SIZE 100
  2. char cadena[SIZE];
  3. // Guarda como mucho SIZE-1 caracteres de la entrada estandar (stdin) en el array (cadena)
  4. // La ultima posicion se reserva para el caracter de fin de cadena: \0
  5. fgets(cadena, SIZE, stdin);
  6. // El Enter que introduzcas al final tambien se guardara (si hay espacio) entonces:
  7. if(cadena[strlen(cadena)-1] == '\n') cadena[strlen(cadena)-1] = '\0'; // Si se ha guardado lo eliminamos
  8. else while(getchar() != '\n'); // sino, es que quedan caracteres en el buffer. Asi se limpia el buffer de entrada

  • En la función mostrarDatosDron(), qué pasa si el número de serie no existe?? Muestras el último. Si yo busco el dron 123 quiero ver el dron 123 o un aviso de que ese dron no existe, no que el programa me enseñe los datos del 321. Supongo que se entiende, no? Además es mejor asignar siempre un valor a todas las variables de forma explícita y en tu caso contador no tiene un valor inicial explícito.
ALGUNOS CONSEJOS:
  • Puedes utilizar typedef para no tener que repetir la palabra struct.
Código
  1. // Para hacer referencia a Persona hay que escribir siempre: struct Persona
  2. struct Persona {
  3.  char *nombre;
  4.  int edad;
  5. };
  6. struct Persona miPersona;
  7.  
  8. // En este otro caso basta con utilizar solo el nombre de la struct: Persona
  9. typedef struct {
  10.  char *nombre;
  11.  int edad;
  12. } Persona;
  13. Persona miPersona;

  • Yo no usaría la palabra tipo en cada struct. Da a entender que hace referencia al tipo de fecha, de coordenada o de Dron. Piensa que en C no están definidos los tipos primitivos como: tipoInt, tipoFloat,... Es mejor usar solo: Fecha, Coordenada, Dron,...
  • El modelo del Dron puedes definirlo como un puntero y utilizar memoria dinámica. Así cada array ocupará lo estrictamente necesario y no más. Esto complica un poco el programa pues tratar con memoria dinámica no siempre es muy sencillo.
  • En los parámetros de las funciones no es necesario especificar el tamaño de la primera dimensión del array. Puedes ahorrar texto y además imagina que en un momento dado le pasas un array con una longitud diferente. Y cuando no se utilizan parámetros no es necesario especificar "void" (se puede y se suele dejar vacío). De igual manera las funciones con retorno void tampoco suelen especificar el return (se añade implícitamente siempre al final de una función).
  • En las definiciones de las funciones no es necesario especificar tampoco el nombre. El nombre solo hay que especificarlo en la implementación y así si lo cambias no tendrás que cambiarlo en 2 sitios, sino solo en 1. Resultado:
Código
  1. //Declaraciones de funciones
  2. void  mostrarDronesARevisar(Dron[], int numDrones);
  3. void mostrarDatosDron (Dron[], int numDrones);
  4. struct tipoDron leerDatosDron();
  5. void mostrarFlota(Dron[],int numDrones);
  6. void mostrarDronesEnReparto(Dron[], int numDrones);

  • También puedes utilizar la palabra const en parámetros para especificar que estos no pueden ser modificados durante la ejecución de la función. Aunque es típico pensar "qué más dará usar const si yo no voy a cambiar el valor?" En códigos grandes es posible que sin querer o queriendo lo cambies llegado un punto y no lo tengas en cuenta. Así evitas este posible problema.
  • La línea 138 es demasiado enrebuscada. No digo que esté mal pero se puede simplificar. Recuerdo en el colegio cuando me decían "antes de operar hay que convertir todo a la misma unidad". Pues eso es lo que hay que hacer, convertir la fecha a meses ¿quedará algo más sencillo no?:
Código
  1. (year * 12 + mes) > (dron.year * 12 + dron.mes)

  • Una mejor manera para buscar un dron (o cualquier elemento en un array) es con un flag de salida por ejemplo. Aprovecha al máximo cada variable:
Código
  1. int dronBuscado = -1; // Suponemos que no existe
  2. for(int i = 0; i < numDrones && dronBuscado == -1; ++i){
  3.  if(dron[i].numSerie == numSerie) dronBuscado = i;
  4. }
  5. // Ya tienes la posicion del dron buscado o -1 si no existe
  6. if(dronBuscado != -1){
  7.  // ...
  8. } else printf("El dron %d no existe\n", numSerie);

  • Además la eficiencia del algoritmo para buscar un dron es lineal O(n). Puedes modificar el programa para guardar siempre los drones en orden según el numSerie y así tener una eficiencia de búsqueda mejor O(log n).
  • En la función mostrarFlota() quitaría la parte final de mostrar un dron. Imagina que automatizas un programa para que muestre 200 arrays diferentes de drones y tienes que tener a una persona ahí pulsando una tecla cada vez que terminas de mostrar un array. La función tiene que hacer lo que tiene que hacer: mostrar los drones. Luego cuando llames a esta función desde fuera tú sabrás si quieres añadir lo otro o no pero que esto no se añada siempre.

Creo que esto es todo. Al menos todas las cosas que yo cambiaría o que se podrían cambiar para mejorarlo.