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, 19:57   #11
Groovy
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.107


Standard

Kann mir jemand erklären wieso dieser Code nix ausgibt?:


Code:
#include <iostream.h>

void sort(char[]);

int main()

{

const int i=100;
char string[i];
cin>>string[i];
sort(string);

return 0;
}


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;    
    cout<<string[i];
   
   }
  }
 }
}
*omg* ich hab wirklich die ärgsten Probleme beim Programmieren...
Groovy ist offline   Mit Zitat antworten
Alt 23.11.2003, 21:02   #12
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

Zitat:
Original geschrieben von kikakater
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.
Das hängt ab vom Gültigkeitsbereich der Ascii-Codes. '\0 ist wohl kein Zeichen. Man könnte auch andere Sonderzeichen weglassen. Tabelle[256] ist notwendig.
Guter Hinweis zum Heap.
____________________________________
Bibel
Flink ist offline   Mit Zitat antworten
Alt 23.11.2003, 21:15   #13
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Zitat:
Original geschrieben von Groovy
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?
nochmal wird mit 0 initialisiert im Kopf der for Schleife.

Der Kopf der for schleife besteht immer aus

Code:
for ( Vorbereitung[,Vorbereitung[,...]];
Bedingung oder
Zuweisung/Funktionsaufruf als Bedingung[,Bedingung oder
Zuweisung/Funktionsaufruf als Bedingung[,...]];
Increment/Dekrement bzw.
zweckentfremdet Funktions/Prozeduraufruf(e) mit oder ohne logische Verknüpfungen[,Increment/Dekrement bzw.
zweckentfremdet Funktions/Prozeduraufruf(e) mit oder ohne logische Verknüpfungen[,...]] )

also kurz:

for ( Vorbereitung ; Bedingung ; Increment/Decrement )
nochmal wird nicht mit "1" initialisiert, sondern es wird 1 ("1" als Begriff, ein NUMERISCHES Literal) als Wert der Variablen zugewiesen.

Dann zieht die Bedingung der äussersten for Schleife ... ---> somit wird diese - also die äusserste for Schleife - nocheinmal durchlaufen.

Ein Fehler ist auch im Code:

Nach

for(start=0,nochmal=0;nochmal;start++)
{

müsste es

nochmal= 0;

heißen.

Sonst wird eine Endlosschleife produziert, falls auch nur ein Zeichen umsortiert worden ist (beim ersten Durchlaufen der gesamten Zeichenkette).

cin>>string[i];

ist außerdem falsch !

Du musst die ganze Zeichenkette einlesen und nicht nur ein Char Zeichen an der Indexstelle i des Char Arrays string[].
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 21:24   #14
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Das bzw. die Vorbereitungsstatements werden NUR EINMAL (nämlich am Anfang) der for Schleife ausgeführt, die Bedingung wird IMMER VOR DER AUSFÜHRUNG des Schleifenkörpers abgefragt, die Inkrement(bzw. Increment) usw. Statements werden IMMER NACH DER AUSFÜHRUNG des Schleifenkörpers durchgeführt. Ein vorzeitiger Abbruch der Schleife erfolgt mit break; bzw. in der Praxis mit if(irgendeine_abbruch_bedingung_erfuellt) break;
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 21:33   #15
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Noch zu Deiner Frage:

if(len<2) return;

ohne Rückgabewert wird kein Rückgabewert zurückgegeben

D.h. return; /* ohne return 0; oder return 1; oder return ret_variable; */

ist keine Rückgabe eines Wertes.

Es ist lediglich so, daß die PROZEDUR - oder void Funktion "sort" - (void bedeutet "kein Wert" bzw. "undefiniert" bzw. "nichts vorhanden") VORZEITIG verlassen wird. Es passiert nichts anderes, als daß die Rücksprungadresse (vom Stack) geladen wird und zur aufrufenden Funktion zurückverzweigt wird. Jedoch wird KEIN Rückgabewert bereitgestellt - es handelt sich eben um eine void Funktion (semantisch = bedeutungsmäßig eine Prozedur).
kikakater ist offline   Mit Zitat antworten
Alt 23.11.2003, 22:52   #16
Groovy
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.107


Standard

Vielen Dank für deine Beiträge.
Ich bekomm aber immer noch nichts raus..., bin halt zu unfähig


Also es weden ganze Zeichenketten eingelesen, hast du es so gemeint?

Code:
#include <iostream.h>

void sort(char[]);

int main()

{


char eingabe[100];
cin>>eingabe;
sort(eingabe);

return 0;
}


void sort (char string[])
{
 long int 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= 0;
    swap_char= string[start];
    string[start]= string[i];
    string[i]= swap_char;    
    
    cout << string[i];
    
   
   }
  }
 }
}
Groovy ist offline   Mit Zitat antworten
Alt 23.11.2003, 23:17   #17
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Code:
#include <iostream>
#include <stdlib.h>

using namespace std;

void sort(char[]);

int main(int argc, char *argv[])
{
 char eingabe[100];

 cin>>eingabe;
 sort(eingabe);
 cout << eingabe << endl;

 system("PAUSE");	
 return 0;
}

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

 if(len<2) return;

 for(start=0,nochmal=1;nochmal;start++)
 {
  nochmal= 0;
  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;    
   }
  }
 }
}
Sollte jetzt ohne Probleme funktionieren.

nochmal muss am Anfang mit 1 initialisiert werden, hast recht und war mein Fehler. Im if Block jedenfalls auf 1 setzen und am Anfang des Schleifenblocks auf 0. 0 steht für die Annahme, daß alles bereits sortiert ist.
kikakater ist offline   Mit Zitat antworten
Alt 24.11.2003, 13:44   #18
Groovy
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.107


Standard

Vielen Dank für deine Hilfe.
Auf den Zeiger wär ich aber nicht gekommen, weil wir stoffmäßig noch nicht so weit sind.

hmm, funktioniert zwar unter Windows aber mit dem g++ Kompiler gehts nicht...eigenartig.

Groovy ist offline   Mit Zitat antworten
Alt 24.11.2003, 21:34   #19
kikakater
Inventar
 
Registriert seit: 24.01.2001
Beiträge: 5.631


Standard

Poste die Fehlermeldung des g++ Compilers. Ich weiß nicht, was es da hat. Du musst mich aufklären.

Außerdem ist der einzige Zeiger in meinem Beispiel ein Feld (Array) aus mehreren char * Zeigern namens argv.
kikakater ist offline   Mit Zitat antworten
Alt 24.11.2003, 21:39   #20
K@sperl
bitte Mailadresse prüfen!
 
Registriert seit: 03.04.2001
Beiträge: 2.387


Standard

Die Schnittstelle der Forward Deklaration stimmt mit der der Implementierung nicht überein:

Code:
void sort(char[])
void sort (char string[])
K@sperl 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 13:27 Uhr.


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