mirror of
https://gitlab.gwdg.de/j.hahn02/university.git
synced 2026-01-01 14:54:25 -05:00
cleanup
This commit is contained in:
107
S1/GdCP/klausur_c_1/binary_find.c
Normal file
107
S1/GdCP/klausur_c_1/binary_find.c
Normal file
@@ -0,0 +1,107 @@
|
||||
#include<stdlib.h>
|
||||
#include<stdio.h>
|
||||
#include<time.h>
|
||||
|
||||
int suche(int **pos, int *s, int *e, int x) {
|
||||
// Binary search wobei e IMMER hinter das letzte element zeigen muss!
|
||||
|
||||
if (s == NULL || e == NULL || s > e) {
|
||||
*pos = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (s < e) {
|
||||
int l = e - s;
|
||||
int m = l / 2;
|
||||
|
||||
if (s[m] == x) {
|
||||
*pos = s + m;
|
||||
return 1;
|
||||
}
|
||||
else if (s[m] > x) {
|
||||
e = s + m;
|
||||
}
|
||||
else {
|
||||
s = s + m + 1;
|
||||
}
|
||||
}
|
||||
|
||||
*pos = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Main loop for the problem
|
||||
int main(int argc, char *argv[]) {
|
||||
srand(time(NULL));
|
||||
// Check for the right amount of args
|
||||
if (argc != 3) {
|
||||
printf("wrong amount of arguments!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Get the parameters
|
||||
int n = atoi(argv[1]);
|
||||
int k = atoi(argv[2]);
|
||||
|
||||
// Checken ob das n Arguemnt richtig gegeben wurde
|
||||
if (n < 1) {
|
||||
printf("n ist zu klein gewaehlt oder konnte nicht gelesen werden!\n");
|
||||
|
||||
// Hier wird die suche mit Null pointern gestartet
|
||||
int buf = suche(0, 0, 0, 0);
|
||||
printf("Ergebnis der Suche: %d.\n", buf);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
// Generate random ascending field of length n
|
||||
int *m = malloc(sizeof(int) * n);
|
||||
if (!m) {
|
||||
printf("it was not possible to allocate memory!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Erzeugen eins aufsteigenden Feldes
|
||||
m[0] = rand()%n+1;
|
||||
for(int i = 1; i < n; i++) {
|
||||
m[i] = m[i-1] + rand()%(n*2)+1;
|
||||
|
||||
// Es soll nach moeglichen Ueberlaufen geprueft werden
|
||||
// Wie kann man das anders machen als zu pruefen ob die zahl kleiner ist?
|
||||
if (m[i] < m[i-1]) {
|
||||
printf("es gab ein Problem!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Print the field
|
||||
for(int i = 0; i < n - 1; i++) {
|
||||
printf("%d ", m[i]);
|
||||
}
|
||||
printf("%d\n", m[n-1]);
|
||||
|
||||
|
||||
int *pos;
|
||||
int buf;
|
||||
if (k >= 0 && k < n) {
|
||||
// k ist ein valider Index vom Feld
|
||||
printf("%d", m[k]);
|
||||
buf = suche(&pos, m, m+n, m[k]);
|
||||
} else {
|
||||
buf = suche(&pos, m, m+n, k);
|
||||
}
|
||||
|
||||
printf("Das Ergebnis der Suche ist %d.\n"
|
||||
"Der Zeiger hat die relative position (Nur relevant wenn suche 1) %d.\n"
|
||||
"Der Zeiger hat die absolute Postion (Nur relevant wenn suche 0) %d.\n", buf, pos - m, pos);
|
||||
|
||||
|
||||
// Noch zu tun ist das aufrufen von der find methode in den verschiedenen aesten.
|
||||
// und das jeweilige zurueckgeben ob der Wert gefunden wurde und der pointer.
|
||||
|
||||
free(m);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user