Tutorium #3
Einführung in die (strukturierte) Programmierung
Gruppe 3 – Michael Schwarz
prog-tutor-michael@iicm.tugraz.at
Gruppe 5 – Jörg Müller
prog-tutor-joerg@iicm.tugraz.at
Gruppe 6 – Christoph Hack
prog-tutor-hack@iicm.tugraz.at
Gruppe 8 – Anja Karl
prog-tutor-anja@iicm.tugraz.at
Gruppe 9 – Manuel Weber
prog-tutor-weber@iicm.tugraz.at
Tutoriumsinhalt
- Testreports
- HW2 Besprechung
- Funktionen
- Bitoperationen
- Bithacking
- HW3
What does the Palme say? - Die magischen Codes
- Was bedeuten die Codes wie
6a7
, 1,6c1,6
, 6d5
?
- Am Testsystem werden die Ausgabe eures Programms mit der korrekten Ausgabe verglichen (mit
diff
).
- Die Codes geben an, was an der Musterausgabe geändert werden müsste, um eure Ausgabe zu erhalten
- Es gibt dabei die Codes
a
(append), d
(delete) und c
(change)
CHANCE #1
description:
check whether output is correct
summary:
[FAILED] comparing "$STDOUT"
compares:
< REFERENCE
> USER CREATED
#0: 6d5
Beispiel
6a7
: Nach der 6. Zeile der Musterausgabe, müsste die folgende 7. Zeile angehängt werden (Zeile folgt). Das heißt, ihr gebt dieses Zeile zuviel aus
6d5
: Die 6. Zeile der Musterausgabe (Zeile folgt) müsste gelöscht werden. Das heißt, ihr gebt eine Zeile nicht aus, obwohl ihr solltet
2c2
: Die 2. Zeile der Musterausgabe stimmt nicht mit eurer 2. Zeile überein, daraufhin folgt die Zeile der Musterausgabe und eure Zeile
Was stimmt hier nicht?
=====================================================================================
TESTCASES
testcase #1 [FAILED]
there were 1 chance(s) to pass testcase
CHANCE #1
description:
check whether output is correct
summary:
[FAILED] return check - ref: 0 user: 255
compares:
< REFERENCE
> USER CREATED
-------------------------------------------------------------------------------------
=====================================================================================
Und hier?
=====================================================================================
TESTCASES
testcase #1 [FAILED]
there were 1 chance(s) to pass testcase
CHANCE #1
description:
check whether output is correct
summary:
[FAILED] comparing "$STDOUT"
compares:
< REFERENCE
> USER CREATED
#0: 6a7
#0: > 1915657434 * 8
-------------------------------------------------------------------------------------
=====================================================================================
Findet den Fehler...
OUTPUT
Archive: Term_6/Course_11/Assignment_58/Group_7642/Submission_1_hw1a.zip
inflating: Course_11/Assignment_58/Group_7642/14960/1381852533/hw1a/hw1a.c
Returnvalue was: 0 - should be 0
=====================================================================================
CHECK
check #1
Result:
[FAILED] File hw1a.c not found
=====================================================================================
COMPILE
executable #1
using file_set #1
return was: 1 - should be 0
OUTPUT
gcc44: hw1a.c: No such file or directory
gcc44: no input files
... noch mehr Fehler ...
summary:
[FAILED] comparing "$STDOUT"
compares:
< REFERENCE
> USER CREATED
#0: 1,7c1,7
#0: < xxxxxxx * 2
#0: < xxxxxxx * 3
#0: < xxxxxxx * 4
#0: < xxxxxxxx * 5
#0: < xxxxxxxxx * 6
#0: < xxxxxxxxx * 7
#0: < An overflow has occurred!
#0: ---
#0: > xxxxxxx * 2
#0: > xxxxxxx * 3
#0: > xxxxxxx * 4
#0: > xxxxxxxx * 5
#0: > xxxxxxxxx * 6
#0: > xxxxxxxxx * 7
#0: > An overflow has occured!
Auch hier gibt es einen Fehler!
summary:
[FAILED] comparing "$STDOUT"
compares:
< REFERENCE
> USER CREATED
#0: 1,6c1,6
#0: < xxxxxxx * 2
#0: < xxxxxxx * 3
#0: < xxxxxxx * 4
#0: < xxxxxxxx * 5
#0: < xxxxxxxxx * 6
#0: < xxxxxxxxx * 7
#0: ---
#0: > xxxxxxx * 2
#0: > xxxxxxx * 3
#0: > xxxxxxx * 4
#0: > xxxxxxxx * 5
#0: > xxxxxxxxx * 6
#0: > xxxxxxxxx * 7
HW2 Besprechung - Häufige Fehler
- Nur eine Schleife verwendet (Spezifikation: zwei Schleifen)
- Codingstandard (Tabulatoren, Zeile zu lang, Einrückungen, ...)
- Deutsche Variablennamen und deutsche Kommentare
- Schlechte Variablennamen (
i
, tmp
, ...)
- Falsche Overflow Behandlung
HW2 Besprechung - Häufige Fehler
- Falsche Overflow Behandlung:
if(number < 0) ...
if((number * counter) < number) ...
if(number > INT_MAX - number) ...
if(number > INT_MAX) ...
if(nubmer * counter >= INT_MAX) ...
- Richtige Overflow Behandlung:
HW2 Beispiele - Gut oder schlecht?
HW2 Beispiele - Gut oder schlecht?
HW2 Beispiele - Gut oder schlecht?
HW2 Beispiele - Gut oder schlecht?
Funktionen
<Rueckgabewert-Typ> Funktion-Name (<Parameter1>, <Parameter2>...)
{
// Code
return <Rueckgabewert>
}
int main()
{
// Aufruf:
<Rueckgabewert-Typ> Ergebnis;
Ergebnis = Funktion-Name(<Parameter1>, <Parameter2>...);
}
Rückgabewert der main
-Funktion anzeigen
> echo $?
0
HW2 mit Funktionen
Live Demo
Bitoperationen
- Verknüpfen Daten bitweise
- Erfordern zwei Operanden (Ausnahme: NOT)
- AND (
&
), OR (|
), XOR (^
)
- Left Shift (
<<
), Right Shift (>>
)
- NOT (
~
)
Bitoperationen
AND ... &
OR ... |
Bitoperationen
XOR ... ^
NOT ... ~
Bitoperationen
Shift Left ... <<
Verschiebt die Bits um n Stellen nach links
Beispiel: 9 ( = 0000 1001b) << 1 = 18 ( = 0001 0010b)
Shift Right ... >>
Verschiebt die Bits n Stellen nach rechts
Beispiel: 27 ( = 0001 1011b) >> 2 = 6 ( = 0000 0110b)
Bitoperation - Wozu?
- Setzen von einzelnen Bits
- Löschen von einzelnen Bits
- Extrahieren von Bits
- Potenzen von 2 schnell berechnen
- Extrahieren von Teilen eines Bytes
- Tauschen von Bytes
- Bitfelder
Bitmasken Beispiel
Bitfeld
#include <stdio.h>
int main()
{
unsigned char lampen_zustand = 0; // 8 Zustände (Lampen)
// Lampe 1 einschalten
lampen_zustand |= 1;
// Lampen 5-8 ausschalten
lampen_zustand &= 15;
// Lampe 5 umschalten
lampen_zustand ^= 16;
// Zustand ausgeben
int lampe;
for(lampe = 0; lampe < 8; lampe++)
{
printf("Lampe %d: %s\n", lampe + 1,
lampen_zustand & (1 << lampe) ? "ein" : "aus");
}
}
Bitmasken Beispiel: RGB
Bitmasken Beispiel: Byte-Reihenfolge
#include <stdio.h>
unsigned int swapByteOrder(unsigned int value)
{
value = ((value << 8) & 0xFF00FF00) |
((value >> 8) & 0xFF00FF);
return (value << 16) | (value >> 16);
}
int main()
{
unsigned int value = 0x12345678;
printf("value = %x\n", value);
printf("swapped value = %x\n", swapByteOrder(value));
return 0;
}
Bitmasken Beispiel: Hexadezimal Ausgabe
#include <stdio.h>
#define BITS_PER_NIBBLE 4
#define NIBBLE_MASK 0xF
int main()
{
int a_number = 17036401;
int index;
printf("bin = ");
for( index = 32; index > 0; index-- )
{
printf( "%d", (a_number & (1 << (index - 1))) ? 1 : 0 );
if( (index - 1) % BITS_PER_NIBBLE == 0 )
printf(" ");
}
// This should only demonstrate how to use bit operations.
// In practice use %x for hexadecimal output
printf("\nhex = ");
for( index = 32 / BITS_PER_NIBBLE; index > 0; index-- )
{
int nibble = (a_number >> ((index - 1) * BITS_PER_NIBBLE)) & NIBBLE_MASK;
printf( "%4c ", nibble < 10 ? nibble + '0' : nibble + 'A' - 10 );
}
return 0;
}
Bitmasken
Bithacking
if((value & (value - 1) == 0)
{
printf("Wann werde ich ausgeführt?");
}
a = a^b;
b = b^a;
a = a^b;
int log = 0;
while(value > 0)
{
value = value >> 1;
log++;
}
http://graphics.stanford.edu/~seander/bithacks.html
HW3
Abgabe
- bis Mittwoch, 23.10.
- Deadline 19:00
Viel Erfolg bei HW3