Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » IF anweisung funktioniert nicht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.01.2016, 17:04 Uhr
dummyC



Ich bekomme bald die Krise.
unzwar möchte ich eine IF ELSE Bedingung abfragen, aber irgendwie tut der code nicht was er tun soll. Bin dazu auch noch neuanfänger

Habe ein Array erstellt welches ich per Bubblesort sortieren muss. Die Anzahl der Elemente bestimme ich per Eingabe sowie die Initialsierung auch.

Bei der Eingabe von nur einem Element und der Eingabe eines Wertes soll er es direkt ausgeben weil ja quasi bei einem Element nichts zu sortieren gibt.

aber wenn mehr als 1 Element bzw weniger als 5 elemente eingegen werden soll er es per bubblesort sortiert ausgeben.

hier mein Code


C++:
#include <iostream>
#include<cmath>
#include<iomanip>
using namespace std;
void main()

{
    double a[100];
    int n = 0;


    cout << " Gebe die Anzahl der Elemente ein ";
    cin >> n;

    cout << endl;
    cout << "Gebe die Elemente ein" << endl;

    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }

    //Fall 1 ein Element
    if (n = 1)
        
    for (int i = 0; i < n; i++)
    {
        cout << "Element sortiert:" << endl;
        cout << a[i] << endl;
    }
        

    //Fall 2 max4Elemente
    else if (n<=4)

    for (int i2 = 0; i2 <= n; i2++)    // bubblesort
    {
        int temp;
        for (int j = 0; j<n; j++)
        {

            if (a[j]>a[j + 1])
            {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
            // Sortierte Ausgabe
        cout << "Array sortiert: " << endl;
    for (int i3 = 1; i3 <= n; i3++)
    {
        cout << "\t\t\t" << a[i3] << endl;
    }

        
    }


    
}    

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.01.2016, 20:38 Uhr
~f.-th.
Gast


Typischer Fehler ist fast jedem schon mal unterlaufen.



C++:
    //Fall 1 ein Element
    if (n = 1)
        
    for (int i = 0; i < n; i++)
    {
        cout << "Element sortiert:" << endl;
        cout << a[i] << endl;
    }



Schau dir die Zeilen noch mal ganz genau an.
Dein Compiler glaubt du willst das so.

MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.01.2016, 02:31 Uhr
dummyC



Ok, jetzt funktionierts einigermaßen, aber bei der Ausgabe der Else also wenn ich mehr wie 1 element eingebe, bekomm ich mehrmals das sortierte ergebnis angezeigt, woran kann es liegen? :S
Hier ein screenshot um es besser zu verdeutlichen
www.directupload.net/file/d/4228/wjk3pgmg_png.htm

Dieser Post wurde am 09.01.2016 um 03:14 Uhr von dummyC editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.01.2016, 04:48 Uhr
Hans
Library Walker
(Operator)


Hi,

ich hab Deinen Quelltext mal neu formatiert unbd um ein paar Kommentare ergänzt. - Dadurch sollte Dir der Grund für die mehfachen Ausgaben jetzt schnell auffallen.

C++:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include<cmath>
#include<iomanip>

using namespace std;

int main()
{
    double a[100];
    int n = 0;


    cout << " Gebe die Anzahl der Elemente ein ";
    cin >> n;

    cout << endl;
    cout << "Gebe die Elemente ein" << endl;

    for (int i = 0; i < n; i++)
        {
            cin >> a[i];
        }

    //Fall 1 ein Element
    if (n == 1)
        for (int i = 0; i < n; i++)  // Da Du hier nur ein Element ausgeben willst, kannst Du
            {                        // Dir die Schleife auch sparen.  
                cout << "Element sortiert:" << endl;
                cout << a[i] << endl;
            }

    //Fall 2 max4Elemente
    else if (n<=4)
        for (int i2 = 0; i2 <= n; i2++)    // bubblesort
            {
                int temp;
                for (int j = 0; j<n; j++)
                    {

                        if (a[j]>a[j + 1])
                            {
                                temp = a[j];
                                a[j] = a[j + 1];
                                a[j + 1] = temp;
                            }
                    } // for j
                // Sortierte Ausgabe
                cout << "Array sortiert: " << endl;
                for (int i3 = 1; i3 <= n; i3++)  // Hier klassischer Fehler der Kategorie
                    {                            // "um 1 daneben".
                        cout << "\t\t\t" << a[i3] << endl;
                    } // for i3
            } // for i2
    return 0;        
} // main()



Den Fehler der Kategorie "um 1 daneben" solltest Du ebenfalls schnell finden, da ich die Stelle ja auch markiert habe. Dieser Fehler ist für die Ausgabe der komischen Zahl verantwortlich, die Du nicht eingegeben hat.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 09.01.2016 um 04:51 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.01.2016, 15:00 Uhr
dummyC



nach mehrmaligem suchen probieren etc komme ich leider nicht drauf wo der fehler ist wie gesagt bin absoluter anfänger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.01.2016, 19:24 Uhr
~f.-th.
Gast


Hast noch 2 Fehler drin.
Hatte erst auch die Vermutung wie Hans, das die Ausgabe auf ein nicht definiertes Feld zugreift. Ausgaben in C oder C++ beginnen meist mit "feld[0]".

Zum Zweiten ist in der Bubble-Sort-Funktion noch nicht alles okay.
In den folgenden Zeilen musst du noch mal sehen wie du es besser hin bekommst:

C++:
        for (int i2 = 0; i2 <= n; i2++)    // bubblesort
            {
                int temp;
                for (int j = 0; j<n; j++)



MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.01.2016, 22:45 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von dummyC:
nach mehrmaligem suchen probieren etc komme ich leider nicht drauf wo der fehler ist wie gesagt bin absoluter anfänger


Okay, also die mehrfache Ausgabe kommt daher, dass Du Schleife zum ausgeben innerhalb der Sortierschleife des Bubblesort hast. Die muss aber dahinter.


Zitat von ~f.-th.:
Hatte erst auch die Vermutung wie Hans, das die Ausgabe auf ein nicht definiertes Feld zugreift.

Was durch einen Debugger auch bestätigt wird. - Jedenfalls zeigt mir der OpenWatcom Debugger das so an.

Der Fehler, den ~f.-th. meint, dürfte das int temp; innerhalb der Schleife sein. Das sollte man besser davor definieren, weil es sonst innerhalb der Schleife bei jedem durchlauf neu erzeugt wird. Also:

C++:
  for (int i2 = 0; i2 <= n; i2++)    // bubblesort
            {
                int temp;
                ... // sonstiger Code
            }


ergibt im Speicher 3 mal die Variable temp, wobei jede nur einmal benutzt wird. Besser ist es, wenn man das so macht:

C++:
  int temp;
  for (int i2 = 0; i2 <= n; i2++)    // bubblesort
            {
                ... // sonstiger Code
            }



@~f.-th.: Kann natürlich sein, dass der Compiler das so optimiert, dass temp doch nur einmal existiert, aber wenn ich mich nicht irre, muss das ja nicht so sein.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.01.2016, 08:24 Uhr
~f.-th.
Gast


Nein, das mit dem temp ist kein Problem.


Zitat von Hans:


C++:
  for (int i2 = 0; i2 <= n; i2++)    // bubblesort
            {
                int temp;
                ... // sonstiger Code
            }


ergibt im Speicher 3 mal die Variable temp, wobei jede nur einmal benutzt wird.
Hans

Die Variable temp sollte, wenn die erste zuständige Klammer zu ist, im Speicher vergessen sein. Es soll einige ältere Compiler geben, die das nicht so handhaben. Also ist temp für aktuelle Compiler nur einmal im Speicher erkennbar.

So sollte folgender Quelltext den aktuellen C++ Ideen entsprechen:

C++:


if (a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
[/cpp]



In den for-Schleifen greift das Programm hin und wieder daneben?

Teste mal ob diese Variante besser ist?


C++:
        for (int passes = 0;  passes < n - 1;  passes++)  // ob du i oder passes schreibst ist fürs Ergebnis egal
        {
            for (int j = 0;  j < n - passes - 1;  j++)
            {
                if (a[j] > a[j+1])



Hoffe mal das ich das ohne Vorschau passend hingebogen habe?
Ich mach dieses nur ein wenig damit meine grauen Zellen nicht einrosten - daher kann ich mich auch irren

MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.01.2016, 08:43 Uhr
~f.-th.
Gast


Da ich beim paste und copy mal daneben gegriffen habe, sorry, hier der Quelltext-Abschnitt zusammenhängend etwas länger:


C++:
   //Fall 2 max4Elemente
    else if (n<=4)

        //Bubble Sorting begins
        for (int passes = 0;  passes < n - 1;  passes++)
        {
            for (int j = 0;  j < n - passes - 1;  j++)
            {
                if (a[j] > a[j+1])
                {
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                }
            }
        }  //Bubble Sorting finished
    // Sortierte Ausgabe
    cout << "Array sortiert: " << endl;
    for (int i3 = 0; i3 < n; i3++)



MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.01.2016, 22:31 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von ~f.-th.:

In den for-Schleifen greift das Programm hin und wieder daneben?


Wann sollte das passieren?
Das kommt doch meisstens dann vor, wenn man beim zählen nicht aufpasst und zu weit oder nicht weit genug zählt. Und dabei liegt man oftmals nur um eins daneben, was meisst an der Formulierung der Abbruchbedingung liegt, die dann

C++:
if (n < something)...

oder
C++:
if (n <= something)...

heissen muss. Das stimmt hier aber so, wie es geschrieben steht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 10.01.2016 um 22:33 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: