Определить количество столбцов матрицы, содержащих хотя бы один нулевой элемент - 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. Если он больше максимального значения, то обновляет максимальное значение и индекс строки, в которой был найден максимум. В конце программы выводится на экран найденный максимум и индекс строки. Для данного кода список объяснений выглядит следующим образом:
- int i, j, s, k; - в этой строке объявляются переменные, которые будут использоваться в цикле.
- int max = 0, imax; - здесь объявляются две переменные: max и imax. Переменная max будет использоваться для хранения количества нулевых элементов в строке, а imax - для хранения индекса строки с максимальным количеством нулевых элементов.
- int n = 2, m = 4; - в этой строке определяются значения переменных n и m. Они представляют собой количество строк и столбцов в матрице соответственно.
- int a[2][4] = { - здесь определяется матрица a размером 2x4, заполненная значениями.
- 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); - здесь начинается внутренний цикл, который проверяет все элементы в строке на равенство нулю. Если элемент равен нулю, то увеличивается значение счетчика s.
- if (s > max) { - если значение счетчика s больше максимального значения, то выполняется блок кода.
- max = s; - значение счетчика s присваивается переменной max.
- imax = i; - значение переменной i присваивается переменной imax.
- } - закрывается блок кода, выполняемый при превышении значения счетчика s максимального значения.
- printf(
row=%d max=%d\n
, imax, max+1); - после завершения циклов выводится на экран количество нулевых элементов в строке и индекс строки. Обратите внимание, что в данном коде предполагается, что матрица уже заполнена значениями. Если матрица пустая, то код не будет работать корректно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д