Multimedia Information Processing Group

Serie1.pdf

Serie1.pdf PDF document, 214 KB

hausaufgabe2.c

hausaufgabe2.c C source code, 2 KB

File contents

#include <stdio.h>
void printBinary(int zahl, int stellen)
{
    // Aufgabe a)
    if (stellen<=0 || stellen>sizeof(int)*8)  // Kommentar
    {
        stellen=sizeof(int)*8;                // Kommentar
    }
    for (int i=stellen-1; i>=0; i--)          // Kommentar
    {
        int b;                                // Kommentar
        b = zahl >> i;                        // Kommentar
        b = b & 0x00000001;                   // Kommentar
        printf("%X",b);                       // Kommentar
        if ((i%8) == 0) printf(" ");          // Kommentar
    }
}

int main()
{
    // Interpretation IEEE Floatformat
    unsigned int vorzeichen, mantisse, exponent ; //Natuerliche Zahlen Vorzeichen, Exponent, Mantisse. Nutzen Sie diese Variablen zur Speicherung der Komponenten der IEEE-Zahl
    char expUnbiased; // Fuer den Exponenten ohne Bias
    float eingabe; // zu interpretierende Zahl

    union {  // dient zur Adressierung der Bitfolge der floatzahl ieee.f mittels der Integerzahl ieee.i
        float f;
        unsigned int i;
    } ieee;

    printf("Gib die zu analysierende Zahl ein: ");
    scanf("%f",&eingabe); // lies die Zahl ein

    // Wert von ieee mittels Floating Point-Repraesentation ieee.f auf eingabe setzen
    ieee.f = eingabe; 

    // Geben Sie hier Ihr Codefragment fuer Aufgabe b) ein
    // Beachten Sie: Bitweise logische Operationen und Shifts sind nur fuer die
    // Integer-Repraesentation ieee.i definiert

    // Ausgabe der Zerlegung, nutzen Sie diesen Code fuer die Ausgabe:
    printf("Float %f als Hex %X ist zerlegt in\nVorzeichen %d \nMantisse %X, \nExponent %d, \nExpUnbiased %d\n", ieee.f, ieee.i, vorzeichen, mantisse, exponent, expUnbiased);

    printf("\nVorzeichen ist \t");
    printBinary(vorzeichen,1);

    printf("\nMantisse binaer ist \t");
    printBinary(mantisse,23);

    printf("\nExponent binaer ist \t");
    printBinary(exponent,8);

    printf("\nExpUnbiased binaer ist \t");
    printBinary(expUnbiased,8);

    // Pruefe die Sonderfaelle

    // Fuegen Sie Ihren Code fuer Aufgabe c) ein (die vier Sonderfaelle)

    // Fuer den Standardfall (normalisiert), bauen Sie die IEEE-Zahl wieder zusammen,
    // so dass sie ueber ieee.f ausgegeben werden kann:

    // Fuegen Sie Ihren Code fuer Aufgabe d) hier ein. Geben Sie die Zahl mit
    printf("Zahl ist: %f\n", ieee.f);
    //   aus.

    return 0;
}

präsenzaufgabe2_loesung.c

präsenzaufgabe2_loesung.c C source code, 2 KB

File contents

#include <stdio.h>

int main()
{
  /* Gib die Anzahl der signifikanten Stellen des Betrags einer ganzen Zahl aus
     eingabe: zu analysierende Zahl, betrag: positiver Wert von eingabe,
     stellen: Anzahl der signifikanten Stellen von betrag als Ausgabe, 
     maxStellen: maximal moegliche Stellenanzahl von betrag als Integerzahl */

  int eingabe, betrag, stellen, maxStellen;
  printf("Gib ganze Zahl ein: ");
  scanf("%d",&eingabe);

  maxStellen= sizeof(int) << 3; // Berechne Bitanzahl durch Byteanzahl * 8

  if (eingabe==0)
  {
    printf("Sonderfall eingabe=0, keine Auswertung\n");
    return 0;
  }

  // Jetzt Studentencode Aufgabe a)
  int bit;

  // Test auf Vorzeichen in MSB

  maxStellen--; // Beginne Zaehlung maxStellen-1 bis 0

  bit = eingabe & 1 << maxStellen;  // Selektiere bit MSB

  if (bit==0)
  {
    betrag=eingabe;  // Eingabe war schon positiv, betrag=eingabe
    printf("Zahl ist positiv!\n");
    printf("MSB: %x\n",bit);
  }
  else
  {
    bit=1;  // wenn eine 1 in MSB, dann ist Eingabe negativ
    printf("Zahl ist negativ!\n");
    printf("MSB: %x\n",bit);

    // Konvertiere negative Zahl in Betrag mit 2-Komplement
    printf("Zahl = %d,  %x\n", eingabe ,eingabe);
    betrag = ~eingabe;  // 1-Komplement
    printf("1-Komplement= %d, 0X%X\n", betrag, betrag);

    betrag++;
    printf("Betrag (2-Komplement)= %d, 0X%X\n", betrag, betrag);
  }

  // Code Aufgabe a) zu Ende

  // Studentencode Aufgabe b)
  // Berechne signifikante Stellen ueber das Auffinden des höchstwertigen "1"-Bits
  // Hierzu maskiere einzelne Bits absteigend, bis eines ungleich 0 ist

  stellen = maxStellen; // starte bei MSB-Stelle, die ist sicher 0
  bit = 0;

  while (bit==0)
  {
    stellen--; // naechste Stelle testen
    bit = betrag & 1 << stellen; // wenn bit !=0, echtes MSB gefunden, sonst weiter
  }

  stellen++; // Anahl der sig. Stellen festlegen

  // Code Aufgabe b) zuende

  printf("Zahl hat %d signifikante Stellen\n",stellen);
  return 0;
} 

praesenzaufgabe4.c

praesenzaufgabe4.c C source code, 1 KB

File contents

#include<stdio.h>
int main()
{
  int imax = 4;
  int kmax = 3;
  for (int i=0;i<imax;i++) {
    for (int k=0;k<kmax;k++) {
      int value = i*kmax+k;
      if (value > 0) printf(" ");
      printf("%d", value);
    }
  }
}

hausaufgabe3.c

hausaufgabe3.c C source code, 1 KB

File contents

#include <stdio.h>

int func(int x2, int x1, int x0)
{
  // Aufgabe 3a)
  // Berechnen Sie das Ergenis der Booleschen Funktion und
  // geben den resultierenden Wert zurück
}

int main()
{
  // Aufgabe 3b)
  // Geben Sie hier den Tabellenkopf aus
 
  // Nutzen Sie verschachtelte for-Schleifen, um
  // alle moeglichen Eingabekombinationen zu durchlaufen

  // Geben Sie in der inneren Schleife die jeweiligen
  // Tabellenzeilen aus

  // Aufgabe 3c)
  // Erweitern Sie die Tabelle um die Spalte "Mintermfunktion"
  // wie in der Beispielausgabe gezeigt
  return 0;
}

hausaufgabe3_loesung.c

hausaufgabe3_loesung.c C source code, 1 KB

File contents

#include <stdio.h>

int func(int x2, int x1, int x0)
{
  return (!x2 && x0 || x2 && x1 || !x2 && !x0) && (x0 || x1) && (!x2 && x1 || x2 && !x1);
}

void printVariable(int val, char *name)
{
  // Gib abhängig vom Wert der Variable ein Leerzeichen oder ein Ausrufezeichen aus,
  // damit die Variablen untereinander stehen
  if(val)
  {
    printf(" ");
  }
  else
  {
    printf("!");
  }
  printf("%s", name);
}

int main()
{
  // Gib den Tabellenkopf aus
  printf("x2 x1 x0 | f | Mintermfunktion\n");
  printf("------------------------------\n");
  // Schleife über alle Eingabevariablen,
  // damit jede Kombination getestet wird
  for(int x2 = 0; x2 < 2; x2++)
  {
    for(int x1 = 0; x1 < 2; x1++)
    {
      for(int x0 = 0; x0 < 2; x0++)
      {
        // berechne den Wert der Funktion
        int result = func(x2, x1, x0);
        // gib die Eingabevariablen und das Ergebnis aus
        printf(" %d  %d  %d | %d | ", x2, x1, x0, result);
        // wenn das Ergebnis wahr ist, gibt den Minterm aus
        if(result)
        {
          printVariable(x2, "x2");
          printVariable(x1, "x1");
          printVariable(x0, "x0");
        }
        printf("\n");
      }
    }
  }
  return 0;
}

praesenzaufgabe4 Lsg Serie5.c

praesenzaufgabe4 Lsg Serie5.c C source code, 1 KB

File contents

#include<stdio.h>
int main()
{
  // initialisiere Parameter imax und kmax
  int imax = 4;
  int kmax = 3;
  // nutze zwei verschachtelte for-Schleifen fuer die Berechnung des
  // auszugebenden Werts
  for (int i=0;i<imax;i++) {
    for (int k=0;k<kmax;k++) {
      // Berechne auszugebenden Wert
      int value = i*kmax+k;
      // Gib Element und Leerzeichen aus
      if (value > 0) printf(" ");
      printf("%d", value);
    }
  }
}

praesenzaufgabe3 Lsg Serie5.c

praesenzaufgabe3 Lsg Serie5.c C source code, 1 KB

File contents

int func(int x2, int x1, int x0)
{
// Direkte Uebersetzung der Booleschen Funktion
// Es sind keine weiteren Klammern notwendig , da die
// jeweilige Bindungsstaerke der Operatoren in C uebereinstimmt
  return(!x1 && x0 || x1 && ! x0 || x2 && x1 ) && ( x2 || !x0);
}