wertübergabe anfänger

nitro-Merlin

Mitglied
hi, ich habe folgendes programm geschrieben, dass bubblesort beherrscht.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>

/* das zu entwickelnde Programm soll das Folgende leisten:

   Eine Anzahl von max. 25 Integer-Werten ist in einem ARRAY zu
   speichern, wobei die Werte wahlweise von der Tastatur
   einzugeben oder per Zufall zu erzeugen sind.
   Danach sollen die Werte unsortiert auf dem Bildschirm ausgegeben,
   sortiert und wieder ausgegeben werden.
   Die Variable 'anzahl' dient dazu, die Feldgroesse temporaer zu
   begrenzen (vor allem bei der Eingabe der Elemente von der
   Tastatur), also nicht immer das gesamte Feld zu verwenden.
*/

#define MAX 5

int main(void)
{ int feld[MAX];
  int anzahl=0,i,tausch,end,sorts; /* evtl. als Zaehler oder aehnliches zu verwenden */
  char ch;

//-------- Eingabe --------------------

  printf("\n\nEingabe der Werte\n");

  printf("\nSollen die Elemente von der Tastatur eingegeben werden (j/n) ? ");
  scanf("%i",&ch);
  do ch = toupper(getchar()); while ((ch!='J')&&(ch!='N'));
  if (ch == 'J')
  { /* Realisieren Sie hier die Eingabe der unsortierten Werte. */

   printf("\nEingabe der Elemente von der Tastatur \n");
   for(i=0; i<MAX; i++)
    {
     scanf("%i",&feld[i]);
    
    }
   
  }
   else
   { /* Erzeugung der Werte ueber Zufallszahlen */

   printf("\nErzeugung der Werte ueber Zufallszahlen \n");

   
   
     srand((unsigned)time(NULL));
     for(i=0; i<MAX; i++)
     {
   		
        feld[i] = rand()%100;
     }
   }


//-------- Ausgabe unsortiertes Feld --------------------

 printf("\n\nDas unsortierte Feld lautet:\n");
 
 
     for(i=0; i<MAX; i++)
      {
      printf("%4i\n",feld[i]);
      } 
 

/* Realisieren Sie an dieser Stelle die Ausgabe aller Werte des
   unsortierten ARRAY's.
   Beachten Sie dabei, dass je nach der moeglichen Groesse der
   eingegebenen Werte bei der Ausgabe ein Zeilenumbruch innerhalb
   einer (mehrstelligen) Zahl erfolgt bzw. dass bei groesseren
   Elementezahlen nicht alle Werte auf den Bildschirm passen.
   Versuchen Sie solche Effekte zu vermeiden.

*/

//-------- Sortieren -----------

  printf("\n\nJetzt wird sortiert, bitte gedulden Sie sich einen Moment!\n");


/* Sortieren Sie hier das Feld mit einem beliebigen Sortieralgorithmus
   (z.B. bubblesort).
	
*/
  do
  {
  sorts=0;
  end=MAX-1;
  for(i=0;i<end;i++)
	if(feld[i]>feld[i+1])
		{
			tausch=feld[i];
			feld[i]=feld[i+1];
			feld[i+1]=tausch;
			sorts++;
		}
	
	
  }	while(sorts&&(end>2));
  


//-------- Ausgabe sortiertes Feld --------------------

 printf("\n\nDas sortierte Feld lautet:\n");
 
/* Realisieren Sie an dieser Stelle die Ausgabe aller Werte des
   sortierten ARRAY's wie oben.
*/
	for(i=0; i<MAX; i++)
	   {
	   printf("%4i\n",feld[i]);
	   } 
 
 printf("\n\n");
 

 return 0;
}

nun ist die aufgabe es in funktionen zu splitter, leider schau ich da noch nich so ganz durch, ich habe also erstmal die eingabe per hand als funtkion versucht:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>

#define MAX 5

/* Funktion zur Eingabe der Zahlen per Tastatur*/
int eingabetasta()
{
	int i;
	int feld[MAX];

	printf("\nEingabe der Elemente von der Tastatur: \n");

    for(i=0; i<MAX; i++)
    {
     scanf("%i",&feld[i]);
	}
	return(feld[i]);
	
}

int main(void)
{ int feld[MAX];
  int anzahl=0,i,tausch,end,sorts; /* evtl. als Zaehler oder aehnliches zu verwenden */
  char ch;

//-------- Eingabe --------------------

  printf("\n\nEingabe der Werte\n");

  printf("\nSollen die Elemente von der Tastatur eingegeben werden (j/n) ? ");
  scanf("%i",&ch);
  do ch = toupper(getchar()); while ((ch!='J')&&(ch!='N'));
  if (ch == 'J')
  { /* Realisieren Sie hier die Eingabe der unsortierten Werte. */
	
	eingabetasta();
   
  }
   else
   { /* Erzeugung der Werte ueber Zufallszahlen */

   printf("\nErzeugung der Werte ueber Zufallszahlen \n");

   
   
     srand((unsigned)time(NULL));
     for(i=0; i<MAX; i++)
     {
   		
        feld[i] = rand()%100;
     }
   }


//-------- Ausgabe unsortiertes Feld --------------------

 printf("\n\nDas unsortierte Feld lautet:\n");
 
 
     for(i=0; i<MAX; i++)
      {
      printf("%4i\n",feld[i]);
      } 
 

/* Realisieren Sie an dieser Stelle die Ausgabe aller Werte des
   unsortierten ARRAY's.
   Beachten Sie dabei, dass je nach der moeglichen Groesse der
   eingegebenen Werte bei der Ausgabe ein Zeilenumbruch innerhalb
   einer (mehrstelligen) Zahl erfolgt bzw. dass bei groesseren
   Elementezahlen nicht alle Werte auf den Bildschirm passen.
   Versuchen Sie solche Effekte zu vermeiden.

*/

//-------- Sortieren -----------

  printf("\n\nJetzt wird sortiert, bitte gedulden Sie sich einen Moment!\n");


/* Sortieren Sie hier das Feld mit einem beliebigen Sortieralgorithmus
   (z.B. bubblesort).
	
*/
  do
  {
  sorts=0;
  end=MAX-1;
  for(i=0;i<end;i++)
	if(feld[i]>feld[i+1])
		{
			tausch=feld[i];
			feld[i]=feld[i+1];
			feld[i+1]=tausch;
			sorts++;
		}
	
	
  }	while(sorts&&(end>2));
  


//-------- Ausgabe sortiertes Feld --------------------

 printf("\n\nDas sortierte Feld lautet:\n");
 
/* Realisieren Sie an dieser Stelle die Ausgabe aller Werte des
   sortierten ARRAY's wie oben.
*/
	for(i=0; i<MAX; i++)
	   {
	   printf("%4i\n",feld[i]);
	   } 
 
 printf("\n\n");
 

 return 0;
}

es ohne kompilerfehler, aber die werte die zurückgegeben werden sind total falsch, ich schätze es liegt am return, kann mir jemand weiterhelfen?
 
Dein fehler liegt an folgenden zwei Stellen:

Code:
/* Funktion zur Eingabe der Zahlen per Tastatur*/
void eingabetasta()
{
	int i;
	int feld[MAX];

	printf("\nEingabe der Elemente von der Tastatur: \n");

    for(i=0; i<MAX; i++)
    {
     scanf("%i",&feld[i]);
	}
	return(feld[i]);
	
}

Die Funktion gibt nur einen konkreten Wert zurück, du solltest aber das ganze Feld
zurückgeben.

Dein eigentlicher Fehler kommt hier:

Code:
  if (ch == 'J')
  { /* Realisieren Sie hier die Eingabe der unsortierten Werte. */
	
	eingabetasta();
   
  }

Du verwirfst den Rückgabewert der Funktion...

Als Lösung könnte man deine Variable "feld" als Referenz an deine Funktion
eingabetasta übergeben somit machen sich alle Änderungen von "feld" innerhalb der
Funktion eingabetasta auch an der Variablen "feld" des main Programms bemerkbar,
da du ja nicht mit einer Kopie sondern mit dem original Objekt "feld" arbeitest, weil du
dieses als Referenz(Adresse) übergeben hast...
Das Beispiel könnte so aussehen:

Definition von eingabetasta:



Code:
void eingabetasta(int ref[])
{
        int i;
        printf("\nEingabe der Elemente von der Tastatur: \n");

    for(i=0; i<MAX; i++)
    {
     scanf("%i",&ref[i]);
        }
        
}

Der Aufruf im main von eigabetasta schaut dann so aus:

Code:
int feld[MAX];
....
if(ch == 'J'){
   eingabetasta(feld);
}

Ich hoffe das ist dir jetzt klarer geworden...

Gruß

RedWing
 
Zurück