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;
}