dreieck



  • @volkard:

    Fehleingaben sind abzuweisen und führen zu einer Neuabfrage.



  • Hallo,

    also mich würde es schon interessieren wie man solch eine Aufgabe angeht, also dreieck zeichnen...

    will er das über konsole machen?
    das man die zwei Werte breite/höhe in zwei variablen steckt ist ja klar, aber wie man dann dieses Dreieck zeichnet würde mich persönlich schon interessieren.



  • x
    xxx
    xxxxx

    zum Beispiel.



  • Schei... so sollte das nicht aussehen ...



  • z.B. so:

    *
     * *
    *****
    


  • Na dann ist es ja jetzt nicht sooo schwer. 🙂


  • Administrator

    Belli schrieb:

    Schei... so sollte das nicht aussehen ...

    Ist aber auch ein Dreieck!

    @jens12,
    Hier mal mit WinAPI und GDI+, wie man ein Dreieck zeichnet:

    #define UNICODE
    #include <windows.h>
    #include <gdiplus.h>
    
    void drawTriangle(HDC hdc)
    {
    	Gdiplus::Pen pen(Gdiplus::Color(255, 0, 0, 255), 4);
    	pen.SetLineJoin(Gdiplus::LineJoinRound);
    
    	Gdiplus::GraphicsPath path;
    	path.StartFigure();
    	path.AddLine(50, 50, 75, 75);
    	path.AddLine(75, 75, 25, 75);
    	path.AddLine(25, 75, 50, 50);
    
    	Gdiplus::Graphics graphics(hdc);
    	graphics.DrawPath(&pen, &path);
    }
    
    LRESULT CALLBACK wndProcedure(
    	HWND hWnd,
    	UINT message,
    	WPARAM wParam,
    	LPARAM lParam)
    {
    	switch(message)
    	{
    	case WM_PAINT:
    		{
    			PAINTSTRUCT ps;
    			HDC hdc = BeginPaint(hWnd, &ps);
    			drawTriangle(hdc);
    			EndPaint(hWnd, &ps);
    
    			return 0;
    		}
    	case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return 0;
    		}
    	default:
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    }
    
    int main()
    {
    	// Initialize GDI+.
    	ULONG_PTR gdiplusToken;
    	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    	Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
    	// Get Instance handle
    	HINSTANCE hInstance = GetModuleHandle(NULL);
    
    	// Register a window class
    	WNDCLASS wndClass;
    	wndClass.style          = CS_HREDRAW | CS_VREDRAW;
    	wndClass.lpfnWndProc    = &wndProcedure;
    	wndClass.cbClsExtra     = 0;
    	wndClass.cbWndExtra     = 0;
    	wndClass.hInstance      = hInstance;
    	wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    	wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
    	wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wndClass.lpszMenuName   = NULL;
    	wndClass.lpszClassName  = L"MainFrameClass";
    
    	RegisterClass(&wndClass);
    
    	// Create a window of that class
    	HWND hWnd = CreateWindow(
    		L"MainFrameClass",		 // class name
    		L"Triangle Window",		 // caption
    		WS_OVERLAPPEDWINDOW,     // style
    		CW_USEDEFAULT,           // x
    		CW_USEDEFAULT,           // y
    		200,					 // width
    		200,			         // heigth
    		NULL,                    // parent
    		NULL,                    // menu
    		hInstance,               // instance
    		NULL);                   // opt create params
    
    	// Show window and send a WM_PAINT message
    	ShowWindow(hWnd, SW_SHOW);
    	UpdateWindow(hWnd);
    
    	// Handle thread messages
    	MSG msg;
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	// Free GDI resources
    	Gdiplus::GdiplusShutdown(gdiplusToken);
    
    	return msg.wParam;
    }
    

    Benutzereingaben und Fehlerbehandlung musst du allerdings noch selber machen. Aber probier erstmal den Code zu verstehen 🤡

    Wichtiges Hilfsmittel:
    http://msdn.microsoft.com/en-us/library/default.aspx

    Und wenn du bei der WinAPI bleiben möchtest:
    Windows-Programmierung | ISBN: 3860631888

    Ansonsten musst du ein anderes graphisches Framework oder API auswählen. Da gibt es allerdings verdammt viele Möglichkeiten. Nur um mal ein paar zu nennen:
    Qt, wxWidgets, MFC, VCL, VCF, SFML, SDL, DirectX, OpenGL, FLTK, usw. usf.

    Grüssli

    PS: Beispiel ist hauptsächlich 1:1 aus der MSDN kopiert 😉



  • Wie kannst du nur? Einfach einem c++ Neuling irgendwelche c-Konstruktionen vor die Nase setzen. 😮 Hoffentlich hat er nicht hingesehen.
    Denk an seinen PROGRAMMIERSTIL!!! 😃 😃 😃
    Dann noch dieses alte Buch mit all den Makros empfehlen.
    Ich fürchte der Threadstarter ist verloren. 😃 😃



  • Mitleid schrieb:

    Denk an seinen PROGRAMMIERSTIL!!! 😃 😃 😃

    Welchen? Er versucht die Arbeit doch eh an Andere zu delegieren. Ich tippe darauf das er mit dieser Einstellung später Manager wird, ein paar Unternehmen an die Wand fährt und für hunderte Entlassungen verantwortlich ist (was ihm aber mit dem Managergehalt egal ist).



  • übrigens hört es sich so an, als ob der TO das in der konsole mit 2 for-schleifen machen sollte - und dann in etwa so was rausbekommen sollte:

    Hoehe?
    4
    Breite?
    7
    
       #   
      ###  
     ##### 
    #######
    

    oder evtl auch so etwas, weil das schöner (für komische höhe/breite-angaben) aussieht:

    #
    ###
    #####
    #######
    

    bb



  • @asc
    Der faule Threadstarter ist mir gleichgültig. Ich wollte Dravere mit dieser Anspielung auf die C/C++ Diskussion vor ein paar Tagen nur etwas sticheln, weil er hier seine eigene Medizin nicht schluckt. 😃




  • Administrator

    Mitleid schrieb:

    Ich wollte Dravere mit dieser Anspielung auf die C/C++ Diskussion vor ein paar Tagen nur etwas sticheln, weil er hier seine eigene Medizin nicht schluckt. 😃

    Keine Chance, da mein Beitrag sowieso nicht ganz so ernst gemeint war. Ich bin da gleicher Meinung wie asc und unskilled. Die Beschreibung im ersten Beitrag hört sich für mich wie eine Aufgabe einer Schule/Uni an.

    Gut, es ist allerdings etwas bös von mir, dass ich versuche, dass der Threadstarter meine präsentierte Lösung als die seinige abgibt. 😃

    Zudem, so schlimm ist der Code nicht. Das ist halt WinAPI, allerdings verwende ich darin keine expliziten C Konstrukte. Ich habe auch nicht alle Variablen ganz oben in der Funktion deklariert. Auch verwende ich GDI+ 😉

    Grüssli



  • Dravere schrieb:

    Ich bin da gleicher Meinung wie asc...

    Hoffentlich nicht: es könnte der nächste Manager deiner Firma sein ;p

    Davon abgesehen finde ich deinen Code an dieser Stelle nicht verkehrt: wenn der Code kopiert wird, wird ein Lehrer es mit Sicherheit sofort erkennen 😉



  • asc schrieb:

    wenn der Code kopiert wird, wird ein Lehrer es mit Sicherheit sofort erkennen 😉

    deshalb wird er es ja auch gemacht haben : D

    bb



  • also ich hab auch ein grosses problem

    unskilled

    15:11:01 10.06.2009

    #######

    so sollte das ja aussehen wenn man hoehe 4 hat und breite 7, hab das programm soweit fertig, er gibt es aber nur immer richtig aus wenn hoehe und breite gleich sind, sonst wenn ich deine werte eingebe, sieht das so aus

    # #
    # #
    # # # # # # #

    und umso höher die werte auseinanderliegen, desto schlimmer, brauche schnelle hilfe

    Mein Programm:

    int i,x=35,weite=2;
    cout<<"\n"<<"\n"<<"Sie haben sich fuer die Darstellung eines Dreiecks entschieden!"<<"\n";

    cout<<"\n"<<"\n"<<"Wie wollen Sie ihr Dreieck ausgeben?"<<"\n";
    cout<<"Auf dem Kopf? [1]"<<"\n";
    cout<<"Auf Grundseite? [2]"<<"\n"<<"\n";

    cout<<"Ihre Auswahl: ";
    cin>>i;

    switch (i)
    {

    case 1:
    {
    person student;
    FILE* datei;

    datei=fopen("test.txt","a");

    cout<<"Geben Sie bitte die Hoehe ihres Dreiecks ein: ";
    cin>>student.hoehe;
    fprintf(datei,"%d\n",student.hoehe);
    cout<<"\n"<<"Geben Sie bitte die Breite ihres Dreiecks ein: ";
    cin>>student.breite;
    fprintf(datei,"%d\n",student.breite);
    cout<<"\n"<<"\n";

    fclose(datei);

    if(student.breite>student.hoehe)
    {
    cout<<"Falsche Werte eingegeben!!!";
    }
    else
    {

    x=x-student.breite;
    cout<<setw(x);

    for(i=2; i<=student.breite; i++)
    {
    cout<<"*", cout<<char(00);

    }

    cout<<endl;
    x++;

    for (i=3; i<=student.hoehe; i++)
    {
    cout<<setw(x);
    cout<<"*"<<setw((student.breite*2)-weite-2)<<"*"<<endl;
    x++;
    student.breite--;
    }

    cout<<setw(34)<<"*"<<endl;

    }

    }
    break;

    case 2:
    {
    person student;
    FILE* datei;

    datei=fopen("test.txt","a");

    cout<<"Geben Sie bitte die Hoehe ihres Dreiecks ein: ";
    cin>>student.hoehe;
    fprintf(datei,"%d\n",student.hoehe);
    cout<<"\n"<<"Geben Sie bitte die Breite ihres Dreiecks ein: ";
    cin>>student.breite;
    fprintf(datei,"%d\n",student.breite);
    cout<<"\n"<<"\n";

    fclose(datei);

    if(student.breite>student.hoehe)
    {
    cout<<"Falsche Werte eingegeben!!!";
    }
    else
    {

    cout<<setw(x);
    cout<<"*"<<endl;
    x=x--;

    for (i=3; i<=student.hoehe; i++)
    {
    cout<<setw(x);
    cout<<""<<setw(weite)<<""<<endl;
    x--;
    weite=weite+2;
    }

    cout<<setw(x);

    for (i=0; i<student.breite; i++)
    {
    cout<<"*", cout<<char(00);

    }
    cout<<endl<<endl;
    }

    }
    break;



  • Beim Verändern der Weite musst Du natürlich das Verhältnis zwischen Breite und Höhe beachten. Stur mit 2 zu erhöhen (bzw. zu verringern) klappt nur wenn Höhe und Breite gleich sind.
    Ändere z.B. die Schleife im case 2: zu

    weite = (student.hoehe - 2)/2;
                    for (i=3; i<=student.hoehe; i++)
                    {
                        weite += 2*(student.breite - 1);
                        cout<<setw(x);
                        cout<<"*"<<setw( weite / (student.hoehe - 1) )<<"*"<<endl;
                        x--;
                    }
    

    das x kann man natürlich auch noch anpassen ...

    Gruß
    Werner



  • danke, kannst mir auch eben kurz erklären, was du da genau gemacht hast

    weite = student.breite - 2;
    for (i=3; i<=student.hoehe; i++)
    {
    weite += 2*(student.breite - 1);
    cout<<setw(x);
    cout<<""<<setw( weite / (student.hoehe - 1) )<<""<<endl;
    x--;
    }

    und muss ich den hier auch noch was verändern, ich hab nun ja einfach gesagt das, die breite nicht höher sein darf als die breite, aber ob das so gedacht war.
    if(student.breite>student.hoehe)

    das müsste doch eigentlich auch gehen oder?

    cout<<setw(x);

    for (i=0; i<student.breite; i++)
    {
    cout<<"*", cout<<char(00);

    }
    cout<<endl<<endl;



  • :eek;

    Von deinem Code bekommt man Augenkrebs
    

    Benutz bitte Code-Tags: [cpp]Code[/cpp ] Ohne Leerzeichen



  • Ja ist ja gut, brauch trotzdem ne antwort


Anmelden zum Antworten