Определить количество столбцов матрицы, содержащих хотя бы один нулевой элемент - C (СИ)

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

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

Дана целочисленная прямоугольная матрица. Определить: 1. количество столбцов, содержащих хотя бы один нулевой элемент; 2. номер строки, в которой находится самая длинная серия одинаковых элементов. Второй пункт (для номера строки) не выполняется. Ошибки не вижу, подскажите. Только учусь еще. Case 3 как раз для обработки, наверное, где-то там...
// Лабораторная работа №3.cpp: определяет точку входа для консольного приложения.
//
/*Дана целочисленная прямоугольная матрица. Определить:
количество столбцов, содержащих хотя бы один нулевой элемент;
номер строки, в которой находится самая длинная серия одинаковых элементов.*/
#include "stdafx.h"
#include <stdio.h>
#include <clocale>
#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <conio.h>
#include <stdlib.h>
#include <ctime>
 
int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    setlocale(LC_ALL, "Russian");
    setlocale(LC_ALL, "rus");
    printf("\t\t\tЛабораторная работа №3\n");
    printf("\nКлавиша 1: заполнение массива случайными числами");
    printf("\nКлавиша 2: заполнение массива с клавиатуры");
    printf("\nКлавиша 3: обработка массива");
    printf("\nКлавиша 4: вывод обработанного массива на экран");
    printf("\nКлавиша 0: выход");
    printf("\n\nСоблюдайте порядок исполнения команд!\n\n");
    char s;
    int n = 0;
    int m = 0;
    int** a = 0;
    bool p = 0;
    int x = 0;
    int y = 0;
    int str = 0;
    int imax = 0;
    int max = 0;
    do
    {
        s=_getch();
        switch(s)
        {
            case '1':
                {
                    if ( a != 0)
                    {
                        for(int i = 0; i < n; i++)
                        {   
                            delete a[i];
                        }
                        delete [] a;
                    }
                    printf("Введите размер массива\n");
                    
                    do
                    {
                        scanf("%d", &n);
                        scanf("%d", &m);
                        if ((!n || n <= 0) || (!m || m <= 0))
                        {
                            flushall();
                            printf("Введено неверное значение\n");
                        }
                    }while ((!n || n <= 0) || (!m || m <=0));
 
                    a = new int* [n];
                    for (int i=0; i < n; i++)
                        a[i] = new int [m];
                    int L = 0;
                    int P = 0;
                    printf("Введите ограничения по выбору чисел от__ до__\n");
                    scanf("%d/n", &L);
                    scanf("%d/n", &P);
                    srand(time(0));                 
                    for (int i = 0; i < n; i++)
                    {
                        for( int j = 0; j < m; j++)
                        {
                            a[i][j] = L + rand() % (P - L + 1);
                            printf("%d  ", a[i][j]);
                        }
                        printf("\n");
                    }
                    printf("Ожидается обработка массива\n");
                    p = true;
                    break;
                }
        
            case '2':
                {
                    if ( a != 0)
                    {
                        for(int i = 0; i < n; i++)
                        {   
                            delete a[i];
                        }
                        delete [] a;
                    }
                    a = new int* [n];
                    printf("Введите размер массива\n");
                    do
                    {
                        scanf("%d", &n);
                        scanf("%d", &m);
                        if ((!n || n <= 0) || (!m || m <= 0))
                        {
                            flushall();
                            printf("Введено неверное значение\n");
                        }
                    }while ((!n || n <= 0) || (!m || m <= 0));
                    for (int i = 0; i < n; i++)
                        a[i] = new int [m];
                    for(int i = 0; i < n; i++)
                        {
                            for(int j = 0; j < m; j++) 
                            {
                                scanf("%d", &a[i][j]);
                            }
                        }
                    for(int i = 0; i < n; i++)
                     {
                        for(int j= 0; j < m; j++)
                         printf("%d  ", a[i][j]);
                         printf("\n");
                     }
                    p = true;
                    break;
                }
            case '3':
                { 
                    if (p == 1)
                    {
                        for(int j = 0; j < m; j++)
                        {
                            for(int i = 0; i < n; i++)
                                if (a[i][j] == 0)
                                {
                                    x = x + 1;
                                    break;      
                                }
                        }
                        int s = 0;
                        int k = 0;
                        for (int i = 1; i < n; i++)
                        {
                            for (int j = 1; j < m; j++)
                            {
                                s = 0;
                                k = j+1;
                                do
                                {
                                    s = s+1;
                                    k = k+1;
                                }while (a[i][j] == a[i][k]);
                                if (s > max)
                                {
                                    max = s;
                                    imax = i;
                                }
                                s = 0;
                            }
                        }
                        printf("Обработка массива завершена\n");
                    }
                
                    else
                    {
                        printf("Ошибка! Соблюдайте порядок исполнения команд! \n");
                        printf("Ожидается ввод массива! \n");
                        break;
                    }
                    break;
                }
            case '4':
                {
                    if (p == 1)
                    {
                        printf("\nКоличество столбцов, в которых хотя бы один элемент равен 0 = %d ", x);
                        printf("\nНомер строки, в которой находится самая длинная серия одинаковых элементов = %d ", imax);
                    }                   
                    else
                    {   
                        printf("Ошибка! Соблюдайте порядок исполнения команд! \n");
                        printf("Ожидается ввод и обработка массива! \n");
                        break;
                    }
                    break;
                }
        }
    }while(s != '0');   
    if (a != 0)
    {
        for(int i = 0; i < n; i++)
        {
            delete[] a[i]; 
        }
        delete [] a;
    }
 
    return 0;
}

Решение задачи: «Определить количество столбцов матрицы, содержащих хотя бы один нулевой элемент»

textual
Листинг программы
#include <stdio.h>
 
int main() {
    int i, j, s, k;
    int max = 0, imax;
    int n = 2, m = 4;
    int a[2][4] = {
        {0, 2, 2, 0},
        {1, 1, 1, 2}
    };
 
    for (i = 0; i < n; i++) {
        for (j = 0; j < m - 1; j++) {
            for (s = 0, k = j+1; k < m && a[i][j] == a[i][k]; ++s, ++k);
            if (s > max) {
                max  = s;
                imax = i;
            }
        }
    }
 
    printf("row=%d max=%d\n", imax, max+1);
}

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

В этом коде определен цикл, который проходит по всем элементам матрицы. Если элемент матрицы равен нулю, то счетчик s увеличивается на единицу. После завершения цикла, программа проверяет значение счетчика s. Если он больше максимального значения, то обновляет максимальное значение и индекс строки, в которой был найден максимум. В конце программы выводится на экран найденный максимум и индекс строки. Для данного кода список объяснений выглядит следующим образом:

  1. int i, j, s, k; - в этой строке объявляются переменные, которые будут использоваться в цикле.
  2. int max = 0, imax; - здесь объявляются две переменные: max и imax. Переменная max будет использоваться для хранения количества нулевых элементов в строке, а imax - для хранения индекса строки с максимальным количеством нулевых элементов.
  3. int n = 2, m = 4; - в этой строке определяются значения переменных n и m. Они представляют собой количество строк и столбцов в матрице соответственно.
  4. int a[2][4] = { - здесь определяется матрица a размером 2x4, заполненная значениями.
  5. for (i = 0; i < n; i++) { - начинается цикл по всем строкам матрицы.
  6. for (j = 0; j < m - 1; j++) { - начинается цикл по всем столбцам матрицы, кроме последнего.
  7. for (s = 0, k = j+1; k < m && a[i][j] == a[i][k]; ++s, ++k); - здесь начинается внутренний цикл, который проверяет все элементы в строке на равенство нулю. Если элемент равен нулю, то увеличивается значение счетчика s.
  8. if (s > max) { - если значение счетчика s больше максимального значения, то выполняется блок кода.
  9. max = s; - значение счетчика s присваивается переменной max.
  10. imax = i; - значение переменной i присваивается переменной imax.
  11. } - закрывается блок кода, выполняемый при превышении значения счетчика s максимального значения.
  12. printf(row=%d max=%d\n, imax, max+1); - после завершения циклов выводится на экран количество нулевых элементов в строке и индекс строки. Обратите внимание, что в данном коде предполагается, что матрица уже заполнена значениями. Если матрица пустая, то код не будет работать корректно.

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


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

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

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