im Unterricht müssen wir derzeit ein Programm schreiben, bei dem es darum geht eine Prüfstatistik zu erstellen (Min. / Max. / Durchschnitt). Das hat eigentlich auch gut funktioniert. Nun sollen wir das Programm aber so erweitern, dass die Zahlen sortiert ausgegeben werden (mit dem Bubblesort-Algorithums als Funktion). Ich habe bereits damit angefanen. Allerdings komme ich nicht weiter, da ich nicht weiß, wie ich einen Array aus einer Funktion zurück geben soll.
Hier mal mein Code:
Code:
> #include "stdafx.h"
> #include <iostream>
> #include <iomanip>
> #define Zahl 30
>
> using namespace std;
>
> // Name der Funktion
> double Durchschnitt(int Punktzahl[], int Teilnehmerzahl);
> int MIN(int Punktwerte[], int Anzahl_Teilnehmer);
> int MAX(int Erreichte_Punkte[], int Prüflinge);
> int sort(int P[], int T);
>
> int _tmain(int argc, _TCHAR* argv[])
> {
>
> // Deklaration der Variablen
> int i;
> int Teilnehmer = 0;
> int Punkte[Zahl];
> int a = 1;
>
>
> // Zahl soll mit 2 Nachkommastelle ausgegeben werden
> cout << fixed << setprecision(2) << endl;
>
>
> //Ausgabe Überschrift
> cout << "PRUEF-STATISTIK" << endl;
> cout << endl << endl;
>
>
> // for-Schleife
> for (i = 0; i < Zahl; i++)
> {
>
> // Eingabeaufforderung - Eingabe
> cout << "Bitte geben Sie Ihre Punktzahl ein (Abbruchbedingung
> Eingabe = -1): ";
> cin >> Punkte[i];
>
>
> // if-Verzweigung
> if (Punkte[i] == -1)
> {
> break;
> }
>
> else
> {
> Teilnehmer += 1;
> }
>
> }
>
> cout << endl << endl;
>
>
> // for-Schleife
> for (i = 0; i < Teilnehmer; i++)
> {
> // Ausgabe
> cout << Punkte[i] << endl;
> }
>
>
>
> cout << endl << endl;
>
>
>
> // for-Schleife
> for (i = 0; i < Teilnehmer; i++)
> {
> // Ausgabe
> cout << sort(Punkte, Teilnehmer) << endl;
> }
>
>
> // Ausgaben
> cout << endl << endl; // Aufruf der Funktion mit
> Übergabeparametern
> cout << "Der Durchschnitt betraegt: " << Durchschnitt(Punkte,
> Teilnehmer) << endl;
>
> cout << endl << endl; // Aufruf der Funktion mit
> Übergabeparametern
> cout << "Die kleinste erreichte Punktzahl betraegt: " <<
> MIN(Punkte, Teilnehmer) << endl;
> // Aufruf der Funktion mit Übergabeparametern
> cout << "Die groesste erreichte Punktzahl betraegt: " <<
> MAX(Punkte, Teilnehmer) << endl;
>
> cout << endl << endl;
> system("pause");
> return 0;
> }
>
>
> // Funktion
> double Durchschnitt(int Punktzahl[], int Teilnehmerzahl)
> {
> double ergebnis = 0;
> int b;
> for (b = 0; b < Teilnehmerzahl; b++)
> {
> ergebnis += Punktzahl[b];
> }
>
> // Rückgabewert
> return ergebnis / Teilnehmerzahl;
>
> }
>
>
> // Funktion
> int MIN(int Punktwerte[], int Anzahl_Teilnehmer)
> {
> int min;
> int c;
> min = Punktwerte[0];
>
> for (c = 0; c < Anzahl_Teilnehmer; c++)
> {
> if (Punktwerte[c] < min)
> {
> min = Punktwerte[c];
> }
> }
>
> // Rückgabewert
> return min;
> }
>
>
> // Funktion
> int MAX(int Erreichte_Punkte[], int Prüflinge)
> {
> int max;
> int d;
> max = Erreichte_Punkte[0];
>
> for (d = 0; d < Prüflinge; d++)
> {
>
> if (Erreichte_Punkte[d] > max)
> {
> max = Erreichte_Punkte[d];
> }
> }
>
> // Rückgabewert
> return max;
> }
>
> int sort(int P[], int T)
> {
> int Hilfsfeld;
> int i;
> int j;
>
> for (j = 0; j < (T - 1) ; i++)
> {
> for (i = 0; i < (T - 2); i++)
> {
> if (P[i] > P[i + 1])
> {
> Hilfsfeld = P[i];
> P[i] = P[i + 1];
> P[i + 1] = Hilfsfeld;
>
> }
>
> return P;
> }
>
>
> }
>
>
>
> }
Um nicht gleich einen weiteren Thread aufzumachen brauche ich noch bei einer anderen Sache Hilfe.
Dabei geht es darum, dass eine Tabelle mit Zufallszahlen (1-10) erstellt werden soll, welche ich auch bereits erstellt habe. Nun soll die Anzahl der gleichen Zufallszahlen gezählt werden. Dazu soll man einen weiteren Array erstellen, welcher 10 Felder für die einzelnen Zahlen besitzen soll. Dieses Array soll dann die Anzahl der einzelnen Zahlen ausgeben. Bsp. Zahl 1 kommt 350 mal vor, Zahl 2 kommt 120 mal vor u.s.w. ....
Leider klappt es bei mir gar nicht. Zwar habe ich bereits etwas ausprobiert, aber irgendwie stimmt es glaube ich nicht ganz. Es sollen auch keine Zeiger oder Pointer verwendet werden, wenn möglich.
Code:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#define Zahl 10000
#define Elemente 10
using namespace std;
int zaehlen(int Zahlen[], int Anzahl, int Tab[]);
//int Zaehlen(int )
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int j;
int Zufallszahl[Zahl];
int Tabelle[Elemente];
int Anzahl = 0;
cout << "ZUFALLSZAHLEN ZAEHLEN" << endl;
cout << endl << endl;
for (i = 0; i < Zahl; i++)
{
Zufallszahl[i] = rand() % 10 + 1;
cout << Zufallszahl[i] << setw(1) << "";
}
cout << endl << endl;
for (j = 0; j < Elemente; j++)
{
cout << zaehlen(Zufallszahl, Anzahl, Tabelle) << endl;
}
cout << endl << endl;
system("pause");
return 0;
}
int zaehlen(int Zahlen[], int Anzahl, int Tab[])
{
int i;
int j;
int zaehler = 0;
for ( i = 0; i < (Anzahl - 1); i++)
{
for (j = i + 1; j < Anzahl; j++)
{
if (Zahlen[i] == Zahlen [j])
{
Tab[zaehler] = Zahlen[i];
zaehler++;
}
}
}
return Tab[zaehler];
}
Was ist das denn für eine dumme Aussage...
Ich habe meine Codes vorgelegt und komme nicht weiter bzw finde den Fehler nicht.
Ich sitze an den Aufgaben schon ne Weile.
Glaubst du nicht ich habs nicht selbst probiert?! Echt...
Wenn du nichts produktives zu sagen hast dann sei gefälligst still.
Allerdings komme ich nicht weiter, da ich nicht weiß, wie ich einen Array aus einer Funktion zurück geben soll.
Kurz gesagt: gar nicht.
Lang: In C und C++ sind Arrays nichts anderes als Pointer mit Offset als Index, das bedeutet, wenn du ein Array als Funktionsargument übergibst, hast du damit grob gesagt (sehr grob!) eine implizite Liste von Pointern auf Integer übergeben.
Damit kannst du also die Inhalte deines Arrays in der Funktion ändern ohne es zurückgeben zu müssen.
Die Rückgabe ist also nicht nötig und falls die Sortierung funktioniert, sollte es so schon klappen.
Zitat:
Leider klappt es bei mir gar nicht. Zwar habe ich bereits etwas ausprobiert, aber irgendwie stimmt es glaube ich nicht ganz. Es sollen auch keine Zeiger oder Pointer verwendet werden, wenn möglich.
Kann das vielleicht an 'Anzahl' liegen? Da 'zaehlen()' mit 'Anzahl'=0 aufgerufen wird, sollte da auch nichts groß passieren...
Allgemein versteh ich nicht ganz, was du mit 'zaehlen()' berechnest, aber die Anzahl der einzelnen Zufallszahlen scheint es nicht zu sein. (Die 2. for-Schleife kann mehr als ein mal ausgeführt werden.)
Probier es vielleicht mal so:
Code:
void zaehlen(rands[], tab[]){
for(i in {1, ..., Elemente}){
tab[i-1] <- 0
for(index in {1, ..., Zahl}){
if(rands[index-1] == i) then tab[i-1] <- tab[i-1] + 1
}
}
}
Der Pseudo-Code sollte hoffentlich verständlich sein. Beachte, dass die Anzahl der Vorkommen von i dann bei tab[i-1] steht.
Wenn du nichts produktives zu sagen hast dann sei gefälligst still.
Dummerweise hat er recht. Fehlersuche gehört nun mal auch dazu. Du "rotzt" hier einige Zeilen absoluten schlechten Code hin und willst jetzt dass ihn dir andere leute so hinfrickeln dass er läuft.
Das funktioniert, wie man sieht, ja auch und ist kein Problem aber das ist kein Grund Leute anzufahren die das anders sehen.
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
Du "rotzt" hier einige Zeilen absoluten schlechten Code hin und willst jetzt dass ihn dir andere leute so hinfrickeln dass er läuft.
Wirklich sehr rücksichtsvoll und ermutigend für jemanden der gerade mal im ersten Lehrjahr der Ausbildung ist.
Und ich habe erwähnt, das ich da schon ne weile dran sitze...
Zitat:
Zitat von spartan-b292
Dummerweise hat er recht.
Ich finds halt nicht nett, wenn man mich so blöd anfährt. Als ob ich mich nicht selbst bemühe und denke hier wird alles gemacht.
Ich bin nun mal kein Profi...
Du kannst jetzt natürlich beleidigt sein oder du nimmst einfach noch einige Tipps an.
1) Versuche dein Problem (=>Die Aufgabe die du lösen willst) in kleine(re) Teilprobleme zu zerlegen und diese dann zu lösen. Dann kannst du die Teile einfach(er) testen und somit den Fehler viel besser eingrenzen.
2) Lerne mit deiner IDE und einem Debugger umzugehen auch damit lassen sich Probleme besser finden.
3) Wenn du fragst, mach es den Leuten die du fragst so einfach wie möglich, dir zu helfen. Nimm mal dein Code aus dem 1. Beispiel. Du hast nicht mal die ">" entfernt die du vermutlich im Editor mitkopiert hast. Damit ich den Code jetzt ausführen könnte müsste ich erst mal jedes ">" entfernen.
Außerdem ist es immer leichter wenn du nur den Teil postest bei dem ein/der Fehler auftritt (siehe Punkt 1).
4) Arbeite ein wenig an deinem Programmierstil. Du verwendest oft nichts sagende Variablen wie d, j, i. Es empfiehlt sich mMn "sprechende Variablennamen" zu benutzen. Also z.B. die Teilnehmerzahl nicht in int i sondern in int teilnehmerzahl speichern.
Wenn du Kommentare schreibst, schreibe sinnvolle Kommentare. Kommentare wie 'for-Schleife' sind wenig hilfreich. Dass das eine for-schleife ist sehe ich selbst, aber nicht was du dir dabei gedacht hast/was in der Schleife gemacht wird.
Sei mit deiner Namensgebung konstant. Im 1. Beispiel hast du 3 unterschiedliche Schreibstile für deine Funktionsnamen verwendet. Großeranfangsbuchstabe() kleineranfangsbuchstabe() ALLESGROSS(). Das macht es nicht alles einfacher, weder dir noch den Leuten die dir helfen wollen.
Einrückungen sind sehr hilfreich für alle Beteiligten um den Code schneller zu verstehen. Wenn du einrückst rücke konstant ein.
using namespace std; ist schlechter Stil und solltest du dir gar nicht angewöhnen.
Ich glaube das sind alles Sachen die man auch von jemanden im 1. Lehrjahr erwarten kann.
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
Folgendes Mitglied bedankte sich bei spartan-b292:
Kurz gesagt: gar nicht.
Lang: In C und C++ sind Arrays nichts anderes als Pointer mit Offset als Index, das bedeutet, wenn du ein Array als Funktionsargument übergibst, hast du damit grob gesagt (sehr grob!) eine implizite Liste von Pointern auf Integer übergeben.
Damit kannst du also die Inhalte deines Arrays in der Funktion ändern ohne es zurückgeben zu müssen.
Diese Aussage ist leicht verwirrend. Zuerst ist es ein "Gar nicht", anschließend knüpfst du eine Bedingung an ("..wenn du ein Array als Funktionsargument übergibst,..").
Das ganze nennt sich call by reference, weist du aber bestimmt schon
Die Geschichte mit den Pointern ist richtig. Aber es kann auch der Fall vorkommen, das ich in einer Funktion ein Array erstelle und den Pointer darauf zurückgebe.
Soweit ich weis, ist es in C++ egal, ob ich dann ein
Code:
int* arr
oder ein
Code:
int arr[]
zurückgebe. In beiden Fällen wäre es aber der return eines Arrays.