[ belegija @ 19.04.2007. 14:32 ] @
Da li moze neko da skonta u cemu je problem? Zadatak:
Napisati program koji trazi da se unese n imena, koje treba sortirati po abecednom redu. Nakon toga za novu unesenu rijec, treba provjeriti da li se nalazi u vec unesenom nizu (postupkom binarne pretrage).

Ovdje je code:(Greska je u funkciji BinarnaPretraga):
Code:
#include<iostream>
#include<cstring>
bool k(char *u,char *v){
    return strcmp(u,v)<0;
}

using namespace std;
template <typename tip>
bool BinarnaPretraga(tip **Niz,  int N, tip *Kljuc)
{int lpok=0,dpok=N-1;
while(lpok<=dpok){
                  int sredina=(lpok+dpok)/2;
                  if(strcmp(Niz[sredina],Kljuc)==0)return true;
                  else if(strcmp(Niz[sredina],Kljuc)>0)lpok=sredina+1;
                  else dpok=sredina-1;
                  }
                  return false;
                  }
int main()
{
    int n1,n;
    cout<<"Unesi broj rijeci:";
    cin>>n1;
    n=n1;
    cin.ignore(100,'\n');
    const int c(n);
    char *reci[c+1];
try{
    for(int i=0;i<=c;i++)
            reci[i]=0;
    for(int i=0;i<c;i++)
    {
            char pom[100];
            cin.getline(pom,sizeof pom);
            reci[i]=new char[strlen(pom)+1];
            strcpy(reci[i],pom);
    }
    sort(reci,reci+c,k);
    cout<<endl;
    for(int i=0;i<c;i++)
    cout<<reci[i]<<endl;
    cout<<"Unesi novu rijec:";
    cin.getline(reci[c+1],sizeof reci[c+1]);
    bool ima=false;
    ima=BinarnaPretraga(reci, c+1, reci[c+1]);
    if(ima)cout<<"Ima.";
    else cout<<"Mema";
    }
catch(...){
           cout<<"Nema memorije?";
           for(int i=0;i<c;i++)
           delete [] reci[i];
           }
           for(int i=0;i<c;i++)
           delete [] reci[i];
system("pause");
return 0;
}
    
[ vlaiv @ 20.04.2007. 14:38 ] @
Mislim da nije problem u funkciji koju si naveo ...

mislim da je problem u sledecoj sekciji koda:

Code:

    cout<<"Unesi novu rijec:";
    cin.getline(reci[c+1],sizeof reci[c+1]);


probaj nesto poput

Code:

    char pom[100];
    cin.getline(pom,sizeof pom);
    reci[c+1]=new char[strlen(pom)+1];
    strcpy(reci[c+1],pom);


Kao sto si radio u petlji za unos reci ...

Mislim da ce ovako raditi ...

Osim toga, cini mi se da ti ne valja memory management ...

U catch sekciji oslobadjas memoriju koju si alocirao za stringove ...
a posle toga opet oslobadjas tu istu memoriju?

(u slucaju da nema greske, program ce svakako raditi)

Malo to pogledaj ...