Ошибка с выводом значений матр. при использовании malloc - C (СИ)

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

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

Не получается организовать правильный ввод и вывод. Пример ввода: N=2; (1,2,3,4) Результат: (3,4,3,4). Компилятор никаких проблем не видит. Долго возился с указателями, возможно где-то накосячил. На остальные ошибки в коде просьба внимание не обращать. Заранее спасибо за помощь!
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
//Константы
#define M 2
#define E 0
 
void Svod(int N,int *a) //+
{
    int z;
    int *c;
      for (z=0;z<N;z++)
      {
          c=(a+(N-1)+z);
          scanf("%d",c);
      }
}
 
//Ввод матрицы
void vvod(int A[][E],int N,int *a) //+
{
    int i;
    for (i=0;i<M;i++)
    {
        Svod(N,a);
    }
 
}
 
void vivodS(int N,int *a)
{
    int j;
    int *c;
        for (j=0;j<N;j++)
        {
            c=a+(N-1)+j;
            printf("%d",*c);
        }
}
 
//Вывод матрицы
void vivod(int A[][E],int N,int *a)
{
    int i;
    for (i=0;i<M;i++)
    {
        vivodS(N,a);
    }
 
}

//Сколярное произведение
int proizv(int A[E],int B[E],int N,int a)
{
    int i,s;
    s=0;
    for (i=0;i<=N-1;i++)
        s=s+(*(A+i+a))*(*(B+i+a));
    return s;
}
 
//Проверка условия задачи
int proverka(int A[][E],int N,int a)
{
    int i,j,flag;
    i=0;
    j=i+1;
    flag=0;     //Установка флага
    while ((i<=M-1)&&(proizv(A[i],A[i],N,a)==1))    //A[i]*A[i]
        {
            i++;
        }
    if (i==M)                                   //A[i]*A[j]; i<>j
    {
        i=0;
        while ((i<=M-2)&&(proizv(A[i],A[j],N,a)==0))
        {
            j=i+1;
            while ((j<=M-1)&&(proizv(A[i],A[j],N,a)==0)){j++;}
            i=i+1;
        }
        if (i>M-2)flag=1;
    }
    return (flag);
}
 
int main()
{
    int N;
    int *a; //Указатель
    printf("Введите число столбцов");
    scanf("%i",&N);
    int A[M][E];
    a = (int*) malloc(M*N*sizeof(int)); //Указатель "а" указывает на начальный элемент выделенной памяти размера установленного массива
    vvod(A,N,a); //передаем 'a' как указатель
    //if (proverka(A,N,a)==1)printf("Условие выполнено");
   // else
      //  {
       //     printf("Условие не выполнено");
       // }
    vivod(A,N,a);
    free(a);
    return 0;
}

Решение задачи: «Ошибка с выводом значений матр. при использовании malloc»

textual
Листинг программы
void input_a(int *a, int rows, int cols)
{
    for(i=0; i<rows; i++)
        for(j=0; j<cols; j++)
            scanf("%d", (a+i*cols+j));
}
 
void print_a(int *a, int rows, int cols)
{
    for(i=0; i<rows; i++)
       for(j=0; j<cols; j++)
           printf("%d", *(a+i*cols+j));
}
int main()
{
    int rows, cols;
    int *a;
    printf("Введите число строк и столбцов через пробел");
    scanf("%d %d" ,&rows, &cols);
    a = (int*) malloc(rows * cols * sizeof(int)); //Указатель "а" указывает на начальный элемент выделенной памяти размера установленного массива
    input_a(a, rows, cols); //передаем 'a' как указатель
    print_a(a, rows, cols);
    free(a);
    return 0;
}

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

  1. Ввод данных в матрицу с помощью функции input_a.
  2. Вывод данных из матрицы с помощью функции print_a.
  3. Выделение памяти под матрицу с помощью функции malloc.
  4. Освобождение памяти с помощью функции free.
  5. Компиляция кода в язык C.

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


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

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

11   голосов , оценка 3.636 из 5
Похожие ответы