Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #pragma warning(disable : 4996)
  5.  
  6. #define maxTours 10
  7. #define maxEpreuves 16
  8. #define nbPatineursParEquipes 3
  9. #define nbEquipeParEpreuves 2
  10. #define tailleMaxChaine 30
  11. #define nbMaxEquipes 32
  12.  
  13. typedef struct {
  14. double temps;
  15. }Mesure;
  16.  
  17. typedef struct {
  18. char nom[tailleMaxChaine];
  19. unsigned int dossard;
  20. Mesure listeTemps[maxTours];
  21. unsigned int tourEffectue;
  22. }Patineur; // Une variable de type "Patineur" va stocker le nom et le numéro de dossard d'un patineur
  23.  
  24. typedef struct {
  25. char nomPays[tailleMaxChaine];
  26. Patineur patineur[nbPatineursParEquipes]; //Rappel nbPatineursParEquipes = 3
  27. }Equipe; // Une variable de type "Equipe" va stocker le pays d'origine de l'équipe et un tableau qui contient tous les patineurs de l'équipe
  28.  
  29. typedef struct {
  30. Equipe tabEquipe[nbEquipeParEpreuves];
  31. unsigned int numEpreuve;
  32. int etatEpreuve;
  33. }Epreuve;
  34.  
  35. typedef struct {
  36. Epreuve tabEpreuve[maxEpreuves];
  37. unsigned int compteurEpreuve;
  38. unsigned int nbTour; //Enregistre le nb de tour à effectué à chaque épreuve grâce à la commande "definir_parcours"
  39. unsigned int nbEpreuve; // enregistre le nb d'épreuve de la compet grace a la commande "defini_nb_epreuve"
  40. unsigned int cptDernier; /* à chaque fois qu'on enregistre le patineur le plus lent d'une équipe, on incrémente le compteur dernier de 1,
  41. cela permet de savoir combien il y a de valeur dans le tableau "dernierPatineur" */
  42. double dernierPatineur[nbMaxEquipes]; // c'est un tableau qui stock les patineurs les plus lents de chaque équipe
  43. int etatCompet;
  44. }Competition;
  45.  
  46. //Prototype des fontions
  47. void inscription_equipe(Equipe* pointeurEquipe, int* pointeurNumDossard);
  48.  
  49. void affichage_equipe(const Equipe* pointeurEquipe);
  50.  
  51. void recherche_dossard(const Equipe* pointeurEquipe, unsigned int* pointeurEntrerDossard, int* pointeurNumEquipe, int* pointeurNumPatineur);
  52.  
  53. void enregistrement_temps(Equipe* pointeurEquipe, Competition* pointeurCompet);
  54.  
  55. void affichage_temps(const Equipe* pointeurEquipe);
  56.  
  57. void affichage_temps_equipes(const Equipe* pointeurEquipe, const int pointeurCptEquipe);
  58.  
  59. void affichage_temps_equipes_avec_classement(const Equipe* pointeurEquipe, const int pointeurCptEquipe, unsigned int pointeurEntrerTour, Competition* pointeurCompet);
  60.  
  61. void definition_parcours(Competition* pointeurCompet);
  62.  
  63. void detection_fin_poursuite(Competition* pointeurCompet, int pointeurIdxEpreuve);
  64.  
  65. void definition_nb_epreuves(Competition* pointeurCompet);
  66.  
  67. void detection_fin_competition(Competition* pointeurCompet);
  68.  
  69. //main
  70. int main() {
  71. char commande[tailleMaxChaine] = ""; //La variable "commande" reçoit les commandes qu'on va rentrer
  72. Equipe equipe[nbMaxEquipes]; //Rappel nbMaxEquipe = 32
  73. int numDossard = 101, compteurEquipeInscrit = 0;
  74. Competition competition;
  75. competition.compteurEpreuve = 0;
  76. competition.cptDernier = 0;
  77.  
  78. do {
  79. scanf("%s", commande);
  80. if (strcmp(commande, "definir_parcours") == 0) {
  81. definition_parcours(&competition);
  82. }
  83. if (strcmp(commande, "definir_nombre_epreuves") == 0) {
  84. definition_nb_epreuves(&competition);
  85. }
  86. if (strcmp(commande, "inscrire_equipe") == 0) { // compare si la commande rentrée par le clavier == "inscrire_equipe", si oui, on rentre dans la condition
  87.  
  88. inscription_equipe(&equipe[compteurEquipeInscrit], &numDossard); /* Cette fonction nous permet de rentrer les données concernant les patineurs et
  89. l'équipe dans la varianle "pays" de type "Equipe"*/
  90.  
  91. compteurEquipeInscrit++; /* on incrémente "compteurEquipeInscrit" pour que la prochaine fois qu'on inscrit une équipe, les données de la nouvelle
  92. équipes soient rangées dans le rang suivant du tableau "equipe", c'est a dire par exemple que l'équipe Canada sera rangée
  93. dans equipe[0] tandis que l'équipe Japon sera rangée dans equipe[1]*/
  94. if (compteurEquipeInscrit % nbEquipeParEpreuves == 0) {
  95. (competition.compteurEpreuve)++;
  96. }
  97. }
  98. if (strcmp(commande, "afficher_equipes") == 0) { // compare si la commande rentrée par le clavier == "afficher_equipes", si oui, on rentre dans la condition
  99. for (int i = 0; i < compteurEquipeInscrit; i++) { // On affiche les données des équipes stocker dans le tableau "equipe"
  100. affichage_equipe(&equipe[i]);
  101. }
  102. }
  103. if (strcmp(commande, "enregistrer_temps") == 0) {
  104. enregistrement_temps(equipe, &competition);
  105. }
  106. if (strcmp(commande, "afficher_temps") == 0) {
  107. affichage_temps(equipe);
  108. }
  109. if (strcmp(commande, "afficher_temps_equipes") == 0) {
  110. affichage_temps_equipes(equipe, compteurEquipeInscrit);
  111. }
  112. if (strcmp(commande, "exit") == 0) { // compare si la commande rentrée par le clavier == "exit", si oui, on arrêt tous
  113. exit(0);
  114. }
  115. } while (1);
  116. }
  117.  
  118. //Fonctions
  119. void inscription_equipe(Equipe* pointeurEquipe, int* pointeurNumDossard) {
  120.  
  121. scanf("%s", pointeurEquipe->nomPays); //
  122.  
  123. for (int i = 0; i < nbPatineursParEquipes; i++) { //On crée une boucle pour rentrer le nom des patineurs, ici i = 0 ou 1 ou 2
  124. scanf("%s", pointeurEquipe->patineur[i].nom); //
  125.  
  126. pointeurEquipe->patineur[i].dossard = *pointeurNumDossard; // On attribut un numéro de dossard au patineur au rang i
  127. printf("inscription dossard %d\n\n", *pointeurNumDossard);
  128. (*pointeurNumDossard)++; /* Ici NumDossard est un pointeur donc lorsque on sortira de la fonction "inscription_equipe", la variable NumDossard ne va pas
  129. disparaitre, elle va conserver la derniere valeur qu'on lui a attribuer. */
  130. }
  131. }
  132.  
  133. void affichage_equipe(const Equipe* pointeurEquipe) {
  134. printf("%s ", pointeurEquipe->nomPays); // affiche le pays originaire de l'une équipe
  135.  
  136. for (int i = 0; i < nbPatineursParEquipes; i++) { // c'est une boucle qui affiche le nom et le dossard de tous les patineurs d'une équipe
  137. if (i == (nbPatineursParEquipes - 1)) {
  138. printf("%s %d", pointeurEquipe->patineur[i].nom, pointeurEquipe->patineur[i].dossard);
  139. }
  140. else {
  141. printf("%s %d ", pointeurEquipe->patineur[i].nom, pointeurEquipe->patineur[i].dossard);
  142. }
  143. }
  144. printf("\n\n");
  145. }
  146.  
  147. void recherche_dossard(const Equipe* pointeurEquipe, unsigned int* pointeurEntrerDossard, int* pointeurNumEquipe, int* pointeurNumPatineur) {
  148. do {
  149. if (pointeurEquipe[*pointeurNumEquipe].patineur[*pointeurNumPatineur].dossard != *pointeurEntrerDossard) {
  150. (*pointeurNumPatineur)++;
  151. if (*pointeurNumPatineur >= nbPatineursParEquipes) { /* Si le numéro du patineur dépasse le nombre de patineur autorisé par équipe, c'est-à-dire 3,
  152. alors on incrémente numEquipe de 1 et on réinitialise numPatineur à 0, cela veut dire qu'on va chercher
  153. dans l'équipe suivante le patineur correspondant au numéro de dossard demandé */
  154. (*pointeurNumEquipe)++;
  155. *pointeurNumPatineur = 0;
  156. }
  157. if (*pointeurNumEquipe >= nbMaxEquipes) {
  158. printf("le numéro de dossard demandé n'existe pas ou n'est pas encore attribué !\n\n");
  159. exit(0);
  160. }
  161. }
  162. else {
  163. break;
  164. }
  165. } while (1);
  166. }
  167.  
  168. void enregistrement_temps(Equipe* pointeurEquipe, Competition* pointeurCompet) {
  169. unsigned int entrerDossard = 0, entrerTour;
  170. double entrerTemps = 0.;
  171. int numEquipe = 0, numPatineur = 0, idxEpreuve = 0, idxEquipe = 0;
  172. scanf("%u", &entrerDossard);
  173.  
  174. recherche_dossard(pointeurEquipe, &entrerDossard, &numEquipe, &numPatineur);
  175.  
  176. scanf("%u", &entrerTour);
  177. pointeurEquipe[numEquipe].patineur[numPatineur].tourEffectue = entrerTour;
  178. scanf("%lf", &entrerTemps);
  179. pointeurEquipe[numEquipe].patineur[numPatineur].listeTemps[entrerTour - 1].temps = entrerTemps;
  180.  
  181. /*Entrer les données d'une équipe dans la variable "Compétition"*/
  182. idxEpreuve = (entrerDossard - 101) / 6; /*Permet de trouver le num de l'épreuve où se trouve le patineur correspondant au dossard entrer dans le scanf*/
  183. if ((entrerDossard - 101) % 6 >= 3) {
  184. idxEquipe = 1;
  185. }
  186. pointeurCompet->tabEpreuve[idxEpreuve].tabEquipe[idxEquipe] = pointeurEquipe[numEquipe];
  187.  
  188. // Appelle de la fontion "detection_fin_poursuite"
  189. detection_fin_poursuite(pointeurCompet, idxEpreuve);
  190. }
  191.  
  192. void affichage_temps(const Equipe* pointeurEquipe) {
  193. unsigned int entrerDossard;
  194. int numEquipe = 0, numPatineur = 0;
  195. scanf("%u", &entrerDossard);
  196.  
  197. recherche_dossard(pointeurEquipe, &entrerDossard, &numEquipe, &numPatineur);
  198.  
  199. unsigned int tourEffectue = pointeurEquipe[numEquipe].patineur[numPatineur].tourEffectue;
  200. for (unsigned int numTour = 0; numTour < maxTours; numTour++) {
  201. if (numTour < tourEffectue) {
  202. printf("%s %u %s %.1f\n\n", pointeurEquipe[numEquipe].nomPays, numTour + 1,
  203. pointeurEquipe[numEquipe].patineur[numPatineur].nom, pointeurEquipe[numEquipe].patineur[numPatineur].listeTemps[numTour].temps);
  204. }
  205. }
  206. }
  207.  
  208. void affichage_temps_equipes(const Equipe* pointeurEquipe, const int pointeurCptEquipe) { /*Fonction qui va afficher selon le tour demandé,
  209. le nom du pays et le temps du dernier patineur de chaque équipe */
  210. double dernier;
  211. int i = 0, j = 0;
  212. unsigned int entrerTour;
  213. scanf("%u", &entrerTour);
  214. entrerTour--;
  215.  
  216. for (i = 0; i < pointeurCptEquipe; i++) {
  217. printf("%s ", pointeurEquipe[i].nomPays);
  218.  
  219. dernier = pointeurEquipe[i].patineur[j].listeTemps[entrerTour].temps;
  220. for (j = 0; j < nbPatineursParEquipes; j++) {
  221. if (pointeurEquipe[i].patineur[j].tourEffectue < (entrerTour + 1)) { /*Les données au tour n sont stokées dans le tableau tempsAuTourN[n-1]*/
  222. printf("indiponible\n\n");
  223. break;
  224. }
  225. if (dernier < pointeurEquipe[i].patineur[j].listeTemps[entrerTour].temps) {
  226. dernier = pointeurEquipe[i].patineur[j].listeTemps[entrerTour].temps;
  227. }
  228. if (j == nbPatineursParEquipes - 1) {
  229. printf("%.1f\n\n", dernier);
  230. }
  231. }
  232. j = 0;
  233. }
  234. }
  235.  
  236. void affichage_temps_equipes_avec_classement(const Equipe* pointeurEquipe, const int CptEquipe, unsigned int EntrerTour, Competition* pointeurCompet) { /*Fonction qui va afficher selon le tour demandé, le nom du pays et le temps
  237. du dernier patineur de chaque équipe */
  238. double tabDernier[nbEquipeParEpreuves] = { 0. };
  239. int i = 0, j = 0, r = 0;
  240. EntrerTour--;
  241.  
  242. for (i = 0; i < CptEquipe; i++) {
  243.  
  244. tabDernier[i] = pointeurEquipe[i].patineur[j].listeTemps[EntrerTour].temps;
  245. for (j = 0; j < nbPatineursParEquipes; j++) {
  246. if (pointeurEquipe[i].patineur[j].tourEffectue < (EntrerTour + 1)) {
  247. printf("indiponible\n\n");
  248. break;
  249. }
  250. if (tabDernier[i] < pointeurEquipe[i].patineur[j].listeTemps[EntrerTour].temps) {
  251. tabDernier[i] = pointeurEquipe[i].patineur[j].listeTemps[EntrerTour].temps;
  252. }
  253. }
  254. pointeurCompet->dernierPatineur[pointeurCompet->cptDernier] = tabDernier[i];
  255. (pointeurCompet->cptDernier)++;
  256. j = 0;
  257. }
  258. if (tabDernier[r] < tabDernier[r + 1]) { //Le problème ici c'est que ça ne marche que s'il n'y a que 2 équipes par épreuves
  259. printf("%s %.1f\n\n", pointeurEquipe[r].nomPays, tabDernier[r]);
  260. printf("%s %.1f\n\n", pointeurEquipe[r + 1].nomPays, tabDernier[r + 1]);
  261. }
  262. else {
  263. printf("%s %.1f\n\n", pointeurEquipe[r + 1].nomPays, tabDernier[r + 1]);
  264. printf("%s %.1f\n\n", pointeurEquipe[r].nomPays, tabDernier[r]);
  265. }
  266. }
  267.  
  268. void definition_parcours(Competition* pointeurCompet) {
  269. unsigned int entrerNbTour;
  270. scanf("%u", &entrerNbTour);
  271. if (entrerNbTour >= 2 && entrerNbTour <= 10) {
  272. pointeurCompet->nbTour = entrerNbTour;
  273. }
  274. else {
  275. printf("Le nb de tour rentré n'est pas valide.\n\n");
  276. }
  277. }
  278.  
  279. void detection_fin_poursuite(Competition* pointeurCompet, int pointeurIdxEpreuve) {
  280. pointeurCompet->tabEpreuve[pointeurIdxEpreuve].etatEpreuve = 1; // 1 = Epreuve Terminer ; 0 = Epreuve en cours
  281.  
  282. for (int idxEquipe = 0; idxEquipe < nbEquipeParEpreuves; idxEquipe++) {
  283. for (int idxPatineur = 0; idxPatineur < nbPatineursParEquipes; idxPatineur++) {
  284. if ((pointeurCompet->tabEpreuve[pointeurIdxEpreuve].tabEquipe[idxEquipe].patineur[idxPatineur].tourEffectue) < pointeurCompet->nbTour) {
  285. pointeurCompet->tabEpreuve[pointeurIdxEpreuve].etatEpreuve = 0;
  286. break;
  287. }
  288. }
  289. }
  290. if (pointeurCompet->tabEpreuve[pointeurIdxEpreuve].etatEpreuve == 1) { // si etatEpreuve = 1 alors on rentre dans la condition if
  291. printf("detection_fin_poursuite\n\n");
  292. affichage_temps_equipes_avec_classement(pointeurCompet->tabEpreuve[pointeurIdxEpreuve].tabEquipe, nbEquipeParEpreuves, pointeurCompet->nbTour, pointeurCompet);
  293. }
  294.  
  295. // Appelle de la fontion "detection_fin_compettion"
  296. detection_fin_competition(pointeurCompet);
  297. }
  298.  
  299. void definition_nb_epreuves(Competition* pointeurCompet) {
  300. unsigned int entrerNbEpreuve;
  301. scanf("%u", &entrerNbEpreuve);
  302. if (entrerNbEpreuve >= 1 && entrerNbEpreuve <= 16) {
  303. pointeurCompet->nbEpreuve = entrerNbEpreuve;
  304. }
  305. else {
  306. printf("Le nombre d'epreuve rentre n'est pas valide.\n\n");
  307. }
  308. }
  309.  
  310. void detection_fin_competition(Competition* pointeurCompet) {
  311. pointeurCompet->etatCompet = 1; // 1 = Compet Terminer ; 0 = Compet en cours
  312.  
  313. for (unsigned int idxEpreuve = 0; idxEpreuve < (pointeurCompet->nbEpreuve); idxEpreuve++) {
  314. if (pointeurCompet->tabEpreuve[idxEpreuve].etatEpreuve != 1) {
  315. pointeurCompet->etatCompet = 0;
  316. }
  317. }
  318. if (pointeurCompet->etatCompet == 1) { // si etatCompet = 1 alors on rentre dans la condition if
  319. printf("detection_fin_Competition\n\n");
  320. // Boucle pour tester les valeurs dans le tableau "DernierPatineur" (A enlever apres avoir fini le sprint5)
  321. for (unsigned int i = 0; i < pointeurCompet->cptDernier; i++) {
  322. printf("%.1f\n", pointeurCompet->dernierPatineur[i]);
  323. }
  324. // Algo de tri
  325. double v;
  326. unsigned int j;
  327. for (unsigned int k = 1; k < pointeurCompet->cptDernier; k++) {
  328. v = pointeurCompet->dernierPatineur[k];
  329. j = k;
  330. while (j > 0 && (pointeurCompet->dernierPatineur[j - 1]) > v) {
  331. pointeurCompet->dernierPatineur[j] = pointeurCompet->dernierPatineur[j - 1];
  332. j = j - 1;
  333. }
  334. pointeurCompet->dernierPatineur[j] = v;
  335. }
  336. //Affiche les tmps après algo de tri
  337. printf("Après Algo de tri\n\n");
  338. for (unsigned int i = 0; i < pointeurCompet->cptDernier; i++) {
  339. printf("%.1f\n", pointeurCompet->dernierPatineur[i]);
  340. }
  341.  
  342. // Mettre ici un algo qui permet de retrouver le pays grace au temps inscrit dans le tab "dernierPatineur" trié avec l'algo de tri
  343.  
  344.  
  345.  
  346. }
  347.  
  348.  
  349. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement