Wyszukiwanie naturalne

0

Witam.

Nie działa mi wyszukiwanie naturalne liczb w tablicy, nawet jeżeli ta liczba jest, program zwraca, że nie znalazł.

Czy pomógłby ktoś z tym kodem?

#define MAX 100
#include <iostream>
#include <cstdlib>
#include <ctime> // biblioteka do srand
#include <stdlib.h>

using namespace std;
int tab[MAX];
int x=0;
int rep=0,temp=0, a=0;
int min=0, i=0,j=0,k=0, h=0, licz_porow=0, licz_zam=0;
int liczba=0;
float wynik;
int wybor=0;

int wyszukiwanie_naturalne(int i, int x, int tab[])
{
cout << "Jakiego elementu szukasz?" << endl;
cin >> x;
for (int i=0; i<MAX;i++)
{
 if (x==tab[i])
 {
 cout << "Dany element " << x << " jest rowny " << i << endl;
 system("pause"); // dzialaj!!!!!
 return(i);
 }
 {
 if (x<tab[i])
 {
 cout << "Brak danego elementu" << endl;
 system("pause"); // dzialaj!!!!!
 return(0);
 }
}
}
}


int main()
{
/*
cout << "Tablica wejsciowa posortowana: " << endl;
for (int i=0; i<MAX;i++)
{
  tab[i]=liczba;
  liczba++;
}
        for (int i=0;i<MAX;i++)
        {
            cout << tab[i] << "\t";
            if((i+1)%5==0)
            cout << endl;
        }
*/

cout << "Tablica wejsciowa losowa:" << endl;
    for (int i=0;i<MAX;i++)
    {
     tab[i]=(rand()%(MAX)) +0;
    }
        for (int i=0;i<MAX;i++)
        {
            cout << tab[i] << "\t";
            if((i+1)%5==0)
            cout << endl;
        }

cout << endl;
cout << endl;

cout << "Jaka metode wybierasz? \n1. Wyszukiwanie naturalne \n2. Wyszukiwanie binarne" << endl;
cin >> wybor;
switch(wybor)
{
case 1:
wyszukiwanie_naturalne(i,x,tab);
break;
default:
     cout << "Brak" << endl;
break;
}

cout << "Licznik porownan: " << licz_porow << endl;
cout << "Licznik zamian: " << licz_zam << endl;
system("pause");
return 0;
}
 
0

Zapoznaj się z formatowaniem kodu.
Ponieważ nie masz formatowania to nie widzisz jakie bzdury wypisujesz.
Rozłóż sobie karty koszulkami do góry i sprawdź czy jest tam As z tym że możesz odwracać tylko jedną kartę i to wyłącznie na chwilę.
Spisz sobie algorytm swoich czynów i zapisz go w postaci kodu.

0

Informację 'brak elementu' musisz dać po przeszukaniu całej tablicy a nie tak jak masz teraz, że jeżeli element nie jest równy szukanemu to oznacza to, że nie ma go tam wcale.

0

Taki mam pseudokod do tego:

Search_nat (N, A[ ], x)
{
for(i <- 1; i <= N; i++)
{
if(x = A[i]) return(i);
if(x < A[i]) return(0); //brak element x w tablicy A[]
}
return(0);
}
0

No to policz ilość return 0 u siebie i w pseudokodzie.

Zastanów się też nad logiczną przeróbką pseudokodu na:

Search_nat (N, A[ ], x)
  {
   for(i <- 1; (i <= N)&&(A[i]<=x) ; ++i) if(A[i] = x) return(i);
   return(0);
  }

jest krótszy, bardziej logiczny, oraz bardziej zgodny z zasadą DRY

0

U mnie w kodzie też są dwa return 0.

0
Naolin napisał(a):

U mnie w kodzie też są dwa return 0.

Skoro w ten sposób liczysz return 0 to wytłumacz czemu w pseudokodzie jest jeden for a w kodzie masz trzy razy for ?

0

Bo dwa pozostałe fory są do wypełniania i wyświetlania tablicy.

0

A ten drugi return 0 do zakończenia całego programu. Więc jeszcze raz policz ilość return 0.

0

Jeden do zwracania funkcji, drugi do zakończenia programu.

#define MAX 100
#include <iostream>
#include <cstdlib>
#include <ctime> // biblioteka do srand
#include <stdlib.h>

using namespace std;
int tab[MAX];
int x=0;
int rep=0,temp=0, a=0;
int min=0, i=0,j=0,k=0, h=0, licz_porow=0, licz_zam=0;
int liczba=0;
float wynik;
int wybor=0;

int wyszukiwanie_naturalne(int i, int tab[], int x)
{
cout << "Jakiego elementu szukasz?" << endl;
cin >> x;
for (int i=0; (i<=MAX)&&(tab[i]<=x);i++)
{
 if (x==tab[i])
 {
 cout << "Dany element " << x << " jest rowny " << i << endl;
 return(i);
 return 0;
 }
}
}

int main()
{
cout << "Tablica wejsciowa posortowana: " << endl;
for (int i=0; i<MAX;i++)
{
  tab[i]=liczba;
  liczba++;
}
        for (int i=0;i<MAX;i++)
        {
            cout << tab[i] << "\t";
            if((i+1)%5==0)
            cout << endl;
        }

cout << endl;
cout << endl;

cout << "Jaka metode wybierasz? \n1. Wyszukiwanie naturalne \n2. Wyszukiwanie binarne" << endl;
cin >> wybor;
switch(wybor)
 {
    case 1:
        wyszukiwanie_naturalne(i,tab,x);
        break;
    default:
        cout << "Niepoprawne dane." << endl;
        break;
 }

cout << "Licznik porownan: " << licz_porow << endl;
cout << "Licznik zamian: " << licz_zam << endl;
system("pause");
return 0;
}
0

Wstawiasz klamerki w sposób losowy.
Poczytaj o tym po co są potrzebne i nie wstawiaj w niepotrzebne miejsca.
Poczytaj też na temat wyszukiwania naturalnego - zadziała tylko pod warunkiem że przeszukiwana tablica jest posortowana to samo dotyczy wyszukiwania binarnego.

0

Tablice już zmieniłem na posortowaną, a na uczelni mówili, że klamerki nigdy nie zaszkodzą. :o

0

Owszem, ale nie w losowym miejscu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1