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