Посчитать в матрице все столбцы, содержащие не менее 2 отрицательных элементов. Исправить ошибки - C (СИ)

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

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

Доброго времени суток! Сварганил программку, но компилятор ругается на ошибки. Помогите исправить их. Вот задача: Посчитать в матрице А (5х7) все столбцы, содержащие не менее 2 отрицательных элементов, а в матрице В (7х7) – столбцы, содержащие не менее 3 отрицательных элементов.
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #define C 5
  4. #define C1 7
  5. int Inp_mas(int *p, int n, int m)
  6. {
  7. int i, j;
  8. for (i=0; i<n; i++)
  9. for (j=0; j<m; j++)
  10. {
  11. printf("\n Input p=");
  12. scanf("%d", p);
  13. p++;
  14. }
  15. return 0;
  16. }
  17. void Outp_mas(int *p, int n, int m)
  18. {
  19. int i, j;
  20. for (i=0; i<n; i++)
  21. {
  22. for(j=0; j<m; j++)
  23. {
  24. printf("%d", *p);
  25. p++;
  26. }
  27. printf("\n");
  28. }
  29. return;
  30. }
  31. void Outp_mas1(int *p, int n)
  32. {
  33. int i;
  34. for(i=0; i<n; i++)
  35. {
  36. printf("%d", *p);
  37. p++;
  38. }
  39. printf("\n");
  40. return;
  41. }
  42. int Kol_mas(int *p, int m, int n, int t)
  43. {
  44. int k=0, h=0, pm=&s[0], j, i;
  45. for (j=0; j<m; j++)
  46. {
  47. p=&a[0][0];
  48. p+=j;
  49. for (i=0; i<n; i++)
  50. {
  51. if (*p<0)
  52. {
  53. k=k+1;
  54. }
  55. else
  56. {
  57. p+=m;
  58. }
  59. if (k>=t)
  60. {
  61. s[h]=j;
  62. h++;
  63. }
  64. else
  65. {
  66. pm=&s[0];
  67. }
  68. }
  69. }
  70. return pm;
  71. }
  72. int main()
  73. {
  74. int g, d, t, l, *p1, *p2, *p3, a[C][C1], b[C1][C1];
  75. do
  76. {
  77. printf("\n Input g=");
  78. scanf("%d", &g);
  79. printf("\n Input l=");
  80. scanf("%d", &l);
  81. }
  82. while (g<=0||g>C||l<=0||l>C1);
  83. p1=&a[0][0];
  84. p2=&b[0][0];
  85. Inp_mas(p1,g,l);
  86. Outp_mas(p2,g,l);
  87. printf("\n");
  88. Intp_mas(p2,d,l);
  89. Out_mas(p1,d,k);
  90. t=-1;
  91. p3=Kol_mas(p1,d,k);
  92. if (t!=-1)
  93. {
  94. Outp_mas(p3,h,l)
  95. }
  96. else
  97. {
  98. t=-1;
  99. }
  100. p3=Kol_mas(p1,g,l,h,t);
  101. if (t!=-1)
  102. {
  103. Outp_mas1(p3,h,l);
  104. }
  105. getch();
  106. return 0;
  107. }

Решение задачи: «Посчитать в матрице все столбцы, содержащие не менее 2 отрицательных элементов. Исправить ошибки»

textual
Листинг программы
  1. #include <stdio.h>
  2. /* #include <conio.h>     я считаю не зачем подключать её. можно вопользоваться и getchar() из stdio.h
  3.    однако я вообще по другому сделаю =))) без велосипедов*/
  4. #include <stdlib.h>
  5. #define SIZE_1 5 /* так понятней */
  6. #define SIZE_2 7 /* мне кажется */
  7.  
  8.  
  9.  
  10. int main()
  11. {
  12.     int /* int g, l, d, t;   они не нужны вообще */
  13.         /* зачем *p1, *p2, *p3 ??? мы работает с массивами поочерёдно*/
  14.         a[SIZE_1][SIZE_2], /* 1ый массив */
  15.         b[SIZE_2][SIZE_2]; /* 2ой массив. Зачем такие пометки??? поймёте в ф-иях */
  16.  
  17.     /*
  18.     do
  19.     {
  20.         printf("\n Input g=");
  21.         scanf("%d", &g);
  22.         printf("\n Input l=");
  23.         scanf("%d", &l);
  24.     }
  25.     while (g <= 0 || g > SIZE_1 || l <= 0 || l > SIZE_2);
  26.  
  27.     Вообще не нужный код, да ещё и с непонятным для чего условием.
  28.     У вас и так через #define определены размерности, а вы зачем-то вводите переменные на размерность массива для перебора как я понял.
  29.     Почему же вы тогда не заполняете ещё и переменные d , t ?  Откуда у Вас переменная ниже k? Забыли мб объявить, опечатались.
  30.     */
  31.  
  32.     /*
  33.     p1=&a[0][0];
  34.     p2=&b[0][0];
  35.     Просто избавляемся от этого =)
  36.     */
  37.  
  38.     /*
  39.     Inp_mas(p1,g,l);
  40.     Outp_mas(p2,g,l);
  41.  
  42.     printf("\n");
  43.  
  44.     Intp_mas(p2,d,l);
  45.     Out_mas(p1,d,k);
  46.  
  47.     1 - Если кратко, вызываем ф-ию для заполнения массива a[][]
  48.     2 - Вызываем ф-ию вывода массива b[][] и получаем крит, т.к. он не инициализирован.
  49.     3 - Если не взирать на предыдущее аварийное завершение программы
  50.         Делаем новую строку. По безопасному программированию CERT лучше юзать puts(""); либо
  51.         если кодите на WINDOWS в Visual Studio (мб и в других IDE под Win тоже самое) использовать
  52.         ptintf_s("\n"), либо вызывать так printf("%s", "\n");
  53.     4 - Вызываем заполнение массива b[][] с передачей не инициализированной d и получаем опять крит
  54.     5 - Не взирая на второй крит, хотя после первого ББ работа приложения,
  55.         вызываем ф-ию вывода массива a[][] c неизвестным идентификатором k и вышеописанной d, получаем отказ в компиляции
  56.  
  57.         наверное лучше всё таки:
  58.         - заполнить массив a[][]
  59.         - вывести массив a[][]
  60.         - заполнить массив b[][]
  61.         - вывести массив b[][]
  62.  
  63.         или по другому как нить
  64.     */
  65.    
  66.     inp_mas(a[0], 1); /* тоже самое что и a[0][0] */
  67.     inp_mas(b[0], 2); /* аналогично */
  68.  
  69.     outp_mas(a[0], 1);
  70.     outp_mas(b[0], 2);
  71.    
  72.     /*
  73.     search_element(a[0], 1);
  74.     search_element(b[0], 2);
  75.     ф-ию сам напишешь по образу и подобию.
  76.     либо своё строгай =)
  77.     */
  78.  
  79. /*  Не буду рассматривать это кусок...
  80.     не хочу больше понимать, что ты хотел написать
  81.  
  82.     p3 = Kol_mas(p1,d,k);
  83.  
  84.     t=-1;
  85.  
  86.     if (t!=-1)
  87.     {
  88.         Outp_mas(p3,h,l);
  89.     } else {
  90.         t=-1;
  91.     }
  92.  
  93.     p3 = Kol_mas(p1,g,l,h,t);
  94.  
  95.     if (t!=-1)
  96.     {
  97.         Outp_mas1(p3,h,l);
  98.     }
  99. */
  100.     system("pause");
  101.     return 0;
  102. }
  103.  
  104. void inp_mas(int *pMAS, int num_mas) /* нам ни чего не нужно возвращать в вызывающую ф-ию, поэтому void и нет return*/
  105. {
  106.     int i, j;
  107.  
  108.     /* так как массива разные, ну и их два */
  109.     if (num_mas == 1)
  110.     {
  111.         for (i = 0; i < SIZE_1; i++)
  112.         {
  113.             for (j = 0; j < SIZE_2; j++)
  114.             {
  115.                 printf_s("Input element mas a[%d][%d]: ", i+1 , j+1);
  116.                 scanf_s("%d", (pMAS + i * 2 + j));
  117.                 /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
  118.                    и не забывать, что scanf принимает адрес блин...*/
  119.             }
  120.         }
  121.         puts("");
  122.     } else {
  123.         for (i = 0; i < SIZE_2; i++)
  124.         {
  125.             for (j= 0; j < SIZE_2; j++)
  126.             {
  127.                 printf_s("Input element mas b[%d][%d]: ", i+1 , j+1);
  128.                 scanf_s("%d", (pMAS + i * 2 + j));
  129.                 /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
  130.                    и не забывать, что scanf принимает адрес блин...*/
  131.             }
  132.         }
  133.         puts("");
  134.     }
  135. }
  136.  
  137. void outp_mas(int *pMAS, int num_mas) /* нам ни чего не нужно возвращать в вызывающую ф-ию, поэтому void и нет return*/
  138. {
  139.     int i, j;
  140.  
  141.     /* так как массива разные, ну и их два */
  142.     if (num_mas == 1)
  143.     {
  144.         printf_s("Elements of a massive:\n");
  145.         for (i = 0; i < SIZE_1; i++)
  146.         {
  147.             for (j = 0; j < SIZE_2; j++)
  148.             {
  149.                 printf_s("%5d ", i+1 , j+1, *(pMAS + i * 2 + j));
  150.                 /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
  151.                    и не забывать, что scanf принимает адрес блин...*/
  152.             }
  153.             puts("");
  154.         }
  155.         puts("");
  156.     } else {
  157.         printf_s("Elements of b massive:\n");
  158.         for (i = 0; i < SIZE_2; i++)
  159.         {
  160.             for (j= 0; j < SIZE_2; j++)
  161.             {
  162.                 printf_s("%5d ", i+1 , j+1, *(pMAS + i * 2 + j));
  163.                 /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
  164.                    и не забывать, что scanf принимает адрес блин...*/
  165.             }
  166.             puts("");
  167.         }
  168.         puts("");
  169.     }
  170. }

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

Код выполняет следующие действия:

  1. Ввод размеров матриц a и b с помощью функции Inp_mas.
  2. Заполнение матрицы a с помощью функции inp_mas.
  3. Вывод матрицы a с помощью функции outp_mas.
  4. Поиск отрицательных элементов в матрице a с помощью функции search_element.
  5. Вывод найденных элементов.
  6. Заполнение матрицы b с помощью функции inp_mas.
  7. Вывод матрицы b с помощью функции outp_mas.
  8. Поиск отрицательных элементов в матрице b с помощью функции search_element.
  9. Вывод найденных элементов. Ошибки и недочеты в коде:
  10. Переменные g, l, d и t объявлены, но не используются.
  11. Переменная k не объявлена.
  12. Функции inp_mas и outp_mas не используют возвращаемые значения.
  13. В функции search_element не указаны размеры матрицы.
  14. В цикле вывода найденных элементов в матрице b используется printf_s вместо puts_s.

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


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

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

12   голосов , оценка 4.25 из 5

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

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

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