Kleine C Aufgabe

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Kleine C Aufgabe

    Hallo Leute,

    ich gucke ab und zu mal in die Aufgaben meines Kollegen rein, der Informatik studiert und probiere selber bzw. löse die Aufgaben einfach für mich.

    Da ich aus der Praxis komme, in der Praxis bin und dort bleibe, sind manche Aufgaben sehr abstrakt. :)

    Das Ganze ist in C. Jetzt stehe ich gerade voll auf dem Schlauch.

    Es geht darum eine "Zahnradsimulation" in der Konsole zu realisieren. Also um zu prüfen ob sich das Konstrukt rotieren lässt.

    Folgendes ist gegeben:

    . = Leeres Feld
    * = Nicht bewegtes Zahnrad
    L = linksdrehendes Zahnrad

    Damit kann man dann zB folgende Matrix bilden:

    . . .
    . * .
    . L .
    . . .

    Die Ausgabe soll berechnet werden:

    F = Freies Zahnrad
    B = Blockiertes Zahnrad
    > = Rechtsdrehend
    < = Linkdrehend

    Also Ausgabe gibt es dann:

    . . .
    . > .
    . < .
    . . .


    Oder Eingabe:

    . . . .
    . * * .
    . L . .
    . . * .

    Ausgabe:

    . . . .
    . B B .
    . B . .
    . . F .


    Rein aus Interesse, löst man das jetzt durch Rekusion oder einfach durch interieren? (es ist ein 2dim char array gegeben)

    Früher hat mir sowas Spaß gemacht..

    Danke & Gruß
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Hi,

    das dachte ich mir auch. Aber im Prinzp sieht das "getriebefeld" so aus:

    [Blockierte Grafik: http://abload.de/img/bildschirmfoto2015-12lippu.png]

    Also ein parallelogramm. Somit greifen vom mitteleren (schwarzen) Zahnrad das direkt drüber, das schräg rechts drüber, die 2 daneben, das drunter und das schräg links nach unten.

    So entnehme ich es zumindest dem Bild.

    Ich hab immernoch keine gescheite Lösung dafür..
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Dann sollte sich auch das Zahnrad rechts unten bewegen blockiert sein. ;)

    Ich würde zunächst alle drehenden Zahnräder suchen. Für jedes Zahnrad besuchst du rekursiv seine Nachbarn und setzt die Drehrichtung. Wenn sich das Zahnrad bereits dreht, brichst du die Rekursion ab. Wenn es sich falsch herum dreht, blockierst du es und auch alle Zahnräder in der aktuellen Rekursion. Das machst du so mit allen gesuchten Zahnrädern.
    „Meine Komplikation hatte eine Komplikation.“

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von macmoonshine ()

  • macmoonshine schrieb:

    Dann sollte sich das Zahnrad rechts unten bewegen. ;)

    Ich würde zunächst alle drehenden Zahnräder suchen. Für jedes Zahnrad besuchst du rekursiv seine Nachbarn und setzt die Drehrichtung. Wenn sich das Zahnrad bereits dreht, brichst du die Rekursion ab. Wenn es sich falsch herum dreht, blockierst du es und auch alle Zahnräder in der aktuellen Rekursion. Das machst du so mit allen gesuchten Zahnrädern.
    *gelöschtweilnochzufrueh*
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ich gebs einfach auf.
    Schien erst so simpel. Wer sich versuchen will, hier mein Code für die Eingabe.

    "feld" -> das eingegebene Getriebefeld
    "buildMap" -> soll nachher das "berechnete" Feld behinhalten.

    in "generateBuild" hätte ich nun die Logik gemacht.

    C-Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define ROW 1000
    4. #define COL 1000
    5. char feld[ROW][COL];
    6. char buildMap[ROW][COL];
    7. int width, height;
    8. int main()
    9. {
    10. initFeld();
    11. scanf("%d %d", &height, &width);
    12. printf("%dx%d Feld\n", height, width);
    13. int currentIndexH = 0;
    14. while(currentIndexH < height)
    15. {
    16. char zeile[width];
    17. scanf("%s", zeile);
    18. for(int i = 0; i < width; i++)
    19. {
    20. feld[currentIndexH][i] = zeile[i];
    21. }
    22. currentIndexH++;
    23. }
    24. generateBuild();
    25. return 0;
    26. }
    27. void generateBuild()
    28. {
    29. for(int i = 0; i < height; i++)
    30. {
    31. for(int j = 0; j < width; j++)
    32. {
    33. printf("%c", buildMap[i][j]);
    34. }
    35. printf("\n");
    36. }
    37. }
    38. void initFeld()
    39. {
    40. for(int i = 0; i < ROW; i++)
    41. {
    42. for(int j = 0; j < COL; j++)
    43. {
    44. feld[i][j] = ' ';
    45. }
    46. }
    47. }
    Alles anzeigen
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Rein aus Interesse:

    Fortrackz schrieb:

    Oder Eingabe:
    . . . .
    . * * .
    . L . .
    . . * .

    Ausgabe:
    . . . .
    . B B .
    . B . .
    . . F .
    Ich persönlich verstehe diese Ausgabe nicht.
    Gemäß meinem geringfügigen Physikverständnisses (mit Gravitation habe ich mehr persönliche Erfahrung als mit Reibung ^^) kann es eigentlich nur zwei Möglichkeiten geben:
    Entweder die Zahnräder drehen auch diagonal, dann wäre das Zahnrad (2,0) ebenfalls blockiert.
    Oder die Zahnräder drehen nur horizontal und vertikal, dann wäre die Ausgabe nach meinem Verständnis eher:
    ....
    .><.
    .<..
    ..F.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P