Witam, tak jak w tytule mam problem z wyszukiwaniem binarnym. W posortowanej tablicy np.:

{1, 1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 7}

chce wypisać wszyskie liczby ze słowa klucz które załóżmy że jest 4. Powinno wypisać trzy 4 a wypisuje tylko 2 ostatnie lub pierwsze, zawsze omija. Problem zapewne jest funkcji ale nie umiem go rozwiązać.

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

struct student
{
    int id;
    string imie;
    string nazwisko;
    int wiek;
    float srednia_ocen;
    int rok_studiow;
} ;
student* makeStdList(int n);

void wyswietlRaport(student* arr, int n);
int liniowe(int* arr, int n, int key);
int bisekcyjne_petla(int* arr, int n, int key);
int bisekcyjne_rekurencja(int* arr, int lewy, int prawy, int key);

int main()
{
    int n;
    int maxwiek = 25;
    int minwiek = 20;
    int liczbaImionINazwiskDoGen = 10;

    string imionaDoGeneracji[] = {"Jan      ", "Stanislaw", "Andrzej  ",
                                  "Jozef    ", "Jerzy    ", "Maria    ", "Krystyna ",
                                  "Anna     ", "Barbara  ", "Teresa  "
                                 };

    string nazwiskaDoGeneracji[] = {"Nowak    ", "Wojcik   ", "Kowalczyk",
                                    "Wozniak  ", "Mazur    ", "Krawczyk ",
                                    "Kaczmarek", "Adamczyk ", "Dudek    ", "Zajac    "
                                   };
    cout<<"Podaj liczbe studentow: ";
    cin>>n;
    student* arr = new student[n];
    srand(time(NULL));
    for(int i=0; i<n; i++)
    {
        arr[i].id = i;
        arr[i].wiek = rand()%(maxwiek-minwiek+1)+minwiek;
        arr[i].rok_studiow = rand()%5+1;
        arr[i].srednia_ocen = (rand()%((500-200+1))+200)/100.00;
        arr[i].imie = imionaDoGeneracji[rand()% liczbaImionINazwiskDoGen ];
        arr[i].nazwisko = nazwiskaDoGeneracji[rand()% liczbaImionINazwiskDoGen ];

    }
    wyswietlRaport(arr, n);
}

void wyswietlRaport(student* arr, int n){

    for(int i=n-1; i>0; i--)
        {
            for(int j=0; j<i; j++)
            {
                if(arr[j].rok_studiow > arr[j+1].rok_studiow)
                {
                    swap(arr[j], arr[j+1]);
                }
            }
        }
     cout<<"IMIE\t\t\t\t"<<"NAZWISKO\t\t"<<"ID\t"<<"WIEK\t"<<"ROK\t"<<"SREDNIA"<<endl;
    for(int i=0; i<n; i++){

        cout<<arr[i].imie<<"\t\t\t"<<arr[i].nazwisko<<"\t\t"<<arr[i].id<<"\t"<<arr[i].wiek<<"\t"<<arr[i].rok_studiow<<"\t"<<arr[i].srednia_ocen<<endl;
    }
    int klucz, z, tab[n], lewy=0;
    cout<<"Wprowadz klucz: ";
    cin>>klucz;
        for(int i=0; i<n; i++){
            tab[i]=arr[i].rok_studiow;
            cout<<"tab["<<i<<"] = "<<arr[i].rok_studiow<<endl;
        }

        for(int i=0; i<n ;i++){
            z=bisekcyjne_petla(tab, n, klucz);
            if(z>=0 && z<=n){
                cout<<arr[z].imie<<" "<<arr[z].nazwisko<<endl;
                tab[z]=0;
            }
        }
}
int bisekcyjne_petla(int* arr, int n, int key){
    int lewy=0, prawy=n-1, srodek;
    while(lewy<=prawy){
        srodek=(int)(lewy+prawy)/2;
        if(arr[srodek]==key){
            return srodek;
        }
        else{
            if(key<arr[srodek])
                prawy=srodek-1;
            else
                lewy=srodek+1;
        }
    }
    return -1;
}