[C++] 2 Cout aber gleiche Zeile, Zeilenfarbe ändern Konsole

Asix

Mitglied
Tag auch,

mir ist gerade aus Langeweile ne Idee fürn Programm gekommen, welches ich jetzt verfeinern will(optisch).

1. Frage
Wie bekomme ich es hin, dass 2 Couts in der gleichen Zeile stehen? Bzw. dass das 2. Cout ("später" im Code) die Zeile des 1. ergänzt (hoffe ist verständlich beschrieben :) )

2.Frage
Mit dem system("color "); Befehl kann man die Textfarbe ändern, mein Problem ist, dass ich aber nicht den gesamten Text färben will, sondern nur eine Zeile...

Vielen Dank im Vorraus
Asix
 
Zu eins:
PHP:
cout<< varilabe_eins << "Text, bla bla bla" << variable_2 << "bla bla bla"<<endl;
mit dem oparator "<<" kanst du immer stings und zeichenfolgen, oder auch variablen anhängen, beliebig oft. das "endl" ist wie ein Zeilen-Umbruch zu verstehen. Jedoch wenn du das "endl" weglässt und einen zweuten cout dranhängst, wird das zweite in eine separate Zeile geschreiben, deshalb empfehle ich dich immer mit einem cout pro zeile zu arbeiten;)

zu zwei, habe ich eine fertige Problemlösung für dich, doch hab ich jezt keine Zeit das anschaulich und verständlich zu erklären, bin heute um halb 10 wieder da, dan werd ich das mal versuchen schön zu erklären;)
 
Wow Danke für deine schnelle Antwort.

Mein Problem mit dem Cout ist ehr dieses:

cout<<Zahl1<<" + "<<Zahl2<<" = ";
float ErgebnisUser;
cin>>ErgebnisUser;

float Ergebnis; //Vom Programm errechnetes Ergebnis aus Zahl1 und Zahl2
Ergebnis = Zahl1 + Zahl2;

if(ErgebnisUser == Ergebnis)
{
system("color 0A");
cout<<"Richtig!"<<endl;
}
Selbstverstädlich nicht der ganze Code, nur zum Verständnis
:
Das ist n kleines Kopfrechenprogramm, (mir war eben grade langweilig :p) Mein Problem ist, dass das "Richtig" aus dem If oben angehängt werden soll nach dem cin>>ErgebnisUser, da ist ja eig auch kein Zeilenumbruch drin, aber eben durch das Bestätigen des Ergebnises via "Enter" springt der Cursor weiter..
 
Zum cout-Problem:
Ja, verstehe. Kenn ich^^ Du willst an eine vorhandene Bildschirm ausgabe eine User eingabe setzen. Das häte ich jezt Spontan auch keine Lösung zu, den cin sezt automatisch einen Umbruch nach der User-Eingabe. werde mich heut Abend noch mal drum kümmern;)


Zum Farbproblem:
Jede Zeile verschieden färben ist etwas aufwändiger, und wenn du ein Einsteiger bist, auch nicht, bzw. nur schwer zu verstehen, wie und was genau getan wird, deshalb schreibe ich jezt einfach wie du es anzuwenden hast, wenn ich genaueres dazu erklären soll, kann ich das nach Bedarf ja gerne tun;)

PHP:
#include //deine Includes
...
//Farbe definieren
	WORD SetColor(WORD new_color)
{
	WORD old_color=0;
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdOut,&csbi);
	old_color = csbi.wAttributes;
	SetConsoleTextAttribute(hStdOut,new_color);

	return old_color;
}

...

main()
{

int ...
bool...
//deine Variablen deklaration zu der du noch hnzufügst:
WORD old_color = SetColor(FOREGROUND_GREEN|FOREGROUND_INTENSITY);

...

//Nun zum Einfärben. Vor jede Zeile, die du färben möchtest, musst du folgendes setzen:
SetColor(FOREGROUND_BLUE|FOREGROUND_INTENSITY);
/*Nun wird alles in Blau erscheinen, deshalb musst du entweder bei der nächsten Zeile eine neue Farbe setzen (Parameter: FOREGROUND_BLUE), oder nach der gefärbten Zeile auf die alte Farbe zurücksetzen, in dem du folgendes Hinzufügst:*/
SetColor(old_color);
}

so nochmal ein Konkretes Beispiel:
PHP:
#include //deine Includes
...
//Farbe definieren
	WORD SetColor(WORD new_color)
{
	WORD old_color=0;
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	GetConsoleScreenBufferInfo(hStdOut,&csbi);
	old_color = csbi.wAttributes;
	SetConsoleTextAttribute(hStdOut,new_color);

	return old_color;
}

...

main()
{
WORD old_color = SetColor(FOREGROUND_GREEN|FOREGROUND_INTENSITY);

string str_1 = "Hallo Welt!";

cout<< str_1; //Farbe: Standart

SetColor(FOREGROUND_BLUE|FOREGROUND_INTENSITY);
cout<< str_1; //Farbe: Gruen
SetColor(FOREGROUND_REDFOREGROUND_INTENSITY);
cout<< str_1; //Farbe: Rot
SetColor(old_color);
cout<< str_1; //Farbe: wieder Standart

...

return (0);
}
 
Zuletzt bearbeitet:
Jau dann warte ich mit dem 1. Problem natürlich ;-)
Nur kein Stress.
Danke für die Farb Funktion, darfst mir gerne erklären wie genauer das Funktioniert :p
 
Ich hätte da folgende Idee:
Schreibe sämtliche Ausgaben/Eingaben in ein Array, das die Größe des Bildschirmes haben könnte. Dann wird ab und zu der Bildschirm gellert, und du gibst das Array Zeile für Zeile mit Cout aus. Kann natürlich sein dass das noch elganter geht, aber dass hier is ja auch nur ein Vorschlag.
Skini
 
So, da bin ich wieder.^^ Nun hier kamen ja schon Vorschläge zu deinem Problem, weitere hätt ich eigentlich nicht, aber in der Konsole ist das eh nicht so wichtig, wie es aussieht. Es geht rein mehr um die Logic. Die Optik wird erst ab der GUI-Anwendung interessant;)

Erklären, nungut, versuche es mal^^

Soooo: als erstes schreiben wir uns eine Funktion, die den Datentyp WORD als rückgabe wert erwarten. diese nennen wir "SetColor(WORD new_color)". Und wir sehen auch gleich, dass in den klammern eine Varialble "new_color" angelegt wird, und die Funktion SetColor somit auch beim Aufruf einen Parameter des Types WORD erwarten.
Anlegen des Funktionskopfes:
PHP:
WORD SetColor(WORD new_color)
Aufruf der Funktion:
PHP:
SetColor(/*Variable des Datentyps WORD*/)

Info:
Code:
WORD ist zu vergleichen mit einem "unsigned short" und hat somit die Größe von 16bit. Also ist WORD eine zahl, ohne Vorzeichen:

So das zu WORD. Ab hier wird es lustiger;)

Ich werd es versuchen anhand von Kommentaren zu erklären;)
PHP:
WORD old_color=0; /*Nochmal eine Variable des Typs WORD anlegen, die später als Speicher unserer "alten" Bildschirmfarbe dienen wird*/

    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); /*So, was ein HANDLE ist, wird schwieriger sein. Also nen HANDLE ist eine Datenstruktur. Nun ja schwierig zu erklären, Auf jeden Fall benötigst du ein solches, um wie z.b. hier auf unser Konsolen-Fenster zuzugreifen.*/
/*So, mit GetStdHandle holst du dir won Windoofs das entsprechende Handle zum Ein/Ausgabe. Also: (standard input, standard output, or standard error)*/
    CONSOLE_SCREEN_BUFFER_INFO csbi; /*CONSOLE_SCREEN_BUFFER_INFO ist eine Struktur, die den Buffer des Konsolenfenster beinhaltet, Somit alles was dein Fenster so anzeigt.*/

    GetConsoleScreenBufferInfo(hStdOut,&csbi); /*Damit verschaffst du dir praktisch zugriff auf dein Fenster-Buffer*/
    old_color = csbi.wAttributes;/*Hier holst du dir eine Variable aus der Fenster-Struktur, und speicherst diese für weitere Zwecke ab*/
    SetConsoleTextAttribute(hStdOut,new_color);/*Und hier wird nun endlich die Farbe an das HANDLE gegeben, und umgesezt*/

    return old_color;

Hoffe es ist was mit anzufangen;) Wenn ich irgendwo falsch liege, dan bitte ich mich zu korregieren, den auch ich will mehr wissen:D
 
Zurück