В случае ввода неправильных данных и возвращения в главное меню в подпрограммах появляется указанный цикл - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имею след код и примитивная защита от "дурака", реализованная посредством условия if, else и бесконечного цикла for. В случае ввода неправильных данных программа предупреждает об этом и предлагает вернуться в главное меню. Но я столкнулся с проблемой: в случае ввода неправильных данных и возвращения в главное меню в подпрограммах появляется этот цикл.Прошу помочь разобраться. Сам цикл представлен на 176 строке.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int mass[20][20], mass1[20][20], res[20][20], i, k, j, n, z;
    char ans;
    printf("Введите размер исходных матриц - не более 20\n");
    printf("Вы ввели: ");
    if (scanf("%d", &n) && (n > 0 && n < 21))
    {
        printf("\n");
        printf("1 - Автозаполнение элементов матрицы\n");
        printf("2 - Ввод данных с клавиатуры\n");
        printf("3 - Заполнение диагоналей 2 - x матриц единицами\n");
        printf("Вы ввели: ");
        scanf("%d", &z);
        switch (z)
        {
        case 1: system("cls");
        {
            for (i = 0; i < n; i++)
            {
 
                for (j = 0; j < n; j++)
                    mass[i][j] = rand();
            }
            printf("Ваш результат: ");
            for (i = 0; i < n; i++)
            {
                printf("\n");
                for (j = 0; j < n; j++)
                    printf("%d\t", mass[i][j]);
            }
            printf("\n");
        }
        break;
        case 2: system("cls");
        {
            for (i = 0; i < n; i++)
            {
 
                for (j = 0; j < n; j++)
                {
                    printf("Введите элемент первой матрицы %d.%d : ", i + 1, j + 1);
                    scanf("%d", &mass[i][j]);
                }
            }
            for (i = 0; i < n; i++)
            {
 
                for (j = 0; j < n; j++)
                {
                    printf("Введите элемент второй матрицы %d.%d : ", i + 1, j + 1);
                    scanf("%d", &mass1[i][j]);
                }
            }
            printf("Ваша матрица 1: ");
            for (i = 0; i < n; i++)
            {
                printf("\n");
                for (j = 0; j < n; j++)
                {
                    printf("%d\t", mass[i][j]);
                }
            }
            printf("\n");
            printf("Ваша матрица 2: ");
            for (i = 0; i < n; i++)
            {
                printf("\n");
                for (j = 0; j < n; j++)
                {
                    printf("%d\t", mass1[i][j]);
                }
            }
            printf("\n");
            printf("1 - Сложение\n");
            printf("2 - Умножение\n");
            printf("Вы ввели: ");
            scanf("%d", &z);
            switch (z)
            {
            case 1:
                printf("Сумма матриц: ");
                for (i = 0; i < n; i++)
                {
                    printf("\n");
                    for (j = 0; j < n; j++)
                        printf("%d\t", mass[i][j] + mass1[i][j]);
                }
 
                break;
            case 2:
                printf("Умножение матриц: ");
                for (i = 0; i < n; i++) {
                    for (j = 0; j < n; j++)
                    {
                        res[i][j] = 0;
                        for (k = 0; k < n; k++)
                            res[i][j] += mass[i][k] * mass1[k][j];
                    }
                }
                for (i = 0; i < n; i++)
                {
                    printf("\n");
                    for (j = 0; j < n; j++)
                        printf("%d\t", res[i][j]);
                }printf("\n");
            }
        }
        break;
        case 3: system("cls");
        {
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                    if (i == j)
                        mass[i][j] = 1;
                    else mass[i][j] = 0;
            }
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                    if (i == j)
                        mass1[i][j] = 1;
                    else mass1[i][j] = 0;
            }
            printf("Ваша заполненная матрица 1: ");
            for (i = 0; i < n; i++)
            {
                printf("\n");
                for (j = 0; j < n; j++)
                    printf("%d\t", mass[i][j]);
            }
            printf("\n");
            printf("Ваша заполненная матрица 2: ");
            for (i = 0; i < n; i++)
            {
                printf("\n");
                for (j = 0; j < n; j++)
                    printf("%d\t", mass1[i][j]);
            }
            printf("\n"); break;
        }
        default:
            for (;;)
            {
                gets(&ans);
                system("cls");
                printf("Вы выбрали несуществующий пункт! Попробовать еще? (y / n): ");
                scanf("%s", &ans);
                if (strlen(&ans) == 1)
                {
                    if (ans == 'y')
                    {
                        system("cls");
                        main();
                    }
                    if (ans == 'n')
                    {
                        system("cls");
                        exit(0);
                    }
                }
            }
        }
    }
    else
    {
        for (;;)
        { 
        gets(&ans);
        system("cls");
        printf("Вы ввели неверное значение! Попробовать еще? (y / n): ");
        scanf("%s", &ans);
        if (strlen(&ans) == 1)
        {
            if (ans == 'y')
            {
                system("cls");
                main();
            }
            if (ans == 'n')
            {
                system("cls");
                exit(0); 
            }
        }
        }
    }
            return 0;       
}

Решение задачи: «В случае ввода неправильных данных и возвращения в главное меню в подпрограммах появляется указанный цикл»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <locale.h>
 
int main()
{
 
    int mass[20][20], mass1[20][20], res[20][20], i, k, j, n, z;
    char ans='y';
    setlocale(LC_ALL, "Russian");
    while(ans=='y')
    {
    ans = 'n';
    system("cls");
    printf("Введите размер исходных матриц - не более 20\n");
    printf("Вы ввели: ");
    scanf("%d", &n);
    if (n > 0 && n < 21)
    {
        printf("\n");
        printf("1 - Автозаполнение элементов матрицы\n");
        printf("2 - Ввод данных с клавиатуры\n");
        printf("Вы ввели: ");
        scanf("%d", &z);
        system("cls");
        switch (z)
        {
        case 1:
        {
            for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                {
                    mass[i][j] = rand()%10;
                    mass1[i][j] = rand()%10;
                }
 
            break;
        }
        case 2:
        {
            for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                {
                    printf("Введите элемент первой матрицы %d.%d : ", i + 1, j + 1);
                    scanf("%d", &mass[i][j]);
                }
 
            for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                {
                    printf("Введите элемент второй матрицы %d.%d : ", i + 1, j + 1);
                    scanf("%d", &mass1[i][j]);
                }
            break;
        }
        default:
        {
            printf("Вы ввели неверное значение! Попробовать еще? (y / n): ");
            fflush(stdin);
            ans = getchar();
            if (ans != 'y')
                return 0;
        }
    }
    }
    else
        return;
    }
 
    printf("Ваша матрица 1: ");
    for (i = 0; i < n; i++)
    {
        printf("\n");
        for (j = 0; j < n; j++)
            printf("%d\t", mass[i][j]);
    }
    printf("\nВаша матрица 2: ");
    for (i = 0; i < n; i++)
    {
        printf("\n");
        for (j = 0; j < n; j++)
            printf("%d\t", mass1[i][j]);
    }
    ans = 'y';
    while(ans=='y')
    {
        ans = 'n';
        printf("\n");
        printf("1 - Сложение\n");
        printf("2 - Умножение\n");
        printf("Вы ввели: ");
        scanf("%d", &z);
        system("cls");
        switch (z)
        {
            case 1:
            {
                printf("Сумма матриц: ");
                for (i = 0; i < n; i++)
                    for (j = 0; j < n; j++)
                        res[i][j] = mass[i][j] + mass1[i][j];
 
                break;
            }
            case 2:
            {
                printf("Умножение матриц: ");
                for (i = 0; i < n; i++)
                {
                    for (j = 0; j < n; j++)
                    {
                    res[i][j] = 0;
                    for (k = 0; k < n; k++)
                        res[i][j] += mass[i][k] * mass1[k][j];
                    }
                }
                for (i = 0; i < n; i++)
                {
                    printf("\n");
                    for (j = 0; j < n; j++)
                        printf("%d\t", res[i][j]);
                }
                printf("\n");
                break;
            }
            default:
            {
                printf("Вы выбрали несуществующий пункт! Попробовать еще? (y / n): ");
                fflush(stdin);
                ans = getchar();
            }
        }
    }
    printf("Ваша матрица 1: ");
    for (i = 0; i < n; i++)
    {
        printf("\n");
        for (j = 0; j < n; j++)
            printf("%d\t", mass[i][j]);
    }
    printf("\nВаша матрица 2: ");
    for (i = 0; i < n; i++)
    {
        printf("\n");
        for (j = 0; j < n; j++)
            printf("%d\t", mass1[i][j]);
    }
    printf("\nРезультат: ");
    for (i = 0; i < n; i++)
    {
        printf("\n");
        for (j = 0; j < n; j++)
            printf("%d\t", res[i][j]);
    }
 
    return 0;
}

Объяснение кода листинга программы

В этом коде представлена программа для работы с двумя матрицами. Пользователю предлагается ввести размер матриц, а затем заполнить их элементами. После этого выполняется операция сложения или умножения матриц, и результат выводится на экран.

  1. Объявлены матрицы mass, mass1, res, а также переменные i, k, j, n, z, ans.
  2. Установлена локальная область с помощью setlocale(LC_ALL, Russian).
  3. Введен цикл while(ans=='y'), который продолжается до тех пор, пока пользователь не введет 'n'.
  4. В начале цикла пользователю предлагается ввести размер матриц.
  5. Если размер матриц введен корректно (не больше 20), то программа переходит к следующему циклу.
  6. В этом цикле пользователю предлагается выбрать операцию для выполнения (автозаполнение, ввод данных с клавиатуры, сложение или умножение).
  7. В зависимости от выбора выполняется соответствующая операция (автозаполнение, ввод данных, сложение или умножение).
  8. Если пользователь вводит неверное значение, программа возвращает 0.
  9. Выводится матрица 1.
  10. Выводится матрица 2.
  11. Выводится результат операции.
  12. Программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы