Informatik I - Übung 1

Pascal Schärli

pascscha@student.ethz.ch

22.02.2019

Was gibts heute?

Pascal Schärli 22.09.2019

Administratives

Pascal Schärli 22.09.2019

Vorlesung

Pascal Schärli 22.02.2019

Die Main-Funktion

Pascal Schärli 22.02.2019

int main(){

    // Insert program here

    return 0;
}
  • Jedes C++ Programm startet seine Ausführung mit der main-Funktion.
     
  • Analog zu einer Mathematischen Funktion
    • Argumente: Keine
    • Rückgabewert: Integer
       
  • Ein erfolgreiches Ausführen wird mit dem Rückgabewert 0 signalisiert.

Variabeln

Pascal Schärli 22.02.2019

int a = 5;
b = a + a;
c = b + 3;
  • Variabeln können sich im Laufe des Programms ändern.
  • Jede Variable hat ihren eigene Typ (int, float, char)
  • Jede Variable muss vor Gebrauch deklariert werden.
int a = 5;
int b = a + a;
int a = b + 3;
error: ‘b’ was not declared in this scope
int a = 5;
int b = a + a;
int c = b + 3;
error: error: redeclaration of ‘int a’

Input-/Output

Pascal Schärli 22.02.2019

#include <iostream>
 
int main() {
   int a;
   int b;
   std::cout << "Welcome to the multiplicator7000â„¢";
   std::cout << "Please enter your numbers: " << std::endl;
   std::cin >> a >> b;
   std::cout << a << " * " << b << " = " << a * b << std::endl;

   return 0;
}
  • Die Standard Bibliothek enthält Funktionen um Werte einzulesen und auszugeben.
     
  • Mehrere Werte können durch wiederholtes << bzw. >> eingelesen bzw. ausgegeben werden.
     
  • std::endl ist der Endline-Charakter und startet eine neue Zeile.

 

Kommentare/Layout

Pascal Schärli 22.02.2019

  • Kommentare erklären was ein Programm macht und wie es verwendet wird.
  • Kommentare werden vom Compiler ignoriert
  • Kommentare starten mit // und gehen bis zum Zeilenende
     
  • Einrückungen bestehen aus Tabs, Leerschlägen und Leerzeilen
  • Einrückungen sollten die Programmlogik widerspiegeln.

 

 

 

Hello World!

Pascal Schärli 22.02.2019

// Informatik 1 - Beispiel
// Programm: hello_world.cpp
// Autor: Pascal Schärli

#include <iostream>

int main(){

    // Display message    
    std::cout << "Hello World!";

    return 0;
}

Häufig verwendete Funktionen können aus der Standard Library importiert werden.

Ein C++ Programm startet seine Ausführung immer in der Main-Funktion

Kommentare starten mit // und werden beim Ausführen des Programms ignoriert.

Ausgabe des Texts

Rückgabewert 0 signalisiert, dass die Ausführung des Programms fehlerfrei war.

Integer Division/Modulo

Pascal Schärli 22.02.2019

 7 / 3 == ??
15 / 4 == ??
16 / 4 == ??
 7 % 3 == ??
15 % 4 == ??
16 % 4 == ??
 7 / 3 == 2
15 / 4 == 3
16 / 4 == 4
 7 % 3 == 1
15 % 4 == 3
16 % 4 == 0
(x / y) * y + x % y == x

(9 / 4) * 4 + 9 % 4 == 9

Asserts

Pascal Schärli 22.02.2019

#include <iostream>
#include <cassert>
 
int main() {
    int a;
    std::cout >> "Enter a number smaller than 10: ";    
    std::cin >> a;
    assert(a < 10);

   return 0;
}
  • Mit der Funktion assert aus <cassert> kann überprüft werden ob gewisse Voraussetzungen erfüllt sind.
  • Gibt Runtime Fehler wenn assertion nicht erfüllt ist

Letzten 3 Ziffern

#include <iostream>
#include <cassert>

int main() {
  
    int a;

    // input
    // TODO

    assert(a >= 1000);

    // computation
    // TODO





    // output
    // TODO

    return 0;
}
#include <iostream>
#include <cassert>

int main() {

    int a;
    
    // input
    std::cin >> a;

    assert(a >= 1000);
    
    // computation
    int digit0 = a % 10;
    int remainder0 = a / 10;
    int digit1 = remainder0 % 10;
    int remainder1 = remainder0 / 10;
    int digit2 = remainder1 % 10;
    
    // output
    std::cout << digit2 << " " << digit1 << " " << digit0 << std::endl;

    return 0;
}

Binäre Repräsentation

  • Wie muss man das Programm ändern um die letzten 3 Bits anzuzeigen?

 

  • -> 10 durch 2 ersetzen

 

  • 10 -> Dezimal
    2 -> Binär

Pascal Schärli 22.02.2019

#include <iostream>
#include <cassert>

int main() {
    int a;
    
    // input
    std::cin >> a;
    assert(a >=   1000);
    
    // computation
    int digit0 = a % 10;
    int remainder0 = a / 10;
    int digit1 = remainder0 % 10;
    int remainder1 = remainder0 / 10;
    int digit2 = remainder1 % 10;
    
    // output
    std::cout << digit2 << " " << digit1 << " " << digit0 << std::endl;
    return 0;
}
#include <iostream>
#include <cassert>

int main() {
    int a;
    
    // input
    std::cin >> a;
    assert(a >= 0b1000);
    
    // computation
    int digit0 = a % 2;
    int remainder0 = a / 2;
    int digit1 = remainder0 % 2;
    int remainder1 = remainder0 / 2;
    int digit2 = remainder1 % 2;
    
    // output
    std::cout << digit2 << " " << digit1 << " " << digit0 << std::endl;
    return 0;
}

Binäre Repräsentation

  • Wie kann man aus einer Dezimalzahl die Binäre Repräsentation bekommen?

 

  • Zahl durch 2 dividieren, der Rest entspricht der Binär Ziffer

Pascal Schärli 22.02.2019

61 = 2 * 30 + 1
30 = 2 * 15 + 0
15 = 2 *  7 + 1
 7 = 2 *  3 + 1
 3 = 2 *  1 + 1
 1 = 2 *  0 + 1

=> 111101

Suffixes

  • Integer

 

 

  • Unsigned integer

 

 

  • Float

 

Pascal Schärli 22.02.2019

17 -> int
17u -> unsigned int
17. -> float

Suffixes

Pascal Schärli 22.02.2019

std::cout << 2 / 7 << " " << 2. / 7 << " " << 2 / 7.;
0 0.285714 0.285714
std::cout << 2 - 7 << " " << 2u - 7 << " " << 2 - 7u;
-5 4294967291 4294967291

Expressions

  • Expressions werden auch Punkt vor Strich ausgewertet.

 

 

 

  • Auswertung von Links nach rechts ist jedoch nicht garantiert

Pascal Schärli 22.02.2019

   5u +  5 * 3u  
== 5u + (5 * 3u)
== 5u + 15u
== 20u
int a = 5;
std::cout << a << ++a;
Output: 56 oder 66

Expressions

Welche der folgenden Sequenzen sind C++ Expressions?

Pascal Schärli 22.02.2019

Expression Valid R oder L Value? Evaluation
1 * (2 * 3)
(a = 1)
(1
(a * 3) = (b * 5)

R

L

6

1

-

-

-

-

Vorbesprechung

Pascal Schärli 22.02.2019

Task 1: Expressions

Pascal Schärli 22.02.2019

a = b = 5
1 = a
a + a++
a + b = c + d
a = 2 b
  • Welche der Sequenzen sind  C++ Expressions?
  • Sind es lvalues oder rvalues?
  • Zu was evaluieren sich die Expressions?

Tipps:

  • Schaut euch die Slide "Expressions" nochmal an
  • Falls Ihr bei den R/L values unsicher seit, probiert es einfach aus

Task 2: Binärzahlen

Pascal Schärli 22.02.2019

    binary          decimal
1.  0b1           = ?
2.  0b10          = ?
3.  0b000001      = ?
4.  0b101010      = ?

5.  ?             = 7
6.  ?             = 11
7.  ?             = 28
8.  ?             = 1024

Tipps:

  • Falls ihr euch mit binärzahlen nicht so wohl fühlt schaut euch die Slides "Binäre Repräsentation" nochmals an. Ansonsten hilft das Digitech Skript

Task 3: Widerstand

Pascal Schärli 22.02.2019

Tipps:

  • Die Aufgabe verlangt, dass ihr Arithmetisch runde ohne dabei floats zu verwenden.
      x / 2 = abrunden(x/2)
(x + 1) / 2 =   runden(x/2)
      x / y = abrunden(x/y)
(x + ?) / y =   runden(x/y)

Program of the Week

Pascal Schärli 22.02.2019

VoltageDividor1000â„¢

#include <iostream>

int main(){

	std::cout << "Welcome, this is the VoltageDivider1000â„¢.\n"
			  << "This is our circuit: \n"
			  << "    ____         ____       \n"
			  << "---[____]-------[____]----  \n"
			  << "|    R1     |     R2     |  \n"
			  << "°           °            °  \n"
			  << "V0         Vr2          GND \n" << std::endl;







	// Insert Divider Here









	return 0;
}
#include <iostream>

int main(){

	std::cout << "Welcome, this is the VoltageDividor1000â„¢.\n"
			  << "This is our circuit: \n"
			  << "    ____         ____       \n"
			  << "---[____]-------[____]----  \n"
			  << "|    R1     |     R2     |  \n"
			  << "°           °            °  \n"
			  << "V0         Vr2          GND \n" << std::endl;


	int v, r1, r2;

	std::cout << "Please enter the value for V0 in Volt: ";
	std::cin >> v;
	
	std::cout << "Please enter the value for R1 in ohm: ";
	std::cin >> r1;

	std::cout << "Please enter the value for R2 in ohm: ";
	std::cin >> r2;

	int vr2 = v * r2/(r1 + r2);

	std::cout << "Vr2 = " << vr2 << " Volt" << std::endl;

	return 0;
}

Viel Spass!

Pascal Schärli 22.02.2019