Посчитать в матрице все столбцы, содержащие не менее 2 отрицательных элементов. Исправить ошибки - C (СИ)
Формулировка задачи:
Доброго времени суток! Сварганил программку, но компилятор ругается на ошибки. Помогите исправить их. Вот задача: Посчитать в матрице А (5х7) все столбцы, содержащие не менее 2 отрицательных элементов, а в матрице В (7х7) – столбцы, содержащие не менее 3 отрицательных элементов.
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #define C 5
- #define C1 7
- int Inp_mas(int *p, int n, int m)
- {
- int i, j;
- for (i=0; i<n; i++)
- for (j=0; j<m; j++)
- {
- printf("\n Input p=");
- scanf("%d", p);
- p++;
- }
- return 0;
- }
- void Outp_mas(int *p, int n, int m)
- {
- int i, j;
- for (i=0; i<n; i++)
- {
- for(j=0; j<m; j++)
- {
- printf("%d", *p);
- p++;
- }
- printf("\n");
- }
- return;
- }
- void Outp_mas1(int *p, int n)
- {
- int i;
- for(i=0; i<n; i++)
- {
- printf("%d", *p);
- p++;
- }
- printf("\n");
- return;
- }
- int Kol_mas(int *p, int m, int n, int t)
- {
- int k=0, h=0, pm=&s[0], j, i;
- for (j=0; j<m; j++)
- {
- p=&a[0][0];
- p+=j;
- for (i=0; i<n; i++)
- {
- if (*p<0)
- {
- k=k+1;
- }
- else
- {
- p+=m;
- }
- if (k>=t)
- {
- s[h]=j;
- h++;
- }
- else
- {
- pm=&s[0];
- }
- }
- }
- return pm;
- }
- int main()
- {
- int g, d, t, l, *p1, *p2, *p3, a[C][C1], b[C1][C1];
- do
- {
- printf("\n Input g=");
- scanf("%d", &g);
- printf("\n Input l=");
- scanf("%d", &l);
- }
- while (g<=0||g>C||l<=0||l>C1);
- p1=&a[0][0];
- p2=&b[0][0];
- Inp_mas(p1,g,l);
- Outp_mas(p2,g,l);
- printf("\n");
- Intp_mas(p2,d,l);
- Out_mas(p1,d,k);
- t=-1;
- p3=Kol_mas(p1,d,k);
- if (t!=-1)
- {
- Outp_mas(p3,h,l)
- }
- else
- {
- t=-1;
- }
- p3=Kol_mas(p1,g,l,h,t);
- if (t!=-1)
- {
- Outp_mas1(p3,h,l);
- }
- getch();
- return 0;
- }
Решение задачи: «Посчитать в матрице все столбцы, содержащие не менее 2 отрицательных элементов. Исправить ошибки»
textual
Листинг программы
- #include <stdio.h>
- /* #include <conio.h> я считаю не зачем подключать её. можно вопользоваться и getchar() из stdio.h
- однако я вообще по другому сделаю =))) без велосипедов*/
- #include <stdlib.h>
- #define SIZE_1 5 /* так понятней */
- #define SIZE_2 7 /* мне кажется */
- int main()
- {
- int /* int g, l, d, t; они не нужны вообще */
- /* зачем *p1, *p2, *p3 ??? мы работает с массивами поочерёдно*/
- a[SIZE_1][SIZE_2], /* 1ый массив */
- b[SIZE_2][SIZE_2]; /* 2ой массив. Зачем такие пометки??? поймёте в ф-иях */
- /*
- do
- {
- printf("\n Input g=");
- scanf("%d", &g);
- printf("\n Input l=");
- scanf("%d", &l);
- }
- while (g <= 0 || g > SIZE_1 || l <= 0 || l > SIZE_2);
- Вообще не нужный код, да ещё и с непонятным для чего условием.
- У вас и так через #define определены размерности, а вы зачем-то вводите переменные на размерность массива для перебора как я понял.
- Почему же вы тогда не заполняете ещё и переменные d , t ? Откуда у Вас переменная ниже k? Забыли мб объявить, опечатались.
- */
- /*
- p1=&a[0][0];
- p2=&b[0][0];
- Просто избавляемся от этого =)
- */
- /*
- Inp_mas(p1,g,l);
- Outp_mas(p2,g,l);
- printf("\n");
- Intp_mas(p2,d,l);
- Out_mas(p1,d,k);
- 1 - Если кратко, вызываем ф-ию для заполнения массива a[][]
- 2 - Вызываем ф-ию вывода массива b[][] и получаем крит, т.к. он не инициализирован.
- 3 - Если не взирать на предыдущее аварийное завершение программы
- Делаем новую строку. По безопасному программированию CERT лучше юзать puts(""); либо
- если кодите на WINDOWS в Visual Studio (мб и в других IDE под Win тоже самое) использовать
- ptintf_s("\n"), либо вызывать так printf("%s", "\n");
- 4 - Вызываем заполнение массива b[][] с передачей не инициализированной d и получаем опять крит
- 5 - Не взирая на второй крит, хотя после первого ББ работа приложения,
- вызываем ф-ию вывода массива a[][] c неизвестным идентификатором k и вышеописанной d, получаем отказ в компиляции
- наверное лучше всё таки:
- - заполнить массив a[][]
- - вывести массив a[][]
- - заполнить массив b[][]
- - вывести массив b[][]
- или по другому как нить
- */
- inp_mas(a[0], 1); /* тоже самое что и a[0][0] */
- inp_mas(b[0], 2); /* аналогично */
- outp_mas(a[0], 1);
- outp_mas(b[0], 2);
- /*
- search_element(a[0], 1);
- search_element(b[0], 2);
- ф-ию сам напишешь по образу и подобию.
- либо своё строгай =)
- */
- /* Не буду рассматривать это кусок...
- не хочу больше понимать, что ты хотел написать
- p3 = Kol_mas(p1,d,k);
- t=-1;
- if (t!=-1)
- {
- Outp_mas(p3,h,l);
- } else {
- t=-1;
- }
- p3 = Kol_mas(p1,g,l,h,t);
- if (t!=-1)
- {
- Outp_mas1(p3,h,l);
- }
- */
- system("pause");
- return 0;
- }
- void inp_mas(int *pMAS, int num_mas) /* нам ни чего не нужно возвращать в вызывающую ф-ию, поэтому void и нет return*/
- {
- int i, j;
- /* так как массива разные, ну и их два */
- if (num_mas == 1)
- {
- for (i = 0; i < SIZE_1; i++)
- {
- for (j = 0; j < SIZE_2; j++)
- {
- printf_s("Input element mas a[%d][%d]: ", i+1 , j+1);
- scanf_s("%d", (pMAS + i * 2 + j));
- /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
- и не забывать, что scanf принимает адрес блин...*/
- }
- }
- puts("");
- } else {
- for (i = 0; i < SIZE_2; i++)
- {
- for (j= 0; j < SIZE_2; j++)
- {
- printf_s("Input element mas b[%d][%d]: ", i+1 , j+1);
- scanf_s("%d", (pMAS + i * 2 + j));
- /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
- и не забывать, что scanf принимает адрес блин...*/
- }
- }
- puts("");
- }
- }
- void outp_mas(int *pMAS, int num_mas) /* нам ни чего не нужно возвращать в вызывающую ф-ию, поэтому void и нет return*/
- {
- int i, j;
- /* так как массива разные, ну и их два */
- if (num_mas == 1)
- {
- printf_s("Elements of a massive:\n");
- for (i = 0; i < SIZE_1; i++)
- {
- for (j = 0; j < SIZE_2; j++)
- {
- printf_s("%5d ", i+1 , j+1, *(pMAS + i * 2 + j));
- /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
- и не забывать, что scanf принимает адрес блин...*/
- }
- puts("");
- }
- puts("");
- } else {
- printf_s("Elements of b massive:\n");
- for (i = 0; i < SIZE_2; i++)
- {
- for (j= 0; j < SIZE_2; j++)
- {
- printf_s("%5d ", i+1 , j+1, *(pMAS + i * 2 + j));
- /* что бы это понять, нужно знать арифметику с указателями + как массив представлен в памяти.
- и не забывать, что scanf принимает адрес блин...*/
- }
- puts("");
- }
- puts("");
- }
- }
Объяснение кода листинга программы
Код выполняет следующие действия:
- Ввод размеров матриц a и b с помощью функции
Inp_mas
. - Заполнение матрицы a с помощью функции
inp_mas
. - Вывод матрицы a с помощью функции
outp_mas
. - Поиск отрицательных элементов в матрице a с помощью функции
search_element
. - Вывод найденных элементов.
- Заполнение матрицы b с помощью функции
inp_mas
. - Вывод матрицы b с помощью функции
outp_mas
. - Поиск отрицательных элементов в матрице b с помощью функции
search_element
. - Вывод найденных элементов. Ошибки и недочеты в коде:
- Переменные
g
,l
,d
иt
объявлены, но не используются. - Переменная
k
не объявлена. - Функции
inp_mas
иoutp_mas
не используют возвращаемые значения. - В функции
search_element
не указаны размеры матрицы. - В цикле вывода найденных элементов в матрице b используется
printf_s
вместоputs_s
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д