University stuff.
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

Oblig7.java 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919
  1. import java.util.Scanner;
  2. import java.util.regex.*;
  3. import java.util.NoSuchElementException;
  4. import java.io.File;
  5. import java.io.FileOutputStream;
  6. import java.io.OutputStream;
  7. class Oblig7 {
  8. static class Data {
  9. File file;
  10. Tabell<Pasient> personer = new Tabell<Pasient>(10);
  11. Tabell<Legemiddel> legemidler = new Tabell<Legemiddel>(10);
  12. Tabell<Lege> leger = new Tabell<Lege>(10);
  13. Tabell<Resept> resepter = new Tabell<Resept>(10);
  14. Data(File file) throws Exception {
  15. this.file = file;
  16. read();
  17. }
  18. public void insertPerson(
  19. int id,
  20. String navn,
  21. String fodselsnummer,
  22. String addresse,
  23. String postnr) {
  24. personer.leggTil(new Pasient(
  25. id,
  26. navn,
  27. addresse,
  28. postnr,
  29. fodselsnummer
  30. ));
  31. }
  32. public void insertLegemiddel(
  33. int id,
  34. String navn,
  35. String form,
  36. String type,
  37. int pris,
  38. int mengde,
  39. int virkestoffPerMengde,
  40. int styrke) throws Exception {
  41. if (type.equals("a") && form.equals("pille")) {
  42. legemidler.leggTil(new LegemiddelNarkotiskPille(
  43. id,
  44. pris,
  45. navn,
  46. styrke,
  47. mengde,
  48. virkestoffPerMengde
  49. ));
  50. } else if (type.equals("a") && form.equals("mikstur")) {
  51. legemidler.leggTil(new LegemiddelNarkotiskFlytende(
  52. id,
  53. pris,
  54. navn,
  55. styrke,
  56. mengde,
  57. virkestoffPerMengde
  58. ));
  59. } else if (type.equals("b") && form.equals("pille")) {
  60. legemidler.leggTil(new LegemiddelVanedannendePille(
  61. id,
  62. pris,
  63. navn,
  64. styrke,
  65. mengde,
  66. virkestoffPerMengde
  67. ));
  68. } else if (type.equals("b") && form.equals("mikstur")) {
  69. legemidler.leggTil(new LegemiddelVanedannendeFlytende(
  70. id,
  71. pris,
  72. navn,
  73. styrke,
  74. mengde,
  75. virkestoffPerMengde
  76. ));
  77. } else if (type.equals("c") && form.equals("pille")) {
  78. legemidler.leggTil(new LegemiddelVaneligPille(
  79. id,
  80. pris,
  81. navn,
  82. mengde,
  83. virkestoffPerMengde
  84. ));
  85. } else if (type.equals("c") && form.equals("mikstur")) {
  86. legemidler.leggTil(new LegemiddelVaneligFlytende(
  87. id,
  88. pris,
  89. navn,
  90. mengde,
  91. virkestoffPerMengde
  92. ));
  93. } else {
  94. throw new Exception(
  95. "Feil legemiddel: type "+type+", form "+form
  96. );
  97. }
  98. }
  99. public void insertLege(
  100. String navn,
  101. int avtalenr) {
  102. if (avtalenr == 0)
  103. leger.leggTil(new Lege(navn));
  104. else
  105. leger.leggTil(new Fastlege(navn, avtalenr));
  106. }
  107. public void insertResept(
  108. int id,
  109. String farge,
  110. int pasientNr,
  111. String utskriverNavn,
  112. int legemiddelNr,
  113. int reit) throws Exception {
  114. Legemiddel legemiddel = null;
  115. for (Legemiddel l: legemidler) {
  116. if (l.id == legemiddelNr) {
  117. legemiddel = l;
  118. break;
  119. }
  120. }
  121. if (legemiddel == null) {
  122. throw new Exception(
  123. "Ingen legemiddel med ID "+legemiddelNr
  124. );
  125. }
  126. if (farge.equals("blaa")) {
  127. resepter.leggTil(new BlaaResept(
  128. id,
  129. utskriverNavn,
  130. pasientNr,
  131. legemiddel,
  132. reit
  133. ));
  134. } else if (farge.equals("hvit")) {
  135. resepter.leggTil(new HvitResept(
  136. id,
  137. utskriverNavn,
  138. pasientNr,
  139. legemiddel,
  140. reit
  141. ));
  142. }
  143. }
  144. private void insert(String mode, String[] tokens) throws Exception {
  145. switch (mode) {
  146. case "Personer": {
  147. insertPerson(
  148. Integer.parseInt(tokens[0]),
  149. tokens[1],
  150. tokens[2],
  151. tokens[3],
  152. tokens[4]
  153. );
  154. break;
  155. }
  156. case "Legemidler": {
  157. int styrke = 0;
  158. try {
  159. styrke = Integer.parseInt(tokens[7]);
  160. } catch (ArrayIndexOutOfBoundsException ex) {};
  161. insertLegemiddel(
  162. Integer.parseInt(tokens[0]),
  163. tokens[1],
  164. tokens[2],
  165. tokens[3],
  166. Integer.parseInt(tokens[4]),
  167. Integer.parseInt(tokens[5]),
  168. Integer.parseInt(tokens[6]),
  169. styrke
  170. );
  171. break;
  172. }
  173. case "Leger": {
  174. insertLege(
  175. tokens[0],
  176. Integer.parseInt(tokens[1])
  177. );
  178. break;
  179. }
  180. case "Resepter": {
  181. insertResept(
  182. Integer.parseInt(tokens[0]),
  183. tokens[1],
  184. Integer.parseInt(tokens[2]),
  185. tokens[3],
  186. Integer.parseInt(tokens[4]),
  187. Integer.parseInt(tokens[5])
  188. );
  189. break;
  190. }
  191. default:
  192. break;
  193. }
  194. }
  195. private void read() throws Exception {
  196. Scanner s = new Scanner(file);
  197. String mode = null;
  198. while (s.hasNextLine()) {
  199. String line = s.nextLine();
  200. if (line.startsWith("#")) {
  201. String[] tokens = line.split("\\s+");
  202. mode = tokens[1];
  203. if (mode.equals("Slutt"))
  204. return;
  205. } else if (mode != null) {
  206. String[] tokens = line.split(",\\s+");
  207. if (tokens.length == 1 && tokens[0].equals(""))
  208. continue;
  209. insert(mode, tokens);
  210. }
  211. }
  212. }
  213. private void writeln(OutputStream w, String s) throws Exception {
  214. w.write((s+"\n").getBytes());
  215. }
  216. public void write() throws Exception {
  217. OutputStream w = new FileOutputStream(file);
  218. { // Personer
  219. writeln(w, "# Personer");
  220. for (Pasient p: personer) {
  221. writeln(w,
  222. p.id+", "+
  223. p.navn+", "+
  224. p.fodselsnummer+", "+
  225. p.addresse+", "+
  226. p.postnr
  227. );
  228. }
  229. writeln(w, "");
  230. }
  231. { // Legemidler
  232. writeln(w, "# Legemidler");
  233. for (Legemiddel l: legemidler) {
  234. int id = l.id;
  235. String navn = l.navn;
  236. String form = "";
  237. String type = "";
  238. int pris = l.pris;
  239. int mengde = 0;
  240. int virkestoffPerMengde = 0;
  241. Integer styrke = null;
  242. if (l instanceof LegemiddelNarkotiskPille) {
  243. LegemiddelNarkotiskPille c = (LegemiddelNarkotiskPille)l;
  244. form = "pille";
  245. type = "a";
  246. mengde = c.antallPiller();
  247. virkestoffPerMengde = c.virkestoffPerPille();
  248. styrke = c.styrke;
  249. }
  250. else if (l instanceof LegemiddelNarkotiskFlytende) {
  251. LegemiddelNarkotiskFlytende c = (LegemiddelNarkotiskFlytende)l;
  252. form = "mikstur";
  253. type = "a";
  254. mengde = c.cm3();
  255. virkestoffPerMengde = c.virkestoffPerCm3();
  256. styrke = c.styrke;
  257. }
  258. else if (l instanceof LegemiddelVanedannendePille) {
  259. LegemiddelVanedannendePille c = (LegemiddelVanedannendePille)l;
  260. form = "pille";
  261. type = "b";
  262. mengde = c.antallPiller();
  263. styrke = c.hvorVanedannende;
  264. virkestoffPerMengde = c.virkestoffPerPille();
  265. }
  266. else if (l instanceof LegemiddelVanedannendeFlytende) {
  267. LegemiddelVanedannendeFlytende c = (LegemiddelVanedannendeFlytende)l;
  268. form = "mikstur";
  269. type = "b";
  270. mengde = c.cm3();
  271. styrke = c.hvorVanedannende;
  272. virkestoffPerMengde = c.virkestoffPerCm3();
  273. }
  274. else if (l instanceof LegemiddelVaneligPille) {
  275. LegemiddelVaneligPille c = (LegemiddelVaneligPille)l;
  276. form = "pille";
  277. type = "c";
  278. mengde = c.antallPiller();
  279. virkestoffPerMengde = c.virkestoffPerPille();
  280. }
  281. else if (l instanceof LegemiddelVaneligFlytende) {
  282. LegemiddelVaneligFlytende c = (LegemiddelVaneligFlytende)l;
  283. form = "mikstur";
  284. type = "c";
  285. mengde = c.cm3();
  286. virkestoffPerMengde = c.virkestoffPerCm3();
  287. }
  288. writeln(w,
  289. id+", "+
  290. navn+", "+
  291. form+", "+
  292. type+", "+
  293. pris+", "+
  294. mengde+", "+
  295. virkestoffPerMengde+
  296. (styrke == null ? "" : ", "+styrke)
  297. );
  298. }
  299. writeln(w, "");
  300. }
  301. { // Leger
  302. writeln(w, "# Leger");
  303. for (Lege l: leger) {
  304. String navn = l.navn;
  305. int avtalenummer = 0;
  306. if (l instanceof Fastlege) {
  307. Fastlege f = (Fastlege)l;
  308. avtalenummer = f.avtalenummer;
  309. }
  310. writeln(w, navn+", "+avtalenummer);
  311. }
  312. writeln(w, "");
  313. }
  314. { // Resepter
  315. writeln(w, "# Resepter");
  316. for (Resept r: resepter) {
  317. int id = r.id;
  318. String type = "";
  319. int pasientNr = r.pasientNr;;
  320. String utskriverNavn = r.utskriverNavn;
  321. int legemiddelNr = r.legemiddel.id;
  322. int reit = r.reit;
  323. if (r instanceof BlaaResept)
  324. type = "blaa";
  325. else if (r instanceof HvitResept)
  326. type = "hvit";
  327. writeln(w,
  328. id+", "+
  329. type+", "+
  330. pasientNr+", "+
  331. utskriverNavn+", "+
  332. legemiddelNr+", "+
  333. reit
  334. );
  335. }
  336. writeln(w, "");
  337. }
  338. { // Slutt
  339. writeln(w, "# Slutt");
  340. }
  341. }
  342. }
  343. static class CmdLine {
  344. private Scanner s;
  345. private boolean looping;
  346. private Data data;
  347. CmdLine(Scanner s, Data data) {
  348. this.s = s;
  349. this.data = data;
  350. }
  351. private String readln(String text, String rx, String prompt) {
  352. if (text != null) {
  353. System.out.print(text);
  354. if (rx != null) {
  355. System.out.print(" ("+rx+")");
  356. }
  357. System.out.println("");
  358. }
  359. if (rx == null) {
  360. System.out.print(prompt);
  361. return s.nextLine();
  362. } else {
  363. // Strings must match entirely, not just partially
  364. String realrx = ("^"+rx+"$").replace("*", "\\*");
  365. Pattern p = Pattern.compile(realrx);
  366. while (true) {
  367. System.out.print(prompt);
  368. String line = s.nextLine();
  369. Matcher m = p.matcher(line);
  370. if (m.matches()) {
  371. return line;
  372. } else {
  373. System.out.println("'"+line+"' matcher ikke ("+rx+").");
  374. }
  375. }
  376. }
  377. }
  378. private String readln(String text, String rx) {
  379. return readln(text, rx, "> ");
  380. }
  381. private int ireadln(String text, String rx) {
  382. try {
  383. return Integer.parseInt(readln(text, rx));
  384. } catch (NumberFormatException ex) {
  385. return 0;
  386. }
  387. }
  388. private String readln() {
  389. return readln(null, null, "> ");
  390. }
  391. private int ireadln() {
  392. try {
  393. return Integer.parseInt(readln());
  394. } catch (NumberFormatException ex) {
  395. return 0;
  396. }
  397. }
  398. public void loop() throws Exception {
  399. looping = true;
  400. while (looping) {
  401. String str;
  402. try {
  403. str = readln(null, null, "$ ");
  404. } catch (NoSuchElementException ex) {
  405. System.out.println("");
  406. return;
  407. }
  408. cmd(str);
  409. }
  410. }
  411. public void cmd(String name) throws Exception {
  412. switch (name) {
  413. /*
  414. * Hjelp
  415. */
  416. case "hjelp": {
  417. System.out.print(
  418. "Tilgjengelige kommandoer:\n"+
  419. " hjelp - vis denne teksten\n"+
  420. "\n"+
  421. " skriv ut - skriv ut data\n"+
  422. " nytt legemiddel - legg til et nytt legemiddel\n"+
  423. " ny lege - legg til en ny lege\n"+
  424. " ny person - legg til en ny person\n"+
  425. " ny resept - legg til en ny resept\n"+
  426. " hent legemiddel - vis legemiddel paa resept\n"+
  427. "\n"+
  428. " antall resepter - vis antall resepter basert paa kriterier\n"+
  429. " vis resepter til person - vis reseptene til en person\n"+
  430. " vis resepter til lege - vis reseptene en lege har skrevet ut\n"+
  431. " finn narkotisk misbruk - finn misbruk av narkotika\n"
  432. );
  433. break;
  434. }
  435. /*
  436. * Skriv ut
  437. */
  438. case "skriv ut": {
  439. System.out.println("Personer:");
  440. for (Pasient p: data.personer) {
  441. System.out.println(" "+p.identify());
  442. }
  443. // Leger maa sorteres, saa vi legger dem inn i en
  444. // SortertEnkelList for vi printer dem
  445. SortertEnkelListe<Lege> legeliste = new SortertEnkelListe<>();
  446. for (Lege l: data.leger) {
  447. legeliste.settInn(l);
  448. }
  449. System.out.println("Leger:");
  450. for (Lege l: legeliste) {
  451. System.out.println(" "+l.identify());
  452. }
  453. System.out.println("Legemidler:");
  454. for (Legemiddel l: data.legemidler) {
  455. System.out.println(" "+l.identify());
  456. }
  457. System.out.println("Resepter:");
  458. for (Resept r: data.resepter) {
  459. System.out.println(" "+r.identify());
  460. }
  461. break;
  462. }
  463. /*
  464. * Nytt legemiddel
  465. */
  466. case "nytt legemiddel": {
  467. data.insertLegemiddel(
  468. -1,
  469. readln("Navn?", null),
  470. readln("Form?", "pille|mikstur"),
  471. readln("Type?", "a|b|c"),
  472. ireadln("Pris?", "[0-9]+"),
  473. ireadln("Mengde?", "[0-9]+"),
  474. ireadln("Mengde virkestoff?", "[0-9]+"),
  475. ireadln("Styrke?", "([0-9]+)?")
  476. );
  477. System.out.println("Satt inn.");
  478. break;
  479. }
  480. /*
  481. * Ny lege
  482. */
  483. case "ny lege": {
  484. data.insertLege(
  485. readln("Navn?", null),
  486. ireadln("Avtalenummer?", "([0-9]+)?")
  487. );
  488. System.out.println("Satt inn.");
  489. break;
  490. }
  491. /*
  492. * Ny person
  493. */
  494. case "ny person": {
  495. data.insertPerson(
  496. -1,
  497. readln("Navn?", null),
  498. readln("Fodselsnummer?", "[0-9]+"),
  499. readln("Addresse?", null),
  500. readln("Postnummer?", "[0-9]+")
  501. );
  502. System.out.println("Satt inn.");
  503. break;
  504. }
  505. /*
  506. * Ny resept
  507. */
  508. case "ny resept": {
  509. data.insertResept(
  510. -1,
  511. readln("Farge?", "blaa|hvit"),
  512. ireadln("Pasient ID?", "[0-9]+"),
  513. readln("Legenavn?", null),
  514. ireadln("Legemiddel ID?", "[0-9]+"),
  515. ireadln("Reit?", "[0-9]+")
  516. );
  517. System.out.println("Satt inn.");
  518. break;
  519. }
  520. /*
  521. * Hent legemiddel
  522. */
  523. case "hent legemiddel": {
  524. int reseptId = ireadln("Resept ID?", "[0-9]+");
  525. // Finn resept med riktig ID
  526. Resept resept = null;
  527. for (Resept r: data.resepter) {
  528. if (r.id == reseptId) {
  529. resept = r;
  530. break;
  531. }
  532. }
  533. if (resept == null) {
  534. System.out.println("Finner ingen resept med ID "+reseptId+".");
  535. return;
  536. }
  537. if (resept.reit < 1) {
  538. System.out.println("Reseptens reit er for lav.");
  539. return;
  540. }
  541. // Finn riktig legemiddel
  542. Legemiddel legemiddel = resept.legemiddel;
  543. // Finn riktig person
  544. Pasient person = null;
  545. for (Pasient p: data.personer) {
  546. if (p.id == resept.pasientNr) {
  547. person = p;
  548. break;
  549. }
  550. }
  551. if (person == null) {
  552. System.out.println("Finner ingen personer som eiger resepten.");
  553. return;
  554. }
  555. resept.reit -= 1;
  556. System.out.println("Skal betales: "+(resept instanceof BlaaResept ? 0 : legemiddel.pris));
  557. System.out.println("Legens navn: "+resept.utskriverNavn);
  558. System.out.println("Pasientens navn: "+person.navn);
  559. System.out.println(legemiddel.identify());
  560. break;
  561. }
  562. /*
  563. * Vis antall resepter
  564. */
  565. case "antall resepter": {
  566. String type = readln("Type?", "a|b|c|*");
  567. Tabell<Resept> resepter;
  568. if (type.equals("*")) {
  569. resepter = data.resepter;
  570. } else {
  571. resepter = new Tabell<>(10);
  572. for (Resept r: data.resepter) {
  573. Legemiddel lm = r.legemiddel;
  574. if ((type.equals("a") && lm instanceof LegemiddelNarkotisk)
  575. || (type.equals("b") && lm instanceof LegemiddelVanedannende)
  576. || (type.equals("c") && lm instanceof LegemiddelVanelig)) {
  577. resepter.leggTil(r);
  578. }
  579. }
  580. }
  581. String sted = readln("Hvor skal personen vaere bosatt?", "oslo|*");
  582. Tabell<Pasient> personer;
  583. if (sted.equals("*")) {
  584. personer = data.personer;
  585. } else {
  586. personer = new Tabell<>(10);
  587. int postnrStart = 0;
  588. int postnrEnd = 9999;
  589. switch (sted) {
  590. case "oslo":
  591. postnrStart = 1;
  592. postnrEnd = 1295;
  593. break;
  594. }
  595. for (Pasient p: data.personer) {
  596. int postnr = Integer.parseInt(p.postnr);
  597. if (postnr >= postnrStart && postnr <= postnrEnd) {
  598. personer.leggTil(p);
  599. }
  600. }
  601. }
  602. int antall = 0;
  603. for (Resept r: resepter) {
  604. for (Pasient p: personer) {
  605. if (r.pasientNr == p.id) {
  606. antall += 1;
  607. break;
  608. }
  609. }
  610. }
  611. System.out.println(antall);
  612. break;
  613. }
  614. /*
  615. * Vis resepter til person
  616. */
  617. case "vis resepter til person": {
  618. String fodselsnummer = readln("ID/Fodselsnummer?", "[0-9]+");
  619. int id;
  620. try {
  621. id = Integer.parseInt(fodselsnummer);
  622. } catch (NumberFormatException ex) {
  623. id = -1;
  624. }
  625. // Finn person med IDen
  626. Pasient person = null;
  627. for (Pasient p: data.personer) {
  628. if (p.fodselsnummer.equals(fodselsnummer) || p.id == id) {
  629. person = p;
  630. break;
  631. }
  632. }
  633. if (person == null) {
  634. System.out.println(
  635. "Fant ingen person med id/fodselsnummer "+fodselsnummer+"."
  636. );
  637. return;
  638. }
  639. String farge = readln("Farge?", "blaa|hvit|*");
  640. System.out.println("Resepter skrevet ut til "+person.navn+":");
  641. // Finn resepter som horer til personen og har riktig farge
  642. YngsteForstReseptListe yfrl = new YngsteForstReseptListe();
  643. for (Resept r: data.resepter) {
  644. if (r.pasientNr == person.id) {
  645. if ((farge.equals("*"))
  646. || (farge.equals("blaa") && r instanceof BlaaResept)
  647. || (farge.equals("hvit") && r instanceof HvitResept)) {
  648. yfrl.settInn(r);
  649. }
  650. }
  651. }
  652. for (Resept r: yfrl) {
  653. System.out.println(" "+r.identify());
  654. }
  655. break;
  656. }
  657. /*
  658. * Vis resepter til lege
  659. */
  660. case "vis resepter til lege": {
  661. String navn = readln("Legenavn?", null);
  662. Lege lege = null;
  663. for (Lege l: data.leger) {
  664. if (l.navn.equals(navn)) {
  665. lege = l;
  666. break;
  667. }
  668. }
  669. if (lege == null) {
  670. System.out.println("Fant ingen lege som heter "+navn+".");
  671. return;
  672. }
  673. String type = readln("Type?", "pille|mikstur|*");
  674. int pilleVirkestoff = 0;
  675. int miksturVirkestoff = 0;
  676. // Liste over reseptene til legen, eldste forst
  677. EldsteForstReseptListe efrl = new EldsteForstReseptListe();
  678. // Gaa igjennom resepter for aa finne de skrevet ut av legen
  679. for (Resept r: data.resepter) {
  680. if (r.utskriverNavn.equals(navn)) {
  681. // Tell pilleVirkestoff og miksturVirkestoff
  682. // Dete maa gjores her, siden det skal telles uansett
  683. // om resepten er paa riktig form eller ikke
  684. Legemiddel lm = r.legemiddel;
  685. if (lm instanceof LegemiddelPille) {
  686. LegemiddelPille l = (LegemiddelPille)lm;
  687. pilleVirkestoff += (l.antallPiller() + l.virkestoffPerPille());
  688. } else if (lm instanceof LegemiddelFlytende) {
  689. LegemiddelFlytende l = (LegemiddelFlytende)lm;
  690. miksturVirkestoff += (l.cm3() * l.virkestoffPerCm3());
  691. }
  692. if ((type.equals("*"))
  693. || (type.equals("pille") && lm instanceof LegemiddelPille)
  694. || (type.equals("mikstur") && lm instanceof LegemiddelFlytende)) {
  695. efrl.settInn(r);
  696. }
  697. }
  698. }
  699. for (Resept r: efrl) {
  700. Legemiddel lm = r.legemiddel;
  701. System.out.println(r.identify());
  702. System.out.println(" for "+lm.identify());
  703. }
  704. System.out.println(
  705. "Samlet virkestoff: "+(pilleVirkestoff + miksturVirkestoff)+
  706. ", hvorav:"
  707. );
  708. System.out.println(" "+pilleVirkestoff+" er fra piller");
  709. System.out.println(" "+miksturVirkestoff+" er fra miksturpreparater");
  710. break;
  711. }
  712. /*
  713. * Finn narkotisk misbruk
  714. */
  715. case "finn narkotisk misbruk": {
  716. /*
  717. * Hva bor gjores hvis disse sporringene utfores veldig ofte?
  718. *
  719. * Disse sporringene er veldig tunge, fordi
  720. * vi maa gaa igjennom alle legemidler for hver resept
  721. * for baade hver lege og hver pasient.
  722. *
  723. * Hvis disse sporringene blir utfort veldig ofte, bor vi finne
  724. * en maate aa gjore at de gaar raskere. Her er noen maater
  725. * en kunne gjort det paa:
  726. *
  727. * 1. Cache resultatene.
  728. * Saa lenge vi ikke endrer paa legemidler, resepter, leger,
  729. * eller personer, vil resultatene alltid vaere det samme.
  730. * Det er derfor ikke noe vits i aa kalkulere alt paa nytt
  731. * hver gang; en kunne ha lagret resultatet, og kun vist frem
  732. * det lagrede resultatet hvis ingenting har endret seg.
  733. * Viktig aa passe paa at det lagrede resultatet slettes
  734. * slik at det rekalkuleres hver gang noe viktig endrer seg.
  735. *
  736. * 2. Bruke en database.
  737. * Relasjonelle databaser er laget for denne typen sporringer.
  738. * Aa gaa over fra et hjemmesnekret filformat til en form for
  739. * relasjonell database hadde nok vaert den beste losningen
  740. * hvis dette hadde vaert et ekte program for en ekte klient.
  741. * Naar en forst har gaatt over til en relasjonell database
  742. * finnes det ogsaa en del optimaliseringsteknikker
  743. * (indekser, etc.) som jeg ikke gaar in paa her.
  744. */
  745. // Finn leger som har skrevet ut narkotiske resepter
  746. SortertEnkelListe<Lege> legeliste = new SortertEnkelListe<>();
  747. for (Lege lege: data.leger) {
  748. boolean skrevetUtNarkotisk = false;
  749. for (Resept r: data.resepter) {
  750. Legemiddel lm = r.legemiddel;
  751. if ((r.utskriverNavn.equals(lege.navn))
  752. && (lm instanceof LegemiddelNarkotisk)) {
  753. skrevetUtNarkotisk = true;
  754. }
  755. }
  756. if (skrevetUtNarkotisk) {
  757. legeliste.settInn(lege);
  758. }
  759. }
  760. // Skriv ut legene som har skrevet ut narkotiske resepter
  761. System.out.println("Leger som har skrevet ut narkotiske resepter:");
  762. for (Lege lege: legeliste) {
  763. int antall = 0;
  764. for (Resept r: data.resepter) {
  765. Legemiddel lm = r.legemiddel;
  766. if ((r.utskriverNavn.equals(lege.navn))
  767. && (lm instanceof LegemiddelNarkotisk)) {
  768. antall += 1;
  769. }
  770. }
  771. System.out.println(
  772. " "+lege.navn+": "+
  773. antall+" narkotisk(e) resept(er)"
  774. );
  775. }
  776. // Skriv ut personene med en gyldig resept paa narkotiske legemidler
  777. System.out.println("Personer med en gyldig resept paa narkotiske legemidler:");
  778. for (Pasient person: data.personer) {
  779. int antall = 0;
  780. for (Resept r: data.resepter) {
  781. Legemiddel lm = r.legemiddel;
  782. if ((r.pasientNr == person.id)
  783. && (r.reit > 0)
  784. && (lm instanceof LegemiddelNarkotisk)) {
  785. antall += 1;
  786. }
  787. }
  788. if (antall > 0) {
  789. System.out.println(
  790. " "+person.navn+": "+
  791. antall+" narkotisk(e) resept(er)"
  792. );
  793. }
  794. }
  795. break;
  796. }
  797. /*
  798. * Ukjent kommando
  799. */
  800. default:
  801. System.out.println(
  802. "Ukjent kommando: "+name+". "+
  803. "Skriv 'hjelp' for hjelp."
  804. );
  805. }
  806. data.write();
  807. }
  808. }
  809. public static void main(String[] args) throws Exception {
  810. if (args.length < 1) {
  811. System.out.println("Usage: java Oblig7 <file>");
  812. return;
  813. }
  814. Data d = new Data(new File(args[0]));
  815. Scanner s = new Scanner(System.in);
  816. CmdLine cmdline = new CmdLine(s, d);
  817. cmdline.loop();
  818. }
  819. }