Grundlagen der Programmierung 12. Vorlesung 08.01.2019 1
Arrays (Felder, Vektoren) Container für mehrere Objekte Objekte in dem Container werden über Indizes adressiert (beginn bei 1) 1 2 3 4 5 6 Für Indizes dürfen Ausdrücke benutzt werden (d.h. Indizes können berechnet werden) 2
Felder Zeilenvektoren: a = [1 2 3 4] oder a = 1:4 Spaltenvektoren: b = [5; 6; 7; 8] Matrizen: c = [1 2; 3 4; 5 6] Zugriff über Zeilen/Spaltenindex in ( ) a(2) c(1,2) c([1 3], 1) auch schreib: a(2)=42; Hinzufügen: Element mit neuem Index zuweisen! Löschen: Elemente auf leere Matrix [] setzen Z.B.: zweite Spalte löschen: x(:,2) = [] 3
Felder: Operationen Array-Operationen - + -.*./.^ elementweise Felder müssen bgzl. Größe kompatibel sein auch auf mehrdimensionale Felder anwbar Matrix-Operationen Matrixmultiplikation * Lösen linearer Gleichungssysteme / \ Potenzierung ^ 4
Array Op.: Kompatible Größen = n x m n x m n x m = n x m 1 x 1 n x m = n x m n x 1 n x m = n x 1 1 x m n x m = n x m 1 x m n x m Z.B.: Multiplikationstabelle: [1:10]'.* [1:10] 5
Array Op..* vs. Matrix Op. * 6
Array Op../ vs. Matrix Op. \ 7
Traversieren eines Vektors for var = bereich block bereich ist ein Vektor: v = [1 2 3 4 5]; for x = v fprintf( %d\n, x); für jedes Element x aus dem Vektor v: 8
Traversieren eines Vektors Alle Elemente durchlaufen (Zeilenvektor!) for element = vektor... Über Index for idx = [1 : length(vektor) ] % Zugriff auf El.: vektor(idx)... 9
Beispiel: Max. Element in Vektor zz = randi(100, 1, 100); fprintf('max. Element ist: %d\n', maxi(zz)); fprintf('(mit Matlab Fkt: %d)\n', max(zz)); function m = maxi( v ) max_so_far = 0; for x = v if max_so_far < x max_so_far = x; m = max_so_far; 10
Beispiel: Max. Element mit Index zz = randi(100, 1, 10); [e,x] = maxi(zz)); fprintf('max. Element ist: %d an %d\n',e,x); function [m, max_idx] = maxi( v ) max_so_far = v(1); max_idx = 1; for idx = [2:length(v)] if max_so_far < v(idx) max_so_far = v(idx); max_idx = idx; m = max_so_far; 11
Zurück zum Notenhistogramm Aufgabe: Zahlen (Noten von 1-6) von Tastatur einlesen, bis 0 eingegeben wird, Histogramm ausgeben 12
Notenhistogramm (neu) n = zeros(1,6); eingabe = 1; while eingabe ~= 0 eingabe = input('note: '); if (eingabe > 0) && (eingabe < 7) n(eingabe) = n(eingabe) + 1; for x=[1:6] fprintf('\nnote %d: ', x); print_n_stars( n(x) ); Vektor erzeugen Element erhöhen Element ausgeben 13
Notenhistogramm (Version 3) spektrum = 6; n = zeros(1, spektrum); Leichter zu Ändern! eingabe = 1; while eingabe ~= 0 eingabe = input('note: '); if (eingabe > 0) && (eingabe <= spektrum) n(eingabe) = n(eingabe) + 1; for x = [1:spektrum] fprintf('\nnote %d: ', x); print_n_stars( n(x) ); 14
Exkurs: Plots 15
Exkurs: Plots x = linspace(0,10,100) y = sin(x) plot(x,y) 16
Exkurs: Plots plot: 2D plots plot3d: 3D plots loglog: Plots mit log. Achsen bar: Balkiagramm histogram: Histogramm pie: Tortiagramm... https://de.mathworks.com/help/matlab/2-and-3dplots.html 17
Beispiel: Zufallszahlenverteilung % Vektor mit 1000 Zahlen in ]0,1[ würfeln : zz = rand(1,1000); oder randi(10,1,1000) zz = zz.* 10; % -> in ]0,10[ zz = zz.+ 1; % -> in ]1,11[ zz = floor(zz); % abrunden -> in {1,2,...,10} % Histogramm generieren (liefert handle ): h = histogram( zz ); % Eigenschaften ändern: h.orientation = 'horizontal'; 18
Notenhistogramm (mit Matlab Plot) spektrum = 6; n = zeros(1,spektrum); eingabe = 1; while eingabe ~= 0 eingabe = input('note: '); if (eingabe > 0) && (eingabe <= spektrum) n(eingabe) = n(eingabe) + 1; diagramm = barh( n ); diagramm.facecolor = [1.0 0 0]; 19
Beispiel: Mastermind Quizmaster wählt Code: 4 Zahlen zwischen 1 und 6 Solange der Code nicht geknackt wurde: Code-Knacker rät 4 Zahlen Quizmaster bewertet den Versuch mit bis zu 4 + oder - Zeichen + für jede Zahl, die an der richtigen Stelle steht - für jede Zahl, die im Code vorkommt, aber im Versuch an der falschen stelle steht 20
Beispiel: Mastermind CODE_LEN = 4; MAX_CODE = 6; correct = correct_solution( CODE_LEN ); code = shuffle_code( CODE_LEN, MAX_CODE ); hints = []; while ~isequal( hints, correct ) guess = read_code( CODE_LEN, MAX_CODE ); hints = check_code( guess, code, CODE_LEN ); fprintf('%s\n', hints); fprintf('yayy, got it!\n'); Zum Schummeln : ; weglassen 21
Beispiel: Mastermind % liefert Vektor mit l Pluszeichen function c = correct_solution( l ) c = []; for z = 1:l c = [c '+']; % würfelt Vektor der Länge l % mit Zahlen zwischen 1 und m function code = shuffle_code( l, m ) code = randi( m, 1, l ); + an Vektor c anhängen 22
Beispiel: Mastermind % Zahl zwischen 0 und 10^l einlesen % und in Vektor umwandeln function guess = read_code( l, m ) in = 0; while in <= 0 in >= 10^l in = input('enter your guess: '); % dirty hack: guess = num2str(in) - '0'; ToDo: sicherstellen, dass Zahlen im Vektor zwischen 1 und m liegen 23
Beispiel: Mastermind % Liefere ein '+' für jede Zahl an der richtigen Pos. % Liefere ein '-' für jede Zahl im Code function hint = check_code( guess, code, l ) correct_pos = 0; % Zähler: korrekte Pos. correct_num = 0; % Zähler: korrekte Zahl for i = 1:l if guess(i) == code(i) correct_pos = correct_pos + 1; elseif ismember( guess(i), code ) correct_num = correct_num + 1; hint = build_hint( correct_pos, correct_num ); 24
Beispiel: Mastermind % Vektor mit n_pos '+', n_minus '-' function hint = build_hint( n_pos, n_minus ) hint = []; for x = 1:n_pos hint = [hint '+']; for x = 1:n_minus hint = [hint '-']; 25
Zeichenketten und Dateien 26
Zeichenketten Eingeschlossen in Sind Vektoren von Zeichen: 27
Beispiel: Leerzeichen entfernen s = 'String mit Leer Zeichen'; s2 = str_strip( s ); fprintf('mit Leerzeichen: >%s<\n', s) fprintf('ohne Leerzeichen: >%s<\n', s2) function out = str_strip( in ) o = 1; out = ''; for i = 1:length( in ) if ( ~isspace( in(i) )) out(o) = in(i); o = o + 1; C Denkweise! 28