Определить второй по величине элемент двумерного массива - C (СИ)

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

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

Доброго дня! По условию задачи надо определить второй по величине элемент двумерного массива и вывести на экран номера строк и количество данных элементов в этих строках. вот что получилось:
Листинг программы
  1. int main()
  2. {
  3. system ("chcp 1251");
  4. system ("cls");
  5. int a[10][10],n,m,i,j;
  6. printf("введите количество строк от 1 до 10\n");
  7. scanf("%d",&n);
  8. while(n<1||n>10)
  9. {printf("введено неверное значение, пробуй еще\n");
  10. scanf("%d",&n);
  11. }
  12. printf("введите количество элементов в каждой строке от 1 до 10\n");
  13. scanf("%d",&m);
  14. while(m<1||m>10)
  15. {printf("введено неверное значение, пробуй еще\n");
  16. scanf("%d",&m);
  17. }
  18. srand(time(0));
  19. for(i=0;i<n;i++)
  20. {
  21. for(j=0;j<m;j++)
  22. {
  23. a[i][j]=rand()%30+1;
  24. }
  25. }
  26. for(i=0;i<n;i++)
  27. {
  28. for(j=0;j<m;j++)
  29. {
  30. printf("%4d",a[i][j]);
  31. }
  32. printf("\n");
  33. }
  34. int max=a[0][0],max2=a[0][0];
  35. for(i=0;i<n;i++)
  36. {
  37. for(j=0;j<m;j++)
  38. {
  39. if(a[i][j]>max)
  40. {
  41. max=a[i][j];
  42. }
  43. if(a[i][j]>max2&&a[i][j]<max)
  44. {
  45. max2=a[i][j];
  46. }
  47. }
  48. }
  49. printf("second max element =%d\n",max2);
  50. int sum[i];
  51. for(i=0;i<n;i++)
  52. {
  53. sum[i]=0;
  54. for(j=0;j<m;j++)
  55. {
  56. if(a[i][j]==max2)
  57. {sum[i]++;
  58. }
  59. }
  60. if(sum[i]>0) printf("количество вторых по величине элементов %d строки равно %d\n",i+1,sum[i]);
  61. }
  62. return 0;
  63. }
Проблема в том, что программа иногда выводит максимальный элемент вместо второго по величине... подскажите где ошибка.
Вроде как если в условии:
Листинг программы
  1. if( ( a[i][j]>max2 ) && ( a[i][j]<max ) )
  2. {
  3. max2=a[i][j];
  4. }
добавить выделенные скобки, то вроде как ошибка появляется реже, но все равно проскакивает

Решение задачи: «Определить второй по величине элемент двумерного массива»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <time.h>
  5. #define n 5
  6. #define m 4
  7. //вывести на экран второй наибольший элемент массива
  8. int main()
  9. {
  10.     bool flag = false;
  11.     int i, j, max, max2, a[n][m];
  12.     srand(time(0));
  13.     for(i = 0; i < n; i++){
  14.         for(j = 0; j < m; j++){
  15.             printf("%3d", a[i][j] = rand() % 150 - 60);
  16.             if(i == 0 && j == 0)
  17.                 max = max2 = a[0][0];
  18.             if(!flag){
  19.                 if(a[i][j] < max){
  20.                     max2 = a[i][j];
  21.                     flag = true;
  22.                 }
  23.             }
  24.             if(a[i][j] > max){
  25.                 max2 = max;
  26.                 max = a[i][j];
  27.             }
  28.             if(a[i][j] > max2 && a[i][j] < max)
  29.                 max2 = a[i][j];
  30.         }
  31.     }
  32.     printf("\n%d\n", max2);
  33.     return 0;
  34. }

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

  1. Включаем необходимые заголовочные файлы для работы с C
  2. Задаем размерность двумерного массива с помощью макросов
  3. Инициализируем переменные, в том числе флаг, который указывает, найден ли уже второй максимальный элемент
  4. Заполняем массив случайными числами с помощью функции rand() и операции модуля %
  5. В цикле находим второй максимальный элемент, сравнивая текущий элемент с уже найденными максимальными значениями
  6. Выводим на экран второй максимальный элемент массива
  7. Возвращаем 0, чтобы указать, что программа успешно завершилась

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.857 из 5

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

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

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