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

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

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

  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
Похожие ответы