• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

С использованием двух классов создать консольное приложение для записи телефонной книжки. C++

laynan

New member
18.12.2022
1
0
BIT
0
.Реализовать функцию поиска телефона по имени методом деления на 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;//Объявление переменной
};
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!