.Реализовать функцию поиска телефона по имени методом деления на 2. Написала код, программа грузится бесконечно. Не понимаю в чём проблема.
C++:
основной код
#include <iostream>
#include <vector>
#include "Header.h"
//#include "std.h"
#include <process.h>
//#include<windows.h>
//#include<string>
using namespace std;
size_t DirectSort(vector<PhoneNumber>& vecRec);
size_t search(vector<PhoneNumber>& vecRec, string& f);
int main()
{
std::cout << "Phone Book" << endl;
vector<PhoneNumber>PhBk;
do
{
PhoneNumber A;// Объявление переменной А класса
if (!A.Input())
break;
PhBk.push_back(A);
} while (1);
cout << endl << "Phone book" << endl;;
size_t kCmps = DirectSort(PhBk);
for (int i = 0; i < PhBk.size(); i++)//цикл для таблицы
{
cout << endl << i + 1 << "\t";//печать порядкого номера контакта
PhBk[i].Output(45);//печать данных контакта
}
cout << "Input name" << endl;//
string x;
cin >> x;
int c = search(PhBk, x);
if (c == -1)
{
cout << "error" << endl;
system("pause");
return 0;
}
else {
cout << "Search result:" << endl;
PhBk[c].Output(5);
system("pause");
return 0;
}
system("pause");
return 0;
}
size_t DirectSort(vector<PhoneNumber>& vecRec)
{
vector<PhoneNumber>vecTmp;
size_t kCmp = 0;
for (int j = 0; j < vecRec.size(); j++)
{
PhoneNumber tmp;
tmp.Name_con = "aaaaaaaaaaaaa";
size_t kMin{}; //объявляем минимум
for (int i = 0; i < vecRec.size(); i++)//внутренний цикл
{
if (vecRec[i].Cmp(tmp))//если код текущего контакта меньше предыдущего
{
tmp.Name_con = vecRec[i].Name_con;
tmp.Phone_con = vecRec[i].Phone_con;
kMin = i;
}
kCmp++;
}
vecTmp.push_back(vecRec[kMin]);
vecRec[kMin].Name_con = string(10, 127);
}
vecRec = vecTmp;
return kCmp;
}
size_t search(vector<PhoneNumber>& zvecRec, string& x)//функция поиска
{
size_t step = 0;
size_t run = zvecRec.size() - 1;
int k = 0;
do
{
int k = (step + run) / 2;
if (zvecRec[k].Name_con == x)
return k;
if (zvecRec[k].Name_con > x)
run = k;
else
step = k;
if ((run - step) == 1)
{
if (zvecRec[run].Name_con == x)
{
return run;
}
if (zvecRec[step].Name_con == x)
{
return step;
}
else
return -1;
}
} while (step != run);
if (k == 0)
return -1;
return k;
}
lib.cpp
#include <iostream>
//#include "std.h"
#include "lib.h"
using namespace std;
PhoneNumber::PhoneNumber() {} // Конструктор
PhoneNumber::~PhoneNumber() {} // Деструктор
bool PhoneNumber::Input() // Функция ввода
{
cout << "Input Name" << endl;
//string call; // объявление строки
cin >> Name_con;
//Name_con = call; // m_Name приобретает значение введённого имени.
cout << "Input Phone" << endl; // тот же принцип далее
cin >> Phone_con;
//Phone_con = _atoi64(call.c_str());
return Phone_con ? true : false;
}
void PhoneNumber::Output(size_t PhoneCall) // Функция вывода
{
cout << Name_con; // Печать имени контакта
for (int i = 0; i < PhoneCall - Name_con.size(); i++)// Цикл для последовательного вывода пробелов между именем контакта и его телефонным номером для выравнивания таблицы
cout << " "; // Вывести пробел
//cout << "\t" << PhoneCall;
cout << "\t" << Phone_con << "\n";
}
bool PhoneNumber::Cmp(const PhoneNumber& rc)
{
return(Name_con < rc.Name_con);
}
Header.h
#pragma once
#include <iostream>
#include <string>
#include"process.h"
//#include "stdafx.h"
//#include"process.h" //подключение библиотек
//// Функция для перевода числа из 10 СС в 2 СС
//void TenToTwo(int A);
//void Output(int* nums);
//bool CheckStr(char* A);
//char* CorrectNumber(char* A);
using namespace std;
class PhoneNumber //Имя класса
{
public:
PhoneNumber(); //Конструктор
~PhoneNumber();// Деструктор
public:
bool Input(); // Объявление функции ввода
void Output(size_t PhoneCall); // Объявление функции вывода
bool Cmp(const PhoneNumber &rc); // Объявление функции сравнения
public:
string Name_con; //Объявление строки
__int64 Phone_con;//Объявление переменной
};