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

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

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

Дана целочисленная прямоугольная матрица. Определить: 1. количество столбцов, содержащих хотя бы один нулевой элемент; 2. номер строки, в которой находится самая длинная серия одинаковых элементов. Второй пункт (для номера строки) не выполняется. Ошибки не вижу, подскажите. Только учусь еще. Case 3 как раз для обработки, наверное, где-то там...
Листинг программы
  1. // Лабораторная работа №3.cpp: определяет точку входа для консольного приложения.
  2. //
  3. /*Дана целочисленная прямоугольная матрица. Определить:
  4. количество столбцов, содержащих хотя бы один нулевой элемент;
  5. номер строки, в которой находится самая длинная серия одинаковых элементов.*/
  6. #include "stdafx.h"
  7. #include <stdio.h>
  8. #include <clocale>
  9. #define CRTDBG_MAP_ALLOC
  10. #include <crtdbg.h>
  11. #include <conio.h>
  12. #include <stdlib.h>
  13. #include <ctime>
  14. int _tmain(int argc, _TCHAR* argv[])
  15. {
  16. _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  17. setlocale(LC_ALL, "Russian");
  18. setlocale(LC_ALL, "rus");
  19. printf("\t\t\tЛабораторная работа №3\n");
  20. printf("\nКлавиша 1: заполнение массива случайными числами");
  21. printf("\nКлавиша 2: заполнение массива с клавиатуры");
  22. printf("\nКлавиша 3: обработка массива");
  23. printf("\nКлавиша 4: вывод обработанного массива на экран");
  24. printf("\nКлавиша 0: выход");
  25. printf("\n\nСоблюдайте порядок исполнения команд!\n\n");
  26. char s;
  27. int n = 0;
  28. int m = 0;
  29. int** a = 0;
  30. bool p = 0;
  31. int x = 0;
  32. int y = 0;
  33. int str = 0;
  34. int imax = 0;
  35. int max = 0;
  36. do
  37. {
  38. s=_getch();
  39. switch(s)
  40. {
  41. case '1':
  42. {
  43. if ( a != 0)
  44. {
  45. for(int i = 0; i < n; i++)
  46. {
  47. delete a[i];
  48. }
  49. delete [] a;
  50. }
  51. printf("Введите размер массива\n");
  52. do
  53. {
  54. scanf("%d", &n);
  55. scanf("%d", &m);
  56. if ((!n || n <= 0) || (!m || m <= 0))
  57. {
  58. flushall();
  59. printf("Введено неверное значение\n");
  60. }
  61. }while ((!n || n <= 0) || (!m || m <=0));
  62. a = new int* [n];
  63. for (int i=0; i < n; i++)
  64. a[i] = new int [m];
  65. int L = 0;
  66. int P = 0;
  67. printf("Введите ограничения по выбору чисел от__ до__\n");
  68. scanf("%d/n", &L);
  69. scanf("%d/n", &P);
  70. srand(time(0));
  71. for (int i = 0; i < n; i++)
  72. {
  73. for( int j = 0; j < m; j++)
  74. {
  75. a[i][j] = L + rand() % (P - L + 1);
  76. printf("%d ", a[i][j]);
  77. }
  78. printf("\n");
  79. }
  80. printf("Ожидается обработка массива\n");
  81. p = true;
  82. break;
  83. }
  84. case '2':
  85. {
  86. if ( a != 0)
  87. {
  88. for(int i = 0; i < n; i++)
  89. {
  90. delete a[i];
  91. }
  92. delete [] a;
  93. }
  94. a = new int* [n];
  95. printf("Введите размер массива\n");
  96. do
  97. {
  98. scanf("%d", &n);
  99. scanf("%d", &m);
  100. if ((!n || n <= 0) || (!m || m <= 0))
  101. {
  102. flushall();
  103. printf("Введено неверное значение\n");
  104. }
  105. }while ((!n || n <= 0) || (!m || m <= 0));
  106. for (int i = 0; i < n; i++)
  107. a[i] = new int [m];
  108. for(int i = 0; i < n; i++)
  109. {
  110. for(int j = 0; j < m; j++)
  111. {
  112. scanf("%d", &a[i][j]);
  113. }
  114. }
  115. for(int i = 0; i < n; i++)
  116. {
  117. for(int j= 0; j < m; j++)
  118. printf("%d ", a[i][j]);
  119. printf("\n");
  120. }
  121. p = true;
  122. break;
  123. }
  124. case '3':
  125. {
  126. if (p == 1)
  127. {
  128. for(int j = 0; j < m; j++)
  129. {
  130. for(int i = 0; i < n; i++)
  131. if (a[i][j] == 0)
  132. {
  133. x = x + 1;
  134. break;
  135. }
  136. }
  137. int s = 0;
  138. int k = 0;
  139. for (int i = 1; i < n; i++)
  140. {
  141. for (int j = 1; j < m; j++)
  142. {
  143. s = 0;
  144. k = j+1;
  145. do
  146. {
  147. s = s+1;
  148. k = k+1;
  149. }while (a[i][j] == a[i][k]);
  150. if (s > max)
  151. {
  152. max = s;
  153. imax = i;
  154. }
  155. s = 0;
  156. }
  157. }
  158. printf("Обработка массива завершена\n");
  159. }
  160. else
  161. {
  162. printf("Ошибка! Соблюдайте порядок исполнения команд! \n");
  163. printf("Ожидается ввод массива! \n");
  164. break;
  165. }
  166. break;
  167. }
  168. case '4':
  169. {
  170. if (p == 1)
  171. {
  172. printf("\nКоличество столбцов, в которых хотя бы один элемент равен 0 = %d ", x);
  173. printf("\nНомер строки, в которой находится самая длинная серия одинаковых элементов = %d ", imax);
  174. }
  175. else
  176. {
  177. printf("Ошибка! Соблюдайте порядок исполнения команд! \n");
  178. printf("Ожидается ввод и обработка массива! \n");
  179. break;
  180. }
  181. break;
  182. }
  183. }
  184. }while(s != '0');
  185. if (a != 0)
  186. {
  187. for(int i = 0; i < n; i++)
  188. {
  189. delete[] a[i];
  190. }
  191. delete [] a;
  192. }
  193. return 0;
  194. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.     int i, j, s, k;
  5.     int max = 0, imax;
  6.     int n = 2, m = 4;
  7.     int a[2][4] = {
  8.         {0, 2, 2, 0},
  9.         {1, 1, 1, 2}
  10.     };
  11.  
  12.     for (i = 0; i < n; i++) {
  13.         for (j = 0; j < m - 1; j++) {
  14.             for (s = 0, k = j+1; k < m && a[i][j] == a[i][k]; ++s, ++k);
  15.             if (s > max) {
  16.                 max  = s;
  17.                 imax = i;
  18.             }
  19.         }
  20.     }
  21.  
  22.     printf("row=%d max=%d\n", imax, max+1);
  23. }

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

В этом коде определен цикл, который проходит по всем элементам матрицы. Если элемент матрицы равен нулю, то счетчик 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы