2022-06-09
Max. 32 points
Name:
Task | Max. | Achieved |
---|---|---|
1 | 4 | |
2 | 12 | |
3 | 9 | |
4 | 7 | |
Sum | 32 |
Statement | True | False |
---|---|---|
Der mit malloc(.) reservierte Speicher
muss manuell mittels Aufruf von free(.) freigegeben
werden. | ||
Dynamische Speicherverwaltung in C is notwendig, um den gesamten vorhandenen Hauptspeicher nutzen zu können. | ||
Speicher für einen Array kann mit
malloc(.) nicht reserviert werden. | ||
Dynamisch wachsende Arrays stehen in C auch ohne dynamische Speicherverwaltung zur Verfügung. | ||
Der Rückgabewert von malloc(.) ist
void* . | ||
In C kann der gleiche Funktionsname mehrfach mit unterschiedlichen Parametern definiert werden. | ||
Die C++ Standard Template Library (STL) stellt
mitunter Container Datentypen wie string und
vector zur Verfügung. | ||
C++ Templates erlauben es, eine Funktion nur einmal zu definieren und sie dennoch mit unterschiedlichen Datentypen der Parameter zu verwenden. |
int main(.)
ausgeführt und
alle notwendigen #include
s sind vorhanden.
Wenn das Snippet nicht kompilierbar ist oder zu einem Absturz führen würde,
so ist das Wort “ERROR” als Antwort zu geben.
Erzeugt das Snippet keinen Output (wenn beispielsweise kein
printf
oder dergleichen aufgerufen wird), so ist "-" als
richtige Antwort zu verwenden.
std::vector<std::string> names = {"Pat", "Chris", "Sue", "Steve"};
for (const auto& name : names) {
std::cout << name << " ";
}
std::vector<int> values = {1, 2, 3};
for (auto it = values.rbegin(); it != values.rend(); it++) {
std::cout << *it << std::endl; // dereference the iterator
}
int array[] = {1, 2, 3, 4};
int* array_ptr = array;
int count = sizeof(array) / sizeof(int);
int value = 0;
while (count--) {
value += *array_ptr++;
}
printf("%d\n", value);
char str[] = "students";
char* haystack = str;
char needle = 's';
int occ = 0;
while (*haystack) {
if (*haystack == needle) { occ++; }
haystack++;
}
printf("%d\n", occ);
typedef struct treenode TreeNode;
struct treenode {int value; TreeNode *left; TreeNode *right;};
TreeNode *node = (TreeNode*) malloc(sizeof(TreeNode));
node->value = 123; node->left=NULL; node->right=NULL;
printf("%d\n", node->value);
std::vector<int> values = {1, 2, 3};
values.push_back(4);
for (const auto& value: values) {
std::cout << value << ' ';
}
struct
struct intarray {
size_t reserved; // available storage
size_t elements; // current number of elements
int* array;
};
Erstelle einen Typen IntArray
, mit dem Instanzen von
struct intarray
erstellt werden können.
Implementiere die Funktion
IntArray* ia_create()
, welche einen neuen
IntArray
zurück gibt, dessen array
Platz für
100 Elemente hat. Setze den Wert von reserved
auf 100 und
den Wert von elements
auf 0.size_t ia_count(IntArray* ia, int elem)
, welche zurück gibt,
wie oft elem
in ia->array
enthalten ist.
IntArray
array
reserved
und
elements
typedef struct intarray IntArray;
IntArray* ia_create() {
IntArray* ia = (IntArray*) malloc(sizeof(IntArray));
ia->reserved = 100;
ia->elements = 0;
ia->array = (int*) malloc(ia->reserved * sizeof(int));
return ia;
}
size_t ia_count(IntArray* ia, int elem) {
size_t count = 0;
for (size_t i = 0; i < ia->elements; ++i) {
if (ia->array[i] == elem) count++;
}
return count;
}
std::pair<double, double> quadratic(double a, double b, double c)
welche die quadratische Gleichung mit den Koeffizienten a, b und c löst und
die beiden Nullstellen std::pair
zurückgibt.
Wer std::pair
lieber nicht verwenden möchte, kann auch einen
eigenen struct
für diesen Zweck implementieren, um beide
Werte zurückgeben zu können. In diesem Fall muss natürlich die
Signatur der Funktion quadratic
angepasst werden.sqrt
verwendet werden. Auf komplexe Zahlen braucht
keine Rücksicht genommen zu werden.
std::pair
oder
Deklaration und Verwendung des Structs inkl. anpassen der Signaturstd::pair<double, double> quadratic(double a, double b, double c) {
double root(sqrt(b * b - 4 * a * c));
double x1((-b + root) / (2 * a));
double x2((-b - root) / (2 * a));
std::pair<double, double> result(x1, x2);
return result;
}