function studka3
%Vorlesungsbeispiel: Studentenkartei
% mit zusäztzlicher Sortierung nach Namen bzw. Immatr.-Nummern
%3. Variante:Menügesteuerte Bearbeitung in Funktionsschreibweise
%              Struktur besteht aus
%              Name
%              Vorname
%              Immatrikulationsnummer
%              Geburtsdatum 
%              Immatrikulationsdatum
%              - Datum als Unterstruktur mit Tag, Monat, Jahr
%   Memüaufbau
%   (1) Listeneingabe
%   (2) Laden einer vorhandenen Liste
%   (3) Suchen und bearbeiten eine Eintrages
%   (4) Löschen eines Eintrags
%   (5) Ausgabe der Daten in Tabellenform
%   (6) Speichern der Daten und Beenden des Programms
clear all;
iend=0; student=[];
quit = 1;
while quit
clc;
disp('Bearbeitung einer Studentenkartei *** Menü ***');
disp('   ');
disp('(1) Listeneingabe');
disp('(2) Laden einer vorhandenen Liste');
disp('(3) Suchen und bearbeiten eine Eintrages');
disp('(4) Reihenweise Ausgabe der Einträge');
disp('(5) Löschen eines Eintrages');
disp('(6) Ausgabe einer Liste in Tabellenform');
disp('(7) Ausgabe einer namenssortierten Liste');
disp('(8) Ausgabe der sortierten Immatrikulationsnummern');
disp('(9) Speichern der Daten und Beenden des Programms');
disp('   ');
auswahl= input('Eingabe einer Zahl: ');
switch auswahl
   case 1 % Listeneingabe
      [iend,student]=listeneingabe(iend,student);
   case 2
      % Laden einer vorhandenen Liste
      [iend,student]=laden;
   case 3
      % Suchen und bearbeiten eine Eintrages
      clc;disp('Suchen und bearbeiten eine Eintrages');
      i=suchen(iend,student,input('Suchname: ','s'));
      student=bearbeiten(i,iend,student);
   case 4
      % Reihenweise Ausgabe der Einträge
      einzelausgabe(iend,student);
   case 5
      % Löschen eines Eintrages
      clc;disp('Löschen eines Eintrages');
      i=suchen(iend,student,input('Suchname: ','s'));
      [iend,student]=loeschen(i,iend,student);
   case 6
      % Ausgabe einer Liste in Tabellenform
      ausgabe(iend,student)
   case 7
      % Ausgabe einer namenssortierten Kurzliste
      ausgabe_n(iend,student)
   case 8
      % Ausgabe einer Kurzliste nach sortierten Immatrikulationsnummern
      ausgabe_i(iend,student)
   
   case 9
      % Speichern der Daten und Beenden des Programms
      beenden(iend,student);
      quit = 0;
   otherwise
      disp('Wählen Sie eine Zahl zwischen 1 und 9 !');
      disp('Weiter mit beliebiger Taste !');
      pause;
   end
end

function [iend,student]=listeneingabe(iend,student)
clc;disp('Listeneingabe');
if input('(n)eue Liste/Liste (e)rgänzen: ','s')== 'n'
  i=1;
else
   i=iend+1;
end;
quit1=1;
while quit1
         clc;disp('Listeneingabe');
         disp('   ');
         disp('Eingabeende durch Eingabe einer leeren Zeichenkette!');
         student(i).name = input('Name:         ','s');
         if isempty(student(i).name )
            disp('Eingabe beendet - weiter mit beliebiger Taste!');
            quit1 = 0;iend=i-1;
            pause;
         else
            student(i).vorname = input('Vorname:      ','s');
            student(i).nr = input('Immatr.-Nr.: ');
            if isempty(student(i).nr), student(i).nr=i; end
            dat= input('Geburtsdatum          - [Tag,Monat,Jahr]: ');
            if isempty(dat), dat=[0 0 0]; end
            student(i).gebtag.tag = dat(1);
            student(i).gebtag.monat = dat(2);
            student(i).gebtag.jahr = dat(3);
            dat= input('Immatrikulationsdatum - [Tag,Monat,Jahr]: ');
            if isempty(dat), dat=[0 0 0]; end
            student(i).immat.tag = dat(1);
            student(i).immat.monat = dat(2);
            student(i).immat.jahr = dat(3);
           i=i+1;
        end;
     end ;
     
function beenden(iend,student)
disp(' Speichern der Daten und Beenden des Programms');
if input('Daten speichern (j/n): ','s') == 'j'
s1=input('\nLaufwerk und Pfad für Datensicherung: ','s');
s2=input('\nDateiname ohne Erweiterung: ','s');
s=['save ',s1,filesep,s2,' iend student'];
eval(s);
disp([num2str(iend),' Datensätze unter ',s1,'\',s2,'.mat gespeichert']);
disp('Weiter mit beliebiger Taste !');
pause;
end;

function [iend,student]=laden
clc;
disp('Laden vorhandener Daten aus einer Datei.');
disp('Bestehende Daten werden überschrieben !');
s1=input('\nLaufwerks- und Pfadangabe: ','s');
s2=input('\nDateiname ohne Erweiterung: ','s');
s=['load ',s1,filesep,s2,' iend student'];
eval(s);
disp([num2str(iend),' Datensätze geladen']);
disp('Weiter mit beliebiger Taste !');
pause;

function ausgabe(iend,student)
clc;
disp('Ausgabe der kompletten Kurzliste');
if iend==0
   disp('Keine Daten vorhanden!');
   else
   disp('Nr.  Name                 Vorname           Immatrikulationsnummer   ');
   for i=1:iend
      fprintf('%3d  %-20s %-20s %10d\n',i,student(i).name,student(i).vorname,student(i).nr); 
      if rem(i,15)==0
         disp('Fortsetung der Ausgabe nach Tastendruck!');
         pause;
         clc;
         disp('*** Fortsetung der Ausgabe ***');
         disp('Nr.  Name                 Vorname           Immatrikulationsnummer   ');
      end;
   end;
end;
disp('   ');
disp('Ausgabe beendet - weiter mit beliebiger Taste!');
pause;

function ausgabe_n(iend,student)
clc;
disp('Ausgabe der sortierten Namensliste');
if iend==0
   disp('Keine Daten vorhanden!');
   else
   disp('Name                 Vorname           Immatrikulationsnummer   ');
   j=1:20;n='                    ';
   for i=1:iend
      s(i,j)=n(j);
   end
   for i=1:iend
      j=1:length(student(i).name);
      s(i,j)=student(i).name(j);
   [sl,si]=sortrows(s);
   end
   for i=1:iend
      fprintf('%-20s %-20s %10d\n',student(si(i)).name,student(si(i)).vorname,student(si(i)).nr); 
      if rem(i,15)==0 & rem(i,iend)~=0
         disp('Fortsetung der Ausgabe nach Tastendruck!');
         pause;
         clc;
         disp('*** Fortsetung der Ausgabe ***');
         disp('Name                 Vorname           Immatrikulationsnummer   ');
      end;
   end;
end;
disp('   ');
disp('Ausgabe beendet - weiter mit beliebiger Taste!');
pause;

function ausgabe_i(iend,student)
clc;
disp('Nach Immatrikulationsnummern sortierte Kurzliste');
if iend==0
   disp('Keine Daten vorhanden!');
   else
   disp('Immatrikulationsnummer     Name  ');
   s=[];
   for i=1:iend
   s=[s;student(i).nr];
   [sl,si]=sortrows(s);
   end
   for i=1:iend
      fprintf('%10d                  %-20s \n',student(si(i)).nr,student(si(i)).name); 
      if rem(i,15)==0 & rem(i,iend)~=0
         disp('Fortsetung der Ausgabe nach Tastendruck!');
         pause;
         clc;
         disp('*** Fortsetung der Ausgabe ***');
         disp('Immatrikulationsnummer     Name   ');
      end;
   end;
end;
disp('   ');
disp('Ausgabe beendet - weiter mit beliebiger Taste!');
pause;

function n=suchen(iend,student,wert)
for i=1:iend+1
   if strcmp(student(i).name,wert), break, end;   
end;
if iend == i-1
   disp('Eintrag nicht gefunden - weiter mit beliebiger Taste!');
   pause;
else
   disp(['Eintrag gefunden bei i = ',num2str(i),' !']);
   disp('Weiter mit beliebiger Taste!'); pause;
end;
n=i;

function [iend,student]=loeschen(i,iend,student)
if i ~= iend+1
   student(i) = student(iend);
   iend= iend-1;
end;

function student=bearbeiten(i,iend,student)
if i ~= iend+1
   ende=1;
   while ende
   clc;
   disp(['Aktuelle Daten des gefundenen Eintrages ',student(i).name,' mit Nr. ',num2str(i)]);
   disp(' ');
   disp(['1. Name: ',student(i).name]);disp(' ');
   disp(['2. Vorname: ',student(i).vorname]);disp(' ');
   disp(['3. Geburtsdatum: ',num2str(student(i).gebtag.tag),',',...
      num2str(student(i).gebtag.monat),',',num2str(student(i).gebtag.jahr)]);disp(' ');
   disp(['4. Immatrikulationsnummer: ',num2str(student(i).nr)]);disp(' ');
   disp(['5. Immatrikulationsdatum: ',num2str(student(i).immat.tag),',',...
      num2str(student(i).immat.monat),',',num2str(student(i).immat.jahr)]);disp(' ');
   disp('   Änderung der Eingabewerte über Angabe der Nummer');
   n=input('6: Bearbeitung beenden ,                         Eingabewert: ');
   switch n
   case 1
      student(i).name=input('Neuer Name: ','s');
   case 2
       student(i).vorname=input('Neuer Vorname: ','s');
   case 3
      dat=input('Neues Geburtsdatum [Tag,Monat,Jahr]: ');
      student(i).gebtag.tag=dat(1);
      student(i).gebtag.monat=dat(2);
      student(i).gebtag.jahr=dat(3);
   case 4
      student(i).nr=input('Neue Immatr.-Nr.:','s');
   case 5
      dat=input('Neues Immatrikulationsdatum [Tag,Monat,Jahr]: ');
      student(i).immat.tag=dat(1);
      student(i).immat.monat=dat(2);
      student(i).immat.jahr=dat(3);
   case 6
      ende=0;
  otherwise
   ;
   end;
 end; 
end;

function einzelausgabe(iend,student)
% Reihenweise Ausgabe 
%Ausgabeschablone für Einzeleintrag
i=1;
ende=1;
while ende
   clc;disp('Reihenweise Ausgabe der Einträge');
   fprintf('Einzelausgabe %d.ter Datensatz\n\n',i);
   fprintf('Name: %-20s  Vorname: %-20s \n',student(i).name,student(i).vorname); 
   fprintf('Geburtsdatum: %d-%d-%d\n',student(i).gebtag.tag,student(i).gebtag.monat,student(i).gebtag.jahr );
   fprintf('\n\nImmatrikulation\n');
   fprintf('Tag der Immatrikulation: %d-%d-%d',student(i).immat.tag,student(i).immat.monat,student(i).immat.jahr );
   fprintf('\tNummer der Einschreibung: %d\n',student(i).nr);
   fprintf('n - Nächster Eintrag,\tv - vorheriger Eintrag\t b - Ausgabe beenden\n');
   steuerung=input('Auswahl(n,v,b): ','s'),
   switch steuerung
   case 'n'
      if i < iend, i=i+1; else i=1;end;
   case 'v'
      if i>1,i=i-1; else i=iend; end;
   case 'b'
      ende=0;
   end;
end;