Посчитать в матрице все столбцы, содержащие не менее 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д