Guest User

Untitled

a guest
Nov 19th, 2019
86
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2. *
  3. *
  4. * @file bt.oblig4.c
  5. * @date 2019-11-19
  6. * @version 1.0
  7. * @author Bjørn-Tore Semb
  8. */
  9. #include <stdio.h>
  10. #include <stdbool.h>
  11. #include "LesData.h"
  12.  
  13. #define MAXPERS 6 ///< max antall personer per oppgaave
  14. #define MAXOPPG 20 ///< max antall oppgaver det er plass til
  15.  
  16. struct Oppgave *gOppgavene[MAXOPPG]; ///< Array med oppgavepointere
  17.  
  18. //dette navnet ga mye mer mening enn den oppgava spurte om
  19. int gAntallOppgaver = 0; ///< Antall oppgaver lagt inn
  20.  
  21.  
  22. /**
  23. * Oppgave (med navn, antallTotalt, antallNaa og hvem).
  24. *
  25. * navn = navnet på oppgaven
  26. * antallTotalt = totalt antall som kan arbeide med oppgaven
  27. * antallnaa = hvor mange som er satt opp på oppgaven nå
  28. * hvem = hvem som er satt opp på oppgaven
  29. */
  30. struct Oppgave {
  31. char *navn;
  32. int antallTotalt,
  33. antallNaa;
  34. int hvem[MAXPERS];
  35. };
  36.  
  37.  
  38. void skrivMeny();
  39. void nyOppgave();
  40. void oppgaveLesData(struct Oppgave *oppgave);
  41. void skrivOppgaver();
  42. void oppgaveSkrivData(const struct Oppgave *oppgave);
  43. void ledigeOppgaver();
  44. bool oppgaveLedigPlass(const struct Oppgave *oppgave);
  45. void personerTilknyttesOppgave();
  46. void oppgaveTilknyttPersoner(struct Oppgave *oppgave);
  47. void fjernOppgave();
  48. void oppgaveSlettData(struct Oppgave *oppgave);
  49.  
  50. /**
  51. * Hovedprogrammet:
  52. */
  53. int main() {
  54. char kommando = ' '; //tom vaiabel til å lagre en kommando i
  55.  
  56. printf("Oppgaveplanleggern 1.0\n");
  57. skrivMeny(); // skriver ut en meny med mulige valg
  58.  
  59. while(kommando != 'Q'){ // looper igjennom
  60.  
  61. kommando = lesChar("\n\nVelg en kommando ");
  62.  
  63. switch(kommando){
  64. case 'O':skrivOppgaver();break;
  65. case 'N':nyOppgave();break;
  66. case 'L':ledigeOppgaver();break;
  67. case 'K':personerTilknyttesOppgave();break;
  68. case 'F':fjernOppgave();break;
  69. case 'M':skrivMeny();break;
  70. case 'Q':printf("Avslutter program\n");break;
  71. default: printf("Ugyldig kommando\n");
  72. }
  73. }
  74. return 0;
  75. }
  76.  
  77. /**
  78. * Skriver leser inn data til en oppgave og setter.
  79. *
  80. * @param oppgave
  81. */
  82. void oppgaveLesData(struct Oppgave *oppgave) {
  83. oppgave->navn = lagOgLesText("Navn: ");
  84. oppgave->antallTotalt = lesInt("Antall ansvarlige", 1, 6);
  85. oppgave->antallNaa = 0;
  86. }
  87.  
  88. /**
  89. * Legger til ny oppgave og fyller inn noe data.
  90. *
  91. * legger til en ny oppgave og bruker kan gi den et navn.
  92. *
  93. * @see oppgaveLesData(...)
  94. */
  95. void nyOppgave() {
  96. if (gAntallOppgaver < MAXOPPG) {
  97. printf("\tNy oppgave nr: %i\n", gAntallOppgaver + 1);
  98. gOppgavene[gAntallOppgaver] = (struct Oppgave *)
  99. malloc(sizeof(struct Oppgave));
  100. oppgaveLesData(gOppgavene[gAntallOppgaver]);
  101. gAntallOppgaver++;
  102. printf("Ny oppgave lagt til\n");
  103. } else {
  104. printf("\aBeklager, ikke plass til flere oppgaver (%i/%i).\n",
  105. gAntallOppgaver, MAXOPPG);
  106. }
  107. }
  108.  
  109. /**
  110. * Skriver ut all ifo em en oppgave.
  111. *
  112. * @param oppgave
  113. */
  114. void oppgaveSkrivData(const struct Oppgave *oppgave) {
  115. printf("Navn \t: %s\n"
  116. "Ansvarliges id(%i/%i):\n\t",
  117. oppgave->navn,
  118. oppgave->antallNaa,
  119. oppgave->antallTotalt);
  120. for (int i = 0; i < oppgave->antallNaa; i++) {
  121. printf("%i ", oppgave->hvem[i]);
  122. }
  123. printf("\n");
  124. }
  125.  
  126. /**
  127. * Skriver ut alle oppgavene og data om de.
  128. *
  129. * Går igjennom hver oppgave og skriver den ut med all data.
  130. *
  131. * @see oppgaveSkrivData(...)
  132. */
  133. void skrivOppgaver() {
  134. printf("Skriver ut alle oppgavene:\n");
  135. if(gAntallOppgaver != 0){
  136. for (int i = 0; i < gAntallOppgaver; i++) {
  137. oppgaveSkrivData(gOppgavene[i]);
  138. }
  139. }else{
  140. printf("Ingen oppgaver lagt inn\n");
  141. }
  142. }
  143.  
  144. /**
  145. * Skriver ut oversik over alle ledige oppgaver.
  146. *
  147. * Går igjennom hver opppgave og hvis den har ledige plasser, så skriver den ut
  148. * den oppgaven.
  149. *
  150. * @see oppgaveLedigPlass(...)
  151. */
  152. void ledigeOppgaver() {
  153. printf("Oppgaver med ledige plasser:\n");
  154. for (int i = 0; i < gAntallOppgaver; i++) {
  155. if (oppgaveLedigPlass(gOppgavene[i])) {
  156. oppgaveSkrivData(gOppgavene[i]);
  157. }
  158. }
  159. }
  160.  
  161.  
  162. /**
  163. * Sjekker om det er ledige plasser på oppgaven
  164. *
  165. * @param oppgave
  166. * @return true/false om det er ledige plasser på oppgaven
  167. */
  168. bool oppgaveLedigPlass(const struct Oppgave *oppgave) {
  169. return oppgave->antallNaa < oppgave->antallTotalt;
  170. }
  171.  
  172. /**
  173. * Knyter personer til oppgaver.
  174. *
  175. * @param oppgave
  176. * @see oppgaveSkrivData(...)
  177. * @see oppgaveLedigPlass(...)
  178. */
  179. void oppgaveTilknyttPersoner(struct Oppgave *oppgave) {
  180. int antall; // antall personer å legge til
  181. oppgaveSkrivData(oppgave);
  182. if (oppgaveLedigPlass(oppgave)) {
  183. printf("Hvor mange vil du sette av til denne oppgaven?\n");
  184. antall = lesInt("Velg et antall mellom 0",
  185. 0, (oppgave->antallTotalt - oppgave->antallNaa));
  186. for (int i = 0; i < antall; i++) {
  187. oppgave->hvem[oppgave->antallNaa] = lesInt("Person id",
  188. 1, 1000);
  189. oppgave->antallNaa++;
  190. }
  191. printf("\nOppgaven er oppdatert til følgende:\n");
  192. oppgaveSkrivData(oppgave);
  193. } else {
  194. printf("Beklager, oppgaven er allerede tatt hånd om av ønsket antall "
  195. "personer.\n");
  196. }
  197. }
  198.  
  199.  
  200. /**
  201. * Knytter personer til valgt oppgave.
  202. *
  203. * Bruker velger en oppgave og hvor mange personer som skal knyttes til denne.
  204. *
  205. * @see oppgaveTilknyttPersoner
  206. */
  207. void personerTilknyttesOppgave() {
  208. int valg;
  209. if (gAntallOppgaver != 0) {
  210. printf("Velg en oppgave du vil knyte personer til:\n");
  211. for (int i = 0; i < gAntallOppgaver; i++) {
  212. printf("\t%i. %s \n", i + 1, gOppgavene[i]->navn);
  213. }
  214. printf("\t0. Avbryt\n");
  215. valg = lesInt("Velg en oppgave:", 0, gAntallOppgaver);
  216.  
  217. if (valg != 0) {
  218. oppgaveTilknyttPersoner(gOppgavene[valg - 1]);
  219. } else {
  220. printf("Inntasting avbrytes...\n");
  221. }
  222. } else {
  223. printf("\aIngen oppgaver lagt til enda.\n");
  224. }
  225.  
  226. }
  227.  
  228.  
  229. /**
  230. * Frigir minne allokert til oppgave.
  231. *
  232. * @param oppgave
  233. */
  234. void oppgaveSlettData(struct Oppgave *oppgave){
  235. free(oppgave->navn);
  236. free(oppgave);
  237. }
  238.  
  239.  
  240. /**
  241. * Sletter ønsket Oppgave.
  242. *
  243. * Bruker skriver inn hvilken oppgave de vill slette, og så skjer det.
  244. *
  245. * @see oppgaveSlettData(...)
  246. */
  247. void fjernOppgave(){
  248. int valg;
  249. if(gAntallOppgaver != 0){
  250. printf("Velg en oppgave å fjerne:\n");
  251. for (int i = 0; i < gAntallOppgaver; i++) {
  252. printf("\t%i. %s \n", i + 1, gOppgavene[i]->navn);
  253. }
  254. printf("\t0. Avbryt\n");
  255. valg = lesInt("Velg en oppgave:", 0, gAntallOppgaver);
  256.  
  257. if (valg != 0) {
  258. if(lesChar("Vil du virkelig fjerne denne "
  259. "oppgaven (svar: 'J')? : ") =='J'){
  260. if(valg-1 != gAntallOppgaver-1){
  261. printf("Fjerner oppgaven og rydder i oppgavelista.\n");
  262. oppgaveSlettData(gOppgavene[valg-1]);
  263. gOppgavene[valg-1] = gOppgavene[gAntallOppgaver - 1];
  264. gOppgavene[gAntallOppgaver-1]=NULL;
  265. }else{
  266. printf("fjerner oppgaven\n");
  267. oppgaveSlettData(gOppgavene[valg-1]);
  268. }
  269. gAntallOppgaver--;
  270. }else{
  271. printf("Fjerning avbrytes...\n");
  272. }
  273. } else {
  274. printf("Fjerning avbrytes...\n");
  275. }
  276. }else{
  277. printf("Ingen oppgaver lagt inn.\n");
  278. }
  279. }
  280.  
  281.  
  282. /**
  283. * Skriver programmets menyvalg/muligheter på skjermen.
  284. */
  285. void skrivMeny() {
  286. printf("\nFølgende kommandoer er tilgjengelig:\n");
  287. printf("\tO = Oversikt over oppgavene\n");
  288. printf("\tN = Registrer ny oppgave\n");
  289. printf("\tL = Finn ledige oppgaver\n");
  290. printf("\tK = Knyt personer til oppgaver\n");
  291. printf("\tF = Fjern en oppgave\n");
  292. printf("\tM = Se denne menyen\n");
  293. printf("\tQ - Quit / avslutt\n");
  294. }
RAW Paste Data