Sortieralgorythmus

Nebuchadnezar

Erfahrenes Mitglied
hi ich wollte mal ein 2 Dimensionales Feld in dem ich einfache Wörter einlese nach alphabet sortieren(eh schon aus meinem letzten Post ersichtlich) das schaut ungefähr so aus:
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>

char eingabe[20][20];
void tausche(char szEingabeA[],char szEingabeB[]);
void sortieren(char zEingabe[][20]);


void main()
{
	int i;

	for (i = 0;i <20;i++)
	{
		eingabe[i][0] = '0';
	}

	
	
	for (i = 0;i < 5;i++)
	{
		gets(eingabe[i]);
	}

	sortieren(eingabe);
	
	for (i = 0;i < 5;i++)
	{
		cout << eingabe[i] << endl;
	}
	
	

	getch();


	//to do
}

void tausche(char szEingabeA[],char szEingabeB[])
{
	char temp[20];
	strcpy(temp,szEingabeA);
	strcpy(szEingabeA,szEingabeB);
	strcpy(szEingabeB,temp);
	

}

void sortieren(char szEingabe[][20])
{
	int i = 0,j,m,n,o,p;
	for (j = 0; j < 20; j++)
	{
		if(szEingabe[j][0] != '0')
			i++;
	}
	n = i;
	for (j = 0;j < n; j++)
	{
		
		for(m = 0;m < i - 1;m++)
		{
			if(strlen(szEingabe[m]) > strlen(szEingabe[m+1])) p = strlen(szEingabe[m]); 
			else p = strlen(szEingabe[m+1]);
			for(o = 0;o < p;o++)
			{
				if(szEingabe[m][o] > szEingabe[m+1][o])
				{
					tausche(szEingabe[m],szEingabe[m+1]);
					break;
			
					
				}

			
				else (szEingabe[m][o] < szEingabe[m+1][o]);
				break;
				
				
				
			}
			

		
		}
		i--;
	}
}
Ist ein bisschen viel für einen Post aber falls es jemand von euch compillieren will braucht er sich ned das Hauptprogramm überlegen.
Kenner sehen sofort die Ähnlichkeit mit Bubblesort.
Mein Problem ist bei ähnlichen Wörtern will der Kerl noch nicht so richtig.
Zum Beispiel macht das Programm aus:
abc
aba
fgh
efg
bik
-----
abc ************
aba ************
bik
efg
fgh

die mit stern markierten zeilen gehören ja umgekehrt. Sonst funktioniert es.
Vielleicht weis wer rat.
 
Ich glaub der Fehler wäre recht einfach zu beheben:

Du machst, bevor du die Funktion "tausche(...)" aufrufst, einen Vergleich von zwei Strings, fragst diese aber (meiner Meinung nach) nicht richtig ab!

Stringvergleiche macht man immer mit strcmp( )!
strcmp(1. String, 2. String) liefert
+1, wenn der 2. String alphabetisch vor dem 1. String ist
-1, wenn der 2. String alphabetisch nach dem 1. String ist
0, wenn beide Strings ident sind.

Ach ja, den else-Zweig kannst du weglassen, der erfüllt keine allzu großen Aufgaben! ;)

Ich hoffe, dass ich dir damit weiterhelfen konnte,

lg D;-]c
 
danke erst mal
zu 1:
strcmp greift glaub ich in diesem fall nicht da wenn das wort kürzer ist nimmt er dann nachher die NULL zeichen und interpretiert evtl. das Wort welches alphabetisch gesehen später kommt als ein früheres, zumindest hab ich da bei manchen den Eindruck gehabt.
zu 2:
der else Zweig ist nur eine Absicherung damit wenn schon ein Buchstabe größer ist und er die zwei Strings tauscht er nicht nochmal die nächsten Buchstaben überprüft und dadurch falsch tauscht.
----
bei 1 hast du recht gehabt hab vergessen dass auch -1 true zurückliefert
nur so überprüft:
Code:
if(strcmp(szEingabe[m],szEingabe[m+1]))
und nicht auf ==1 überprüft.
 
Zuletzt bearbeitet:
Funktioniert die Sortierung jetzt?!

Wenn nicht, dann versuch mal, nicht auf -1 bzw +1 zu überprüfen, denn manche Compiler liefern entweder einen negativen oder einen positiven Wert; und folglich wäre dann die Abfrage falsch.

lg D;-]c
 
ja es funzzt: - mehr oder minder - ich will diesen algorythmus in die Prozesserfassung einbinden - Siehe Enumerating all Processes. Den Sourcecode dazu brauch ich ja nur per copy and paste in den Sortieralgorythmus einbinden nur mir ist ein interressantes Phänomen aufgefallen.
Ich habe eine Hilfsvariable z die ich zuvor als integer definiert habe die ich dazu verwende die Prozesse zu zählen abzüglich der unknown Prozesse - keine Ahnung was die sind aber egal. Ohne unknown ist z ca 29 mit unknown 35. Aufgrund diverser Überprüfungszwecke wollte ich z ausgeben - Interressant:
auf einmal wird z obwohl ich z als integer definiert habe als array oder char was auch immer interpretiert. bei cout hab ich mich noch gewundert. Dann printf brachte die bestätigung. Sollte ja nur eine Zahl sein in einer Zeile:
Code:
printf("%d",z);
auf einmal spuckt der kerl mir 29 Zeilen aus und in die 30 in die Mitte schreibt der mir 29. Jemand eine idee.
 
Versuch mal, einen Cast auf Integer zu machen!

Wenn das nicht funktioniert, poste doch mal die Zuweisungen an z, vielleicht passt ja da irgendwas nicht?!

lg D;-]c
 
aus da is da ganze source code wollt ich zwar nicht machen aber is eh ned so viel:
Code:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <tchar.h>
#include <psapi.h>


void tausche(char szEingabeA[],char szEingabeB[]);
void sortieren(char zEingabe[][50]);
void PrintProcessNameAndID( DWORD processID );
char eingabe[50][50];
int z;


int main(int argc, char* argv[])
{
	
	 // Get the list of process identifiers.
	HWND hWnd = 0;
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;
	int s;
	z = 0;

	for (s = 0;s <100;s++)
	{
		eingabe[s][0] = '0';
	}



    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
		return 0;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);



    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
	    PrintProcessNameAndID( aProcesses[i] );
	
	sortieren(eingabe);
	
	cout << z << endl;

	getch();

	return 0;
}


void PrintProcessNameAndID( DWORD processID )
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
	//char Text[20];
	

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }

    // Print the process name and identifier.
	if(strcmp(szProcessName,"<unknown>"))
	{
		char buffer[20];
		//_tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );  //geändert
		strcpy(eingabe[z],szProcessName);
		strcat(eingabe[z]," ");
		strcat(eingabe[z],"PID: ");
		itoa(processID,buffer,10);
		strcat(eingabe[z],buffer);
		z++;
	}



    CloseHandle( hProcess );
}

void tausche(char szEingabeA[],char szEingabeB[])
{
	char temp[50];
	strcpy(temp,szEingabeA);
	strcpy(szEingabeA,szEingabeB);
	strcpy(szEingabeB,temp);
	

}

void sortieren(char szEingabe[][50])
{
	int i = 0,j,m,n,o,p;
	for (j = 0; j < 100; j++)
	{
		if(szEingabe[j][0] != '0')
			i++;
	}
	n = i;
	for (j = 0;j < n; j++)
	{
		for(m = 0;m < i - 1;m++)
		{
			if(strlen(szEingabe[m]) > strlen(szEingabe[m+1])) p = strlen(szEingabe[m]); 
			else p = strlen(szEingabe[m+1]);
			for(o = 0;o < p;o++)
			{
				if(strcmp(szEingabe[m],szEingabe[m+1]) == 1)
				{
					tausche(szEingabe[m],szEingabe[m+1]);
				}							
			}	
		}
		i--;
	}
}

danke wennst es findest
 
Hab jetzt leider keinen Compiler am Computer, bin im Büro... :-)
Ich könnte es am Abend mal testen.

Wie wäre es, wenn du z nicht als globale Variable deklarierst, sondern immer übergibst?! (Pointer :eek: )
Vielleicht ist da ja irgendwo der Bug versteckt!

lg D;-]c
 
die idee is mir auch scho kommen - war im mom nur zu faul, abgesehen davon das is doch schon irgendwie interressant oda?
update:
mit pointerübergabe funktionierts erst recht nicht und überhaupt interressant:
ich setze z auf 0 dann ist für ihn z 48. Ich setze z auf -48 in der Hoffung es funktioniert - er übergibt -48 und wenn ich z auf +48 setze übergibt er trotzdem 48 dasselbe wie wenn ich z 0 setze *grübl*
*lol* Markenqualität aus Redmond *lol*
 
Zuletzt bearbeitet:
Hmmmm, jojo ich weis, es ist scho ein bisschen lang her, dass ich mich wegen dem Problem gemeldet habe, aber egal. Hab endlich mal das Problem ausgemerzt, wodurch der ganze Text der Prozesse einfach in die Mitte geschrieben wurde bzw. erst nach ca 20 Zeilen Linefeed ausgespuckt wurde.
Es lag daran, dass ich das Feld als ein [50][50] Feld definiert habe, und aus irgendeinem Grund zur Initialisierung bis [100][100] aufgefüllt habe -> mich wunderts, dass das überhaupt funktioniert^^.
Aber langsam treibt mich das Programm in die Verzweiflung: Es funktioniert fast perfekt doch nach dem 5. Prozess tauchen 4 Prozesse auf die einfach sagen - Ich lass mich nicht sortieren, ich schreib mich dazwischen rein:eek: . Danach startets wieder bei a und ab dann ist es richtig sortiert.
Hier das Programm.
 

Anhänge

Zurück