# Buchstaben sortieren



## Andi5x (24. Oktober 2004)

Hi

Weiß jemand wie man in C++ Buchstaben sortieren lassen kann ?
Ich gebe z.B. die drei Buchstaben "bca" ein und würde sie gerne alphabetisch
geordet bekommen. Wie macht man das ? Habe es mit 2 Schleifen versucht, aber
irgendwie bekomme ich es nicht hin.
Weiß jemand weiter 

```
for( int k=0 ; k<2 ; k++)
 {
  for( int i=0 ; i<2 ; i++)
  {
   if(quelle[k] <= quelle[i])
   {
    ziel[k]=quelle[k];
   }
```
 
Danke schon im Vorraus für euere Hilfe.

Andi


----------



## Beichtpfarrer (24. Oktober 2004)

Solange a und b entweder beide Klein- oder beide Großbuchstaben sind:
char a,b;
if(a<b)
//a ist im alphabet vor b

Falls Klein-/Großbuchstaben auch gemischt vorkommen, könntest du mit toupper oder tolower erstmal konvertieren.


----------



## Andi5x (24. Oktober 2004)

HI

ich verstehe nicht was du damit meinst ?
Ich habe doch in meinen Schleifen eine if Bedingung drin.

Gruß
Andi


----------



## Beichtpfarrer (24. Oktober 2004)

Ahso.. 
sollte mir mal angewöhnen, die Fragen ordentlich durchzulesen, es ging nicht um den Vergleich zweier Buchstaben, sondern um den Algorithmus 

Empfehle ich dir einfach mal den sort-Algorithmus aus der Standard-lib


```
char data[10];
sort(data,data+sizeof(data));
```


----------



## Andi5x (24. Oktober 2004)

Merci für deinen Rat. 
Werde es mal versuchen.

Gruß
Andi


----------



## randomize (25. Oktober 2004)

Ansonsten mal nach so Sachen wie _BubbleSort_, _QuickSort_... blabla suchen, die jibbet an jeder Ecke, glaube ich. Zumindest einige hunderttausend Mal im Netz, bestimmt.


----------



## Andi5x (27. Oktober 2004)

HI

Danke für euere Hilfe.
Habe einen String erstellt:  name[10] = ( " cba" );
Würde gerne die Buchstaben in dem String alphabetisch ordnen lassen.
Hier wurde erwähnt das man das mit - sort - machen kann.
Muss ich da noch eine Bibliothek einbinden 

Was genau bedeutet:

char data[10];
sort(data,data+sizeof(data));

ist data mein String name ?
Und in welchem String wird der geordnete Sting geschrieben 

Oder hat noch jemand eine andere Idee wie ich meine Buchstaben alphabetisch geordnet bekomme ?

Danke schon im Vorraus für euere Hilfe,

Gruß Andi


----------



## HarryXVI (15. April 2008)

sorry dass ich mich einmische aber ihr sprecht gerade von buchstaben:

Wie stelle ich ein, dass "char" nicht nur 1, sondern 10 Buchstaben aufnimmt?
Ihc hab nen Programm geschrieben, da muss amn was eingeben, aber der compiler nimmt dann nur den ersten Buchstaben, z.B. von "Mercedes" nur "M".


----------



## Dorschty (15. April 2008)

Das geht nicht! char kann nur einen Buchstaben aufnehmen! Das was du brauchst ist ein String! Da kannst du beliebig viele Char aneinander reihen!

Gruß
dorschty


----------



## HarryXVI (15. April 2008)

Dorschty hat gesagt.:


> Das geht nicht! char kann nur einen Buchstaben aufnehmen! Das was du brauchst ist ein String! Da kannst du beliebig viele Char aneinander reihen!



Ok, und wie schreibe ich so einen String, wo ich 10 beliebige Buchstaben habe? Tut mir leid, aber ich bin noch Anfänger.


----------



## devDevil (15. April 2008)

Ein String besteht aus Zeichen (chars). Auch genannt Zeichenkette. Diese wird Nullterminiert, um das Ende des Strings zu kennzeichnen. Sonst wäre der Umgang mit Zeichenketten extrem umständlich.

```
char string[]="Das ist ein String!";
```
 wäre z.B. ein String.

```
char string[4] = {'a', 'b', 'c', 0};
```
 auch.

Unter C++ wird die Stringbearbeitung durch std::string realisiert, was das ganze wesentlich vereinfacht.


----------



## random-access (15. April 2008)

HarryXVI hat gesagt.:


> Ok, und wie schreibe ich so einen String, wo ich 10 beliebige Buchstaben habe?



Also zunächst:
du hast mehrere Möglichkeiten. entweder du nimmst ein char array,

```
char Name[Groesse] // typ: "char", name: "Name", "Groesse" gibt an, wie viele Zeichen das Array aufnehmen kannn.
```
du musst allerdings beachten das das Array immer bei 0 beginnt. also
name[0] ist das erste Element.
Das letzte Element ist IMMER "Groesse - 1".
d.h.:

```
char Testarray[500] // dieses Array geht von "Testarray[0]" bis "Testarray[499]"
```
Die nächste Möglichkeit wäre die klasse "string" zu includen und diese zu benutzen, was ich für vorteilhaft halte, weil du schon viele funktionen zur manipulation zur verfügung hast.

```
#include "string"
#include "iostream"
int main{
std::string stringname;
std::cin >> stringname;   // wenn du f eingibst wird f ausgegeben, ist deine Eingabe "Tutorial" wird auch das ausgegeben.
std::cout << stringname;
return 0;
}
```

greeetz

Edit: - da war ich wohl zu langsam ;-)


----------



## HarryXVI (15. April 2008)

gib ma nen beispiel: char Name[2].
bitte komplett, denn ich hab gelesen, das man dann alle einzeln hinschreiben muss, weiß aber nit wie das geht


----------



## random-access (15. April 2008)

also gut.


```
char GutenTag[11]; // so erstellst du ein Array mit 11 Elementen vom typ char, jedes speichert ein Zeichen.

char GutenTag[0] = 'H';
char GutenTag[1] = 'a';
char GutenTag[2] = 'l';
char GutenTag[3] = 'l';
char GutenTag[4] = 'o';
char GutenTag[5] = ' ';
char GutenTag[6] = 'W';
char GutenTag[7] = 'e';
char GutenTag[8] = 'l';
char GutenTag[9] = 't';
char GutenTag[10] = '!';
```

jetzt hast du das Array vollgeschrieben.

wenn du es wieder ausgeben willst, und dir etwas schreibarbeit erleichtern willst, gebe ich dir den Tip es mit einer for-Schleife zu realisieren.

greetz


----------



## HarryXVI (15. April 2008)

ich möchte jetzt den benutzer was eingeben lassen. da kann ich doch so schreiben.

char Name[10];
cout<<"Bitte einen Namen eingeben.";
cin>>Name;


----------



## random-access (15. April 2008)

HarryXVI hat gesagt.:


> ich möchte jetzt den benutzer was eingeben lassen. da kann ich doch so schreiben.
> 
> char Name[10];
> cout<<"Bitte einen Namen eingeben.";
> cin>>Name;



ja, in der Theorie ist das wohl nicht zu beanstanden 

Wenn der Name des Benutzers allerdings 12 Buchstaben lang ist hast du ein Problem, denn die restlichen 2 Zeichen befinden sich immernoch im Eingabepuffer.

wenn du möchtest das maximal 10 Zeichen eingegeben werden können ist es sinnvoll wenn du das hier schreibst.

```
char Name[10];
cout<<"Bitte einen Namen eingeben.";
cin>>Name;
cin.clear();  // so leerst du den Eingabepuffer.
```

wenn du allerdings möchtest das der Benutzer seinen Namen ganz eingeben kann würde ich dir wieder zur string stl raten.
Beispiel:

```
#include "string"
#include "iostream"
int main{
std::string Vorname;
std::cin >> Vorname;
std::cout << "Hallo " << Vorname << ", Willkommen in meinem Programm!"
return 0;
```

hoffe ich konnte dir weiterhelfen 

greetz


----------



## devDevil (15. April 2008)

Wasn Quatsch ... bitte nicht immer Halbwissen hier posten!

clear setzt die error state flags zurück. Aber damit leerst du bestimmt keinen Buffer!
Was du machen kannst ist:

```
template<class char_type, class char_traits>
std::basic_istream<char_type, char_traits>& flush(std::basic_istream<char_type, char_traits>& in)
{    return in.ignore(std::numeric_limits<std::streamsize>::max(), in.widen ('\n')); }
```
 damit räumst du sauber auf


----------



## HarryXVI (15. April 2008)

ich hab nun anstatt der variablen "char name" dies als array "char name[10]" genommen und es funktioniert prächtig. Danke für eure Hilfe


----------



## 3Cyb3r (24. Mai 2008)

hier mal ein billiger sortier algorithmus der allerdings sehr lamgsam ist und deswegen einer der schlechtesten aber für den anfang total aktebtabel und leichtverständlich denke ist der richtige für dich:

```
include "stdafx.h"
#include "stdlib.h"
#include "iostream"

using namespace std;


int main()
{
	system("TITLE Sortier-Algorithmus");

	int len=20, buffer, i=0, j=1;
	int vektor[]={23,12,45,26,76,88,123,2,34,56,0,98,45,64,23,78,8,82,50,20};

	for(i=0; i<len; i++)
	{
		for(j=0; j<len; j++)
		{
			if(vektor[i]<vektor[j])
			{
				buffer=vektor[i];
				vektor[i]=vektor[j];
				vektor[j]=buffer;
			}
		}
		j=0;
	}

	for(i=0; i<len; i++)
	{
		cout<<vektor[i]<<" ";
	}

	cout<<endl;
	system("PAUSE");
	return 0;
}
```


----------

