Как создать бесконечный цикл

471
22 сентября 2019, 15:30

Как звучит задача:

Написать программу «справочник». Создать два одномерных массива. Один массив хранит номера 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;
    }
}
Answer 1

Сами по себе 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.

Answer 2

for(;;) - это и есть бесконечный цикл. Банальный ответ, но всё же.

READ ALSO
Преобразование Mat в byte[] и обратно

Преобразование Mat в byte[] и обратно

Необходимо получить класс Mat, провести с ним манипуляции и сохранить в byte[], с последующим восстановлением byte[] в MatНаписал простейший пример:

136
UnixException on Mac

UnixException on Mac

Начал получить ошибку на Mac при попытке записать pdf файл в папку tempВернее, приложение должно записывать туда файл, но не записывает (исключения...

134
Exception in thread &ldquo;main&rdquo; java.lang.ArrayIndexOutOfBoundsException: 1 at Main.main(Main.java:15) Why?

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1 at Main.main(Main.java:15) Why?

Если я в 15 строке заменяю на простое, обыкновенное число (не digitnextInt()), то все работает по плану!

132
Версионирование API Spring

Версионирование API Spring

У меня есть старый контроллер, который обслуживает все запросы по адресу /get, то есть на уровне класса стоит аннотация @RequestMapping(value = "get")

182