Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 13
1

Телефонный справочник

30.08.2019, 11:11. Показов 4211. Ответов 2
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <time.h>
using namespace std;
#pragma warning(disable:4996)
 
// макроопределения
#define ROW       10 /* кол-во абонентов */
#define COL_SIZE  60 /* чтобы вместить ФИО */
// макрофункция
#define RAND(min, max) (rand()%((max)-(min)+1)+(min))
 
// статический массив списка опреаторов
const char* Operators[] = {
  "701", "702", "705", "775", "777", "999",
};
 
void InitSpravRand(char TSp[2][ROW][COL_SIZE],
    int  AbonentCnt)
{
    //if(AbonentCnt <= ROW)
    for (int i = 0; i < AbonentCnt; i++) {
        // заполнить ФИО длиной от 4 до 12 символов
        int szFio = RAND(4, 12);
        for (int j = 0; j < szFio; j++) {
            // 'a' .. 'z'
            //TSp[0][i][j] = rand() % ('z' - 'a' + 1) + 'a';
            TSp[0][i][j] = RAND('a', 'z');
        }
        TSp[0][i][szFio] = '\0'; // обязательно
        // первый символ в верхний регист
        TSp[0][i][0] -= 'a' - 'A'; // -= 32;
 
        // тел. номера
        // индекс оператора из массива операторо
        int indexOper = RAND(0,
            sizeof(Operators) / sizeof(*Operators) - 1);
        strcpy(TSp[1][i], Operators[indexOper]);
        // временный строковый буфер для RAND
        char buf[8];
        for (int j = 0; j < 7; j++) {
            buf[j] = RAND('0', '9');
        }
        buf[7] = '\0';
        // сцепление номера опреатора с номером из 7 цифр
        strcat(TSp[1][i], buf);
    }
}
 
void PrinSprav(char TSp[2][ROW][COL_SIZE],
    int  AbonentCnt)
{
    cout << "ФИО\t\tТелефон\n";
    for (int i = 0; i < AbonentCnt; i++) {
        cout << TSp[0][i] << "\t" << TSp[1][i] << endl;
    }
}
 
// глобальный тел. справочник
char TelSprav[2][ROW][COL_SIZE]{};
int main()
{
    system("chcp 1251 > nul");
    InitSpravRand(TelSprav, 5);
    PrinSprav(TelSprav, 5);
 
 
 
 
 
    cin.get(); cin.get();
}


Напишите приложение <Телефонный справочник>.
Информация храниться в двухмерном массиве строк.
Первая размерность хранит имена,
вторая - телефонные номера.
Реализовать меню с возможностью добавления,
удаления, просмотра записей и сортировки записей
по фамилии и номеру телефона.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2019, 11:11
Ответы с готовыми решениями:

Телефонный справочник
Здравствуйте пытаюсь разобрать такую программу изкнижки Напишите программу, которая позволяет...

Телефонный справочник
Прога читает из файла, есть поиск по имени и по адресу. Никак не могу реализовать поиск по номеру....

телефонный справочник
создать программу телефонный справочник на 5 человек эти 5 человек вводятся с клавиатуры. помогие...

телефонный справочник
Написать программу, которая позволяет найти в телефонном справочнике (phone.txt) нужные сведения....

2
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
01.09.2019, 00:25 2
Лучший ответ Сообщение было отмечено Egor_S как решение

Решение

Egor_S, здравствуйте! Вот, писал программу не так давно. Возможно, вам это поможет:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
/*
Файл "Абонент телефона"
 
Предполагаемая структура записи:
 
- Ф.И.О. абонента;
- номер телефона;
- год установки телефона;
 
- создать файл с заданной структурой записи.
- выдать на экран содержимое файла.
 
Выдать на экран список всех абонентов, телефоны которых начинаются с двух заданных цифр в виде:
 
- Ф.И.О. абонента
- номер телефона
 
Сформировать новый файл:
 
- Ф.И.О. абонента
- год установки телефона
 
Вновь сформированный файл распечатать.
 
- добавить запись в исходный файл.
- удалить все записи с указанными Ф.И.О. абонентов.
- корректировка файла: по заданной Ф.И.О. абонента изменить номер телефона.
*/
 
#include <iostream> 
#include <string> 
#include <list> 
#include <algorithm> 
#include <fstream> 
#include <cmath> 
#include <windows.h> //Шрифт консоли - Lucida Console
 
    using namespace std;
 
struct Subscriber {
    string surname;
    string phone_number;
    int mount_year;
};
 
list<Subscriber> lst;
 
ifstream& operator>>(ifstream &in, Subscriber &obj) { //Перегрузка оператора чтения из файла
    in >> obj.surname; 
    in >> obj.phone_number; 
    in >> obj.mount_year; 
    return in;
}
 
istream& operator>>(istream &in, Subscriber &obj) { //Перегрузка оператора ввода в консоль
    cout << "Добавление новых записей:\n\n";
    cout << "Ф.И.О.: "; in >> obj.surname;
    cout << "Номер телефона: "; in >> obj.phone_number;
    cout << "Год установки телефона: "; in >> obj.mount_year;
    return in;
}
 
ostream& operator<<(ostream &out, Subscriber &obj) { //Перегрузка оператора вывода в консоль
    out << obj.surname << "\n";
    out << obj.phone_number << "\n";
    out << obj.mount_year << "\n";
    return out;
}
 
void clear() { //Функция очистки файла
    ofstream in("input.txt", ios::out | ios::trunc); 
    in.close();
}
 
void clear_new() { //Функция очистки нового файла
    ofstream in("input_new.txt", ios::out | ios::trunc); 
    in.close();
}
 
bool is_file_empty() { //Функция проверки файла на пустоту
    ifstream in ("input.txt"); 
    in.seekg(0, ios::end);
    if (in.tellg() == 0) {
        return true;
    } 
    in.close();
    return false;
}
 
void save_into_file() { //Функция сохранения списка в файл
    clear();
    ofstream out("input.txt");
    for (const Subscriber &data: lst) {
        out << data.surname << "\n";
        out << data.phone_number << "\n";
        out << data.mount_year << "\n";
    }
    out.close();
}
 
void save_into_new_file() { //Функция сохранения списка в новый файл (Ф.И.О. и год установки телефона)
    clear_new();
    ofstream out("input_new.txt");
    for (const Subscriber &data: lst) {
        out << data.surname << "\n";
        out << data.mount_year << "\n";
    }
    cout << "\nНовый файл успешно сформирован!\n\n";
    out.close();
}
 
void read_from_file(Subscriber &data) { //Функция добавления записей из файла в список
    ifstream in("input.txt");
    while (in >> data) {
        lst.push_back(data);
    } 
    in.close();
}
 
void output_from_file(Subscriber &data) { //Функция вывода записей из файла в консоль
    if (!is_file_empty()) {
        ifstream in ("input.txt");
        if (in) {
            int k = 0;
            while ( in >> data) {
                k++;
                cout << "Запись #" << k << ":\n\n";
                cout << data;
                cout << "\n";
            } 
            in.close();
        } else {
            cout << "Файл input.txt не найден!\n\n";
        }
    } else {
        cout << "Файл input.txt пуст!\n\n";
    }
}
 
void output_from_new_file(Subscriber &data) { //Функция вывода записей из нового файла в консоль
        ifstream in("input_new.txt");
        if (in) {
            int k = 0;
            while (in >> data.surname >> data.phone_number) {
                k++;
                cout << "Запись #" << k << ":\n\n";
                cout << data.surname << "\n";
                cout << data.mount_year << "\n\n";
            } 
            in.close();
        } else {
            cout << "Файл input_new.txt не найден!\n\n";
        }
    }
 
void add_client(Subscriber &data) { //Добавление новой записи в список (записи добавляются в конец списка)
    int k;
    cout << "Введите число добавляемых записей: ";
    cin >> k;
    for (int i = 1; i <= k; i++) {
        cout << "\nЗапись #" << i << ":\n";
        cin >> data;
        lst.push_back(data);
    }
    cout << "\nЗаписи успешно добавлены!\n\n";
    save_into_file(); //Сохраняем результат в файл
}
 
void del_client(string const &key) { //Функция удаления элементов из списка (по Ф.И.О. абонента)
    bool flag = false;
    for (auto it = lst.begin(); it != lst.end();) {
        if (it->surname == key) {
            it = lst.erase(it);
            flag = true;
        } else {
            ++it;
        }
    }
    if (!flag) {
        cout << "\nЗаписи с такой Ф.И.О. не найдено!\n\n";
        return;
    } else {
        cout << "\nЗаписи успешно удалены!\n\n";
    }
    save_into_file(); //Сохраняем результат в файл
}
 
void replace_client(string const &key) { //Функция изменения номера телефона (по Ф.И.О. абонента)
    int k = 0;
    for (auto it = lst.begin(); it != lst.end(); ++it) {
        if (it->surname == key) {
            k++;
            cout << "Запись #" << k << ":\n";
            cout << it->phone_number 
            << " => ";
            cin >> it->phone_number;
            it->phone_number = it->phone_number;
            cout << "\n";
        }
    }
    if (!k) {
        cout << "Записи с такой Ф.И.О. не найдено!\n\n";
        return;
    } else {
        cout << "Записи успешно обновлены!\n\n";
    }
    save_into_file(); //Сохраняем результат в файл
}
 
void output_client() { //Функция вывода списка клиентов, телефоны которых начинаются с двух заданных цифр
    ifstream in("input.txt");
    bool flag = false;
    string digits;
    cout << "Enter two phone number digits: ";
    cin >> digits;
    for (auto it = lst.begin(); it != lst.end(); ++it) {
       if (it->phone_number.find(digits) == 0) {
            cout << it->surname << "\n";
            cout << it->phone_number << "\n";
            cout << it->mount_year << "\n";
            flag = true;
        }
    } 
    in.close();
    if (!flag) {
        cout << "Искомых клиентов не найдено!\n\n";
    }
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Subscriber person;
    read_from_file(person); //Считываем в односвязный список записи, которые уже есть в файле (при первом запуске программы)
    menu:
    int choice, back; 
    string surname;
    cout << "Выберите действие:\n\n";
    cout << "0 - Выход.\n";
    cout << "1 - Добавить новую запись.\n";
    cout << "2 - Удалить запись (по Ф.И.О. абонента).\n";
    cout << "3 - Изменить номер телефона (по Ф.И.О. абонента).\n";
    cout << "4 - Список клиентов, телефоны которых начинаются с двух заданных цифр.\n";
    cout << "5 - Вывод информации из исходного файла.\n";
    cout << "6 - Формирование нового файла (Ф.И.О. абонента, год установки телефона).\n";
    cout << "7 - Печать нового файла (Ф.И.О. абонента, год установки телефона).\n";
    cout << "\nВаш выбор: ";
    cin >> choice;
    cout << "\n";
    switch (choice) {
    case 0:
        exit(0);
        break;
    case 1:
        add_client(person);
        break;
    case 2:
        cout << "Введите Ф.И.О.: ";
        cin >> surname;
        del_client(surname);
        break;
    case 3:
        cout << "Введите Ф.И.О.: ";
        cin >> surname;
        cout << "\n";
        replace_client(surname);
        break;
    case 4:
        output_client();
        break;
    case 5:
        output_from_file(person);
        break;
    case 6:
        save_into_new_file();
        break;
    case 7:
        output_from_new_file(person);
        break;
    default:
        cout << "Пункт выбран неправильно!\n\n";
    }
    cout << "Вы хотите вернуться в меню?\n";
    cout << "1 - Да\n";
    cout << "2 - Нет\n";
    cout << "Ваш выбор: ";
    cin >> back;
    if (back == 1) {
        system("cls");
        goto menu;
    } else {
        exit(0);
    }
    system("pause");
    return 0;
}
2
Модератор
Эксперт С++
11045 / 9111 / 5473
Регистрация: 18.12.2011
Сообщений: 24,369
01.09.2019, 07:36 3
См. ссылки внизу страницы
И в дальнейшем не ленитесь пользоваться поиском по разделу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2019, 07:36

Телефонный справочник
Всем привет! :) Задачка в двух словах такова. Надо сделать телефонный справочник, чтоб можно было...

телефонный справочник
Создать телефонный справочник для осуществления следующих операций: Добавление абонентов в...

Телефонный справочник.
#include &quot;stdio.h&quot; #include &quot;conio.h&quot; #define FNAME &quot;I:\\phone.txt\0&quot; void main() { char...

Телефонный справочник
Помогите пожалуйста написать программу &quot;Телефонный справочник&quot;, в которой есть два массива по 10...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.