/core.cpp

http://abicalc.googlecode.com/ · C++ · 1049 lines · 904 code · 104 blank · 41 comment · 292 complexity · 4345aa11182cd6a8d2a8c43f94dcb4d5 MD5 · raw file

  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "core.h"
  4. //---------------------------------------------------------------------------
  5. bool Core::addKurs(Kurs *kurs){
  6. if(this->cKurse>20 || kurs == NULL){
  7. return false;
  8. }
  9. if(kurs->isLK()){
  10. if(this->cLK >= 2){
  11. return false;
  12. }
  13. this->lk[this->cLK] = kurs;
  14. this->cLK++;
  15. return true;
  16. }
  17. this->kurse[this->cKurse] = kurs;
  18. this->cKurse++;
  19. return true;
  20. }
  21. Kurs* Core::getKursByName(String name){
  22. if(this->lk[0] != NULL && this->lk[0]->getName() == name)
  23. return this->lk[0];
  24. if(this->lk[1] != NULL && this->lk[1]->getName() == name)
  25. return this->lk[1];
  26. for(int i =0; i<this->cKurse; i++){
  27. if(this->kurse[i] != NULL){
  28. if(this->kurse[i]->getName() == name){
  29. return this->kurse[i];
  30. }
  31. }
  32. }
  33. return NULL;
  34. }
  35. void Core::clearKurse(){
  36. for (int i = 0; i < this->cKurse; i++) {
  37. this->kurse[i] = NULL;
  38. }
  39. this->cKurse = 0;
  40. for (int i=0; i< this->cLK; i++) {
  41. this->lk[i] = NULL;
  42. }
  43. this->cLK =0;
  44. }
  45. Kurs* Core::getLKByPosition(int pos){
  46. if(pos == 1 || pos == 2)
  47. return this->lk[pos-1];
  48. else
  49. return NULL;
  50. }
  51. Kurs* Core::getFS(){
  52. Kurs *tmp = this->getKursByName("Frz A");
  53. if(tmp != NULL){
  54. return tmp;
  55. }
  56. tmp = this->getKursByName("Frz B");
  57. if(tmp != NULL){
  58. return tmp;
  59. }
  60. tmp = this->getKursByName("Ru A");
  61. if(tmp != NULL){
  62. return tmp;
  63. }
  64. tmp = this->getKursByName("Ru B");
  65. if(tmp != NULL){
  66. return tmp;
  67. }
  68. return NULL;
  69. }
  70. int Core::anzahlKurs(){
  71. return this->cKurse+ this->cLK;
  72. }
  73. double Core::getAverageByYear(int year){
  74. if(year>4 || year < 1){
  75. return -1;
  76. }
  77. int count =0;
  78. double ret =0;
  79. for(int i =0; i<this->anzahlKurs(); i++){
  80. Kurs *tmp = this->iterateKurse(i);
  81. if(tmp->getNote(year) != -1 && tmp->getNote(year) != -2){
  82. ret += tmp->getNote(year);
  83. count++;
  84. }
  85. }
  86. if(count != 0){
  87. return ret/count;
  88. }
  89. return -1 ;
  90. }
  91. /*void Core::orderKurse(){
  92. Kurs *tmp[20];
  93. tmp[0] = this->getLKByPosition(1);
  94. tmp[1] = this->getLKByPosition(2);
  95. for(int i = 0; i<this->cKurse; i++){
  96. Kurs* sTmp = this->kurse[i];
  97. if(sTmp != NULL && !sTmp->isLK()){
  98. tmp[2+i] = sTmp;
  99. }
  100. }
  101. for(int i =0; i<20; i++){
  102. this->kurse[i] = tmp[i];
  103. }
  104. } */
  105. Kurs *Core::iterateKurse(int index){
  106. if(index < 2){
  107. return this->lk[index];
  108. }
  109. if(this->cKurse < index-2){
  110. return NULL;
  111. }
  112. return this->kurse[index-2];
  113. }
  114. void Core::setPruefungen(Pruefungen * p){
  115. this->pruefungen = p;
  116. }
  117. Pruefungen * Core::getPruefungen(){
  118. return this->pruefungen;
  119. }
  120. void Core::clearPruefungen(){
  121. this->pruefungen = NULL;
  122. }
  123. void Core::setAbgHalbjahre(int wert){
  124. if(wert<=5 && wert>= 0){
  125. this->kurse_abg = wert;
  126. }
  127. }
  128. int Core::getAbgHalbjahre(){
  129. return this->kurse_abg;
  130. }
  131. int Core::getBlockPunkte(int block){
  132. if(block == 1){
  133. //(Summe Kurshalbjahre)/(Anzahl Kurshalbjahresergebnisse)*40= BLOCK I
  134. int summe = 0;
  135. int summeLK = 0;
  136. int hj = 0;
  137. if(this->lk[0] != NULL){
  138. int note = this->lk[0]->getNote(1);
  139. if(!(note == -1 || note == -2)){
  140. summeLK += note;
  141. hj += 2;
  142. }
  143. note = this->lk[0]->getNote(2);
  144. if(!(note == -1 || note == -2)){
  145. summeLK += note;
  146. hj += 2;
  147. }
  148. note = this->lk[0]->getNote(3);
  149. if(!(note == -1 || note == -2)){
  150. summeLK += note;
  151. hj += 2;
  152. }
  153. note = this->lk[0]->getNote(4);
  154. if(!(note == -1 || note == -2)){
  155. summeLK += note;
  156. hj += 2;
  157. }
  158. }
  159. //LK 2
  160. if(this->lk[1] != NULL){
  161. int note = this->lk[1]->getNote(1);
  162. if(!(note == -1 || note == -2)){
  163. summeLK += note;
  164. hj += 2;
  165. }
  166. note = this->lk[1]->getNote(2);
  167. if(!(note == -1 || note == -2)){
  168. summeLK += note;
  169. hj += 2;
  170. }
  171. note = this->lk[1]->getNote(3);
  172. if(!(note == -1 || note == -2)){
  173. summeLK += note;
  174. hj += 2;
  175. }
  176. note = this->lk[1]->getNote(4);
  177. if(!(note == -1 || note == -2)){
  178. summeLK += note;
  179. hj += 2;
  180. }
  181. }
  182. summe += summeLK*2;
  183. for(int i = 0; i< this->cKurse; i++){
  184. int note1, note2, note3, note4;
  185. if(this->kurse[i] != NULL){
  186. note1 = this->kurse[i]->getNote(1);
  187. note2 = this->kurse[i]->getNote(2);
  188. note3 = this->kurse[i]->getNote(3);
  189. note4 = this->kurse[i]->getNote(4);
  190. if(note1 != -1 && note1 != -2){
  191. summe += note1;
  192. hj++;
  193. }
  194. if(note2 != -1 && note2 != -2){
  195. summe += note2;
  196. hj++;
  197. }
  198. if(note3!= -1 && note3 != -2){
  199. summe += note3;
  200. hj++;
  201. }
  202. if(note4 != -1 && note4 != -2){
  203. summe += note4;
  204. hj++;
  205. }
  206. }
  207. }
  208. if(hj != 0){
  209. float fSumme = (float)summe;
  210. float fHj = (float)hj;
  211. float t = fSumme/fHj*40.0;
  212. String ret = FormatFloat("##", t);
  213. return ret.ToInt();
  214. }else{
  215. return 0;
  216. }
  217. }else if(block == 2){
  218. //(Prüfung1+Pr2+Pr3+Pr4+Pr5)*4= BlockII
  219. int summe =0;
  220. for(int i =1; i<6; i++){
  221. if(this->pruefungen != NULL){
  222. if(this->pruefungen->get(i) != NULL){
  223. summe += this->pruefungen->get(i)->getNoteGes();
  224. }
  225. }
  226. }
  227. return summe*4;
  228. }else{
  229. return 0;
  230. }
  231. }
  232. void Core::saveToFile(String path)
  233. {
  234. TStringList *file = new TStringList();
  235. //Legacy: abgeschlossene Halbjahre hinzufügen
  236. file->Add("0");
  237. file->Add("//Pruefungen");
  238. if(this->getPruefungen() != NULL){
  239. for(int i = 0; i<5; i++){
  240. Kurse_Pruefung *tmp = this->getPruefungen()->get(i+1);
  241. if(tmp != NULL){
  242. String bell = "0";
  243. if(tmp->isBell()){
  244. bell = "1";
  245. }
  246. file->Add("P#"+tmp->getName()+"#"+IntToStr(tmp->getNote())+"#"+IntToStr(tmp->getNachpruefungNote())+"#"+bell+"#");
  247. }else{
  248. //Prüfung[i] nicht vorhanden
  249. file->Add("P#NULL#-1#-1#0#");
  250. }
  251. }
  252. }else{
  253. //Keine Prüfungen vorhanden
  254. file->Add("P#NULL#-1#-1#0#");
  255. file->Add("P#NULL#-1#-1#0#");
  256. file->Add("P#NULL#-1#-1#0#");
  257. file->Add("P#NULL#-1#-1#0#");
  258. file->Add("P#NULL#-1#-1#0#");
  259. }
  260. file->Add("//Kurse");
  261. for(int i = 0; i<this->anzahlKurs(); i++){
  262. Kurs *tmp = this->iterateKurse(i);
  263. if(tmp != NULL){
  264. String kursart = "0";
  265. String abgewaehlt = "0";
  266. if(tmp->isLK()){
  267. kursart = "1";
  268. }
  269. if(tmp->isAbg()){
  270. abgewaehlt = "1";
  271. }
  272. file->Add("k#"+tmp->getName()+"#"+IntToStr(tmp->getNote(1))+"#"+IntToStr(tmp->getNote(2))+"#"+IntToStr(tmp->getNote(3))+"#"+IntToStr(tmp->getNote(4))+"#"+kursart+"#"+abgewaehlt+"#");
  273. }else{
  274. //Kurs[i] nicht vorhanden
  275. }
  276. }
  277. file->SaveToFile(path);
  278. }
  279. void Core::loadFromFile(String path)
  280. {
  281. int i,h,j;
  282. char *t;
  283. TStringList *ergebnis = new TStringList();
  284. char buffer[6];
  285. String p;
  286. String k;
  287. //TStrings TStg2;
  288. TStrings *Fach;
  289. TStringList *TStg1 = new TStringList();
  290. TStg1->LoadFromFile(path);
  291. if(TStg1->Capacity<9)
  292. {
  293. Application->MessageBoxA(L"Datei unvollständig",L"Fehler",MB_OK);
  294. }else{
  295. this->pruefungen = new Pruefungen();
  296. for(int i = 2; i<7; i++){
  297. Kurse_Pruefung *tmp;
  298. String name;
  299. int countPos = 0; //Position im String (Ob Name, Note, etc)
  300. j = 0; //Zähler des Buffers
  301. t = TStg1->Strings[i].c_str();
  302. for(int k =0; k<TStg1->Strings[i].Length();k++){
  303. if(t[k] != 'P' && t[k] != '#'){
  304. buffer[j] = t[k];
  305. buffer[j+1] = '\0';
  306. j++;
  307. }else{
  308. if(t[k] != 'P' && j!= 0){
  309. switch(countPos){
  310. case 0: //Name
  311. name = buffer;
  312. if(name != "NULL"){
  313. tmp = new Kurse_Pruefung(name);
  314. }else{
  315. tmp = NULL;
  316. }
  317. buffer[0] = '\0';
  318. buffer[1] = '\0';
  319. buffer[2] = '\0';
  320. buffer[3] = '\0';
  321. buffer[4] = '\0';
  322. countPos++;
  323. j = 0;
  324. break;
  325. case 1: // Note 1 Prüfung
  326. if(tmp != NULL){
  327. String note = buffer;
  328. buffer[0] = '\0';
  329. buffer[1] = '\0';
  330. buffer[2] = '\0';
  331. buffer[3] = '\0';
  332. buffer[4] = '\0';
  333. countPos++;
  334. j = 0;
  335. tmp->setNote(note.ToInt());
  336. }
  337. break;
  338. case 2:
  339. if(tmp != NULL){
  340. String note = buffer;
  341. buffer[0] = '\0';
  342. buffer[1] = '\0';
  343. buffer[2] = '\0';
  344. buffer[3] = '\0';
  345. buffer[4] = '\0';
  346. countPos++;
  347. j = 0;
  348. int inote = note.ToInt();
  349. if(inote > -2){
  350. tmp->setNachpruefung(true);
  351. }
  352. tmp->setNachpruefungNote(inote);
  353. }
  354. break;
  355. case 3:
  356. if(tmp != NULL){
  357. String bell = buffer;
  358. buffer[0] = '\0';
  359. buffer[1] = '\0';
  360. buffer[2] = '\0';
  361. buffer[3] = '\0';
  362. buffer[4] = '\0';
  363. countPos++;
  364. j = 0;
  365. if(bell.ToInt() == 1){
  366. tmp->setBell(true);
  367. }
  368. this->getPruefungen()->add(tmp, i-1);
  369. } else{
  370. this->getPruefungen()->add(NULL, i-1);
  371. }
  372. break;
  373. }
  374. }
  375. }
  376. t = TStg1->Strings[i].c_str();
  377. }
  378. }
  379. //Kurse
  380. // z=0;
  381. int lks = 0;
  382. Kurs *tmp;
  383. for (i = 8; i < TStg1->Count; i++) {
  384. int countPosition = 0;
  385. j = 0;
  386. p=TStg1->Strings[i];
  387. t=p.c_str();
  388. for (h = 0; h < p.Length(); h++) {
  389. if (t[h] != '#'&& t[h] != 'k') {
  390. buffer[j]=t[h];
  391. buffer[j+1] = '\0';
  392. j++;
  393. }else{
  394. if(t[h] != 'k' && j != 0){
  395. switch(countPosition){
  396. case 0:
  397. tmp = new Kurs(buffer, false);
  398. buffer[0] = '\0';
  399. buffer[1] = '\0';
  400. buffer[2] = '\0';
  401. buffer[3] = '\0';
  402. buffer[4] = '\0';
  403. countPosition++;
  404. j = 0;
  405. break;
  406. case 1:
  407. if(tmp != NULL){
  408. String note = buffer;
  409. buffer[0] = '\0';
  410. buffer[1] = '\0';
  411. buffer[2] = '\0';
  412. buffer[3] = '\0';
  413. buffer[4] = '\0';
  414. countPosition++;
  415. j = 0;
  416. tmp->setNote(note.ToInt(), 1);
  417. }
  418. break;
  419. case 2:
  420. if(tmp != NULL){
  421. String note = buffer;
  422. buffer[0] = '\0';
  423. buffer[1] = '\0';
  424. buffer[2] = '\0';
  425. buffer[3] = '\0';
  426. buffer[4] = '\0';
  427. countPosition++;
  428. j = 0;
  429. tmp->setNote(note.ToInt(), 2);
  430. }
  431. break;
  432. case 3:
  433. if(tmp != NULL){
  434. String note = buffer;
  435. buffer[0] = '\0';
  436. buffer[1] = '\0';
  437. buffer[2] = '\0';
  438. buffer[3] = '\0';
  439. buffer[4] = '\0';
  440. countPosition++;
  441. j = 0;
  442. tmp->setNote(note.ToInt(), 3);
  443. }
  444. break;
  445. case 4:
  446. if(tmp != NULL){
  447. String note = buffer;
  448. buffer[0] = '\0';
  449. buffer[1] = '\0';
  450. buffer[2] = '\0';
  451. buffer[3] = '\0';
  452. buffer[4] = '\0';
  453. countPosition++;
  454. j = 0;
  455. tmp->setNote(note.ToInt(), 4);
  456. }
  457. break;
  458. case 5:
  459. if(tmp != NULL){
  460. String art = buffer;
  461. buffer[0] = '\0';
  462. buffer[1] = '\0';
  463. buffer[2] = '\0';
  464. buffer[3] = '\0';
  465. buffer[4] = '\0';
  466. countPosition++;
  467. j = 0;
  468. if(art.ToInt() == 1){
  469. tmp->setLK(true);
  470. }else if(art.ToInt() == 0){
  471. tmp->setLK(false);
  472. }
  473. }
  474. break;
  475. case 6:
  476. if(tmp != NULL){
  477. String art = buffer;
  478. buffer[0] = '\0';
  479. buffer[1] = '\0';
  480. buffer[2] = '\0';
  481. buffer[3] = '\0';
  482. buffer[4] = '\0';
  483. countPosition++;
  484. j = 0;
  485. if(art.ToInt() == 1){
  486. tmp->setAbg(true);
  487. }else if(art.ToInt() == 0){
  488. tmp->setAbg(false);
  489. }
  490. }
  491. break;
  492. }
  493. }
  494. }
  495. if(countPosition > 6){
  496. this->addKurs(tmp);
  497. countPosition =0;
  498. }
  499. }
  500. }
  501. }
  502. }
  503. int Core::getUnterkurse(){
  504. this->unterkurse = 0;
  505. for(int i =0; i<this->anzahlKurs(); i++){
  506. if(this->iterateKurse(i) != NULL){
  507. if(this->iterateKurse(i)->getNote(1) <5 && this->iterateKurse(i)->getNote(1) != -1 && this->iterateKurse(i)->getNote(1) != -2){
  508. if(this->iterateKurse(i)->isLK()){
  509. this->unterkurse++;
  510. }
  511. this->unterkurse++;
  512. }
  513. if(this->iterateKurse(i)->getNote(2) <5 && this->iterateKurse(i)->getNote(2) != -1 && this->iterateKurse(i)->getNote(2) != -2){
  514. if(this->iterateKurse(i)->isLK()){
  515. this->unterkurse++;
  516. }
  517. this->unterkurse++;
  518. }
  519. if(this->iterateKurse(i)->getNote(3) <5 && this->iterateKurse(i)->getNote(3) != -1 && this->iterateKurse(i)->getNote(3) != -2){
  520. if(this->iterateKurse(i)->isLK()){
  521. this->unterkurse++;
  522. }
  523. this->unterkurse++ ;
  524. }
  525. if(this->iterateKurse(i)->getNote(4) <5 && this->iterateKurse(i)->getNote(4) != -1 && this->iterateKurse(i)->getNote(4) != -2){
  526. if(this->iterateKurse(i)->isLK()){
  527. this->unterkurse++;
  528. }
  529. this->unterkurse++;
  530. }
  531. }
  532. }
  533. return this->unterkurse;
  534. }
  535. void Core::print(String name){
  536. int cm = 118;
  537. int t =0;
  538. TPrinter *print = Printer();
  539. print->BeginDoc();
  540. TCanvas *seite = print->Canvas;
  541. seite->Font->Name = "fnArial";
  542. seite->Brush->Style = bsClear;
  543. seite->Font->Size = 18;
  544. String headline = "Noten für "+name;
  545. seite->TextOutA(3*cm, 1*cm, headline);
  546. seite->Font->Size = 14;
  547. seite->TextOutA(3*cm, 2.5*cm, "Kursnoten");
  548. //Kursnoten
  549. seite->Font->Size = 12;
  550. seite->TextOutA(3*cm, 4*cm, "Fach");
  551. seite->TextOutA(5.5*cm, 4*cm, "12.1");
  552. seite->TextOutA(7.5*cm, 4*cm, "12.2");
  553. seite->TextOutA(9.5*cm, 4*cm, "13.1");
  554. seite->TextOutA(11.5*cm, 4*cm, "13.2");
  555. for(int i =0; i<this->anzahlKurs(); i++){
  556. seite->TextOutA(3*cm, (5+i)*cm, this->iterateKurse(i)->getName());
  557. String n121;
  558. if(this->iterateKurse(i)->getNote(1) <0){
  559. n121 = " - " ;
  560. }else {
  561. n121 = FormatFloat("00", this->iterateKurse(i)->getNote(1));
  562. }
  563. String n122;
  564. if(this->iterateKurse(i)->getNote(2) <0){
  565. n122 = " - " ;
  566. }else {
  567. n122 = FormatFloat("00",this->iterateKurse(i)->getNote(2));
  568. }
  569. String n131;
  570. if(this->iterateKurse(i)->getNote(3) <0){
  571. n131 = " - " ;
  572. }else {
  573. n131 = FormatFloat("00",this->iterateKurse(i)->getNote(3));
  574. }
  575. String n132;
  576. if(this->iterateKurse(i)->getNote(4) <0){
  577. n132 = " - " ;
  578. }else {
  579. n132 = FormatFloat("00",this->iterateKurse(i)->getNote(4));
  580. }
  581. seite->TextOutA(5.5*cm, (5+i)*cm, n121);
  582. seite->TextOutA(7.5*cm, (5+i)*cm, n122);
  583. seite->TextOutA(9.5*cm, (5+i)*cm, n131);
  584. seite->TextOutA(11.5*cm, (5+i)*cm, n132);
  585. t++; //Zähler für später erhöhen
  586. }
  587. //Prüfungsnoten
  588. seite->Font->Size = 14;
  589. seite->TextOutA(3*cm, (5.5+t)*cm, "Prüfungsnoten");
  590. seite->Font->Size = 12;
  591. seite->TextOutA(3*cm, (7+t)*cm, "Fach");
  592. seite->TextOutA(5.5*cm, (7+t)*cm, "Prüfung 1");
  593. seite->TextOutA(9.5*cm, (7+t)*cm, "Prüfung 2");
  594. seite->TextOutA(15.5*cm, (7+t)*cm, "Gesamt");
  595. for(int i=1; i<6; i++){
  596. seite->TextOutA(3*cm, (8+t)*cm, this->getPruefungen()->get(i)->getName());
  597. // int t = this->getPruefungen()->get(i)->getNote();
  598. if(this->getPruefungen()->get(i)->getNote()>-1){
  599. seite->TextOutA(5.5*cm, (8+t)*cm, FormatFloat("00",this->getPruefungen()->get(i)->getNote()));
  600. }else{
  601. seite->TextOutA(5.5*cm, (8+t)*cm, " - " );
  602. }
  603. if(this->getPruefungen()->get(i)->hasNachpruefung()){
  604. int note =this->getPruefungen()->get(i)->getNachpruefungNote();
  605. if(this->getPruefungen()->get(i)->getNachpruefungNote() >=0){
  606. seite->TextOutA(9.5*cm, (8+t)*cm, FormatFloat("00",this->getPruefungen()->get(i)->getNachpruefungNote()));
  607. }else{
  608. seite->TextOutA(9.5*cm, (8+t)*cm, " - " );
  609. }
  610. }else{
  611. seite->TextOutA(9.5*cm, (8+t)*cm, " - " );
  612. }
  613. int note = this->getPruefungen()->get(i)->getNoteGes() ;
  614. seite->TextOutA(15.5*cm, (8+t)*cm, FormatFloat("00",note));
  615. t++;
  616. }
  617. //Auswertung
  618. seite->Font->Size = 14;
  619. seite->TextOutA(3*cm, (10+t)*cm, "Auswertung");
  620. seite->Font->Size = 12;
  621. seite->TextOutA(3*cm, (11.5+t)*cm, "Qualifikationsphase:");
  622. seite->TextOutA(12*cm, (11.5+t)*cm, IntToStr(this->getBlockPunkte(1)));
  623. seite->TextOutA(3*cm, (12.5+t)*cm, "Prüfungsphase:");
  624. seite->TextOutA(12*cm, (12.5+t)*cm, IntToStr(this->getBlockPunkte(2)));
  625. double pGes = this->getBlockPunkte(1)+this->getBlockPunkte(2);
  626. double n = (17.0/3.0)-(pGes/180.0) ;
  627. n = (n<1)? 1.00 : n;
  628. String note = n;
  629. //FormatFloat("0.0", t); (t <1) ? 1.0: t;
  630. note = note.SubString(1,3);
  631. seite->TextOutA(3*cm, (15+t)*cm, "Gesamtpunkte:");
  632. seite->TextOutA(10*cm, (15+t)*cm, FloatToStr(pGes));
  633. seite->TextOutA(3*cm, (16+t)*cm, "Abiturnote:");
  634. seite->TextOutA(10*cm, (16+t)*cm, note);
  635. seite->Font->Size = 8;
  636. seite->Font->Style = TFontStyles() << fsItalic;
  637. seite->TextOutA(3*cm, (18+t)*cm, "generiert mit AbiCalc - http://redmine.vadaru.com/projects/abicalc");
  638. print->EndDoc();
  639. }
  640. int Core::countNaturwissenschaften(){
  641. int c =0;
  642. for (int i = 0; i < this->anzahlKurs(); i++) {
  643. if(this->iterateKurse(i) != NULL){
  644. if(this->iterateKurse(i)->getName() == "Ch"){
  645. c++ ;
  646. }
  647. if(this->iterateKurse(i)->getName() == "Phy"){
  648. c++ ;
  649. }
  650. if(this->iterateKurse(i)->getName() == "Bio"){
  651. c++ ;
  652. }
  653. }
  654. }
  655. return c;
  656. }
  657. int Core::getPositionOfKursByName(String name){
  658. for(int i =0; i<this->cKurse; i++){
  659. if(this->kurse[i] != NULL){
  660. if(this->kurse[i]->getName() == name){
  661. return i;
  662. }
  663. }
  664. }
  665. return -1;
  666. }
  667. Kurs *Core::getKursByPosition(int pos){
  668. if(0<=pos <20){
  669. return this->kurse[pos];
  670. }
  671. return NULL;
  672. }
  673. void Core::setKursInPosition(Kurs* kurs,int pos){
  674. if(0 <= pos < 20){
  675. this->kurse[pos] = kurs;
  676. }
  677. }
  678. void Core::setLKInPosition(Kurs* kurs,int pos){
  679. if(kurs->isLK()){
  680. if(this->lk[pos-1] == NULL){
  681. this->cLK++;
  682. }
  683. if(0<pos<3){
  684. this->lk[pos-1] = kurs;
  685. }
  686. }
  687. }
  688. void Core::deleteKursOnPosition(int pos){
  689. if(0<=pos<20){
  690. Kurs *tmp;
  691. for(int i = pos; i<this->cKurse; i++){
  692. if((i+1)<this->cKurse){
  693. this->kurse[i] = this->kurse[i+1];
  694. }else{
  695. this->kurse[i] = NULL;
  696. }
  697. }
  698. this->cKurse--;
  699. }
  700. }
  701. Core::Core(){
  702. this->isChanged = false;
  703. this->cKurse =0; //init - keine Kurse im Array
  704. this->cLK = 0;
  705. this->kurse_abg = 0;
  706. this->pruefungen = NULL;
  707. this->savePath = "";
  708. }
  709. Core::~Core(){}
  710. void Core::parseFile(String path){
  711. TStringList *file = new TStringList();
  712. file->LoadFromFile(path);
  713. bool error = true; //ist ein fehler aufgetreten?
  714. bool isKurse = false; // //Kurse ist aufgetaucht
  715. int cIsKurse =0; // Zeile an dem cIsKurse true wurde
  716. int countPruefungen =0;
  717. Kurse_Pruefung *tmp[5];
  718. this->pruefungen = new Pruefungen();
  719. for(int i =1; i<file->Count;i++){
  720. char*line = file->Strings[i].c_str(); //Eine Zeile aus der Datei
  721. /**
  722. * Prüfungen
  723. **/
  724. if(i == 1 && file->Strings[i].Compare("//Pruefungen") == 0){
  725. error = false;
  726. }
  727. if(i>1 && i<7 && !error){ //Prüfungsfächer
  728. char buffer[6];
  729. buffer[0] = '\0';
  730. buffer[1] = '\0';
  731. buffer[2] = '\0';
  732. buffer[3] = '\0';
  733. buffer[4] = '\0';
  734. buffer[5] = '\0'; //Buffer leeren */
  735. int countBuffer =0;
  736. int countPosition =0;
  737. for(int j =1; j<file->Strings[i].Length(); j++){
  738. if(line[j] != '#' && !error){
  739. buffer[countBuffer] = line[j];
  740. countBuffer++;
  741. }else{
  742. /*if(countBuffer >= 5 || line[j] == '#' && countPosition < 6 /*&& countBuffer > 1){*/
  743. if(countBuffer != 0){
  744. switch(countPosition){
  745. case 0: //Name
  746. tmp[countPruefungen] = new Kurse_Pruefung(buffer);
  747. if(tmp[countPruefungen]->getName() == "BELL"){
  748. tmp[countPruefungen]->setBell(true);
  749. }
  750. buffer[0] = '\0';
  751. buffer[1] = '\0';
  752. buffer[2] = '\0';
  753. buffer[3] = '\0';
  754. buffer[4] = '\0';
  755. buffer[5] = '\0'; //Buffer leeren
  756. countPosition++;
  757. countBuffer =0;
  758. break;
  759. case 1:
  760. if(tmp[countPruefungen] != NULL){
  761. String note = buffer;
  762. buffer[0] = '\0';
  763. buffer[1] = '\0';
  764. buffer[2] = '\0';
  765. buffer[3] = '\0';
  766. buffer[4] = '\0';
  767. buffer[5] = '\0'; //Buffer leeren
  768. countPosition++;
  769. countBuffer =0;
  770. tmp[countPruefungen]->setNote(note.ToInt());
  771. }
  772. break;
  773. case 2:
  774. if(tmp[countPruefungen] != NULL){
  775. String note = buffer;
  776. buffer[0] = '\0';
  777. buffer[1] = '\0';
  778. buffer[2] = '\0';
  779. buffer[3] = '\0';
  780. buffer[4] = '\0';
  781. buffer[5] = '\0'; //Buffer leeren
  782. countPosition++;
  783. countBuffer =0;
  784. if(note.ToInt() == -1){
  785. tmp[countPruefungen]->setNachpruefung(false);
  786. }else{
  787. tmp[countPruefungen]->setNachpruefung(true);
  788. tmp[countPruefungen]->setNachpruefungNote(note.ToInt());
  789. }
  790. }
  791. break;
  792. }
  793. if(countPosition == 3){
  794. countPosition = 0;
  795. this->pruefungen->add(tmp[countPruefungen], i-1);
  796. countPruefungen++;
  797. }
  798. }
  799. //fix: Bug das plötzlich line bloß noch 1 buchstabig ist...
  800. line = file->Strings[i].c_str();
  801. }
  802. }
  803. }
  804. /**
  805. * Kurse
  806. **/
  807. if(file->Strings[i].Compare("//Kurse") == 0){
  808. isKurse = true;
  809. cIsKurse = i;
  810. }
  811. if(isKurse && cIsKurse < i){
  812. char buffer[6];
  813. buffer[0] = '\0';
  814. buffer[1] = '\0';
  815. buffer[2] = '\0';
  816. buffer[3] = '\0';
  817. buffer[4] = '\0';
  818. buffer[5] = '\0'; //Buffer leeren */
  819. int countBuffer =0;
  820. int countPosition =0;
  821. Kurs *tmp;
  822. for(int j =1; j<file->Strings[i].Length(); j++){
  823. if(line[j] != 'K' && line[j] != '#' && !error){
  824. buffer[countBuffer] = line[j];
  825. countBuffer++;
  826. }else{
  827. if(countBuffer > 0){
  828. switch(countPosition){
  829. case 0: // Name
  830. tmp = new Kurs(buffer, false);
  831. buffer[0] = '\0';
  832. buffer[1] = '\0';
  833. buffer[2] = '\0';
  834. buffer[3] = '\0';
  835. buffer[4] = '\0';
  836. buffer[5] = '\0'; //Buffer leeren
  837. countPosition++;
  838. countBuffer =0;
  839. break;
  840. case 1: //12.1
  841. if(tmp != NULL){
  842. String note = buffer;
  843. buffer[0] = '\0';
  844. buffer[1] = '\0';
  845. buffer[2] = '\0';
  846. buffer[3] = '\0';
  847. buffer[4] = '\0';
  848. buffer[5] = '\0'; //Buffer leeren
  849. countPosition++;
  850. countBuffer =0;
  851. tmp->setNote(note.ToInt(), 1);
  852. }
  853. break;
  854. case 2: //12.2
  855. if(tmp != NULL){
  856. String note = buffer;
  857. buffer[0] = '\0';
  858. buffer[1] = '\0';
  859. buffer[2] = '\0';
  860. buffer[3] = '\0';
  861. buffer[4] = '\0';
  862. buffer[5] = '\0'; //Buffer leeren
  863. countPosition++;
  864. countBuffer =0;
  865. tmp->setNote(note.ToInt(), 2);
  866. }
  867. break;
  868. case 3: //13.1
  869. if(tmp != NULL){
  870. String note = buffer;
  871. buffer[0] = '\0';
  872. buffer[1] = '\0';
  873. buffer[2] = '\0';
  874. buffer[3] = '\0';
  875. buffer[4] = '\0';
  876. buffer[5] = '\0'; //Buffer leeren
  877. countPosition++;
  878. countBuffer =0;
  879. tmp->setNote(note.ToInt(), 3);
  880. }
  881. break;
  882. case 4: //13.2
  883. if(tmp != NULL){
  884. String note = buffer;
  885. buffer[0] = '\0';
  886. buffer[1] = '\0';
  887. buffer[2] = '\0';
  888. buffer[3] = '\0';
  889. buffer[4] = '\0';
  890. buffer[5] = '\0'; //Buffer leeren
  891. countPosition++;
  892. countBuffer =0;
  893. tmp->setNote(note.ToInt(), 4);
  894. }
  895. break;
  896. case 5: //12.1
  897. if(tmp != NULL){
  898. String note = buffer;
  899. buffer[0] = '\0';
  900. buffer[1] = '\0';
  901. buffer[2] = '\0';
  902. buffer[3] = '\0';
  903. buffer[4] = '\0';
  904. buffer[5] = '\0'; //Buffer leeren
  905. countPosition++;
  906. countBuffer =0;
  907. if(note.ToInt() == 0){
  908. tmp->setLK(false);
  909. }else if(note.ToInt() == 1){
  910. tmp->setLK(true);
  911. }
  912. }
  913. break;
  914. case 6: //12.1
  915. if(tmp != NULL){
  916. String note = buffer;
  917. buffer[0] = '\0';
  918. buffer[1] = '\0';
  919. buffer[2] = '\0';
  920. buffer[3] = '\0';
  921. buffer[4] = '\0';
  922. buffer[5] = '\0'; //Buffer leeren
  923. countPosition++;
  924. countBuffer =0;
  925. if(note.ToInt() == 0){
  926. tmp->setAbg(false);
  927. }else if(note.ToInt() == 1){
  928. tmp->setAbg(true);
  929. }
  930. }
  931. break;
  932. }
  933. if(countPosition == 6){
  934. this->addKurs(tmp);
  935. //delete tmp;
  936. countPosition =0;
  937. }
  938. }
  939. }
  940. }
  941. }
  942. }
  943. }
  944. #pragma package(smart_init)