Ввод матрицы с условием остановки ввода - C (СИ)

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

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

Доброго времени суток. Пытаюсь написать программу, в которой нужно будет сначала задать количество столбцов матрицы, а затем вводить строки до тех пор, пока все числа в последней не будут делиться на 3. Ввод матрицы реализовать смог, проверку делимости последней строки на тройку тоже реализовал. Однако не могу придумать способ реализации остановки ввода при условии, что последняя введённая пользователем строка делится на 3. Буду благодарен за идеи.
#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main() 
{
 
    int *a;  // указатель на массив
    int i, j, n, m;
     
    bool needbrake;
 
    int r, s, k;
    s = 3;
    k = 0;
 
    printf("Quantity of strings: ");
    scanf_s("%d", &n);
    printf("Quantity of columns: ");
    scanf_s("%d", &m);
    // Выделение памяти
    a = (int*)malloc(n*m * sizeof(int));
    // Ввод элементов массива
    for (i = 0; i < n; i++)  // цикл по строкам
        {
            for (j = 0; j < m; j++)  // цикл по столбцам
            {
                printf("a[%d][%d] = ", i, j);
                scanf_s("%d", (a + i*m + j));
            }
        }
 
        //тут проверка на делимость
    for (j = 0; j < m; j++)
    {
        r = a[(n - 1), j];
        if (r%s == 0)
            k = k + 1;
    }
    if (k == m) printf("poslednyaya stroka delitsa na 3:");
    else {
        printf("ne delitsa na 3:");
 
    }
    if (k == m) needbrake = true;
    
            // Вывод элементов массива
            for (i = 0; i < n; i++)  // цикл по строкам
            {
                for (j = 0; j < m; j++)  // цикл по столбцам
                {
                    printf("%5d ", *(a + i*m + j)); // 5 знакомест под элемент массива
                }
                printf("\n");
            }
        free(a);
        getchar();   getchar();
        
        return 0;
}

Решение задачи: «Ввод матрицы с условием остановки ввода»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int **a, i = 0, j, flag = 0, ns = 1, m;
    printf("Quantity of columns: ");
    scanf("%d", &m);
    a = malloc(sizeof(a));
    a[i] = malloc(m * sizeof(*a));
    puts("Input elements:");
    while(1){
        flag = 0;
        for(j = 0; j < m; ++j){
            printf("a[%d][%d] = ", i, j);
            scanf("%d", &a[i][j]);
            if(a[i][j] % 3 != 0)
                flag = 1;
        }
        if(!flag)
            break;
        else
            ++i;
            ++ns;
            a = realloc(a, ns * sizeof(a));
            a[i] = malloc(m * sizeof(*a));
    }
    for(i = 0; i < ns; ++i){
        for(j = 0; j < m; ++j)
            printf("%3d", a[i][j]);
        printf("\n");
        free(a[i]);
    }
    free(a);
    return 0;
}

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

В этом коде:

  1. Объявлены переменные:
    • i - счётчик строк матрицы;
    • j - счётчик столбцов матрицы;
    • flag - флаг условия остановки ввода;
    • ns - счётчик количества строк матрицы;
    • m - количество столбцов матрицы;
    • a - двумерный массив (матрица).
  2. Задаётся количество столбцов матрицы с помощью функции scanf().
  3. Выделяется память под матрицу с помощью функций malloc() и realloc().
  4. Выводится приглашение к вводу элементов матрицы.
  5. В цикле while(1) происходит ввод элементов матрицы до тех пор, пока не будет введено число, кратное трём (условие остановки).
  6. Если введено число, кратное трём, то флаг flag меняется на единицу.
  7. Если введено не кратное трём число, то флаг flag меняется на ноль.
  8. Если флаг равен нулю, то выполняется выход из цикла с помощью оператора break.
  9. Если флаг равен единице, то добавляется новая строка матрицы (увеличивается счётчик строк ns, выделяется новая память под новую строку матрицы и присваивается новый индекс i).
  10. После ввода всех элементов матрицы выводится на экран с помощью цикла for.
  11. Освобождается память, выделенная под матрицу.
  12. Возвращается ноль, завершая работу программы.

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


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

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

14   голосов , оценка 3.857 из 5