Advertisement
madegoff

07ex

Jan 8th, 2024
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.07 KB | None | 0 0
  1. /*
  2. Zur Abgabe einen branch `iprg-b07` erstellen und pushen, in dem als einzige Datei die `07ex.c` liegt.
  3. */
  4.  
  5. /*
  6. Um die Tests für dieses Blatt zu kompilieren und zu starten, führen Sie den folgenden Befehl aus:
  7. cc -std=c11 -g -Wall -Werror 07ex_test.c -o 07ex_test.o -lm && ./07ex_test.o
  8.  
  9. Wir empfehlen, mit möglichst streng eingestelltem valgrind zu testen, denn so testen wir auch auf dem Server:
  10. cc -std=c11 -g -Wall -Werror 07ex_test.c -o 07ex_test.o -lm && valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./07ex_test.o
  11. */
  12.  
  13. #include "sphinx.h"
  14. #include <stdio.h>
  15. #include <stdbool.h>
  16. #include <stdlib.h>
  17.  
  18. int answers = 0;
  19. /*
  20. Aufgabe 1:
  21.  
  22. Da spaziert man entspannt durch Theben, und plötzlich kommt eine Sphinx angeflogen
  23. und spricht: "Ich habe mir ein Array mit n absteigend sortierten Zahlen überlegt (Zahlen
  24. können mehrfach vorkommen). Du darfst mich nach dem Wert an 1 + log2(n) (aufgerundet) vielen
  25. Positionen fragen. Und wenn du mir danach nicht sagen kannst, ob das Array die Zahl 12345
  26. enthält, dann fresse ich dich.".
  27.  
  28. Geben Sie zurück, ob das Array der Sphinx die Zahl 12345 enthält. Um den Wert an Position `i`
  29. zu erfragen, rufen Sie `sphinx_ask(s, i)` auf. Aber Achtung: Wenn Sie diese Funktion mehr als
  30. 1 + log2(n) (aufgerundet) mal aufrufen, stürzt das Programm fehlerhaft ab.
  31. */
  32.  
  33. int logarithmus(int a){
  34. int res = 0;
  35. if(a == 1) return 0;
  36.  
  37. while(a){
  38. a/=2;
  39. res++;
  40. }
  41. return res;
  42. }
  43.  
  44.  
  45. bool descending_sphinx(Sphinx *s, size_t n){
  46.  
  47. if(n==0) return false;
  48. else if(n==1){
  49. if(sphinx_ask(s,0) != 12345) return false;
  50. else return true;
  51. }
  52. else{
  53. int left = 0;
  54. int right = n-1;
  55.  
  56. //printf("left = %d, right = %d\n", left, right);
  57. int pos = (left+right)/2; //der erste index nach dem wir fragen
  58. //printf("mitte = %d\n", pos);
  59.  
  60. while(pos >= left && pos <= right){
  61.  
  62. int num = sphinx_ask(s,pos);
  63. answers++;
  64. //if(answers > logarithmus(n)+1) break;
  65. if(num == 12345) return true;
  66. else if(num < 12345){ //die zahl ist kleiner als 12345 -> schauen im lonken teilarray
  67. //printf("die zahl ist kleiner als 12345 -> schauen im linken teilarray\n");
  68. right = pos - 1; //verschieben die rechte grenze, linke bleibt gleich
  69. //printf("left = %d, right = %d\n",left, right);
  70. }
  71. else if(num > 12345){
  72. //printf("die zahl ist groesser als 12345 -> schauen im linken teilarray\n");
  73. left = pos + 1; //verschieben die linke grenze, rechte bleibt gleich
  74. //printf("left = %d, right = %d\n",left, right);
  75. }
  76.  
  77. //betrachteten index nochmal berechnen, da sich die grenzen geaendert haben
  78. pos = (left+right)/2;
  79. //printf("new position = %d\n", pos);
  80. }
  81. //wenn immer noch nichts gefunden / array grenzen ueberschritten oder anzahl der schritten ueberschritten -> return false
  82. }
  83.  
  84. return false;
  85.  
  86. }
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement