Zahlen sortieren in C

12/04/2006 13:15 lugh#1
Bräuchte nochmal ein klein bisschen hilfe bei einer C aufgabe.

Ich muss eine zahlenfolge eingeben maximal 20zahlen und diese sortiert ausgeben, aber jeder durchlauf soll angezeigt werden, soweit so gut das programm läuft auch, jedoch hab ich 2 sachen die mich sehr stören

1. Man muss jetzt -1 eingeben wenn man keine zahlen mehr eingeben möchte, bekomme es aber irgendwie nur so hin, fände es besser wenn man am ende enter drückt und fertig ;)
2. Fänd ich es schöner wenn man nicht nach jeder zahl Enter eingeben muss, sondern das ganze einfach mit einem lerrzeichen gelöst wird, jedoch habe ich dann das problem das es nur bei genau 20 Zahlen geht

Wäre vielleicht jemand so nett und schaut mal drüber?

Hier der Code

Code:
#include <stdio.h>

int main(int argc, char *argv[]){
	int zahlen[20];
	int zahl_min,zahl_pos;
	int i,x,z,temp=0;
	int c;
	int scanner_count = 0;
	int temp_zahl = 0;
	int arraysize=0;
	
	/*FIX: problem wenn dateiende: CR+LF*/
	/*FIX: zahleneingabe von mir muss mit -1 beendet werden*/
	int a=0,old_a,new_a;
	printf("EOF:%i\n\n",EOF);
	/*einlesen der daten solange bis EOF erreicht ist*/
	while(a<20){
 if(a==0){
 	/*als Information für den benutzer*/
 	printf("Da EOF -1 ist, wird die Eingabe automatisch beendet, wenn Sie -1 eingeben\noder die Datei -1 enthaelt!!!!\n\n");
 }
 old_a = a;
 printf("\n%i. Wert: ",a+1);
 new_a = scanf("%i",&zahlen[a]);
 printf("-->%i",zahlen[a]);
 a+=new_a;
 if((x = getchar()) == EOF || zahlen[a-1] == EOF) break;
 /*printf("%i-->%i||%i||%i\n",zahlen[a-1],a,old_a,new_a);*/
 arraysize++;
	}	
	
	
	/*Ausgabe der eingelesenen Werte*/
	printf("\nAnzahl der eingelesenen Werte = %i\n",arraysize);
	/*Ausgabe der unsortierten Daten */
	printf("Ausgabe der unsortierten Zahlen:\n\t\t\t");
	for(i=0;i<arraysize;i++){
 printf("%i\t",zahlen[i]);
	}
	printf("\n");
	
	/*Daten werder sortiert*/
	for(z=0;z<arraysize-1;z++){
/*-1 da letzter wert nicht mehr geprüft werden muss*/
 zahl_min = zahlen[z];
 zahl_pos = z;
 for(x=z+1;x<arraysize;x++){
 	if(zahlen[x] < zahl_min){
  zahl_min = zahlen[x];
  zahl_pos = x;
 	}
 }
 /*hier werden daten getauscht*/
 temp = zahlen[z];
 zahlen[z] = zahlen[zahl_pos];
 zahlen[zahl_pos] = temp;
 
 /*ausgabe der sortierten daten*/
 printf("Durchlauf %i\t",z+1);
 for(i=0;i<arraysize;i++){
 	printf("\t%i",zahlen[i]);
 }
 printf("\n");
	}
	
	return 0;
}
12/04/2006 19:19 99345#2
um dein problem mit der eingabe zu lösen: mach die eingabe der zahlen in eine while schleife wobei (!(eingabe<0)) die bedingung ist. das sollte so lange werte aufnehmen, bis die eingabe einen negativen wert ergibt...
12/04/2006 20:39 NoName#3
mache nicht wirklich c aber mit der eingabe und leerzeichen würde ich das so machen einlesen als string dann ne split/explode auf leerzeichen (wenn es das in c gibt) und dann haste die zahlen in ne array das dann noch das int konvertieren, wenn es sowas wie split/explode nicht gibt, halt als string einlesen dann nach ne leerzeichen suchen den teil bis zum leerzeichen rausschneiden und nach dem nächsten suchen etc, solange das array dynamisch ist isses auch egal wieviel zahlen eingegeben werden
12/05/2006 00:27 KoyTheOne#4
du machst dir zuviel arbeit bei den syntaxen und denkst zu wenig.
das ist ja nen regelrechter spam code ^^

#include <set>
#include <iostream>
int main(void)
{
std::set <int>s;
int i=0;
std::cout << "Zahlen eingeben, Buchstaben zum Beenden&#092;n";
while( scanf( "%d", &i ) > 0 )
s.insert( i );
for( std::set<int>::iterator it = s.begin(); it != s.end(); ++it )
std::cout << *it << "&#092;n";
return 0;
}

oder so ?!
12/05/2006 09:43 lugh#5
Quote:
Originally posted by KoyTheOne@Dec 5 2006, 00:27
du machst dir zuviel arbeit bei den syntaxen und denkst zu wenig.
das ist ja nen regelrechter spam code ^^

#include <set>
#include <iostream>
int main(void)
{
std::set <int>s;
int i=0;
std::cout << "Zahlen eingeben, Buchstaben zum Beenden&#092;n";
while( scanf( "%d", &i ) > 0 )
s.insert( i );
for( std::set<int>::iterator it = s.begin(); it != s.end(); ++it )
std::cout << *it << "&#092;n";
return 0;
}

oder so ?!
huch die befehle hab ich ja noch nie gesehen ;(

bräuchte wie gesagt nur eine änderung das man NICHT MEHR -1 eingeben muss zum beenden, am liebsten den ganzen oberen krempel (einlesen so um schreiben das man die zahlen so in der art einlesen kann 1 4 2 5 7 2 5 11 23 4 [Enter] )

und dann die berechnung kommt, aber das bekomme ich nicht hin ;(
12/07/2006 14:31 KoyTheOne#6
mach doch ne ascii code abfrage enter = 23
01/02/2007 16:02 x]vIrus[x#7
enter = 13 :p
01/03/2007 12:18 Ultima#8
Vergiss alle posts bis hierher die haben alle nicht gelesen das es C sein soll

die andere lösung war c++ und coders beschreibung geht nicht weils keine dynamischen arrays gibt

ich editier gleich hier ne lösung rein muss nur eben mal los^^
01/03/2007 13:00 caytchen#9
Quote:
Originally posted by Ultima@Jan 3 2007, 12:18
Vergiss alle posts bis hierher die haben alle nicht gelesen das es C sein soll

die andere lösung war c++ und coders beschreibung geht nicht weils keine dynamischen arrays gibt

ich editier gleich hier ne lösung rein muss nur eben mal los^^
Es gibt auch in C in bestimmtem Rahmen dynamische Arrays, die Arraygröße muss nicht zwangsweise zur compile-time bekannt sein sondern kann auch während dem laufenden Programm ermittelt werden.

Code:
int x = strlen&#40;&#34;eine User-Eingabe&#34;&#41;;
int *arr = new int&#91;x&#93;;
Ansonsten ist die C++-Variante natürlich um einiges schöner. Werd dazu auch nachher nochmal was posten ;)
Um genau zu sein jetzt, die ultra stylische C++/Boost-Variante:

Code:
#include &#60;iostream>
#include &#60;string>
#include &#60;algorithm>
#include &#60;boost/tokenizer.hpp>
#include &#60;boost/lexical_cast.hpp>

class sort_desc
{
public&#58;
	int operator&#40;&#41; &#40;const int a, const int b&#41; const
	{
 return a > b;
	}
}; 

int main&#40;&#41;
{
	std&#58;&#58;string input;
	std&#58;&#58;vector&#60;int> zahlen;
	std&#58;&#58;cout &#60;&#60; &#34;Geben sie die Zahlen ein, jeweils mit einem Semikolon zwischen jeder&#58;&#092;n&#34;;
	std&#58;&#58;cin >> input;

	boost&#58;&#58;char_separator&#60;char> sep&#40;&#34;;&#34;&#41;;
	boost&#58;&#58;tokenizer&#60;boost&#58;&#58;char_separator&#60;char> > teile&#40;input, sep&#41;;
	for &#40;boost&#58;&#58;tokenizer&#60;boost&#58;&#58;char_separator&#60;char> >&#58;&#58;const_iterator it = teile.begin&#40;&#41;; it != teile.end&#40;&#41;; ++it&#41;
	{
 std&#58;&#58;string part = *it;
 int final;
 try {
 	final = boost&#58;&#58;lexical_cast&#60;int>&#40;part&#41;;
 	zahlen.push_back&#40;final&#41;;
 }
 catch &#40;boost&#58;&#58;bad_lexical_cast&#41;
 {
 	std&#58;&#58;cout &#60;&#60; &#34;Teilstring '&#34; &#60;&#60; part &#60;&#60; &#34;' ist keine Zahl und wird daher nicht beruecksichtigt.&#092;n&#34;;
 }
	}

	sort&#40;zahlen.begin&#40;&#41;, zahlen.end&#40;&#41;, sort_desc&#40;&#41;&#41;;
	std&#58;&#58;cout &#60;&#60; &#34;Sortierte Zahlen&#58; &#092;n&#34;;
	copy&#40;zahlen.begin&#40;&#41;, zahlen.end&#40;&#41;, std&#58;&#58;ostream_iterator&#60;int>&#40;std&#58;&#58;cout, &#34; &#34;&#41;&#41;;
}
Komplett mit Erkennung von falschen Eingaben und dies und das :cool:
01/03/2007 13:29 Ultima#10
mit dynamishcen array is gemeint die array größe zu einem späteren zeitpunkt zu verändern

und ansonsten kann man mit c alles machen nur man muss es per hand machen gibt halt nix fertiges so war es gemeint
01/03/2007 17:00 x]vIrus[x#11
Code:
 int c,pos,merker,endpos=5;
 int zahlen&#91;&#93;={8,10,2,7,11};
 for &#40; pos=0&#59; pos &#60; endpos&#59; pos++ &#41;
 {
  for&#40; c=pos+1&#59; c&#60;endpos&#59; c++ &#41;
  {
   if &#40; zahlen&#91;pos&#93; > zahlen&#91;c&#93; &#41; {
    merker=zahlen&#91;pos&#93;;
    zahlen&#91;pos&#93;=zahlen&#91;c&#93;;
    zahlen&#91;c&#93;=merker;
   }
  }
 }
 for&#40; pos=0;pos&#60;endpos;pos++&#41;
 {
  printf&#40;&#34;%i &#34;,zahlen&#91;1&#93;&#41;;
 }
:)
01/08/2007 11:27 SilonVier#12
Quote:
Originally posted by Ultima+Jan 3 2007, 13:29--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (Ultima @ Jan 3 2007, 13:29)</td></tr><tr><td id='QUOTE'>
mit dynamishcen array is gemeint die array größe zu einem späteren zeitpunkt zu verändern[/b]

So wie malloc und realloc? :-)

<!--QuoteBegin--Ultima
@Jan 3 2007, 13:29
und ansonsten kann man mit c alles machen nur man muss es per hand machen gibt halt nix fertiges so war es gemeint [/quote]
Was C++ angeht, könnte ich dir hier nicht ohne Beispiele zustimmen.
02/10/2011 09:27 TheLeFreak#13
Also ich code jetzt seit ner Woche oder so und bin noch ein newbie, also bitte nicht zu hart rannehmen ;)

Ich muss ein Programm schreiben, welches 10 Zahlen, die ich beliebig eingebe, von klein nach Groß sortiert - Mit Hilfe des vergleichens nebeneinander stehender Zahlen- in C.


Ich habe schon einen Code:

 
#include <stdio.h>
int main(int argc, char *argv[]){
int a,x,i,temp=0;
int zahlen[10];
int z=0,alt_z,neu_z;
int scanner_count=0;
int temp_zahl=0;
int zahl_min,zahl_pos;
int arraysize=0;
/*Zahleneingabe wird Aufgefordert*/
printf("\nBitte geben Sie 10 Zahlen ein\n");
while (z<10){
alt_z=z;
printf("\n%i. Zahl: ",z+1);
neu_z=scanf("%i",&zahlen[z]);
printf(" --> %i\n", zahlen[z]);
z+=neu_z;
arraysize++;
/*Daten sortieren*/
for(a=0; a<10; a++){
zahl_min=zahlen[a];
zahl_pos=a;
for(x=0; x<10; x++){
if(zahlen[z]>zahlen[z+1]){
/*tauschen*/
}
temp=zahlen[a];
zahlen[a]=zahlen[zahl_pos];
zahlen[zahl_pos] = temp;
}
}
}
printf("\n\nSortiert\t",z);
printf("\n--------------------------------------------------");
for(i=0;i<arraysize;i++){
printf("\n\t%i",zahlen[i]);
}
printf("\n\n");
return 0;
}


Mein Problem liegt beim Sortieren und beim Ausgeben.

Bitte! Ich brauche es bis spätestens Morgen :/



Uups der Blog is ja schon 4 Jahre alt... sorry :)
02/10/2011 16:13 ZackBlack#14
Hi, würd mal sagen so ist das leichter lesbar.
Ich würds so ählich machen(bzw. würd ichs so machen wenn es eh nicht schon vektoren und strings gibt die mir die Arbeit abnehmen :D):
Code:
int max = 32700;
int zahlen[max] = 0;
int zahl;
//C++ kannst du wohl überstezen?
for(i= 0; i<= 10; i++)
{
cin >> zahl; //zahl einlesen
zahlen[zahl] = zahl;
}
for(i = 0; i < max; i++)
{
if(zahlen[i])//Wenn Zahl nicht 0 ist.
cout << zahlen[i] <<"," <<endl;  //Alle Zahlen die nicht 0 sind ausgeben. Sind ja dann schon in der richtigen Reihenfolge.
Bin aber auch n nub und hab das jetzt nicht kompiliert, kA ob es geht.