koordinatenlinie darstellen (rekursion)



  • hallo,
    ich habe folgende übungsaufgabe bekommen:

    http://s.gullipics.com/image/y/5/r/3a6rlt-jmlczd-jek2/img.jpeg

    punkt 1 und 2 habe ich hinbekommen. (wobei ich mir bei punkt zwei nicht mehr ganz sicher bin)

    bei punkt 3 wollte ich ein zweidimensionales array machen, welches so groß ist wie der zweite koordinaten punkt. dann fülle ich das array mit '.' und trage die werte von punkt 2 mit 'x' in das array ein.
    am ende müsste ich dann ungefähr eine linie haben.

    1 Frage:
    wie kann ich eine array größe abhängig von einem eingegebenen wert festlegen? funktioniert ja mit variablen nicht (im beispiel habe ich deshalb eine fixe größe zum probieren angegeben).

    2 Frage: Warum werden mir nicht alle 'x' werte eingetragen? was stimmt da nicht?

    code version 1: (dachte ich sei fertig, bis auf die variable array größe - dann bin ich drauf gekommen, dass nicht alle 'x' werte eingetragen werden)

    #include<stdlib.h>
    #include<stdio.h>
    
    void vergleich(int x1, int y1, int x2, int y2);
    void rasta(int x1, int y1, int x2, int y2);
    
    #define XACHSE 10
    #define YACHSE 10
    
    char koord[XACHSE][YACHSE]; // definiert das array für die grafik
    
    void vergleich(int x1, int y1, int x2, int y2)
    {
    	int mx=0, my=0;
    	koord[x1][y1] = 'x';
    	koord[x2][y2] = 'x';
    
    	koord[mx][my] = 'x';
    	//abs gib den wert ohne vorzeichen zurück
    	if(abs(x1-x2) <= 1 && abs(y1-y2) <= 1)
    	{
    		// puts("Punkt A und B sind benachbart\n");
    		printf("Punkt A: %d, %d\n", x1, y1);
    		koord[x1][y1] = 'x';
    		printf("Punkt B: %d, %d\n", x2, y2);
    		koord[x2][y2] = 'x';
    	}
    
    	else
    	{
    		mx=(x2+x1)/2;
    		my=(y2+y1)/2;
    
    		vergleich(mx, my, x2, y2);
    		vergleich(x1, y1, mx, my);
    	}
    }
    
    void rasta(int x1, int y1, int x2, int y2)
    {
    	int count1=0, count2=0, hoehe, breite;
    
    	// es wird geschaut welcher punkt größer
    	// danach wird die array größe bestimmt
    	if(x2 > x1)
    	{
    		puts("X2 ist groesser!");
    
    		for(hoehe=0; hoehe<YACHSE; hoehe++)
    		{
    			for(breite=0; breite<XACHSE; breite++)
    			{
    				koord[count1][count2]='.';
    				count2++;
    			}
    			count1++;
    		}
    	}
    	else
    	{
    		puts("X1 ist groesser!");
    	}
    
    }
    
    int main()
    {
    	int x1=0, y1=0, x2=0, y2=0, count1=0, count2=0, hoehe=0, breite=0;
    
    	puts("Koordinaten Punkt A");
    	scanf("%d %d", &x1, &y1);
    	fflush(stdin);
    
    	puts("\nKoordinaten Punkt B");
    	scanf("%d %d", &x2, &y2);
    	fflush(stdin);
    
    		printf("\n");
    
    	rasta(x1, y1, x2, y2);
    
    		printf("\n");
    		printf("\n");
    
    	vergleich(x1, y1, x2, y2);
    
    		printf("\n");
    		printf("\n");
    
    	// array ausgabe:
    	for(hoehe=0; hoehe<YACHSE; hoehe++)
    		{
    			for(breite=0; breite<XACHSE; breite++)
    			{
    				printf("%c ", koord[count1][count2]);
    				count2++;
    			}
    			printf("\n");
    			count1++;
    		}
    
    		printf("\n");
    }
    

    code version 2: habe nochmal neu angefangen und wollte das problem mit den nicht eingetragenen 'x'en lösen - leider funktioniert das hier auch nicht.

    #include<stdlib.h>
    #include<stdio.h>
    
    // ---<Define & Global>---
    #define XACHSE 10 //größe vom array
    #define YACHSE 10 //größe vom array
    char koord[XACHSE][YACHSE]; // definiert das array für das rasta
    
    // ---<Funktionsdeklaration>---
    void rasta();
    void vergleich();
    void ausgabe();
    
    // ---<Funktionsdeffinition>---
    void rasta(int x1, int y1, int x2, int y2)
    {
    	int hoehe=0, breite=0, count1=0, count2=0;
    
    	for(hoehe=0; hoehe<YACHSE; hoehe++)
    		{
    			for(breite=0; breite<XACHSE; breite++)
    			{
    				koord[count1][count2]='.';
    				count2++;
    			}
    			count1++;
    		}
    
    }
    
    void vergleich(int x1, int y1, int x2, int y2)
    {
    	koord[x1-1][y1-1] = 'x'; //minus 1 damit es im erray auf der richtigen position ist
    	koord[x2-1][y2-1] = 'x';
    }
    
    void ausgabe(int x1, int y1, int x2, int y2)
    {
    	int hoehe=0, breite=0, count1=0, count2=0;
    
    	for(hoehe=0; hoehe<YACHSE; hoehe++)
    		{
    			for(breite=0; breite<XACHSE; breite++)
    			{
    				printf("%c ", koord[count1][count2]);
    				count2++;
    			}
    			printf("\n");
    			count1++;
    		}
    
    }
    
    // ---<Main>---
    int main()
    {
    	int x1=0, y1=0, x2=0, y2=0;
    
    	puts("Koordinaten Punkt A");
    	scanf("%d %d", &x1, &y1);
    	fflush(stdin);
    
    	puts("\nKoordinaten Punkt B");
    	scanf("%d %d", &x2, &y2);
    	fflush(stdin);
    
    	rasta(x1, y1, x2, y2);
    	vergleich(x1, y1, x2, y2);
    	ausgabe(x1, y1, x2, y2);
    }
    

    vielleicht kann mir jemand helfen.

    peace out



  • Überlege nochmal ob du count1 und count2 in rasta() und ausgabe() brauchst.

    Zudem ist da keine Rekursion zu finden.



  • zu 1: Zur Not mußt du den Speicher dynamisch anfordern (per malloc()/free())

    zu 2: An welcher Stelle berechnest du eigentlich die Zwischenpunkte der Verbindungslinie?

    PS: Es gibt afaik bessere Algorithmen zum Zeichnen von Linien 😉



  • Ein klassisches Array hat immer eine feste Größe und muss demzufolge bei der Definition bekannt sein, d.h. konstant sein.
    (neumodische, fehlerbehandlungsuntaugliche, nicht ANSI C konforme VLA mal ausgenommen)
    Wenn du was dynamisch machen willst, musst du Zeiger verwenden und die dann zur einfacheren Handhabung ähnlich einem Array zugreifbar machen. Dann sind diese Zeiger aber immer noch Zeiger (auch wenn auf sie wie auf Arrays zugegriffen wird) und KEINE Arrays. Zeiger und Arrays sind nicht dasgleiche (bis auf genau eine Ausnahme, wo ein deklariertes Array vom Compiler implizit in einen Zeiger gewandelt wird) obwohl sich in Anfänger- und Professorenkreisen hartnäckig diese Weisheit hält.
    Hier mal ein Beispiel für o.g. Zeiger, auf den wie auf ein Array zugegriffen werden kann:

    char **koord;
    
    int main()
    {
      int i,j;
      int x=47;
      int y=11;
      koord = calloc(x,sizeof*koord);
      for(i=0;i<x;++i)
      {
        koord[i]=calloc(1,y);
      }
      for(i=0;i<x;++i)for(j=0;j<y-1;++j)
      {
        koord[i][j]='0'+j; /* hier der Quasi-Array-Zugriff auf den Zeiger */
      }
      for(i=0;i<x;++i)
      {
        puts(koord[i]);
        free(koord[i]);
      }
      free(koord);
    
      return 0;
    }
    

    Und wie man einen mehrdimensionalen Zeiger an eine Funktion übergibt und innerhalb dieser dann auch wie auf ein Array zugreift, zeige ich das nächste Mal (evtl. findet sich bis dahin ja auch jemand anderes).



  • #include<stdlib.h>
    #include<stdio.h>
    
    // ---<Define & Global>---
    #define XACHSE 10 //größe vom array
    #define YACHSE 10 //größe vom array
    char koord[XACHSE][YACHSE]; // definiert das array für das rasta
    
    // ---<Funktionsdeklaration>---
    void rasta();
    void vergleich();
    void ausgabe();
    
    // ---<Funktionsdeffinition>---
    void rasta(int x1, int y1, int x2, int y2)
    {
    	int hoehe=0, breite=0, count1=0, count2=0;
    
    	for(hoehe=0; hoehe<YACHSE; hoehe++)
    		{
    			for(breite=0; breite<XACHSE; breite++)
    			{
    				koord[hoehe][breite]='.';
    			}
    		}
    }
    
    void vergleich(int x1, int y1, int x2, int y2)
    {
    	int mx=0, my=0;
    
    	if(abs (x1-x2) <= 1 && abs (y1-y2) <= 1)
    	{
    		// Bildschirm Ausgabe
    		printf("Punkt A: %d, %d\n", x1, y1);
    		printf("Punkt B: %d, %d\n", x2, y2);
    
    		// Werte in das Array eintragen
    		koord[x1-1][y1-1]='x'; 
    		koord[x2-1][y2-1]='x'; //minus 1 damit es im erray auf der richtigen position ist
    	}
    	else
    	{
    		mx=(x2+x1)/2;
    		my=(y2+y1)/2;
    
    		vergleich(mx, my, x2, y2);
    		vergleich(x1, y1, mx, my);
    	}
    }
    
    void ausgabe(int x1, int y1, int x2, int y2)
    {
    	int hoehe=0, breite=0, count1=0, count2=0;
    
    	for(hoehe=0; hoehe<YACHSE; hoehe++)
    		{
    			for(breite=0; breite<XACHSE; breite++)
    			{
    				printf("%c ", koord[hoehe][breite]);
    			}
    			printf("\n");
    		}
    }
    
    // ---<Main>---
    int main()
    {
    	int x1=0, y1=0, x2=0, y2=0;
    
    	puts("Koordinaten Punkt A");
    	scanf("%d %d", &x1, &y1);
    	fflush(stdin);
    
    	puts("\nKoordinaten Punkt B");
    	scanf("%d %d", &x2, &y2);
    	fflush(stdin);
    
    	rasta(x1, y1, x2, y2);
    	vergleich(x1, y1, x2, y2);
    	ausgabe(x1, y1, x2, y2);
    }
    

    vielen dank! warum werden jetzt alle 'x' eingetragen, nur weil ich die counts rausgelöscht habe?

    die rekursion befindet sich in der funktion vergleich.

    jetzt bleibt nur mehr ein punkt übrig, wie das mit der automatischen array größe funktionieren soll. (war damit "malloc" gemeint?)



  • c_rookie schrieb:

    vielen dank! warum werden jetzt alle 'x' eingetragen, nur weil ich die counts rausgelöscht habe?

    Nimm die einen Zettel (kariert) und gehe die (alte) Funktion Schritt für Schritt durch.
    Dein Array ist dann ein Bereich wie beim Schiffe versenken.
    Schreib auf, was im Programm passiert und nicht was du meinst/denkst.


Anmelden zum Antworten