Определить количество столбцов матрицы, содержащих хотя бы один нулевой элемент - 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); - после завершения циклов выводится на экран количество нулевых элементов в строке и индекс строки. Обратите внимание, что в данном коде предполагается, что матрица уже заполнена значениями. Если матрица пустая, то код не будет работать корректно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д