В общем, вот само задание:
Написать и протестировать функции сортировки записей и поиска их по ключам для следующих методов: линейный выбор с обменом, бинарный поиск.
Запись имеет три поля, например, фамилия, имя, номер телефона. Иметь не менее 30 записей. Поиск - по любому ключу, задаваемому из меню.
Вот то, что я сделал:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
class qwe
{
public:
char name[20];
char sirname[20];
char phone[7];
};
int main()
{
clrscr();
randomize;
int k;
qwe base[30];
for(int i=1;i<=30;i++)
{
for (k=1;k<random(10)+5;k++)
{
base[i].name[k]=char(random(25)+65);
base[i].sirname[k]=char(random(25)+65);
}
for (k=1;k<8;k++)
base[i].phone[k]=random(9);
}
getch();
}
Во-первых, если ты уже написал, что это С++, и пользуешься классами, то почему бы тебе не воспользоваться и конструкторами, чтобы не делать генерацию вручную, а она проводилась бы автоматически?
#include <iostream.h>Вот так, например...
#include <conio.h>
#include <stdlib.h>
const int size = 20;
class qwe
{
public:
char name[size];
char sirname[size];
char phone[8];
qwe();
};
qwe :: qwe() {
int k;
for(k = 0; k < random(10) + 5; k++)
name[k] = char(random(25)+65);
name[k] = '\0';
for(k = 0; k < random(10) + 5; k++)
sirname[k] = char(random(25)+65);
sirname[k] = '\0';
for(k = 0; k < 7; k++)
phone[k] = char(random(10) + '0');
phone[7] = '\0';
}
int main() {
clrscr();
randomize;
qwe base[30];
for(int i = 0; i < 30; i++)
cout << base[i].name << " , " <<
base[i].sirname << " : " <<
base[i].phone << endl;
getch();
return 0;
}
Хмм, чего-то я не пойму... Линейная сортировка (она же пузырьковая) - это упорядочение всех записей в базе по определенному условию - правильно? В порядке возрастания/убывания номеров и т.п., да? В задании написано - "Поиск - по любому ключу, задаваемому из меню." Т.е. фамилии/имена в алфавитном порядке, номера телефонов в порядке возрастания? или как?
С бинарным поиском - то же самое? Т.е. задали фамилию Иванов - ищем местоположение буквы "И", потом - "в" и т.п.?
Я к тому, что если в базе есть фамилии Иванов и Иванченко - тогда как (записи же отсортированы в алфавитном порядке, да?)? Вот взяли мы 15-й элемент и посмотрели, а там - Лыков. Значит, до (л<и). Взяли 7 - Иванченко. Значит, до (т.к. и=и, в=в, а=а, н=н, о<ч).
Все правильно?
Да что тебя так тянет сравнивать ПОБУКВЕННО? Кто же это делает? strcmp для кого? Сравниваешь СТРОКУ со СТРОКОЙ... Переливать из пустого в порожнее заканчиваю. Я уже дал всю необходимую информацию... Теперь твоя очередь это реализовать (хотя бы начать)...
Вот, что я сделал:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
const int size = 20;
class qwe
{
public:
char name[size];
char sirname[size];
char phone[8];
qwe();
};
qwe :: qwe() {
int k;
for(k=0; k<random(10)+5; k++)
name[k]=char(random(25)+65);
name[k]='\0';
for(k=0; k<random(10)+5; k++)
sirname[k]=char(random(25)+65);
sirname[k]='\0';
for(k=0; k<7; k++)
phone[k]=char(random(10)+'0');
phone[7]='\0';
}
qwe base[30];
char ch[size];
void bubblename ()
{
for (int i=0; i<30; i++)
for (int j=0; j<30; j++)
if (strcmp(base[j].name,base[j+1].name)>0)
{
ch=base[j].name;base[j].name=base[j+1].name;base[j+1].name=ch;
}
};
void bubblesirname ()
{
for (int i=0; i<30; i++)
for (int j=0; j<30; j++)
if (strcmp(base[j].sirname,base[j+1].sirname)>0)
{
ch=base[j].sirname;base[j].sirname=base[j+1].sirname;base[j+1].sirname=ch;
}
};
void bubblephone ()
{
for (int i=0; i<30; i++)
for (int j=0; j<30; j++)
if (strcmp(base[j].phone,base[j+1].phone)>0)
{
ch=base[j].phone;base[j].phone=base[j+1].phone;base[j+1].phone=ch;
}
};
int main()
{
clrscr();
randomize;
for(int i=0; i<30; i++)
cout << base[i].name << " , " <<
base[i].sirname << " : " <<
base[i].phone << endl;
cout<<"\nBBeguTe napaMeTp (name - 1/sirname - 2/phone - 3): ";
if (getch=='1') bubblename() else if (getch=='2') bubblesirname() else bubblephone();
getch();
return 0;
}
Ошибка такая: Lvalue required на строке
ch=base[j].name;base[j].name=base[j+1].name;base[j+1].name=ch;
Уф, вроде все получилось:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
const int size = 20;
int n,left=0,right=29;
class qwe
{
public:
char name[size];
char sirname[size];
char phone[8];
qwe();
};
qwe :: qwe() {
int k;
for(k=0; k<random(10)+5; k++)
name[k]=char(random(25)+65);
name[k]='\0';
for(k=0; k<random(10)+5; k++)
sirname[k]=char(random(25)+65);
sirname[k]='\0';
for(k=0; k<7; k++)
phone[k]=char(random(10)+'0');
phone[7]='\0';
}
qwe base[31];
void sortname ()
{
for (int i=0; i<30; i++)
for (int j=i; j<30; j++)
if (strcmp(base[j].name,base[i].name)<0)
{base[30]=base[i];base[i]=base[j];base[j]=base[30];}
};
void sortsirname ()
{
for (int i=0; i<30; i++)
for (int j=i; j<30; j++)
if (strcmp(base[j].sirname,base[i].sirname)<0)
{base[30]=base[i];base[i]=base[j];base[j]=base[30];}
};
void sortphone ()
{
for (int i=0; i<30; i++)
for (int j=i; j<30; j++)
if (strcmp(base[j].phone,base[i].phone)<0)
{base[30]=base[i];base[i]=base[j];base[j]=base[30];}
};
void baseout()
{
for(int i=0; i<30; i++)
{
cout.width(15);
cout << base[i].name << ", ";
cout.width(15);
cout << base[i].sirname << " : ";
cout << base[i].phone << endl;
}
};
int main()
{
clrscr();
randomize;
baseout();
cout<<"\nWhat would you like to find? (name - 1/sirname - 2/phone - 3): ";
char ch=getch();
if (ch=='1')
{
sortname();clrscr();
cout<<"base sorted by name:\n\n";baseout();
cout<<"\nEnter the name: ";cin>>base[30].name;
while ((right-left)>1)
{
n=(right+left+1)/2;
if (strcmp(base[30].name,base[n].name)>0)
left=n; else right=n;
}
}
else if (ch=='2')
{
sortsirname();clrscr();
cout<<"base sorted by sirname:\n\n";baseout();
cout<<"\nEnter the sirname: ";cin>>base[30].sirname;
while ((right-left)>1)
{
n=(right+left)/2;
if (strcmp(base[30].sirname,base[n].sirname)>0)
left=n; else right=n;
}
}
else {
sortphone();clrscr();
cout<<"base sorted by phone:\n\n";baseout();
cout<<"\nEnter the phone: ";cin>>base[30].phone;
while ((right-left)>0)
{
n=(right+left)/2;
if (strcmp(base[30].phone,base[n].phone)>0)
left=n; else right=n;
}
}
clrscr();
cout << base[n].name << " , " <<
base[n].sirname << " : " <<
base[n].phone << endl;
getch();
return 0;
}
Все-таки ошибки имеют место быть...
Во-первых, был выбран не тот метод сортировки (в вашем факе пузырьковая и линейная с обменом - одно и то же, а в методичке нашего препода - разные вещи...), но это я исправил (см. выше)
Во-вторых, если заданный элемент в бинарном поиске - первый, то программа ошибается... Может кто-нибудь помочь с этим?