Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.91 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. typedef struct Foto
  7. {
  8.     char szdateiname[100];
  9.     char szort[100];
  10.     char szkurzbeschreibung[100];
  11.     char szdatum[11];
  12.     struct Foto* pnaechstes_foto;
  13.     struct Foto* pvorheriges_foto;
  14. } Foto;
  15.  
  16. //Prototypen
  17. //////////////////
  18. Foto* AlbumAnlegen(char* szdateiname);         // charakter
  19. Foto* AlbumLaden(char* szdateiname);
  20. Foto* AlbumDurchsuchen(Foto* pliste);
  21. Foto* FotoEntfernen(Foto* pfoto);
  22. Foto* FotoHinzufuegen(Foto* pliste);
  23. void AlbumSpeichern(char* szdateiname, Foto* pliste);
  24. void AlbumAnzeigen(Foto* pliste);
  25. void FotoDetailsEinlesen(Foto* pfoto);
  26. void FotoDetailsAnzeigen(Foto* pliste);
  27. void FotoAnzeigen(char* szdateiname);
  28. //////////////////
  29.  
  30.  
  31. int main()
  32. {
  33.     char szdateiname[100] = { 0 };// 100 ist die zeichen von mein datei
  34.     Foto* pliste = 0;
  35.     int iwahl = 0;
  36.     int ineuzeichnen = 0; //Soll das Fenster im aktuellen durchlauf der schleife neu gezeichnet werden?
  37.  
  38.     do
  39.     {
  40.         if(ineuzeichnen)
  41.         {
  42.             fflush(stdin);// mein löscchte eingabe puffer
  43.             _getch(); // mein programm wartet bis zu einer taster gedrückt
  44.             system("cls");
  45.             ineuzeichnen = 0;
  46.         }
  47.         if(szdateiname[0])
  48.         {
  49.             printf("Aktuelle Verwaltungsdatei: %s.bin\n", szdateiname);
  50.         }
  51.         else
  52.         {
  53.             puts("Willkommen im Fotoverwaltungsprogramm!\nEs ist gerade keine Verwaltungsdatei geoeffnet!");
  54.         }
  55.  
  56.         puts("Bitte eine Aktion auswaehlen\n\n"
  57.  
  58.         "[n] Neues Album anlegen\n"
  59.         "[l] Album laden\n\n"
  60.  
  61.         "[h] Foto zum Album hinzufuegen\n"
  62.         "[b] Album betrachten\n"
  63.         "[a] Album abspeichern\n"
  64.         "[s] Album speichern und schliessen\n\n"
  65.  
  66.         "[x] Programm beenden");
  67.  
  68.         fflush(stdin);
  69.         iwahl = _getch();
  70.         system("cls");
  71.         switch(iwahl)
  72.         {
  73.         case 'n':
  74.             if(pliste)
  75.             {
  76.                 puts("Es ist bereits ein Album geoeffnet!");
  77.                 ineuzeichnen = 1;
  78.             }
  79.             else
  80.             {
  81.                 pliste = AlbumAnlegen(szdateiname);
  82.                 if (pliste)
  83.                 {
  84.                     puts("Neues Album erfolgreich angelegt");
  85.                 }
  86.                 else
  87.                 {
  88.                     puts("Fehler beim anlegen eines neuen Albums");
  89.                     memset(szdateiname, 0, sizeof(szdateiname)); //dateinamen zurücksetzen. mein datei auf 0 setzen
  90.                     ineuzeichnen = 1;
  91.                 }
  92.             }
  93.             break;
  94.         case 'l':
  95.             if (pliste)
  96.             {
  97.                 puts("Es ist bereits ein Album geoeffnet!");
  98.                 ineuzeichnen = 1;
  99.             }
  100.             else
  101.             {
  102.                 pliste = AlbumLaden(szdateiname);
  103.                 if(pliste)
  104.                 {
  105.                     puts("Album erfolgreich geladen");
  106.                     ineuzeichnen = 1;
  107.                 }
  108.                 else
  109.                 {
  110.                     puts("Fehler beim laden des Albums");
  111.                     memset(szdateiname, 0, sizeof(szdateiname)); //dateinamen zurücksetzen
  112.                     ineuzeichnen = 1;
  113.                 }
  114.             }
  115.             break;
  116.         case 'h':
  117.             if (pliste)
  118.             {
  119.                 pliste = FotoHinzufuegen(pliste);
  120.                 ineuzeichnen = 1;
  121.             }
  122.             else
  123.             {
  124.                 puts("Fehler es ist kein Album geoeffnet!");
  125.                 ineuzeichnen = 1;
  126.             }
  127.             break;
  128.         case 'b':
  129.             if(pliste)
  130.             {
  131.                 AlbumAnzeigen(pliste);
  132.             }
  133.             else
  134.             {
  135.                 puts("Fehler es ist kein Album geoeffnet!");
  136.                 ineuzeichnen = 1;
  137.             }
  138.             break;
  139.         case 'a':
  140.             if(pliste)
  141.             {
  142.                 AlbumSpeichern(szdateiname, pliste);
  143.                 puts("Album gespeichert");
  144.                 ineuzeichnen = 1;
  145.             }
  146.             else
  147.             {
  148.                 puts("Fehler es ist kein Album geoeffnet!");
  149.                 ineuzeichnen = 1;
  150.             }
  151.             break;
  152.         case 's':
  153.             {
  154.  
  155.                 if(pliste)
  156.                 {
  157.                     AlbumSpeichern(szdateiname, pliste);
  158.                     puts("Album gespeichert");
  159.  
  160.                     //Zu erstem foto springen
  161.                     while (pliste->pvorheriges_foto)
  162.                     {
  163.                         pliste = pliste->pvorheriges_foto;
  164.                     }
  165.  
  166.                     //speicher freigeben
  167.                     while (pliste->pnaechstes_foto)
  168.                     {
  169.                         pliste = pliste->pnaechstes_foto;
  170.                         free(pliste->pvorheriges_foto);
  171.                     }
  172.                     //kopf freigeben
  173.                     free(pliste); //myliste ist frei
  174.                     pliste = 0;
  175.                     puts("Schliessen des Albums erfolgreich");
  176.                     memset(szdateiname, 0, sizeof(szdateiname)); //Dateinamen zurücksetzen ich setze datei name auf 0
  177.                     ineuzeichnen = 1;
  178.                 }
  179.                 else
  180.                 {
  181.                     puts("Es ist kein Album zum schliessen vorhanden!");
  182.  
  183.                 }
  184.             }
  185.  
  186.             break;
  187.         default: // wenn kein zu getroffen hat
  188.             puts("Falsche Eingabe\n\n");
  189.             ineuzeichnen = 1;
  190.             break;
  191.         case 'x':
  192.             break;
  193.         }
  194.  
  195.  
  196.     }
  197.     while(iwahl != 'x');
  198.  
  199.     return 0;
  200. }
  201.  
  202. Foto* AlbumAnlegen(char* szdateiname)
  203. {
  204.     Foto* plistenkopf = calloc(1, sizeof(Foto));
  205.     //printf("Speicher wurde an folgender Adresse allokiert: %p\n", plistenkopf);
  206.  
  207.     if (plistenkopf)
  208.     {
  209.         plistenkopf->pvorheriges_foto = 0;
  210.         plistenkopf->pnaechstes_foto = 0;
  211.         puts("Bitte Namen des Albums eingeben");
  212.         fflush(stdin);
  213.         gets(szdateiname);
  214.         puts("Bitte Daten fuer das erste Foto eingeben");
  215.         FotoDetailsEinlesen(plistenkopf);
  216.     }
  217.     else
  218.     {
  219.         puts("Fehler beim allokieren von Speicher!");
  220.     }
  221.     return plistenkopf;
  222. }
  223.  
  224. void FotoDetailsEinlesen(Foto* pfoto)
  225. {
  226.     if(pfoto)
  227.     {
  228.         puts("Bitte Namen des Fotos eingeben (ohne .jpg)");
  229.         fflush(stdin);
  230.         gets(pfoto->szdateiname);
  231.         puts("Bitte Datum des Fotos im Format TT.MM.JJJJ eingeben");
  232.         fflush(stdin);
  233.         gets(pfoto->szdatum);
  234.         puts("Bitte Aufnahmeort des Fotos eingeben");
  235.         fflush(stdin);
  236.         gets(pfoto->szort);
  237.         puts("Bitte Kurzbeschreibung des Fotos eingeben");
  238.         fflush(stdin);
  239.         gets(pfoto->szkurzbeschreibung);
  240.         system("cls");
  241.     }
  242.  
  243. }
  244.  
  245. Foto* AlbumLaden(char* szdateiname)
  246. {
  247.     Foto* pletztes_foto = 0;
  248.     Foto* paktuelles_foto = 0;
  249.     char szdateiname_mit_endung[260] = { 0 };
  250.  
  251.     puts("Bitte Namen des zu ladenden Albums eingeben");
  252.     fflush(stdin);
  253.     gets(szdateiname);
  254.     //Dateiendung hinzufügen
  255.     strcpy(szdateiname_mit_endung, szdateiname);
  256.     strcat(szdateiname_mit_endung, ".bin");
  257.  
  258.     FILE* pdatei = fopen(szdateiname_mit_endung, "rb");// rb ist zum lesen. i open my datei with rb
  259.     if(pdatei == 0)
  260.     {
  261.         return 0;
  262.     }
  263.  
  264.     rewind(pdatei);
  265.  
  266.     while(!feof(pdatei))//file end of  file(so lange nicht ende der datei) es überprüft
  267.     {
  268.         pletztes_foto = paktuelles_foto;
  269.         paktuelles_foto = calloc(1, sizeof(Foto));//reserviert speicher für 1 foto
  270.         if (fread(paktuelles_foto, 1, sizeof(Foto), pdatei) < sizeof(Foto)) // le datei et size offoto st enregistre ds la foto akt
  271.          {
  272.               // ende der datei, kein vollständiges foto konnte geladen werden
  273.               free(paktuelles_foto);// speicher frei
  274.               paktuelles_foto = pletztes_foto;
  275.              break;
  276.          }
  277.         //pointer richtig setzen
  278.         if(pletztes_foto)
  279.         {
  280.             pletztes_foto->pnaechstes_foto = paktuelles_foto;
  281.             paktuelles_foto->pvorheriges_foto = pletztes_foto;
  282.         }
  283.         else
  284.         {
  285.             paktuelles_foto->pvorheriges_foto = 0;
  286.         }
  287.         paktuelles_foto->pnaechstes_foto = 0;
  288.     }
  289.  
  290.     fclose(pdatei);
  291.     return paktuelles_foto;
  292. }
  293.  
  294. void AlbumAnzeigen(Foto* pliste)
  295. {
  296.     int iwahl = 0;
  297.     do
  298.     {
  299.         system("cls");
  300.         if (pliste)
  301.         {
  302.             puts("Aktuelles Foto ist:");
  303.             FotoDetailsAnzeigen(pliste);
  304.             puts("\n[n] naechstes Foto\t[v] vorheriges Foto\n[a] Foto anzeigen\t[e] Aktuelles Foto entfernen\n[s] Foto suchen\t\t[x] Zurueck");
  305.             fflush(stdin);
  306.             iwahl = _getch();
  307.  
  308.             switch (iwahl)
  309.             {
  310.             case 'n':
  311.                 if (pliste->pnaechstes_foto)
  312.                 {
  313.                     pliste = pliste->pnaechstes_foto;
  314.                 }
  315.                 break;
  316.             case 'v':
  317.                 if (pliste->pvorheriges_foto)
  318.                 {
  319.                     pliste = pliste->pvorheriges_foto;
  320.                 }
  321.                 break;
  322.             case 'a':
  323.                 FotoAnzeigen(pliste->szdateiname);
  324.                 break;
  325.             case 'e':
  326.                 pliste = FotoEntfernen(pliste);
  327.                 if (!pliste) //Liste ist jetzt leer
  328.                 {
  329.                     system("cls");
  330.                     puts("Das letzte Foto in dem Album wurde entfernt");
  331.                     _getch();
  332.                 }
  333.                 break;
  334.             case 's':
  335.                 pliste = AlbumDurchsuchen(pliste);
  336.                 break;
  337.             case 'x':
  338.                 break;
  339.             default:
  340.                 puts("Ungueltige Auswahl!");
  341.                 _getch();
  342.                 break;
  343.             }
  344.         }
  345.         else
  346.         {
  347.             puts("Kein Foto im Album vorhanden");
  348.             _getch();
  349.             break;
  350.         }
  351.     }
  352.     while ( iwahl != 'x' );
  353.     system("cls");
  354. }
  355.  
  356. void FotoDetailsAnzeigen(Foto* pliste)
  357. {
  358.     printf("Name: %s\n", pliste->szdateiname);
  359.     printf("Aufnahmedatum: %s\n", pliste->szdatum);
  360.     printf("Aufnahmeort: %s\n", pliste->szort);
  361.     printf("Kurzbeschreibung: %s\n", pliste->szkurzbeschreibung);
  362.     puts("------------------------------");
  363.     if(pliste->pvorheriges_foto)
  364.     {
  365.         printf("Vorheriges Foto: %s\n", pliste->pvorheriges_foto->szdateiname);
  366.     }
  367.     else
  368.     {
  369.         puts("Dies ist das erste Foto im Album");
  370.     }
  371.  
  372.     if (pliste->pnaechstes_foto)
  373.     {
  374.         printf("Naechstes Foto: %s\n", pliste->pnaechstes_foto->szdateiname);
  375.     }
  376.     else
  377.     {
  378.         puts("Es ist kein weiteres Foto vorhanden");
  379.     }
  380. }
  381.  
  382. void FotoAnzeigen(char* szdateiname)
  383. {
  384.     char szdateiname_mit_endung[260] = { 0 };
  385.     //Dateiendung hinzufügen
  386.     strcpy(szdateiname_mit_endung, szdateiname);
  387.     strcat(szdateiname_mit_endung, ".jpg");
  388.     puts("Foto wird im Bildanzeigeprogramm geoeffnet...");
  389.     system(szdateiname_mit_endung);
  390.     _getch();
  391. }
  392.  
  393. Foto* FotoEntfernen(Foto* pfoto)
  394. {
  395.     if(!pfoto)
  396.     {
  397.         return 0;
  398.     }
  399.  
  400.     if(pfoto->pvorheriges_foto)
  401.     {
  402.         if(pfoto->pnaechstes_foto)
  403.         {
  404.             //FALL 1: Foto hat Vorgänger und Nachfolger
  405.             pfoto->pvorheriges_foto->pnaechstes_foto = pfoto->pnaechstes_foto; //mn pointeur montre les diff foto (zeiger)
  406.             pfoto->pnaechstes_foto->pvorheriges_foto = pfoto->pvorheriges_foto;
  407.         }
  408.         else
  409.         {
  410.             //FALL 2: Foto war letztes Foto
  411.             pfoto->pvorheriges_foto->pnaechstes_foto = 0;
  412.         }
  413.         Foto* fneues_aktuelles_foto = pfoto->pvorheriges_foto;
  414.         free(pfoto);
  415.         return fneues_aktuelles_foto;
  416.     }
  417.  
  418.     //FALL 3: Foto war erstes Foto
  419.     if(pfoto->pnaechstes_foto)
  420.     {
  421.         pfoto->pnaechstes_foto->pvorheriges_foto = 0;
  422.         Foto* fneues_aktuelles_foto = pfoto->pnaechstes_foto;
  423.         free(pfoto);
  424.         return fneues_aktuelles_foto;
  425.     }
  426.  
  427.     //FALL 4: Foto war einziges Foto
  428.     free(pfoto); // enregistrem libre pr une foto
  429.     return 0;
  430. }
  431.  
  432. Foto* FotoHinzufuegen(Foto* pliste)
  433. {
  434.  
  435.     Foto* pneues_foto = calloc(1, sizeof(Foto));
  436.     //printf("Speicher wurde an folgender Adresse allokiert: %p\n", pneues_foto);
  437.  
  438.     if (pneues_foto)
  439.     {
  440.         if(pliste)
  441.         {
  442.                 pneues_foto->pvorheriges_foto = pliste;
  443.                 if(pliste->pnaechstes_foto) //einfügen
  444.                 {
  445.                     pneues_foto->pnaechstes_foto = pliste->pnaechstes_foto;
  446.                     pliste->pnaechstes_foto->pvorheriges_foto = pneues_foto;
  447.                 }
  448.                 else  //anfügen
  449.                 {
  450.                     pneues_foto->pnaechstes_foto = 0;
  451.                 }
  452.                 pliste->pnaechstes_foto = pneues_foto;
  453.  
  454.         }
  455.  
  456.  
  457.         //Liste ist noch leer
  458.         else
  459.         {
  460.             pneues_foto->pvorheriges_foto = 0;
  461.             pneues_foto->pnaechstes_foto = 0;
  462.         }
  463.  
  464.  
  465.         FotoDetailsEinlesen(pneues_foto);
  466.         puts("Foto wurde hinzugefuegt");
  467.         return pneues_foto;
  468.     }
  469.  
  470.     else
  471.     {
  472.         puts("Fehler beim allokieren von Speicher!");
  473.         return pliste;
  474.     }
  475. }
  476.  
  477. void AlbumSpeichern(char* szdateiname, Foto* pliste)
  478. {
  479.     if(pliste)
  480.     {
  481.         char szdateiname_mit_endung[260] = { 0 };
  482.         //Dateiendung hinzufügen
  483.         strcpy(szdateiname_mit_endung, szdateiname);
  484.         strcat(szdateiname_mit_endung, ".bin"); // einfügen
  485.  
  486.         FILE* pdatei = fopen(szdateiname_mit_endung, "wb");
  487.         rewind(pdatei);
  488.  
  489.         if(pdatei)
  490.         {
  491.             while(pliste->pvorheriges_foto) //springe zu erstem foto in liste
  492.             {
  493.                 pliste = pliste->pvorheriges_foto;
  494.             }
  495.             while(pliste)
  496.             {
  497.                 fwrite(pliste, 1, sizeof(Foto), pdatei);
  498.                 pliste = pliste->pnaechstes_foto;
  499.             }
  500.             fclose(pdatei);
  501.         }
  502.     }
  503. }
  504. Foto* AlbumDurchsuchen(Foto* pliste)
  505. {
  506.     if(pliste)
  507.     {
  508.         while(pliste->pvorheriges_foto) // springe zu anfang der liste
  509.         {
  510.             pliste = pliste->pvorheriges_foto;
  511.         }
  512.  
  513.         char szsuchbegriff[100] = { 0 };
  514.         int iwahl = 0;
  515.         puts("Was soll gesucht werden?\n"
  516.              "[o] Aufnahmeort\n"
  517.              "[n] Name\n"
  518.              "[d] Datum\n"
  519.              "[k] Kurzbeschreibung\n");
  520.         do
  521.         {
  522.             fflush(stdin);//löschte eingabe puffer(zwischen speicher)
  523.             iwahl = _getch();
  524.         }
  525.         while(iwahl != 'o' && iwahl != 'n' && iwahl != 'd' && iwahl != 'k');
  526.  
  527.         puts("Bitte Suchbegriff eingeben");
  528.         gets(szsuchbegriff);
  529.         char* pkomponente = 0;
  530.         if(iwahl == 'o') pkomponente = "Aufnahmeorte";
  531.         if(iwahl == 'n') pkomponente = "Namen";                                       //ck jcherche lorsk jcompile mn programm les different compoosan
  532.         if(iwahl == 'd') pkomponente = "Datumsangaben";
  533.         if(iwahl == 'k') pkomponente = "Kurzbeschreibungen";
  534.         printf("%s werden nach \"%s\" durchsucht...\n", pkomponente, szsuchbegriff);
  535.         fflush(stdin);
  536.  
  537.         int itreffer = 0;
  538.         int iindex = 0;
  539.  
  540.         while(1)
  541.         {
  542.             char* psz = 0;
  543.             if(iwahl == 'o') psz = pliste->szort;
  544.             if(iwahl == 'n') psz = pliste->szdateiname;
  545.             if(iwahl == 'd') psz = pliste->szdatum;
  546.             if(iwahl == 'k') psz = pliste->szkurzbeschreibung;
  547.             if(strstr(psz, szsuchbegriff)) //der suchbegriff wird im psz gesucht mn psz est liete en haut
  548.             {
  549.                 itreffer = itreffer + 1;
  550.                 printf("Treffer! Name: %s\tFotonummer: %i\n", pliste->szdateiname, iindex + 1);//index ces le numero dla foto
  551.             }
  552.             if(pliste->pnaechstes_foto)
  553.             {
  554.                 pliste = pliste->pnaechstes_foto;
  555.                 iindex++;
  556.             }
  557.             else
  558.             {
  559.                 break;
  560.             }
  561.         }
  562.         if(itreffer == 0)
  563.         {
  564.             puts("Keine Suchergebnisse");
  565.             _getch();
  566.         }
  567.         else
  568.         {
  569.             puts("Bitte Nummer des anzuzeigenden Fotos eingeben\n");
  570.             int inummer = 1;
  571.             fflush(stdin);
  572.             scanf("%i", &inummer);
  573.  
  574.             while(pliste->pvorheriges_foto) // springe zu anfang der liste
  575.             {
  576.                 pliste = pliste->pvorheriges_foto;
  577.             }
  578.  
  579.             iindex = 0;
  580.             while(iindex < inummer - 1)
  581.             {
  582.                 if(pliste->pnaechstes_foto)
  583.                 {
  584.                     pliste = pliste->pnaechstes_foto;
  585.                     iindex++;
  586.                 }
  587.                 else
  588.                 {
  589.                     break;
  590.                 }
  591.             }
  592.         }
  593.     }
  594.     return pliste;
  595. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement