Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.16 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #include <fstream>
  8. #include "fhswf_service.h"
  9.  
  10. #define DATNAME "skrt.bin"
  11. #define EINGABELANGE 20
  12. #define MAXBYTES 40
  13.  
  14. struct daten //Die guten Strukturen
  15. {
  16. char land[EINGABELANGE];
  17. char hstadt[EINGABELANGE];
  18. };
  19.  
  20. // Funktionsprototypen
  21. FILE* datei_oeffnen(void);
  22. FILE* datei_oeffnen_aendern(void); // für Funktion aendern
  23. int get_dateigroesse(FILE*);
  24. void datei_lesen(struct daten*, FILE*);
  25. void datei_schreiben(struct daten*, FILE*);
  26. void datei_schreiben_ersetzen(struct daten*, FILE*);
  27. void daten_eingeben(struct daten*, FILE*, int);
  28. void dateiinhalt_aendern(struct daten*, int, FILE*);
  29. int RateSpiel(struct daten*);
  30. int checkInput_int(char*, int);
  31.  
  32. //------------------------------main ---------------------
  33. int main(void)
  34. {
  35. // Variablendeklaration
  36. srand(time(NULL)); // RateSpiel
  37. int input, anzahl, distanz, rc, random, fehler;
  38. int wiederholen = 1;
  39. int already[EINGABELANGE] = { 0 };
  40. char eingabem[EINGABELANGE] = { 0 };
  41.  
  42. FILE* my_datei;
  43.  
  44. struct daten daten;
  45.  
  46. // Programmwiederholung
  47. do
  48. {
  49. // Wiederholung bei falscher Eingabe
  50. do
  51. {
  52.  
  53. system("CLS"); // Bildschirm löschen
  54. printf("Dies ist ein Programm um Laender und Hauptstaedte zu lernen.\n\n");
  55. printf("1 = Datei lesen\n");
  56. printf("2 = Land/Hauptstadt schreiben\n");
  57. printf("3 = Land/Hauptstadt aendern\n");
  58. printf("4 = Datei loeschen\n");
  59. printf("5 = Ratespiel\n");
  60. printf("0 = Programm verlassen\n");
  61.  
  62. do
  63. {
  64. printf("\nIhre Auswahl: ");
  65. scanf("%s", eingabem);
  66. tastaturpuffer_leeren();
  67.  
  68. fehler = checkInput_int(eingabem, strlen(eingabem)); // fehleingaben abfangen
  69.  
  70. input = atoi(eingabem);
  71.  
  72. if ((input < 0) || (input > 5)|| fehler > 0)
  73. {
  74. printf("Fehler in der Eingabe !\n");
  75. printf("Nur Werte zwischen 0 und 5 erlaubt!");
  76.  
  77. //getchar();
  78. }
  79.  
  80. } while (fehler > 0);
  81. // Wiederholung bei Falscheingabe
  82. } while ((input < 0) || (input > 5));
  83.  
  84. switch (input)
  85. {
  86. case 1: // Dateiinhalt lesen
  87. system("CLS"); // Bildschirm löschen
  88.  
  89. // Datei öffnen
  90. my_datei = datei_oeffnen();
  91.  
  92. // wenn nicht erfolgreich Programm beenden
  93. if (!my_datei)
  94. {
  95. printf("Datei konnte nicht geoeffnet werden!\n\n");
  96.  
  97. getchar();
  98. return(0);
  99. }
  100.  
  101. // Anzahl der Dateieinträge bestimmen
  102. anzahl = get_dateigroesse(my_datei);
  103.  
  104. if (anzahl == 0)
  105. {
  106. printf("Datei Leer!");
  107. fclose(my_datei);
  108.  
  109. getchar();
  110. continue;
  111. }
  112.  
  113. printf("#\tLand\t|\tHauptstadt\n"); // coole Ausgabe
  114.  
  115. for (int index = 0; index < anzahl; index++)
  116. {
  117. datei_lesen(&daten, my_datei); // Inhalt lesen
  118. printf("%i\t%s\t|\t%s\n", index, daten.land, daten.hstadt);
  119. }
  120. fclose(my_datei); // Datei schließen
  121. getchar();
  122.  
  123. break;
  124.  
  125. case 2: // Daten in Datei schreiben
  126. // Bildschirm löschen
  127. system("CLS");
  128.  
  129. // Kommentare wie case 1
  130.  
  131. my_datei = datei_oeffnen();
  132.  
  133. // wenn nicht erfolgreich Programm beenden
  134. if (!my_datei)
  135. {
  136. printf("Datei konnte nicht geoeffnet werden!\n\n");
  137.  
  138. getchar();
  139. return(0);
  140. }
  141.  
  142. // Dateiinhalt eingeben
  143.  
  144. daten_eingeben(&daten, my_datei, 1);
  145.  
  146. fclose(my_datei);
  147.  
  148. getchar();
  149. break;
  150.  
  151. case 3: // Dateiinhalt ändern
  152. system("CLS");
  153. // Kommentare wie case 1 und case 2
  154. my_datei = datei_oeffnen_aendern();
  155.  
  156. // wenn nicht erfolgreich Programm beenden
  157. if (!my_datei)
  158. {
  159. printf("Datei konnte nicht geoeffnet werden!\n\n");
  160.  
  161. getchar();
  162. return(0);
  163. }
  164.  
  165. anzahl = get_dateigroesse(my_datei);
  166.  
  167. if (anzahl == 0) // leere datei abfangen
  168. {
  169. printf("Datei Leer!");
  170. fclose(my_datei);
  171.  
  172. getchar();
  173. continue;
  174. }
  175.  
  176. printf("Es befinden sich %i Eintraege in der Datei\n", anzahl);
  177. printf("#\tLand\t|\tHauptstadt\n"); // wieder freshe usgabe
  178. for (int index = 0; index < anzahl; index++)
  179. {
  180. datei_lesen(&daten, my_datei); // Inhalt lesen
  181. printf("%i\t%s\t|\t%s\n", index, daten.land, daten.hstadt);
  182. }
  183. dateiinhalt_aendern(&daten, anzahl, my_datei); // dateien aendern
  184. fclose(my_datei);
  185.  
  186. getchar();
  187.  
  188. break;
  189.  
  190. case 4:
  191. remove(DATNAME);
  192. printf("Datei wurde geloescht !\n"); // bye bye datei
  193. break;
  194.  
  195. case 5:
  196. system("CLS");
  197.  
  198. for (int index = 0; index < EINGABELANGE; index++) // reset der schon verwendeten zahlen
  199. already[index] = 0;
  200.  
  201. rc = 0;
  202. // Kommentare wie case 1 und case 2
  203. my_datei = datei_oeffnen();
  204.  
  205. if (!my_datei)
  206. {
  207. printf("Datei konnte nicht geoeffnet werden!\n\n");
  208.  
  209. getchar();
  210. return(0);
  211. }
  212.  
  213. anzahl = get_dateigroesse(my_datei);
  214.  
  215. if (anzahl == 0) // rip wenn datei leer
  216. {
  217. printf("Datei Leer!");
  218. fclose(my_datei);
  219.  
  220. getchar();
  221. continue;
  222. }
  223.  
  224. rewind(my_datei);
  225.  
  226. printf("Das Ratespiel!\n");
  227.  
  228. for (int index = 0; index < anzahl; index++)
  229. {
  230. random = rand() % anzahl; // random zahlen
  231.  
  232. if (already[random] != 0)
  233. {
  234. index--;
  235. continue; //wenn es die zahl schon gab
  236. }
  237.  
  238. already[random] = 1; // flag setzen
  239.  
  240. distanz = random * MAXBYTES;
  241.  
  242. fseek(my_datei, distanz, SEEK_SET); // datei durchwandern
  243.  
  244. printf("%i. von %i Paaren.\n", index+1, anzahl);
  245.  
  246. datei_lesen(&daten, my_datei); // daten einlesen
  247.  
  248. rc += RateSpiel(&daten); // eigentliches ratespiel
  249. }
  250.  
  251. rc = (rc * 100)/ anzahl;
  252.  
  253. printf("Sie hatten %i%% richtig!", rc); // Ausgabe in %
  254.  
  255. getchar();
  256.  
  257. break;
  258.  
  259. case 0:
  260. wiederholen = 0; // Programm beenden
  261. break;
  262. }
  263.  
  264.  
  265. } while (wiederholen == 1);
  266. return (1);
  267. }
  268. //---------------------Ende main ------------------------------------------------------
  269.  
  270.  
  271.  
  272. // ------------------Beschreibung der Funktionen -----------------------------------
  273. int RateSpiel(struct daten *daten)
  274. {
  275. char eingabe[EINGABELANGE] = { 0 }; // eingabefeld
  276.  
  277. printf("\tDas Land: %s\n", daten->land); // Asugabe des Landes & eingabeaufforderung
  278. printf("\tDie Hauptstadt: ");
  279. gets_s(eingabe);
  280.  
  281. if (!strcmp(daten->hstadt, eingabe)) // wenn gleich dann richtig
  282. {
  283. printf("Richtig!\n");
  284. getchar();
  285.  
  286. return 1;
  287. }
  288. else
  289. {
  290. printf("Falsch, richtig waer %s!\n", daten->hstadt); // andernfalls fehler
  291. getchar();
  292.  
  293. return 0;
  294. }
  295. }
  296.  
  297.  
  298. //-------------------Datei oeffnen zum Lesen und Schreiben -----------------------
  299. FILE* datei_oeffnen()
  300. {
  301. FILE* my_datei;
  302.  
  303. my_datei = fopen(DATNAME, "ab+");
  304.  
  305. // wenn nicht erfolgreich --> Fehler zurückgeben und Programm beenden
  306. if (!my_datei)
  307. {
  308. return(NULL);
  309. }
  310.  
  311. return(my_datei);
  312. }
  313.  
  314.  
  315. //-------------------Datei oeffnen zum Lesen und Schreiben -----------------------
  316. FILE* datei_oeffnen_aendern()
  317. {
  318. FILE* my_datei;
  319.  
  320. my_datei = fopen(DATNAME, "rb+");
  321.  
  322. // wenn nicht erfolgreich --> Fehler zurückgeben und Programm beenden
  323. if (!my_datei)
  324. {
  325. return(NULL);
  326. }
  327.  
  328. return(my_datei);
  329. }
  330.  
  331.  
  332. //-------------------Dateigroesse bestimmen ----------------------
  333. int get_dateigroesse(FILE* my_datei)
  334. {
  335. int dummy = 0, anzahl = 0;
  336. //struct daten daten;
  337. // da beim Öffnen Dateipositionszeiger ggf. am Ende
  338. rewind(my_datei);
  339.  
  340. // Datei lesen und Einträge zählen
  341. do
  342. {
  343. fread(&dummy, 1, 1, my_datei);
  344. anzahl++;
  345. } while (!feof(my_datei));
  346.  
  347. dummy = 0;
  348.  
  349. // da feof() erst nach Zugriff über Dateiende Wert ändert
  350. anzahl--;
  351. anzahl = anzahl / MAXBYTES;
  352. // Dateipositionszeiger wieder auf Anfang
  353. rewind(my_datei);
  354. return(anzahl);
  355. }
  356.  
  357.  
  358. //----------------------Daten aus Datei lesen -----------------------------
  359. void datei_lesen(struct daten *daten, FILE* my_datei)
  360. {
  361. int index, groesse;
  362.  
  363. // Daten aus Datei lesen und in Feld schreiben
  364. fread(daten, MAXBYTES, 1, my_datei);
  365. }
  366.  
  367. //-----------------------------Daten eingeben -------------------------------
  368. void daten_eingeben(struct daten *daten, FILE* my_datei, int fall)
  369. {
  370. char eingabel[EINGABELANGE] = {0};
  371. char eingabeh[EINGABELANGE] = {0};
  372. char ende[5] = { "ende" };
  373. int restart = 0;
  374. if (fall == 1)
  375. {
  376. printf("Die Eingabe wird mit \"ende\" (Case sensitive) beendet.");
  377. do
  378. {
  379. restart = 0;
  380. for (int index = 0; index < 20; index++) // reset
  381. {
  382. eingabel[index] = 0;
  383. eingabeh[index] = 0;
  384. }
  385.  
  386. printf("\nLand/ende eingaben: "); // eingabe land
  387. gets_s(eingabel);
  388.  
  389. if (!strcmp(eingabel, ende)) // terminieren bei ende
  390. continue;
  391.  
  392. printf("Hauptstadt eigeben: "); //eingabe hauptstadt
  393. gets_s(eingabeh);
  394.  
  395. if (eingabel[0] == 0 || eingabeh == 0) // wenn enter einfach gedrueckt wurde
  396. {
  397. printf("Fehleingabe!");
  398. restart = 1;
  399. }
  400.  
  401. if (restart == 0) // wenn keine fhleingabe abspeichern
  402. {
  403. strcpy(daten->hstadt, eingabeh);
  404. strcpy(daten->land, eingabel);
  405. datei_schreiben(daten, my_datei);
  406. }
  407.  
  408. } while (restart == 1 || strcmp(eingabel, ende));
  409. }
  410. else // einzeln aendern
  411. {
  412. do // kommentare wie oben
  413. {
  414. restart = 0;
  415. for (int index = 0; index < EINGABELANGE; index++)
  416. {
  417. eingabel[index] = 0;
  418. eingabeh[index] = 0;
  419. }
  420. printf("\nLand eingaben: ");
  421. gets_s(eingabel);
  422.  
  423. printf("Hauptstadt eigeben: ");
  424. gets_s(eingabeh);
  425.  
  426. if (eingabel[0] == 0 || eingabeh == 0)
  427. {
  428. printf("Fehleingabe!");
  429. restart = 1;
  430. }
  431.  
  432. if (restart == 0)
  433. {
  434. strcpy(daten->hstadt, eingabeh);
  435. strcpy(daten->land, eingabel);
  436. //datei_schreiben(daten, my_datei);
  437. }
  438.  
  439. } while (restart == 1);
  440. }
  441. }
  442.  
  443.  
  444. //------------------------Daten in Datei schreiben -------------------
  445. void datei_schreiben(struct daten *daten, FILE* my_datei)
  446. {
  447. // Dateipositionszeiger ans Ende
  448. fseek(my_datei, 0, SEEK_END);
  449. // Feldelemente in Datei schreiben
  450. fwrite(daten, sizeof(struct daten), 1, my_datei);
  451. }
  452.  
  453. void datei_schreiben_ersetzen(struct daten *daten, FILE* my_datei)
  454. {
  455. fwrite(daten, sizeof(struct daten), 1, my_datei); // einzeln aendern
  456. }
  457.  
  458. //-------------Dateiinhalt ändern--------------------------------
  459. void dateiinhalt_aendern(struct daten *daten, int anzahl, FILE* my_datei)
  460. {
  461. char eingabem[EINGABELANGE] = { 0 };
  462. int distanz, fehler;// Variable zum Navigieren in der Datei
  463.  
  464. int nummer; // Variablen für neuen Wert
  465. char zeichen;
  466. //int durchlauf = 0;
  467.  
  468. rewind(my_datei); // Dateipositionszeiger auf Anfang
  469.  
  470. // Schleife für mehrere Änderungen
  471. do
  472. {
  473. // Schleife für Fehleingaben
  474. do
  475. {
  476. printf("\nWelcher Wert soll geaendert werden [0 bis %i] ", anzahl-1); // einzeln aendern
  477. scanf("%s", eingabem);
  478. tastaturpuffer_leeren();
  479.  
  480. fehler = checkInput_int(eingabem, strlen(eingabem)); // fehleingaben abfangen
  481.  
  482. nummer = atoi(eingabem);
  483.  
  484. if ((nummer < 0) || (nummer > anzahl - 1) || fehler > 0)
  485. {
  486. printf("Fehler in der Eingabe !\n");
  487. printf("Nur Werte zwischen 0 und 5 erlaubt!");
  488.  
  489. getchar();
  490. }
  491. } while ((nummer < 0) || (nummer > anzahl - 1 ) || fehler > 0);
  492.  
  493. distanz = nummer * 40; // distanz setzen
  494.  
  495. rewind(my_datei);
  496. fseek(my_datei, distanz, SEEK_SET); // zu distanz wandern
  497.  
  498.  
  499. daten_eingeben(daten, my_datei, 2);
  500.  
  501. datei_schreiben_ersetzen(daten, my_datei);
  502.  
  503. printf("\nNoch eine Aenderung ? J/N ");
  504. scanf("%c", &zeichen);
  505. tastaturpuffer_leeren();
  506.  
  507. // wandeln in Großbuchstaben
  508. zeichen = toupper(zeichen);
  509.  
  510. //durchlauf++;
  511. } while (zeichen == 'J');
  512. }
  513.  
  514. int checkInput_int(char* eingabe, int laenge)
  515. {
  516. int fehler = 0;
  517. int rc = 0; // return_code
  518. int index; // Schleifenindex
  519.  
  520.  
  521. // führendes + Zeichen eliminieren
  522. if (eingabe[0] == '+')
  523. {
  524. laenge = laenge - 1;
  525. index = 0;
  526. while (eingabe[index] != 0)
  527. {
  528. eingabe[index] = eingabe[index + 1];
  529. index++;
  530. }
  531. eingabe[index] = 0; //Stringendezeichen setzen
  532. }
  533.  
  534. // übergebenen String zeichenweise auswerten
  535. for (index = 0; index < laenge; index++)
  536. {
  537. rc = isdigit(eingabe[index]); // Prüfung auf Ziffer 0 bis 9
  538.  
  539. // Rückgabewert auswerten
  540. if (rc == 0)
  541. {
  542. fehler++; // Fehlervariable erhöhen
  543. }
  544. }
  545.  
  546.  
  547. // Prüfung auf Vorzeichen
  548.  
  549. if (eingabe[0] == '-')
  550. {
  551. fehler++;
  552. }
  553.  
  554.  
  555. //Rückgabe an aufrufende Funktion
  556. return (fehler);
  557. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement