вывод номера последней строки с максимальным количеством одинаковых элементов
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <locale.h>
#include <stdio.h>
#include <time.h>
// Функция для вывода матрицы на экран
void printMatrix(int** matrix, int rows, int cols) {
printf("Матрица:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
// Функция для заполнения матрицы рандомными числами
void fillRandomMatrix(int** matrix, int rows, int cols) {
srand(time(NULL));
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = rand() % 10; // Генерация случайных чисел от 0 до 99
}
}
}
int main() {
setlocale(LC_ALL, "Rus");
int** matrix;
int m, n;
// Ввод размеров матрицы
printf("Введите количество строк и столбцов матрицы: ");
scanf("%d %d", &m, &n);
// Выделение памяти для указателей на строки
matrix = (int**)malloc(m * sizeof(int*));
if (matrix == NULL) {
printf("Ошибка выделения памяти\n");
return 1;
}
// Выделение памяти для каждой строки
for (int i = 0; i < m; i++) {
matrix[i] = (int*)malloc(n * sizeof(int));
if (matrix[i] == NULL) {
printf("Ошибка выделения памяти\n");
// Освобождение ранее выделенной памяти
for (int j = 0; j < i; j++) {
free(matrix[j]);
}
free(matrix);
return 1;
}
}
int choice;
printf("Выберите способ заполнения матрицы:\n");
printf("1. Ввести элементы самостоятельно\n");
printf("2. Заполнить случайными числами\n");
printf("Ваш выбор: ");
scanf("%d", &choice);
if (choice == 1) {
// Ввод элементов матрицы
printf("Введите элементы матрицы:\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
}
else if (choice == 2) {
fillRandomMatrix(matrix, m, n);
}
else {
printf("Некорректный выбор.\n");
// Освобождение памяти
for (int i = 0; i < m; i++) {
free(matrix[i]);
}
free(matrix);
return 1;
}
int maxCount = 0; // счетчик макс количества одинаковых элементов
int maxRow = -1; // счетчик количества строк
// Подсчет количества одинаковых элементов в каждой строке
for (int i = 0; i < m; i++) {
int count = 0;
for (int j = 0; j < n - 1; j++) {
if (matrix[i][j] == matrix[i][j + 1]) {
count++;
}
else {
count = 0;
}
}
// Обновление номера строки с максимальным количеством одинаковых элементов
if (count >= maxCount) {
maxRow = i;
maxCount = count;
}
}
// Вывод результата
printMatrix(matrix, m, n);
if (maxRow == -1) {
printf("Нет строк с одинаковыми элементами.\n");
}
else {
printf("Номер последней строки с максимальным количеством одинаковых элементов: %d\n", maxRow + 1);
}
// Освобождение памяти
for (int i = 0; i < m; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
Вот код. При компиляции выводит якобы строку все как нужно по условию, но при проверке выясняется, что это не так. К примеру, последней строкой код определил номер 4, но при проверке последней строкой оказывается 6-ая. Как исправить?
Ответы (1 шт):
С точки зрения оптимизации решение плохое , но я как понимаю это лаба , так что опустим этот момент, сделайте один цикл for и найдите максимально возможное число одинаковых элементов, потом делаете еще один цикл for где считаете число одинаковых элементов для каждой строки и делаете проверку чтобы число одинаковых элементов для текущей строки было равно максимально возможному числу элементов , если условие выполняется, то заносите индекс i, в любую , и после цикла выводите , если не сработает или будут вопросы пишите в комментарии.