Посчитать в матрице все столбцы, содержащие не менее 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.