Как звучит задача:
Написать программу «справочник». Создать два одномерных массива. Один массив хранит номера ICQ, второй – телефонные номера. Реализовать меню для пользователя:
1.Отсортировать по номерам ICQ
2.Отсортировать по номерам телефона
3.Вывести список пользователей
4.Выход
Вопрос:
Всё, что я хотел реализовать - сделано, но вот goto мне не нравится и хотелось бы понять как обходиться без него.
Сам код:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
srand(time(0));
const int ICQ = 10;
const int N = 10;
int arr1[ICQ] = {};
int arr2[N] = {};
int num = 0;
tryAgain2:
for (int i = 0; i < ICQ; i++) {
arr1[i] = rand() % 101;
}
for (int i = 0; i < N; i++) {
arr2[i] = rand() % 90000000 + 9999999;
}
tryAgain:
cout << "№\t Номер телефона \t Номер ICQ" << endl;
cout << "1.\t " << arr2[0] << "\t\t " << arr1[0] << endl;
cout << "2.\t " << arr2[1] << "\t\t " << arr1[1] << endl;
cout << "3.\t " << arr2[2] << "\t\t " << arr1[2] << endl;
cout << "4.\t " << arr2[3] << "\t\t " << arr1[3] << endl;
cout << "5.\t " << arr2[4] << "\t\t " << arr1[4] << endl;
cout << "6.\t " << arr2[5] << "\t\t " << arr1[5] << endl;
cout << "7.\t " << arr2[6] << "\t\t " << arr1[6] << endl;
cout << "8.\t " << arr2[7] << "\t\t " << arr1[7] << endl;
cout << "9.\t " << arr2[8] << "\t\t " << arr1[8] << endl;
cout << "10.\t " << arr2[9] << "\t\t " << arr1[9] << endl;
cout << "\n1.\t Отсортировать по номерам ICQ" << endl;
cout << "2.\t Отсортировать по номерам телефона" << endl;
cout << "3.\t Вывести список пользователей" << endl;
cout << "4.\t Выход" << endl << endl;
cin >> num;
switch (num)
{
case 1:
system("cls");
for (int i = 1; i < ICQ; ++i)
{
int k = i;
while (k > 0 && arr1[k - 1] > arr1[k])
{
int tmp = arr1[k - 1];
arr1[k - 1] = arr1[k];
arr1[k] = tmp;
tmp = arr2[k - 1];
arr2[k - 1] = arr2[k];
arr2[k] = tmp;
k -= 1;
}
}
goto tryAgain;
case 2:
system("cls");
for (int i = 1; i < N; ++i)
{
int k = i;
while (k > 0 && arr2[k - 1] > arr2[k])
{
int tmp = arr2[k - 1];
arr2[k - 1] = arr2[k];
arr2[k] = tmp;
tmp = arr1[k - 1];
arr1[k - 1] = arr1[k];
arr1[k] = tmp;
k -= 1;
}
}
goto tryAgain;
case 3:
system("cls");
goto tryAgain2;
break;
case 4:
return 0;
}
}
Сами по себе goto
убираются легко. Для более изящной программы надо как-то перерабатывать алгоритм, а просто эквивалентное преобразование в for
будет выглядеть так:
#include <iostream>
#include <ctime>
using namespace std;
constexpr int ICQ = 10;
constexpr int N = 10;
void Reinit(int arr1[], int arr2[]) {
for (int i = 0; i < ICQ; i++) {
arr1[i] = rand() % 101;
}
for (int i = 0; i < N; i++) {
arr2[i] = rand() % 90000000 + 9999999;
}
}
int main()
{
setlocale(LC_ALL, "Russian");
srand((unsigned)time(0));
int arr1[ICQ];
int arr2[N];
int num = 0;
Reinit(arr1, arr2);
for (;;) {
cout << "№\t Номер телефона \t Номер ICQ" << endl;
cout << "1.\t " << arr2[0] << "\t\t " << arr1[0] << endl;
cout << "2.\t " << arr2[1] << "\t\t " << arr1[1] << endl;
cout << "3.\t " << arr2[2] << "\t\t " << arr1[2] << endl;
cout << "4.\t " << arr2[3] << "\t\t " << arr1[3] << endl;
cout << "5.\t " << arr2[4] << "\t\t " << arr1[4] << endl;
cout << "6.\t " << arr2[5] << "\t\t " << arr1[5] << endl;
cout << "7.\t " << arr2[6] << "\t\t " << arr1[6] << endl;
cout << "8.\t " << arr2[7] << "\t\t " << arr1[7] << endl;
cout << "9.\t " << arr2[8] << "\t\t " << arr1[8] << endl;
cout << "10.\t " << arr2[9] << "\t\t " << arr1[9] << endl;
cout << "\n1.\t Отсортировать по номерам ICQ" << endl;
cout << "2.\t Отсортировать по номерам телефона" << endl;
cout << "3.\t Вывести список пользователей" << endl;
cout << "4.\t Выход" << endl << endl;
cin >> num;
switch (num)
{
case 1:
system("cls");
for (int i = 1; i < ICQ; ++i)
{
int k = i;
while (k > 0 && arr1[k - 1] > arr1[k])
{
int tmp = arr1[k - 1];
arr1[k - 1] = arr1[k];
arr1[k] = tmp;
tmp = arr2[k - 1];
arr2[k - 1] = arr2[k];
arr2[k] = tmp;
k -= 1;
}
}
break;
case 2:
system("cls");
for (int i = 1; i < N; ++i)
{
int k = i;
while (k > 0 && arr2[k - 1] > arr2[k])
{
int tmp = arr2[k - 1];
arr2[k - 1] = arr2[k];
arr2[k] = tmp;
tmp = arr1[k - 1];
arr1[k - 1] = arr1[k];
arr1[k] = tmp;
k -= 1;
}
}
break;
case 3:
system("cls");
Reinit(arr1, arr2);
break;
case 4:
return 0;
}
}
}
Мелкие замечания:
1) Для srand
надо делать каст time_t
.
2) Массивы при объявлении инициализировать не нужно, они будут все равно инициализированы позже.
3) После goto
не нужно ставить break
.
for(;;)
- это и есть бесконечный цикл. Банальный ответ, но всё же.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Необходимо получить класс Mat, провести с ним манипуляции и сохранить в byte[], с последующим восстановлением byte[] в MatНаписал простейший пример:
Начал получить ошибку на Mac при попытке записать pdf файл в папку tempВернее, приложение должно записывать туда файл, но не записывает (исключения...
Если я в 15 строке заменяю на простое, обыкновенное число (не digitnextInt()), то все работает по плану!
У меня есть старый контроллер, который обслуживает все запросы по адресу /get, то есть на уровне класса стоит аннотация @RequestMapping(value = "get")