Lineare Suche gibt nur einen Treffer aus - auch wenn der ...



  • Vielleicht das else in Zeile 6 weglassen.



  • nwp3 schrieb:

    Vielleicht das else in Zeile 6 weglassen.

    Hallo nwp3,

    habe ich schon probiert, der compiler sagt nichts, aber das Programm wird nicht richtig ausgegeben..oder bleibt ohne reaktion.. no 💡 ...



  • suchen muss in jedem Fall inkrementiert werden, auch wenn etwas gefunden wurde.



  • #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main()
    
    {
    
        //die maximale Anzahl der Werte
    
        const int MAX = 100;
    
        //ein Feld für die Werte
    
        int werte[MAX];
    
        //wurde schon ein Wert gefunden?
    
        bool gefunden = false;
    
        //für die Suche
    
        int suchen = 0;
    
        int kriterium = 0;
    
        //den Zufallsgenerator initialisieren
    
        srand(time(NULL));
    
        cout << "Lineare Suche" << endl;
    
        //die Werte setzen, benutzt werden zufällige Zahlen bis 200
    
        for (int index = 0; index < MAX; index++) {
    
            werte[index] = rand() % 200;
    
        }
    
        //zur Kontrolle ausgeben
    
        cout << "Die Werte sind: " << endl;
    
        for (int index = 0; index < MAX; index++)
    
            cout << werte[index] << ' ';
    
        cout << endl;
    
        //Abfrage des Suchkriteriums
    
        cout << "Wonach soll gesucht werden? ";
    
        cin >> kriterium;
    
        //und jetzt suchen, bis das Ende erreicht wurde oder die Zahl gefunden wird
    
        for (int index = 0; index < MAX; index++) {
    
            if (werte[index] == kriterium)
    		{  
    			cout << "Der Wert " << kriterium << " befindet sich an der Position " << index + 1 << endl;
    
    			gefunden = true;
    		}
    	}
    
        if (gefunden != true)
            cout << "Der Wert " << kriterium << " wurde nicht gefunden. " << endl;
    
        return 0;
    }
    


  • Off-Topic: Es wäre um einiges angenehmer, wenn du bei deinem Code unnötige Leerzeilen herauslöschen würdest. Ist viel besser.

    Beim vorherigen Lösungsvorschlag müsste suchen noch inkrementiert werden, sonst wird die Variable umsonst deklariert.



  • #include <iostream>
    #include <ctime> // Hast du vergessen, einzubinden
    using namespace std;
    
    int main() 
    {
    	srand(time(NULL)); // Macht man ganz am Anfang.
    
        const int MAX = 100; 
        int werte[MAX];
    
        cout << "Lineare Suche" << endl; 
        for (int index = 0; index < MAX; index++)
    	{
    		 werte[index] = rand() % 200; // Liefert Werte von 0 bis 199.
        }
    
        cout << "Die Werte sind: " << endl;
        for (int index = 0; index < MAX; index++)
    	{
    		cout << index << " == " << werte[index] << endl;
    	}
        cout << endl;
    
    	int kriterium = 0;
        cout << "Wonach soll gesucht werden? ";
        cin >> kriterium; // kriterium brauchst du doch erst hier. Was hat die Definition da ganz oben verloren?
    
    	int suchen = 0;
    	bool gefunden = false;
        while( suchen < MAX && !gefunden) // <= ist falsch. false==false oder true==true ist auch doppelt gemoppelt.
    	{
            if (werte[suchen++] == kriterium)
    			gefunden = true;
        }
    
        if(gefunden)
    		cout << "Der Wert " << kriterium << " befindet sich an der Position " << suchen-1 << endl; // NIcht +1 sondern -1.
        else
            cout << "Der Wert " << kriterium << " wurde nicht gefunden. " << endl;
    
    	// return 0 darfst du in der main (nur in der main) weglasse, da es automatisch gemacht wird.
    }
    


  • Auch das klappt nicht so gut, leider Zeigt das Programm nur einmal den Wert obwohl er mehrmals / zweimal auftaucht.. 😕 😕

    Lineare Suche
    Die Werte sind:
    0 == 87
    1 == 193
    2 == 193
    3 == 160
    4 == 11
    5 == 179
    6 == 116
    7 == 194
    8 == 35
    9 == 143
    10 == 86
    11 == 2
    12 == 46
    13 == 125
    14 == 58
    15 == 131
    16 == 5
    17 == 178
    18 == 106
    19 == 26
    20 == 156
    21 == 181
    22 == 174
    23 == 21
    24 == 45
    25 == 44
    26 == 195
    27 == 100
    28 == 70
    29 == 179
    30 == 88
    31 == 143
    32 == 129
    33 == 181
    34 == 30
    35 == 57
    36 == 70
    37 == 37
    38 == 150
    39 == 107
    40 == 108
    41 == 159
    42 == 103
    43 == 148
    44 == 13
    45 == 187
    46 == 32
    47 == 40
    48 == 59
    49 == 58
    50 == 27
    51 == 62
    52 == 13
    53 == 188
    54 == 66
    55 == 182
    56 == 167
    57 == 33
    58 == 102
    59 == 130
    60 == 17
    61 == 158
    62 == 46
    63 == 29
    64 == 70
    65 == 51
    66 == 37
    67 == 66
    68 == 175
    69 == 130
    70 == 15
    71 == 150
    72 == 89
    73 == 179
    74 == 85
    75 == 72
    76 == 53
    77 == 134
    78 == 23
    79 == 24
    80 == 103
    81 == 184
    82 == 50
    83 == 198
    84 == 17
    85 == 41
    86 == 114
    87 == 180
    88 == 41
    89 == 109
    90 == 186
    91 == 143
    92 == 8
    93 == 51
    94 == 1
    95 == 98
    96 == 140
    97 == 162
    98 == 55
    99 == 131

    Wonach soll gesucht werden? 41
    Der Wert 41 befindet sich an der Position 85

    Process returned 0 (0x0) execution time : 6.170 s
    Press any key to continue.


  • Mod

    anakhha schrieb:

    Auch das klappt nicht so gut, leider Zeigt das Programm nur einmal den Wert obwohl er mehrmals / zweimal auftaucht.. 😕 😕

    Worauf bezieht sich denn "auch das"? Der Code von out ist bloß eine Korrektur deines Originalcodes und du musst schon noch selber einbauen, dass mehrere Werte gesucht werden. Lies dir mal die anderen Antworten hier im thread gründlich durch und versuch die verschiedenen Beispielcodes nachzuvollziehen.



  • Der Code von jkljkljkl macht das, was du willst. In den anderen Code-Beispielen (einschließlich deinem) wird in der Schleifenbedingung noch die Variable "gefunden" überprüft und daher die Schleife abgebrochen, sobald der Wert gefunden wurde. Und statt <= muss es < heißen, wie schon erwähnt wurde.

    edit: Das == true kann man sich auch sparen, wie schon gesagt wurde, aber vor allem würde ich dir raten, die Variablen erst dann zu deklarieren, wenn du sie brauchst, das macht den Code wesentlich lesbarer.



  • Wer lesen kann, ist klar im Vorteil.. 🤡

    Extra Danke für alle und natürlich Danke auch an jkljkljkl 👍 👍 👍 👍 🙂


Anmelden zum Antworten