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

What does the Palme say? - Die magischen Codes

CHANCE #1 description: check whether output is correct summary: [FAILED] comparing "$STDOUT" compares: < REFERENCE > USER CREATED #0: 6d5

Beispiel

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

HW2 Besprechung - Häufige Fehler

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

Bitoperationen

AND ... &

&10
110
000

OR ... |

|10
111
010

Bitoperationen

XOR ... ^

^10
101
010

NOT ... ~

10
~01

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?

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

Viel Erfolg bei HW3