WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 23.11.2003, 01:51   #1
Groovy
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.107


Standard c++ Beispielfrage...

Könnt mir jemand in verständlichen Worten Erklären was ich beim 11. Beispiel genau tun soll?

"Schreiben Sie eine Funktion sort(char string[]), das die Zeichen in der als Parameter übergebenen Zeichenkette sortiert."

http://www.pri.univie.ac.at/~itep/ws0304/hue/hue06.html

Wie sollen also die eingegebenen Zeichen sortiert werden?
Könnte das jemand anhand eines Beispiels erklären?
Groovy ist offline   Mit Zitat antworten
Alt 23.11.2003, 04:28   #2
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Du sollst das Zeichen 'a' vor das Zeichen 'b' reihen, wenn diese beiden Zeichen in der übergebenen Zeichenkette vorkommen usw.

Ein Beispiel:

Übergabe -> samba
Ergebnis -> aabms

Alles klar ?!

Code:
void sort (char string[])
{
 long i,start,len= strlen(string);
 int nochmal;
 char swap_char;

 if(len<2) return;

 for(start=0,nochmal=0;nochmal;start++)
 {
  for(i=start+1;i<len;i++)
  {
   if(string[start]>string[i])
   {
    nochmal= 1;
    swap_char= string[start];
    string[start]= string[i];
    string[i]= swap_char;    
   }
  }
 }
}
Das Sortierverfahren ist halt nicht sehr effektiv

mfg Kikakater
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 13:18   #3
Groovy
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.107


Standard

Achsoo also in alphabetischer Reihenfolge ausgeben, können die das nicht dazuschreiben?!

Übrigens danke für dein Code, aber versteh ich ihn wieder nicht...

Was ist strlen?
Groovy ist offline   Mit Zitat antworten
Alt 23.11.2003, 13:20   #4
K@sperl
bitte Mailadresse prüfen!
 
Registriert seit: 03.04.2001
Beiträge: 2.387


Standard

Zitat:
Original geschrieben von Groovy
Was ist strlen?
strlen() gibt die Länge von string zurück.
K@sperl ist offline   Mit Zitat antworten
Alt 23.11.2003, 14:43   #5
Flink
Hero
 
Registriert seit: 29.08.2001
Alter: 57
Beiträge: 904


Flink eine Nachricht über ICQ schicken Flink eine Nachricht über Skype™ schicken
Standard

für lange Zeichenketten gibt es eine schnellere Variante:
Code:
#include <string.h>
void sort (char string[]);

int main()
{
	char string1[] = "abeejkieecccABEFE21342";

	sort(string1);

}

// sort bei längeren Strings
void sort (char string[])
{
 static int tabelle[255], akt_char;  // static, weil schneller
 long i, j, pos, len= strlen(string);

 // Initialisierung wegen static notwendig
 for(i=0;i<255;i++)
 {
    tabelle[i] = 0;
 }

  // sequentiell die Zeichen zählen
 for(i=0;i<len;i++)
 {
   tabelle [string[i]] ++;
 }

 for(i=0, pos=0;i<255;i++)
 {
   for (j = 0; j < tabelle[i]; ++j)
   {
     string[pos++] = (char) i;
   }
 }

}
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 23.11.2003, 16:32   #6
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

2 Fehler:

Falsch: for(i=0;i<255;i++)

Richtig: for(i=0;i<=255;i++)

-

Falsch: for(i=0, pos=0;i<255;i++)

Richtig: for(i=1, pos=0;i<=255;i++)

~

mfg Kikakater
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 16:47   #7
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Außerdem muß folgende Zeile geändert werden:

Falsch: tabelle [string[i]] ++;

Richtig: tabelle [ (unsigned char)string[i] ] ++;

Es ist ein CASTen (ein Umtypisieren) notwendig, da für Zeichencodes > 127 - z.B. Umlaut A - ein negativer Index für das Array tabelle in der Funktion (besser Prozedur genannt da sort keinen Rückgabewert hat --> eben "void" sort (char string[])) herauskommt !

Der Wertebereich von char geht von -128 bis 127. Für tabelle[i], also das i (den Index) braucht man aber die Werte 1-255. Null zählt ja nicht, weil es (das Zeichen NUL (=binäre Null)) den Abschluß eines ASCII C Strings bildet. Deswegen braucht man das Element tabelle[0] nicht.

Oder:

tabelle [ ((unsigned char)string[i])-1 ] ++;

schreiben.

Dann stimmen die sogenannten beiden fehlerhaften Zeilen wieder.
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 16:58   #8
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Ich würde es aber nach Variante 1 machen, weil man sich die dauernde Subtraktion von 1 in der Zeile

tabelle [ ((unsigned char)string[i])-1 ] ++;

erspart.

Die Anzahl der Elemente von tabelle muß von 255 auf 256 erweitert werden - mit Element 0 als quasi nutzlosem Element.

static int tabelle[256], akt_char; // static, weil schneller

außerdem würde ich nicht static verwenden, weil das Feld tabelle sonst am Heap und nicht am Stack abgelegt wird (=Speicherplatzverschwendung).

akt_char wird nicht verwendet und ist demnach obsolet.
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 17:14   #9
Groovy
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.107


Standard

Zitat:
Original geschrieben von K@sperl
strlen() gibt die Länge von string zurück.
Ok Danke...
Was macht die ganzzahlige Variable "nochmal"?
Sie wird unten mit 1 initialisiert, was hat das für einen Zweck?

Sorry, ich check diesen Algorithmus nicht ganz...


Achja und noch eine Frage:
Wieso hat die Funktion void (if(len<2) return; )
einen Rückgabewert?
Groovy ist offline   Mit Zitat antworten
Alt 23.11.2003, 18:10   #10
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

Hat sie doch eh nicht.
In diesem Fall bedeutet return einfach nur, daß die Funktion verlassen wird. Denk dir dort halt ein stop, break oder sonst was.

Jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona)
Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing.
\"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra)
jak ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:43 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag