Advertisement
Guest User

prac1

a guest
Dec 15th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.18 KB | None | 0 0
  1. /*
  2.  
  3. Practica 1 de 1r de Programacio
  4. Autors: Pau Pons Clotet i Carles Roch Arnau
  5.  
  6. LS_STRATEGIST
  7.  
  8. */
  9.  
  10. //Inclusio de llibraries
  11. #include <stdio.h>
  12. #include <math.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <time.h>
  16.  
  17. //Definicio de constants
  18. #define MAX_CODI 10
  19. #define MAX_CHARS 30 //Maxim de caràcters permesos en pilots.nom i altres strings
  20. #define DATA_LENGTH 8 //Llargada de les strings de data, en format (ddmmaaaa)
  21. #define MAX_PILOTS 20 //Maxim de pilots
  22. #define MAX_CHARS_STR 500 //Maxim de caracters de l'input d'informacio a l'opcio 3
  23. #define MAX_LAPS 11 //Maxim nombre de parades
  24.  
  25. //Estructutes
  26. typedef struct {
  27. int dorsal;
  28. char nom[MAX_CHARS];
  29. int data_dia;
  30. int data_mes;
  31. int data_any;
  32. char compost[MAX_CHARS];
  33. int num_parades;
  34. int num_volta_parades[MAX_LAPS];
  35. int index;
  36. } Pilots;
  37.  
  38. //Funcions
  39.  
  40. int custom_atoi(char string[MAX_CHARS_STR]) {
  41. int result = 0;
  42. int i;
  43. if (strlen(string) >= 1) { //Si l'string que ens arriba es nul·la, retornem un -1 per evitar de retornar quelcom valid (0) si l'input no ho es.
  44. for (i = 0; i < strlen(string); i++) {
  45. result = (result * 10) + (string[i] - '0');
  46. }
  47. } else {
  48. result = -1;
  49. }
  50. return (result);
  51. }
  52.  
  53. //Codi
  54. int main(){
  55.  
  56. //Declaracio de variables
  57. int opcio_menu;
  58.  
  59. //Declaracio de variables auxiliars
  60. int error; //Aquesta variable la fem servir de flag per activar el missatge d'error si l'usuari introdueix valors erronis
  61. int i, j, k;
  62. char aux;
  63. char array_aux[MAX_CHARS];
  64. int flag;
  65.  
  66. //Variables opcio1: assistent de pneumatics
  67. int opc1_degradacio, opc1_velocitat_durabilitat; //(ID, IPV)
  68. int num_pneumatic, num_parades;
  69. char lletra_pneumatic;
  70. char opc1_plou;
  71. int opc1_control; //Variable de control que utilitzarem per saber si hem de l'opcio 1 quan volguem fer la 3.
  72.  
  73. //Variables opcio 2: generador de codi
  74. int opc2_dorsal, opc2_carrera;
  75. char codi_lletra;
  76. int codi_xifra1, codi_xifra2;
  77. int opc2_control; //Variable que utilitzarem per saber si hem fet l'opcio 2 quan volguem fer la 3.
  78. char opc2_codi[MAX_CODI];
  79.  
  80. //Variables opcio 3: comunicar-se amb el pilot
  81. char opc3_codi_introduit[MAX_CODI];
  82. int num_pilots;
  83.  
  84. Pilots pilots[MAX_PILOTS];
  85. char opc3_string[MAX_CHARS_STR];
  86.  
  87. char opc3_num_carrera[MAX_CHARS];
  88. char opc3_degradacio[MAX_CHARS];
  89. char opc3_plou[MAX_CHARS];
  90. char opc3_voltes[MAX_CHARS];
  91. char opc3_num_pilots[MAX_CHARS];
  92.  
  93. int opc3_custom_atoi; //Variable auxiliar que fem servir per guardar els valors convertits a integreri
  94. int opc3_pilot_actual; //Variable que fem servir dins d'un bucle com a index del pilot actual
  95.  
  96. int opc3_trespas;
  97. int opc3_control;
  98.  
  99. //Variables opcio 4: simulacio de la carrera
  100. int opc4_control;
  101.  
  102. float opc4_chance[MAX_PILOTS];
  103.  
  104. int opc4_A, opc4_B, opc4_C, opc4_D, opc4_R;
  105. int opc4_winner;
  106. float opc4_top;
  107.  
  108. //Inicialitzacio de les variables de control de les opcions 1, 2 i 3
  109. opc1_control = 0;
  110. opc2_control = 0;
  111. opc3_control = 0;
  112.  
  113. //Display del missatge de benvinguda
  114. printf("Benvingut a LS Strategist!\n");
  115.  
  116. //Codi global que s'anira executant fins que l'opcio sigui (5)
  117. while (opcio_menu != 5) {
  118.  
  119. //Display del menu
  120. printf("\nSi us plau, tria una opcio del menu:\n");
  121. printf("\n 1. Estrategia de pneumatics.");
  122. printf("\n 2. Obtencio del codi de radio.");
  123. printf("\n 3. Comuniar-se amb el pilot.");
  124. printf("\n 4. Simular carrera.");
  125. printf("\n 5. Sortir.\n");
  126.  
  127. //Input de l'opcio seleccionada
  128. printf("\nOpcio seleccionada: ");
  129. do {
  130. scanf("%d", &opcio_menu); //Emmagatzemar input opcio a variable opcio_menu
  131.  
  132.  
  133. //L'input no es valid (0-5) -> mostrar missatge d'error
  134. if (!((opcio_menu >= 1) && (opcio_menu <= 5))) {
  135. error = 1;
  136. printf("\nERROR: Els valors admesos es troben entre l'1 el 5");
  137. printf("\nSi us plau, torneu a introduir la opcio: ");
  138. } else {
  139. error = 0;
  140. }
  141. } while(error == 1); //Repeteix si l'input no es valid
  142.  
  143. //Switch d'opcio seleccionada
  144. switch (opcio_menu) {
  145.  
  146. //Cas 1: Opcio menu == 1: Assistent pneumatics
  147. case (1):
  148.  
  149. //Display del text
  150. printf("\nAssistent d'estrategia de pneumatics:\n");
  151.  
  152. //Input del opc1_plou
  153. do {
  154. printf("Esta provent sobre la pista? (S / N): ");
  155. scanf("\n%c", &opc1_plou);
  156.  
  157. //Deteccio de si l'input es correcte, si no ho es, activem la flag per activar el while
  158. switch (opc1_plou) {
  159. case ('s'):
  160. case ('S'):
  161. case ('n'):
  162. case ('N'):
  163. error = 0;
  164. break;
  165.  
  166. //L'input no es valid (s, S, n, N) -> mostrar missatge d'error
  167. default:
  168. error = 1;
  169. printf("\nERROR: Els valors admesos son n, N, s, S\n");
  170. }
  171.  
  172. } while(error == 1);
  173.  
  174. //Input del opc1_degradacio
  175. do {
  176. printf("Quin nivell de degradacio provoca la pista sobre el pneumatic? (0-4): ");
  177. scanf("%d", &opc1_degradacio);
  178.  
  179. //L'input no es valid (0-4) -> mostrar missatge d'error
  180. if (!((opc1_degradacio >= 0) && (opc1_degradacio <= 4))) {
  181. error = 1;
  182. printf("\nERROR: Els valors admesos es troben entre el 0 i el 4\n");
  183. } else {
  184. error = 0;
  185. }
  186. } while (error == 1);
  187.  
  188. //Input del opc1_velocitat_durabilitat
  189. do {
  190. printf("Com es vol prioritzar la velocitat del pneumatic sobre la durabilitat (1-5): ");
  191. scanf("%d", &opc1_velocitat_durabilitat);
  192.  
  193. //L'input no es valid (1-5) -> mostrar missatge d'error
  194. if (!((opc1_velocitat_durabilitat >= 1) && (opc1_velocitat_durabilitat <= 5))) {
  195. error = 1;
  196. printf("\nERROR: Els valors admesos es troben entre el 1 i el 5\n");
  197. } else {
  198. error = 0;
  199. }
  200. } while (error == 1);
  201.  
  202. //Calcular pneumatic
  203.  
  204. //Calcular el valor absolut de ('opc1_degredacio' - 'opc1_velocitat_durabilitat') = 'num_pneumatic' sense la funcio abs()
  205.  
  206. num_pneumatic = opc1_degradacio - opc1_velocitat_durabilitat;
  207. if (num_pneumatic < 0) {
  208. num_pneumatic = num_pneumatic * (-1);
  209. }
  210.  
  211. //Calcular pneumatic PLOVENT
  212. if ((opc1_plou == 's' || opc1_plou == 'S')) {
  213.  
  214. //Proposar pneumatic Intermedi o Full wet
  215. if (num_pneumatic >= 3) {
  216. lletra_pneumatic = 'I'; //Si la diferencia es superior a 3, proposem l'Intermedi (I)
  217. } else {
  218. lletra_pneumatic = 'W'; //Si no, proposem el Full Wet (W)
  219. }
  220.  
  221. //Calcular pneumatic NO PLOVENT
  222. } else {
  223. if ((opc1_plou == 'n' || opc1_plou == 'N')) {
  224. lletra_pneumatic = 'C';
  225. }
  226. }
  227.  
  228. //Calcular parades
  229. if (opc1_velocitat_durabilitat == 3) {
  230. num_parades = 2;
  231. } else {
  232. if (opc1_velocitat_durabilitat > 3) {
  233. num_parades = 3;
  234. } else {
  235. num_parades = 1;
  236. }
  237. }
  238.  
  239. //Mostrar pneumnatic i parades
  240.  
  241. printf("\n");
  242.  
  243. if (lletra_pneumatic == 'I' || lletra_pneumatic == 'W') {
  244. if (num_parades > 1) {
  245. printf("El compost adequat es el %c i haureu de realitzar %d parades a boxes",lletra_pneumatic,num_parades);
  246. } else {
  247. printf("El compost adequat es el %c i haureu de realitzar una parada a boxes",lletra_pneumatic);
  248. }
  249. } else {
  250. if (num_parades > 1) {
  251. printf("El compost adequat es el %c%d i haureu re realitzar %d parades a boxes",lletra_pneumatic,num_pneumatic,num_parades);
  252. } else {
  253. printf("El compost adequat es el %c%d i haureu de realitzar una parada a boxes",lletra_pneumatic,num_pneumatic);
  254. }
  255. }
  256.  
  257. opc1_control = 1;
  258.  
  259. break;
  260.  
  261.  
  262. //Cas 2, opcio_menu == 2; Codi de radio
  263. case (2):
  264.  
  265. printf("\nGenerador de codi de comunicacio:");
  266.  
  267. //Input de dades
  268.  
  269. //Input de l'opc2_dorsal
  270. do {
  271. printf("\nQuin el nombre de dorsal del pilot amb qui es vol comunicar?(1-99): ");
  272. scanf("%d", &opc2_dorsal);
  273.  
  274. //L'input no es valid (1-99) -> mostrar missatge d'error
  275. if (!((opc2_dorsal >= 1) && (opc2_dorsal <= 99))) {
  276. error = 1;
  277. printf("\nERROR: Els valors admesos es troben entre l'1 i el 99\n");
  278. } else {
  279. error = 0;
  280. }
  281. } while (error == 1);
  282.  
  283. //Input de l'opc2_carrera
  284. do {
  285. printf("Quin es el nombre de la cursa en el calendari (1-21): ");
  286. scanf("%d", &opc2_carrera);
  287.  
  288. //L'input no es valid (1-21) -> mostrar missatge d'error
  289. if (!((opc2_carrera >= 1) && (opc2_carrera <= 21))) {
  290. error = 1;
  291. printf("\nERROR: Els valors admesos es troben entre l'1 i el 21\n");
  292. } else {
  293. error = 0;
  294. }
  295. } while(error == 1);
  296.  
  297. //Generador de codi
  298.  
  299. //Generador dels components del codi
  300. codi_lletra = ('A' - 1) + (opc2_dorsal % 27);
  301. codi_xifra1 = opc2_dorsal / opc2_carrera;
  302. codi_xifra2 = ((opc2_dorsal) / 26);
  303. opc2_control = 1;
  304.  
  305. //Generacio del string de codi
  306. if (codi_xifra1 > 9) {
  307. opc2_codi[0] = codi_lletra;
  308. opc2_codi[1] = (codi_xifra1 / 10) + '0';
  309. opc2_codi[2] = (codi_xifra1 % 10) + '0';
  310. opc2_codi[3] = codi_xifra2 + '0';
  311. opc2_codi[4] = '\0';
  312. } else {
  313. opc2_codi[0] = codi_lletra;
  314. opc2_codi[1] = codi_xifra1 + '0';
  315. opc2_codi[2] = codi_xifra2 + '0';
  316. opc2_codi[3] = '\0';
  317. }
  318.  
  319.  
  320. printf("\nCODI GENERAT: %s", opc2_codi);
  321.  
  322. break;
  323.  
  324. //Cas 3, opcio_menu == 3; Comunicacio amb el pilot
  325. case (3):
  326.  
  327. //Comprovar si s'han fet les dues primeres opcions abans de fer aquesta opcio
  328. if (opc1_control && opc2_control) {
  329.  
  330. do {
  331. printf("\nIntroduiu el codi de radio: ");
  332. scanf("%s", opc3_codi_introduit);
  333. scanf("%c", &aux); //Netejar el '\n'
  334.  
  335. //L'input no es valid (strcmp != 0) -> mostrar missatge d'error
  336. if ((strcmp(opc2_codi, opc3_codi_introduit) != 0)) {
  337.  
  338. if (strcmp(opc3_codi_introduit, "exit") == 0) { //Sortir de l'opcio 3 introduint exit
  339. error = 0;
  340. } else {
  341. error = 1;
  342. printf("\nERROR: Aquest codi de radio no existeix\n");
  343. }
  344. } else { //El codi s'ha introduit correctament
  345. printf("\nCodi correcte");
  346. printf("\nComunicant amb el pilot # %d de la carrera # %d ...", opc2_dorsal, opc2_carrera);
  347. printf("\n");
  348.  
  349. //Comprobem si la primera part del codi es correcte
  350. error = 1;
  351. while (error == 1) {
  352. printf("\nIntroduiu la informacio:\n");
  353.  
  354. fgets(opc3_string, MAX_CHARS_STR, stdin); //Guardem tota la string de caracters a opc3_string
  355. opc3_string[(strlen(opc3_string) - 1)] = '\0'; //Netejem el '\n' que s'ha quedat
  356.  
  357. if (strcmp(opc3_string, "debug2") == 0) {
  358. stpcpy(opc3_string, "1|2|n|10|2|34-Pau Pons-22/03/2001-C4-2-4/8|6-Carles Roch-22/11/2001-C4-1-6");
  359. }
  360.  
  361. if (strcmp(opc3_string, "debug3") == 0) {
  362. stpcpy(opc3_string, "1|2|n|10|3|34-Pau Pons-22/03/2001-C4-2-4/8|6-Carles Roch-22/11/2001-C4-1-6|66-Daniel Amo-09/04/1976-C3-1-3");
  363. }
  364.  
  365. if (!(strcmp(opc3_string, "exit") == 0)) {
  366.  
  367. //Numero de carrera
  368. j = 0;
  369. for (i = 0; opc3_string[i] != '|' && i < MAX_CHARS_STR; i++) {
  370. opc3_num_carrera[j] = opc3_string[i];
  371. j++;
  372. }
  373. opc3_num_carrera[j] = '\0';
  374. opc3_custom_atoi = custom_atoi(opc3_num_carrera); //Fem servir aquesta variable auxiliar per guardar l'custom_atoi d'opc3_num_volte
  375. if (!(opc3_custom_atoi >= 1 && opc3_custom_atoi <= 21)) {
  376. error = 1;
  377. printf("\nERROR: El nombre de carrera és incorrecte!");
  378. } else {
  379. //Nivell degradacio
  380. j = 0;
  381. i++;
  382. while (opc3_string[i] != '|' && i < MAX_CHARS_STR) {
  383. opc3_degradacio[j] = opc3_string[i];
  384. j++;
  385. i++;
  386. }
  387. opc3_degradacio[j] = '\0';
  388. opc3_custom_atoi = custom_atoi(opc3_degradacio); //Fem servir aquesta variable auxiliar per guardar l'custom_atoi d'opc3_degradacio
  389. if (!(opc3_custom_atoi >= 0 && opc3_custom_atoi <= 4)) {
  390. error = 1;
  391. printf("\nERROR: El nombre de degradacio és incorrecte!");
  392. } else {
  393. //Plou
  394. j = 0;
  395. i++;
  396. while (opc3_string[i] != '|' && i < MAX_CHARS_STR) {
  397. opc3_plou[j] = opc3_string[i];
  398. j++;
  399. i++;
  400. }
  401. opc3_plou[j] = '\0';
  402. if (strlen(opc3_plou) == 1) {
  403. if (((strcmp(opc3_plou, "N") == 0) || (strcmp(opc3_plou, "n") == 0) || (strcmp(opc3_plou, "S") == 0) || (strcmp(opc3_plou, "s") == 0))) {
  404. //Numero de voltes
  405. j = 0;
  406. i++;
  407. while (opc3_string[i] != '|' && i < MAX_CHARS_STR) {
  408. opc3_voltes[j] = opc3_string[i];
  409. i++;
  410. j++;
  411. }
  412. opc3_voltes[j] = '\0';
  413. opc3_custom_atoi = custom_atoi(opc3_voltes);
  414. if (!(opc3_custom_atoi >= 0 && opc3_custom_atoi <= 10)) {
  415. printf("ERROR: format de voltes és incorrecte!");
  416. } else {
  417. //Num pilots (2-20)
  418. j = 0;
  419. i++;
  420. while (opc3_string[i] != '|' && i < MAX_CHARS_STR) {
  421. opc3_num_pilots[j] = opc3_string[i];
  422. i++;
  423. j++;
  424. }
  425. opc3_num_pilots[j] = '\0';
  426. opc3_custom_atoi = custom_atoi(opc3_num_pilots);
  427. num_pilots = custom_atoi(opc3_num_pilots);
  428. if (!(opc3_custom_atoi >= 2 && opc3_custom_atoi <= 20)) {
  429. printf("ERROR: format de nombre de pilots és incorrecte!");
  430. } else {
  431.  
  432. for (opc3_pilot_actual = 0; opc3_pilot_actual < num_pilots && opc3_pilot_actual < 20; opc3_pilot_actual++) { //Magic number 20
  433. j = 0;
  434. i++;
  435.  
  436. //Guardem l'ordre del pilot
  437. pilots[opc3_pilot_actual].index = opc3_pilot_actual;
  438.  
  439. //Guardem el dorsal
  440. j = 0;
  441. while ((opc3_string[i] != '-') && i < MAX_CHARS_STR) {
  442. array_aux[j] = opc3_string[i];
  443. i++;
  444. j++;
  445. }
  446. array_aux[j] = '\0';
  447. pilots[opc3_pilot_actual].dorsal = custom_atoi(array_aux);
  448.  
  449. //Verifiquem el dorsal
  450. if (!(pilots[opc3_pilot_actual].dorsal >= 1 && pilots[opc3_pilot_actual].dorsal <= 99)) {
  451. printf("ERROR al pilot %d: format de nombre de dorsal és incorrecte!", opc3_pilot_actual + 1);
  452. error = 1;
  453.  
  454. } else {
  455. //Verificació de nom
  456. j = 0;
  457. i++;
  458. while (opc3_string[i] != '-' && i < MAX_CHARS_STR) {
  459. pilots[opc3_pilot_actual].nom[j] = opc3_string[i];
  460. i++;
  461. j++;
  462. }
  463. pilots[opc3_pilot_actual].nom[j] = '\0';
  464. if (!(strlen(pilots[opc3_pilot_actual].nom) <= 25)) {
  465. printf("ERROR al pilot %d: el nom supera els 25 caràcterns", opc3_pilot_actual + 1);
  466. } else {
  467. //Guardem la data de naixement
  468.  
  469. //Guardem el dia
  470. j = 0;
  471. i++;
  472. while (opc3_string[i] != '/' && i < MAX_CHARS_STR) {
  473. array_aux[j] = opc3_string[i];
  474. i++;
  475. j++;
  476. }
  477. array_aux[j] = '\0';
  478. pilots[opc3_pilot_actual].data_dia = custom_atoi(array_aux);
  479.  
  480. //Guardem el mes
  481. j = 0;
  482. i++;
  483. while ((opc3_string[i] != '/') && i < MAX_CHARS_STR) {
  484. array_aux[j] = opc3_string[i];
  485. i++;
  486. j++;
  487. }
  488. array_aux[j] = '\0';
  489. pilots[opc3_pilot_actual].data_mes = custom_atoi(array_aux);
  490.  
  491. //Guardem l'any
  492. j = 0;
  493. i++;
  494. while (opc3_string[i] != '-' && i < MAX_CHARS_STR) {
  495. array_aux[j] = opc3_string[i];
  496. i++;
  497. j++;
  498. }
  499. array_aux[j] = '\0';
  500. pilots[opc3_pilot_actual].data_any = custom_atoi(array_aux);
  501.  
  502. //Comprovar si es un any de trespas
  503. if (((pilots[opc3_pilot_actual].data_any%100)%4) == 0) {
  504. //Les dues ultimes xifres son multiples de 4
  505. if ((pilots[opc3_pilot_actual].data_any%100) == 0) {
  506. if (((pilots[opc3_pilot_actual].data_any/100)%4) == 0) {
  507. //any de trespas
  508. opc3_trespas = 1;
  509. } else {
  510. //no es trespas
  511. opc3_trespas = 0;
  512. }
  513. } else {
  514. //any de trespàs
  515. opc3_trespas = 1;
  516. }
  517. } else {
  518. //no es trespas
  519. opc3_trespas = 0;
  520. }
  521.  
  522. //Comprovar data
  523. if (opc3_trespas) {
  524. //Any de trespas
  525. if (pilots[opc3_pilot_actual].data_mes == 2) {
  526. if (pilots[opc3_pilot_actual].data_dia >= 1 && pilots[opc3_pilot_actual].data_dia <= 29) {
  527. error = 0;
  528. } else {
  529. error = 1;
  530. printf("ERROR al pilot %s: El dia no es correcte!", pilots[opc3_pilot_actual].nom);
  531. }
  532. } else {
  533. if (pilots[opc3_pilot_actual].data_mes >= 1 && pilots[opc3_pilot_actual].data_mes <= 12 && pilots[opc3_pilot_actual].data_mes != 2) {
  534. if (pilots[opc3_pilot_actual].data_dia >= 1 && pilots[opc3_pilot_actual].data_dia <= 31) {
  535. error = 0;
  536. } else {
  537. error = 1;
  538. printf("ERROR al pilot %s: El dia no es correcte!", pilots[opc3_pilot_actual].nom);
  539. }
  540. } else {
  541. error = 1;
  542. printf("ERROR al pilot %s: El mes no es correcte!", pilots[opc3_pilot_actual].nom);
  543. }
  544. }
  545. } else {
  546. //No any de trespas
  547. if (pilots[opc3_pilot_actual].data_mes == 2) {
  548. if (pilots[opc3_pilot_actual].data_dia >= 1 && pilots[opc3_pilot_actual].data_dia <= 28) {
  549. error = 0;
  550. } else {
  551. error = 1;
  552. printf("ERROR al pilot %s: El dia no es correcte!", pilots[opc3_pilot_actual].nom);
  553. }
  554. } else {
  555. if (pilots[opc3_pilot_actual].data_mes >= 1 && pilots[opc3_pilot_actual].data_mes <= 12 && pilots[opc3_pilot_actual].data_mes != 2) {
  556. if (pilots[opc3_pilot_actual].data_dia >= 1 && pilots[opc3_pilot_actual].data_dia <= 31) {
  557. error = 0;
  558. } else {
  559. error = 1;
  560. printf("ERROR al pilot %s: El dia no es correcte!", pilots[opc3_pilot_actual].nom);
  561. }
  562. } else {
  563. error = 1;
  564. printf("ERROR al pilot %s: El mes no es correcte!", pilots[opc3_pilot_actual].nom);
  565. }
  566. }
  567. }
  568. if (!error) {
  569. //Guardar el compost
  570. j = 0;
  571. i++;
  572. while (opc3_string[i] != '-' && i < MAX_CHARS_STR) {
  573. pilots[opc3_pilot_actual].compost[j] = opc3_string[i];
  574. i++;
  575. j++;
  576. }
  577. pilots[opc3_pilot_actual].compost[j] = '\0';
  578.  
  579. //Guardar i verificar el nombre de parades
  580. j = 0;
  581. i++;
  582. while (opc3_string[i] != '-' && i < MAX_CHARS_STR) {
  583. array_aux[j] = opc3_string[i];
  584. i++;
  585. j++;
  586. }
  587. array_aux[j] = '\0';
  588. pilots[opc3_pilot_actual].num_parades = custom_atoi(array_aux);
  589.  
  590. if (!(pilots[opc3_pilot_actual].num_parades > 0 && pilots[opc3_pilot_actual].num_parades < 11)) {
  591. printf("ERROR al pilot %s: format de nombre de parades és incorrecte!", pilots[opc3_pilot_actual].nom);
  592. } else {
  593. //Guardar i comprovar voltes de parada
  594.  
  595. i++;
  596. flag = 0;
  597. k = 0;
  598. while (!flag && i < MAX_CHARS_STR) {
  599. j = 0;
  600. while (opc3_string[i] != '/' && opc3_string[i] != '|' && i < MAX_CHARS_STR) {
  601. array_aux[j] = opc3_string[i];
  602. i++;
  603. j++;
  604. }
  605.  
  606. if (opc3_string[i] == '|') {
  607. flag = 1;
  608. } else {
  609. i++;
  610. }
  611. array_aux[j] = '\0';
  612. pilots[opc3_pilot_actual].num_volta_parades[k] = custom_atoi(array_aux);
  613. k++;
  614. }
  615.  
  616. if (!(k == pilots[opc3_pilot_actual].num_parades)) {
  617. printf("ERROR al pilot %s: nombre de voltes de parada no coincideix amb nombre de voltes", pilots[opc3_pilot_actual].nom);
  618. error = 1;
  619. } else {
  620. error = 0;
  621. opc3_control = 1;
  622. printf("\nInformacio validada i enviada correctament per al pilot %s!", pilots[opc3_pilot_actual].nom);
  623. }
  624. }
  625. }
  626. }
  627. }
  628. }
  629. }
  630. }
  631. } else {
  632. printf("\nERROR: El format de plou es incorrecte!");
  633. error = 1;
  634. }
  635. } else {
  636. printf("\nERROR: El format de plou es incorrecte!");
  637. error = 1;
  638. }
  639. }
  640. }
  641. } else {
  642. if ((strcmp(opc3_string, "exit")) == 0) {
  643. error = 0;
  644. opc3_control = 0;
  645. printf("\nSortint de l'opcio 3");
  646. }
  647. }
  648. } //Fins aqui, l'usuari introdueix el codi
  649.  
  650. }
  651. } while (error == 1);
  652.  
  653. } else {
  654. if (!opc2_control) {
  655. printf("\nERROR: Encara no s'ha generat cap codi de xifrat per a la radio\n");
  656. } else {
  657. if (!opc1_control) {
  658. printf("\nERROR: Encara no s'han introduit les dades de la carrera (Fer opcio 1)\n");
  659. }
  660. }
  661. }
  662. printf("\n");
  663. break;
  664.  
  665. //Cas 4, opcio_menu == 4; Simulacio de la carrera
  666. case (4):
  667.  
  668. //Generador de nombres pseudoaleatoris
  669. srand(time(0));
  670.  
  671. //Comprovar si s'han efectuat les anteriors opcions
  672. if (!(opc1_control && opc2_control && opc3_control)) {
  673.  
  674. if (opc1_control) {
  675. array_aux[0] = '2';
  676. } else {
  677. array_aux[0] = '1';
  678. }
  679.  
  680. if (opc2_control) {
  681. array_aux[1] = '2';
  682. } else {
  683. array_aux[1] = '1';
  684. }
  685.  
  686. if (opc3_control) {
  687. array_aux[2] = '2';
  688. } else {
  689. array_aux[2] = '1';
  690. }
  691. array_aux[3] = '\0';
  692. opc4_control = custom_atoi(array_aux);
  693.  
  694. switch (opc4_control){
  695. case (211):
  696. printf("ERROR: No s'ha configurat el codi de radio ni s'ha comunicat amb el pilot");
  697. break;
  698. case (221):
  699. printf("ERROR: No s'ha comunicat amb el pilot");
  700. break;
  701. case (121):
  702. printf("ERROR: No s'ha configurat l'estrategia de pneumatics ni s'ha comunicat amb el pilot");
  703. break;
  704. case (112):
  705. printf("ERROR: No s'ha configurat l'estrategia de pneumatics ni el codi de radio");
  706. break;
  707. case (111):
  708. printf("ERROR: No s'ha configurat l'estrategia de pneumatics, el codi de radio ni s'han transmes les dades al pilot");
  709. break;
  710. }
  711.  
  712. printf("\n");
  713.  
  714. } else {
  715. for (i = 0; i < num_pilots; i++) {
  716. //Calcular parametre A
  717. if (lletra_pneumatic == pilots[i].compost[0]) {
  718. if (lletra_pneumatic == 'C') {
  719. opc4_A = num_pneumatic - pilots[i].compost[1];
  720. } else {
  721. opc4_A = 0;
  722. }
  723. } else {
  724. if (lletra_pneumatic == 'C' && pilots[i].compost[0] == 'I') {
  725. opc4_A = 1;
  726. } else {
  727. opc4_A = 2;
  728. }
  729. if (lletra_pneumatic == 'I' && (pilots[i].compost[0] == 'W' || pilots[i].compost[0] == 'I')) {
  730. opc4_A = 1;
  731. }
  732. if (lletra_pneumatic == 'W' && pilots[i].compost[0] == 'C') {
  733. opc4_A = 2;
  734. } else {
  735. opc4_A = 1;
  736. }
  737. }
  738.  
  739. //Calcular parametre B
  740. opc4_B = num_parades - pilots[i].num_parades;
  741.  
  742. //Calcular parametre C
  743. opc4_C = abs(num_pilots - (pilots[i].index + 1));
  744.  
  745. //Calcular parametre D
  746. opc4_D = num_pilots;
  747.  
  748. //Generar parametre R
  749. opc4_R = rand() % 8;
  750.  
  751. //debug
  752. printf("\nDEBUG: (%s)A: %d, B: %d, C: %d, D: %d, R: %d", pilots[opc4_winner].nom, opc4_A, opc4_B, opc4_C, opc4_D, opc4_R);
  753.  
  754. opc4_chance[i] = 100 - sqrt(abs(pow(opc4_A, 2)+pow(opc4_B, 2))) - (abs(cos(((opc4_C / opc4_D)*100*(2/3))+(1/3*opc4_R))) * 40);
  755. }
  756.  
  757. //printejar els resultats
  758.  
  759. printf("\nSimulant carrera ...");
  760. printf("\n\nResultats:\n");
  761. opc4_winner = 0;
  762. opc4_top = 0;
  763. for (i = 0; i < num_pilots; i++) {
  764. printf("\n%d. %s (%.2f)", i + 1, pilots[i].nom, opc4_chance[i]);
  765. if (opc4_chance[i] > opc4_top) {
  766. opc4_top = opc4_chance[i];
  767. opc4_winner = i;
  768. }
  769. }
  770.  
  771. //Pixelart de la copa
  772. printf("\n\n");
  773. printf("\n ░░░░░░░▒▒▒▓▓▓ ");
  774. printf("\n ░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ");
  775. printf("\n ░ ░▒▒▒▒▒▒▒▒▒▒▓▓ ▒ ");
  776. printf("\n ░ ░▒▒▒▒▒▒▒▒▒▒▓▓ ▒ ");
  777. printf("\n ░ ░▒▒▒▒▒▒▒▒▒▒▓▓ ▒ ");
  778. printf("\n ░ ░▒▒▒▒▒▒▒▒▓▓ ▒ ");
  779. printf("\n ░░░░▒▒▒▒▒▓▓▓▓▒▒ ");
  780. printf("\n ░░░░▒▒▒▓▓ ");
  781. printf("\n ░░░ ");
  782. printf("\n ░▒▒ ");
  783. printf("\n ░░▒▒▓ ");
  784. printf("\n ░░▒▒▓▓▓▓▓ ");
  785. printf("\n ░░░▒▒▒▒▒▒ ");
  786. printf("\n");
  787.  
  788. printf("\n Ehnorabona %s!\n", pilots[opc4_winner].nom);
  789. }
  790. }
  791. }
  792. //Si l'opcio triada es 5, el while que s'acaba de tancar no s'executara i passarem aqui.
  793. printf("\nGracies per utilitzar el programa!\nSort en la seguent carrera.\n\n");
  794.  
  795. return(0);
  796. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement