RSS-Feed

Mathe 3

von Kai um 15:54 am Donnerstag, 11. Februar 2010 in Klausuren, Studium | 0 Kommentare

Heute war der Klausurtermin für “Mathematik für Informatiker”. So aus dem Gedächtnis wurden folgende Aufgaben gestellt. Die Liste ist bestimmt nicht vollständig und kann noch Fehler enthalten, kann aber mit Hilfe der anderen Opfer, die mitgeschrieben haben, komplettiert werden.

Aufgabe 1

a.) Beweisen Sie mit Hilfe der vollständigen Induktion:


b.) Beweisen Sie folgende Aussage mit Hilfe von Kontraposition:

Wenn teilerfremd sind, so sind auch teilerfremd.

c.) Beweisen Sie, dass der Satz: Wenn 3a+2b und 3a-2b sind nicht teilerfremd, dann sind a und b auch nicht teilerfremd, nicht gilt.

Lösung (anzeigen)













Aufgabe 2

a.) Die Wettervorhersage gibt an, dass es mit 40% Wahrscheinlichkeit morgen regnet und mit 60% Wahrscheinlichkeit, dass es nicht regnet. Leider trifft die Vorhersage aber nur mit 80% Wahrscheinlichkeit zu, dass es morgen tatsächlich regnet und mit 90% Wahrscheinlichkeit, dass es nicht regnet

Berechnen Sie die Wahrscheinlichkeit dafür, dass morgen ein Regentag ist.

b.) Adam und Eva waren zum Inlineskaten verabredet, doch leider kam Eva nicht zum vereinbartem Zeitpunkt, weil Sie gehört hat, dass es regnen wird. Als Entschuldigung gibt sie an, dass Sie gehört hat, dass es regnen sollte. Adam ist sich sicher, dass Eva die Wettervorhersage nicht gesehen haben kann.

Wie hoch ist die Wahrscheinlichkeit, dass es geregnet hat?

Aufgabe 3

Ein Prof vergisst jedes zehnte Mal (unabhängig vom vorherigen Mal) seine Unterlagen für die Vorlesung und muss zurücklaufen und sie holen. Bei 15 Vorlesungen:
a.) Wie groß ist die Wahrscheinlichkeit, dass er sie nie vergisst?
b.) Wie groß ist die Wahrscheinlichkeit, dass er sie mindestens zweimal nicht vergisst?

Lösung (anzeigen)


Aufgabe 4

In einer Sportgruppe liegt der Erwartungswert bzgl. der Körpergröße bei 1.8m und die Standardabweichung beträgt 0,1m. Für den Kurs „Turnen“ braucht man eine Größe zwischen 1,5m und 1,7m.

Wieviel Prozent der Studenten nehmen teil?

Lösung (anzeigen)





Es nehmen also 15,74% aller Studenten teil.

Aufgabe 5

Es sind folgende zwei Schätzer T1,T2 gegeben:

a.) Überprüfen Sie die Schätzer auf ihre Erwartungstreue
b.) Überprüfen Sie die Schätzer auf ihre Konsistenz

Aufgabe 6

Die Studenten geben an, dass Sie für das Fach Mathe folgenden Lernaufwand haben:

Studenten 80 100 60 40
Zeitaufwand in Std. [0,5) [5,10) [10,20) [20,40)

a.) Bitte erklären Sie, ob die Zufallsvariable X="Zeitaufwand der Studenten" diskret oder stetig ist. Bitte begründen Sie ihre Antwort. Ohne Begründung gibt es keine Punkte.
b.) Bitte geben Sie die Dichtefunktion an, und gehen Sie davon aus, dass die Studenten nicht länger als 40 Stunden für das Fach aufwenden?
c.) Zeichnen Sie die Verteilungsfunktion
d.) Berechnen Sie den Erwartungswert E(X)
e.) Berechnen Sie die Wahrscheinlichkeit für P(X<18)

Aufgabe 7

a.) Anhand folgender Tabelle soll eine Regressionsgerade mit Hilfe des Satzes der kleinen Quadrate berechnet werden.

Jahr nach 2000 2 4 6 8
Durchschnittsverbrauch an Kraftstoff in Liter/100km 8,5 8,2 7,9 8,0

b.) Berechnen Sie, ausgehend von einer linearen Abhängigkeit,nach wie viel Jahren nach dem Jahr 2000 der Durchschnittsverbrauch bei 5 Litern/100km liegen wird

Lösung (anzeigen)

















Onlinetest Python

von Kai um 20:37 am Montag, 11. Januar 2010 in Klausuren, Programmiersprachen, Studium | 0 Kommentare

Heute war es wieder mal soweit: Onlinetest. Dieses mal in Python. Nachdem ich erfolgreich meine Maschine (iMac mit Debian, Windowmanager war glaub ich FVWM) zweimal abgeschossen hatte, bin ich in der vorgegebenen Zeit von 90 Minuten knapp fertig geworden. Eigentlich sind die gestellten Aufgaben in den bisherigen Onlinetests, die ich so mitgeschrieben habe, nicht extrem schwer, trotzdem finde ich es aber schwierig auf Kommando kreativen (und möglichst cleveren) Code zu schreiben.

Es sind eben diese typischen Prüfungssituationen bei denen man unter erschwerten Bedingungen klaren Kopf behalten muss ;-)
Das waren die Aufgaben:

Aufgabe 1:

Man soll von der Standardeingabe eine Zeile einlesen und unnötige Leerzeichen entfernen. Außerdem soll jedes Wort mit einem großen Anfangsbuchstaben in Großbuchstaben umgewandelt wieder ausgegeben werden.

# a1.py
while True:
    line = raw_input()
    line = line.split()
    for word in line:
        if(str.isupper(word[0])):
            print str.upper(word),
        else:
            print word,
    print # Zeilenumbruch für schönere Ausgabe

Aufgabe 2:

Die zweite Aufgabe bestand darin, eine Datei belegung.dat einzulesen, die folgendes Format hatte: <VL-Nr>; <matrikelNr>; <VL-Name>; <VL-Typ>.
Danach sollte die so eingelesene Datei in folgendem Format in eine Datei ausgabe.dat geschrieben werden:
<VL-Nr>,<AnzahlBelegungen>, <VL-Name> <VL-Typ>
Momentan sind in der Ausgabe noch doppelte Einträge drin, das müsste noch geändert werden.

# a2.py
dict = {}
belegung = []

input = open('belegung.dat','r')
for line in input:
    line = line.split(';')
    belegung.append(line)

input.close()

for line in belegung:
    if dict.has_key(line[0]):
        dict[line[0]] += 1
    else:
        dict[line[0]] = 1

ausgabe = file('ausgabe.dat','w')

for nummer, anzahl in dict.iteritems():
    for line in belegung:
        tmp = ""
        if nummer==line[0]:
            try:
                tmp = str(nummer) + ',' + str(anzahl) + ',' + line[2] + '\n'
                ausgabe.write(tmp)
            except:
                pass

ausgabe.close()

Aufgabe 3:

Die dritte Aufgabe bestand darin, einen “sprach-begabten” Taschenrechner zu programmieren, der beim Aufruf des Programms Argumente wie “17 plus 4 minus 3 gleich” übernimmt und korrekt auswertet. Es soll bewusst auf Punkt-vor-Strich Rechnung verzichtet werden (also fällt eval() flach). Außerdem kann man der Einfachheit davon ausgehen, dass nur korrekte Argumente übergeben werden.
Ich hab ungefähr so etwas hingeschrieben:

# a3.py
import sys

i = 0
result = 0
input = sys.argv[1:]
while i < len(input):
    if input[1]=="gleich":
        result = int(input[0])
        break
    elif input[i]=="plus":
        result = int(input[i-1]) + int(input[i+1])
        input[i+1] = result
    elif input[i]=="minus":
        result = int(input[i-1]) - int(input[i+1])
        input[i+1] = result
    elif input[i]=="mal":
        result = int(input[i-1]) * int(input[i+1])
        input[i+1] = result
    elif input[i]=="durch":
        result = int(input[i-1]) / int(input[i+1])
        input[i+1] = result
    i += 1

print "Ergebnis:",str(result)

Letzte Klausur dieses Semester: Hands-On Programmieren 1

von Kai um 18:38 am Freitag, 13. März 2009 in Gadgets, Klausuren, Studium | 5 Kommentare

Update: Ungetestete Lösung Aufgabe 8 noch angehängt

Nachdem ich gestern die letzte Klausur in diesem Semester in Programmieren 1 geschrieben habe und deren Ausgang noch unklar ist, habe ich mich mal hingesetzt und versucht die ganzen Aufgaben zu rekapitulieren (danke auch an Fabian und Seba) und korrekt zu lösen:

1.) Man sollte die EBNF für beliebig lange Summen-Terme hinschreiben und danach das entsprechende Syntaxdiagramm dazu bilden (z.B. a+b, a+b+c+b+a+c, a ). Als EBNF ist wohl folgendes korrekt:

Summe = (a|b|c) {"+"(a|b|c)}

und das entsprechende Syntaxdiagramm sieht dann wohl so aus:

Syntaxdiagramm

2.) Als nächtes musste man ein paar Code-Fragmente auf Korrektheit überprüfen. Da ich die einzelnen Abschnitte nicht mehr rekonstruieren kann, lasse ich diese hier außen vor.

3.) Die Aufgabe war anhand eines übergebenen Monats (1 – 12) die korrekte Jahreszeit wiederzugeben. Einmal mittels Switch-Anweisung und einmal mit einem Array gelöst: Ich hab folgendes hingeschrieben:

public static String Jahreszeit (int monat)
{
// Lösung mit switch
switch(monat) {
    case 1: case 2: case 12:
        return "Winter";
    case 3: case 4: case 5:
        return "Frühling";
    case 6: case 7: case 8:
        return "Sommer";
    case 9: case 10: case 11:
        return "Herbst";
    default:
        return "Ungültige Monatsangabe";
}

// Lösung mit String-Array
String[] jahreszeiten = {"","Winter","Winter","Frühling","Frühling","Frühling","Sommer","Sommer","Sommer","Herbst","Herbst","Herbst","Winter"}

return jahreszeiten[monat];

4.) Bei der nächsten Aufgabe sollten für eine Zahl n alle ungeraden Teiler ausgegeben werden. Einmal mit einer while-Schleife, mit einer do-while-Schleife und mit einer for-Schleife. Meine Lösung:

public static void ungeradeTeiler(int n) {

// while-Schleife
int i=1;
while(i < n) {
    if(n%i==0 && i%2 != 0) {
    System.out.println(i);
    }
    i++;
}

// do-while-Schleife
int j=1;
do {
    if(n%j==0 && j%2 != 0) {
        System.out.println(j);
        }
        j++;
    } while(j < n);

// for-Schleife
for (int k=1; k < n;k++)
    if(n%k==0 && k%2 != 0) {
        System.out.println(k);
    }
}

5.) Die nächste Aufgabe bestand darin, eine Reihe von Zahlen nach Größe sortiert wieder auszugeben. Hier war es von Vorteil, wenn man sich eine der üblichen Sortierverfahren vorher eingeprägt hatte. Obwohl der QuickSort-Algorithmus mit einer der effizientesten Algorithmen ist, hab ich mich dennoch für den BubbleSort entschieden, weil ich mir den leichter merken kann:

public static void main(String[] args) {
       
// Einlesen der Zahlen von der Kommandozeile
int[] array = new int[args.length];
int i=0;
while(i<args.length) {
    array[i] = Integer.parseInt(args[i]);
    i++;
}

// sortieren mit BubbleSort-Verfahren
i= 1;
while(i< array.length) {
    int j = array.length -1;
    while (j >= i) {
        if (array[j] < array[j-1] ) {
            // vertauschen der beiden Stellen
            int tmp = array[j];
            array[j] = array[j-1];
            array[j-1] = temp;
        }
        j--;
    }
    i++;
}
   
// sortierte Liste ausgeben
i=0;
while (i < array.length ) {
    System.out.println(array[i]);
    i++;
    }
}

6.) Die sechste Aufgabe behandelte die binäre Suche. Das ist ein Algorithmus, der auf einem Array recht schnell ein gesuchtes Element finden kann. Der Algorithmus funktioniert folgendermaßen:
Als erstes wird das mittlere Element des Array auf geprüft. Wenn es gleich dem gesuchten Element ist, ist die Suche beendet, ist es kleiner als das gesuchte Element, muss man in der hinteren Hälfte des Arrays weitersuchen, ist es größer, wird in der vorderen Hälfte des Arrays weitergesucht.
Im nächsten Schritt wird dann wieder wie vorher weitergemacht: Also mittleres Element überprüfen, falls das gesuchte Element gleich dem mittleren Element ist, abbrechen, ansonsten jeweilige Hälfte überprüfen usw.
Ein Programmbeispiel konnte ich in der Klausur leider nicht liefern, werde mir aber dafür das Beispiel in der Wikipedia anschauen. Dort ist es neben einem Pseudocode ebenfalls in Java gelöst worden (neben Python und C).

7.) In der siebten Aufgabe sollte ein Skalarprodukt zweier Vektoren mit gleicher Länge ausgerechnet werden. Das Problem sollte einmal iterativ und einmal rekursiv gelöst werden:

// iterative Lösung
public static int skalar(int[] v, int[] w) {
    int result = 0;
    for(int i=0;i<v.length;i++)
    {
        result += v[i] * w[i];
    }
    return result;
}

// rekursive Lösung
public static int skalar(int[] v, int[] w) {
    int l = v.length;
    if (l == 0)
        return 0;
    else {
        int[] vv = new int[l - 1];
        int[] ww = new int[l - 1];
        for (int i = 0; i <= l - 2; i++) {
            vv[i] = v[i];
            ww[i] = w[i];
        }
        return v[l - 1] * w[l - 1] + skalar(vv, ww);
    }
}

8.) Die letzte Aufgabe war es, eine Verbindungslinie zwischen zwei Punkten zu berechnen. Vorgegeben war eine fiktive Funktion setPixel(int[][] a, int[][] b). Zuerst sollte man den Mittelpunkt M zwischen dem Anfangs- und Endpunkt berechnen. Lagen dann alle berechneten Punkte in einem jeweils benachbartem Feld, war man fertig und konnte die errechneten Punkte an die Funktion setPixel übergeben, ansonsten musste man wieder jeweils den Mittelpunkt zwischen dem Anfangs- bzw. Endpunkt berechnen usw. Zum besseren Verständnis eine Grafik:
Verbindungen
Die Lösung erspare ich mir heute und wird morgen nachgereicht. Update: Ungetestete Lösung noch beigefügt:

public static int[][] getMiddlePixel(int A[][], int B[][]) {
    int[][] M = new int[(A.length/2)+(B.length/2)][(A[0].length/2)+(B[0].length/2)];

    if (A.length == B.length && A[0].length == B[0].length) {
        // Die Punkte A und B liegen übereinander
        return M;
    } else  if (A.length == B.length && A[0].length != B[0].length) {
        // Der x-Wert der Punkte A und B sind korrekt
        return getMiddlePixel(A,M);
    } else {
        // Der y-Wert der Punkte A und B sind korrekt
        return getMiddlePixel(M,B);
    }
}