-
May 18th, 2012, 01:12 PM
#1
Search book by its author from 1st record to last
Hey everyone! i stuck here with a thing. I use this code to search a book by its author. I have used the approach of bubble sorting then binary searching.
Alright, now this is what i have. what i want to do now is to search a particular BOOK by its author without using the bubble sorting or binary searching method and instead search all the records one at a time, from start till the end for its author. I think the improved approach will make the coding a lot shorter than it is now
Code:
//***************************************************************
// HEADER FILE USED IN PROJECT
//****************************************************************
#include<fstream>
#include<conio.h>
#include<stdio.h>
#include<process.h>
#include<string.h>
#include<iomanip>
#include<iostream>
using namespace std;
class BOOK
{
public:
char ID[6];
char Content[50];
char AUTHOR[20];
char Book[20];
void create_book()// create new BOOK
{
cout<<"\nNEW BOOK ENTRY...\n";
cout<<"\nEnter The BOOK ID.";
gets(ID);
cout<<"\n\nEnter BOOK NAME ";
gets(Content);
cout<<"\n\nEnter The AUTHOR's Name ";
gets(AUTHOR);
cout<<"\n\nEnter The Source Book ";
gets(Book);
cout<<"\n\n\nBOOK Created..";
getch();
}
void report()
{cout<<ID<<setw(10)<<Content<<setw(30)<<AUTHOR<<setw(20)<<Book<<endl;} //setw--> set width
void Copy(BOOK hd){ // this function copies whole record
strcpy(ID,(hd.ID)); //copy BOOK ki id
strcpy(AUTHOR,(hd.AUTHOR)); // copy BOOK ka AUTHOR
strcpy(Book,(hd.Book));
strcpy(Content,(hd.Content));
}
}; //class ends here
void SwapBOOK(BOOK &hd1, BOOK &hd2){ //swaps position of BOOK1 with BOOK2
BOOK Temp;
Temp.Copy(hd1); //BOOK1 ko temp main copy kiya
hd1.Copy(hd2); //BOOK2 ko BOOK1 main copy kiya (now BOOK2 has moved to the place of BOOK1)
hd2.Copy(Temp); //BOOK1 ko finalyy BOOK2 ki jaga per copy ker diya
}
//***************************************************************
// global declaration for stream object, object
//****************************************************************
fstream fp; // fstream provides an interface to read and write data from files as input/output streams.
ofstream ofp; // ofstream provides an interface to write data to files as output streams
BOOK hd[1000]; //array of 1000 BOOK
int countBOOK=0; // initially there are zero aBOOK in the program
void ReportAll(){ // this function outputs a
system("cls");
for(int i=0;i<countBOOK;i++){
hd[i].report();
}
getche();
}
void writeAllBOOK()
{
char ch;
ofp.open("BOOK.dat",ios::trunc); // purani file (BOOK.dat) del ker k poora naya content overwrite ker do in new file
//If the file opened for output operations already existed before, its previous content is deleted and replaced by the new one.
system("cls");
for(int i=0; i < countBOOK;i++){
ofp.write((char*)&(hd[i]),sizeof(BOOK)); // hd[i] ko char samaj k write ker do BOOK
}
ofp.flush(); // abhi write ker do ... buffer istimal mat kero
ofp.close();// close file
}
BOOK temp;
void LoadAllBOOK()
{
system("cls");
fp.open("BOOK.dat",ios::in);// read file
if(!fp) // if file doesnt opens
{
cout<<"ERROR!!! FILE COULD NOT BE OPEN ";
getch(); // character lo
countBOOK =0;
return; // or waapis peechhay walay menu main chal do
}
int i=0;
while(fp.read((char*)&temp,sizeof(BOOK))) // file say BOOK k siz ko as a string read ker raha hai and loading to memory
{
hd[i++].Copy( temp); // copying BOOK to main array
}
countBOOK=i; // jitni dafa ye kaam ho 'count BOOK' ko utni dafa increment day do
fp.close(); // close file
getch();
}
//***************************************************************
// SORT AND SEARCH BY AUTHOR (START)
//****************************************************************
void SortByAUTHOR() // bubble sort
{
for(int i=0; i< countBOOK-1; i++){
for(int j=0; j <countBOOK-1; j++){
if(strcmp(hd[j].AUTHOR,hd[j+1].AUTHOR)>0)
SwapBOOK(hd[j],hd[j+1]); // if above condition is satisfied, then call 'swapBOOK' function which is defined by us
}
}
}
//////////////////////////////////////////////////////////////////
void SearchBetweenIndex(int IndexA, int IndexB, char* AUTHOR)
{
if(IndexA > IndexB){
int temp;
temp = IndexA;
IndexA = IndexB;
IndexB= temp;
}
for(int i = IndexA; i <= IndexB;i++){
if(strcmp(hd[i].AUTHOR,AUTHOR)==0)
hd[i].report();
}
getch();
}
/////////////////////////////////////////////////////////////////////
void ListByAUTHOR(char* AUTHOR){ //search by AUTHOR
int PreviousIndex = 0; // first
int StartIndex =0 , EndIndex = countBOOK-1;
int i=2;
while(1==1){
int CurrentIndex=(EndIndex+StartIndex)/2; //start searching from the mid position
if(strcmp(hd[CurrentIndex].AUTHOR, AUTHOR) > 0){
PreviousIndex = EndIndex;
EndIndex = CurrentIndex;
}else if(strcmp(hd[CurrentIndex].AUTHOR, AUTHOR) < 0){
PreviousIndex = StartIndex;
StartIndex = CurrentIndex;
}else
{
SearchBetweenIndex(StartIndex, EndIndex, AUTHOR);
break;
}
if(CurrentIndex == PreviousIndex)
break;
}
}
/////////////////////////////////////////////////////////////////////
void SortAndSearchByAUTHOR(){ // INPUT AUTHOR SEARCH CRITERIA
system("cls");
char str[50];
cout << "Enter the Search Criteria for AUTHOR ";
gets(str);
SortByAUTHOR(); // CALL THIS FUNCTION
ListByAUTHOR(str); // CALLL THIS FUNCTION
}
//***************************************************************
// SORT AND SEARCH BY AUTHOR ENDS
//****************************************************************
void main()
{
char ch;
LoadAllBOOK();
do
{
system("cls");
cout<<"\n\n\n\tMAIN MENU";
cout<<"\n\n\t01. Create BOOK";
cout<<"\n\n\t02. SORT And Search By AUTHOR";
cout<<"\n\n\t03. lIST ALL ABOOK";
cout<<"\n\n\t04. EXIT";
cout<<"\n\n\tPlease Select Your Option (1-4) ";
ch=getche();
switch(ch)
{
case '1':system("cls");
hd[countBOOK].create_book();
countBOOK++;
break;
case '2':
SortAndSearchByAUTHOR();
break;
case '3':
ReportAll();
break;
case '4':
writeAllBOOK();
exit(0);
default :cout<<"\a";
}
}while(ch!='4');
}
-
May 18th, 2012, 01:19 PM
#2
Re: Search book by its author from 1st record to last
basically this is the sorting and searching code i have used and want to replace
Code:
void SortByAUTHOR() // bubble sort
{
for(int i=0; i< countBOOK-1; i++){
for(int j=0; j <countBOOK-1; j++){
if(strcmp(hd[j].AUTHOR,hd[j+1].AUTHOR)>0)
SwapBOOK(hd[j],hd[j+1]); // if above condition is satisfied, then call 'swapBOOK' function which is defined by us
}
}
}
//////////////////////////////////////////////////////////////////
void SearchBetweenIndex(int IndexA, int IndexB, char* AUTHOR)
{
if(IndexA > IndexB){
int temp;
temp = IndexA;
IndexA = IndexB;
IndexB= temp;
}
for(int i = IndexA; i <= IndexB;i++){
if(strcmp(hd[i].AUTHOR,AUTHOR)==0)
hd[i].report();
}
getch();
}
/////////////////////////////////////////////////////////////////////
void ListByAUTHOR(char* AUTHOR){ //search by AUTHOR
int PreviousIndex = 0; // first
int StartIndex =0 , EndIndex = countBOOK-1;
int i=2;
while(1==1){
int CurrentIndex=(EndIndex+StartIndex)/2; //start searching from the mid position
if(strcmp(hd[CurrentIndex].AUTHOR, AUTHOR) > 0){
PreviousIndex = EndIndex;
EndIndex = CurrentIndex;
}else if(strcmp(hd[CurrentIndex].AUTHOR, AUTHOR) < 0){
PreviousIndex = StartIndex;
StartIndex = CurrentIndex;
}else
{
SearchBetweenIndex(StartIndex, EndIndex, AUTHOR);
break;
}
if(CurrentIndex == PreviousIndex)
break;
}
}
/////////////////////////////////////////////////////////////////////
void SortAndSearchByAUTHOR(){ // INPUT AUTHOR SEARCH CRITERIA
system("cls");
char str[50];
cout << "Enter the Search Criteria for AUTHOR ";
gets(str);
SortByAUTHOR(); // CALL THIS FUNCTION
ListByAUTHOR(str); // CALLL THIS FUNCTION
}
-
May 18th, 2012, 01:22 PM
#3
Re: Search book by its author from 1st record to last
What's your question?
Sorting and binary searching will be much more efficient with a large dataset. While you want to write concise code, favoring small code over efficient isn't usually a good idea.
A better approach would be just to sort your list as you build it. When somebody adds a book, use a binary search to find the appropriate place to add it. Your list will be sorted without an explicit sort function.
You certainly don't want to sort every time somebody does a search. Once you sort it, it should stay sorted.
-
May 18th, 2012, 01:24 PM
#4
Re: Search book by its author from 1st record to last
i have seen this version which resembles mine. can anyone change it to my requirements please?
Code:
struct book // declare book class
{
int no;
string author; // type name of string
string book; // type name of string
string topic; // type name of string
string genre; // type name of string
book* next; // type name of string
book()
{
no=0;
author=book=topic=genre=" ";
next=NULL; // next given FALSE value
}
void setnext(book *t)
{
next=t;
}
book* getnext()
{
return next;
}
};
class linklist
{
book *start;
book *current;
public:
linklist()
{
start=NULL;
current=NULL;
}
void insert(book *tmp)
{
if(start==NULL)
{
start=tmp;
}
else
{
current=start;
while(current->getnext()!=NULL)
{
current=current->getnext();
}
current->setnext(tmp);
}
}
bool search_no(int value)
{
current=start;
while(current!=NULL)
{
if(current->no==value)
{
cout<<current->author<<endl;
cout<<current->book<<endl;
cout<<current->topic<<endl;
cout<<current->genre<<endl;
cout<<"------------------------------------------------------------------------"<<endl;
return true;
}
else
current=current->getnext();
}
return false;
}
-
May 18th, 2012, 01:28 PM
#5
Re: Search book by its author from 1st record to last
my database would contain not more than a hundred books. so thats y i want to reduce it. and moreover i dont know how to do it that way. So also for learning purpose
-
May 18th, 2012, 01:31 PM
#6
Re: Search book by its author from 1st record to last
my database would contain not more than a hundred books. so thats y i want to reduce it. and moreover i dont know how to do it that way. So also for learning purpose.
-
May 18th, 2012, 01:36 PM
#7
Re: Search book by its author from 1st record to last
Nobody's going to write the code for you. You can store the books in an array or list and just traverse it until you find the book you want. Since users can add books, a list would be a better container. Your text book should have a chapter on them.
In the long run, my suggestion is better, and since you don't know how to do it your way either, I'm not sure the comment that you don't know how to do it my way is valid.
You didn't write the code in your first post I take it? Simple array or list traversal is much simpler than anything in the OP.
-
May 18th, 2012, 01:36 PM
#8
Re: Search book by its author from 1st record to last
 Originally Posted by smrizvi1
Alright, now this is what i have. what i want to do now is to search a particular BOOK by its author without using the bubble sorting or binary searching method
1) It would help if you changed from those char arrays to string variables such as std::string.
Then your C++ code doesn't have ugly C-string handling functions such as strcpy(), strcmp(), etc. Whenever I see that in an obvious beginner program, it raises the question of what material you're using to learn C++.
2) Nothing in your code is specific to Visual C++. Your question should have been posted in the non-Visual C++ forum.
3)
Code:
#include <algorithm>
#include <cstring>
//...
class BOOK
{
//... whatever
};
struct BookSearcher
{
char m_author[20];
BookSearcher(const char* author)
{
strcpy(m_author, author);
}
bool operator()(const BOOK& theBook) const
{
return strcmp(theBook.author, m_author) == 0;
}
};
bool BookSortByAuthor(const BOOK& theBook1, const BOOK& theBook2) {
return strcmp(theBook1.author, theBook2.author) < 0;
}
using namespace std;
int main()
{
//....sort books by author
sort(hd, hd + countBOOK, BookSortByAuthor);
// search for book
BookSearcher searcher("Joe Smith"); // search for this author
BOOK* foundBook = std::find_if(hd, hd + countBOOK, searcher);
if (distance(hd, foundBook) < countBOOK )
{
// the book was found. It is pointed to by *foundBook
}
else
{ /* book was not found */ }
}
Now, I didn't compile this, but this is how you would do the sort and search without writing any loops, search code, etc. in C++. You use the std::sort() algorithm and find_if() algorithm functions. The sort is reduced to a single line of code and a function, and the find_if() is a single line of code, using a function object.
As GCDEF mentioned, no one is going to write all the code for you. I showed an example using a radically different, but "real-world" C++ approach. Now your goal is to understand what I posted, as I won't go into explanation. Any good book on C++ will explain it to you. If it's an assignment, you will need to explain it to your teacher, as they will ask you what those functions do and how you used them.
Regards,
Paul McKenzie
Last edited by Paul McKenzie; May 18th, 2012 at 01:42 PM.
-
May 21st, 2012, 06:49 AM
#9
Re: Search book by its author from 1st record to last
Thank you Mr. Paul
I also wanted to know that is it possible search a particular string/char, having more than one word, by just a single word?? I mean If i want to search 'Lord of the rings' and i just input 'rings', is there any way that i get all the books that contain the word 'rings'?
-
May 21st, 2012, 07:12 AM
#10
Re: Search book by its author from 1st record to last
 Originally Posted by smrizvi1
Thank you Mr. Paul
I also wanted to know that is it possible search a particular string/char, having more than one word, by just a single word?? I mean If i want to search 'Lord of the rings' and i just input 'rings', is there any way that i get all the books that contain the word 'rings'?
look up strstr.
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|