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

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

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

Не получается организовать правильный ввод и вывод. Пример ввода: N=2; (1,2,3,4) Результат: (3,4,3,4). Компилятор никаких проблем не видит. Долго возился с указателями, возможно где-то накосячил. На остальные ошибки в коде просьба внимание не обращать. Заранее спасибо за помощь!
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. //Константы
  5. #define M 2
  6. #define E 0
  7. void Svod(int N,int *a) //+
  8. {
  9. int z;
  10. int *c;
  11. for (z=0;z<N;z++)
  12. {
  13. c=(a+(N-1)+z);
  14. scanf("%d",c);
  15. }
  16. }
  17. //Ввод матрицы
  18. void vvod(int A[][E],int N,int *a) //+
  19. {
  20. int i;
  21. for (i=0;i<M;i++)
  22. {
  23. Svod(N,a);
  24. }
  25. }
  26. void vivodS(int N,int *a)
  27. {
  28. int j;
  29. int *c;
  30. for (j=0;j<N;j++)
  31. {
  32. c=a+(N-1)+j;
  33. printf("%d",*c);
  34. }
  35. }
  36. //Вывод матрицы
  37. void vivod(int A[][E],int N,int *a)
  38. {
  39. int i;
  40. for (i=0;i<M;i++)
  41. {
  42. vivodS(N,a);
  43. }
  44. }
  45.  
  46. //Сколярное произведение
  47. int proizv(int A[E],int B[E],int N,int a)
  48. {
  49. int i,s;
  50. s=0;
  51. for (i=0;i<=N-1;i++)
  52. s=s+(*(A+i+a))*(*(B+i+a));
  53. return s;
  54. }
  55. //Проверка условия задачи
  56. int proverka(int A[][E],int N,int a)
  57. {
  58. int i,j,flag;
  59. i=0;
  60. j=i+1;
  61. flag=0; //Установка флага
  62. while ((i<=M-1)&&(proizv(A[i],A[i],N,a)==1)) //A[i]*A[i]
  63. {
  64. i++;
  65. }
  66. if (i==M) //A[i]*A[j]; i<>j
  67. {
  68. i=0;
  69. while ((i<=M-2)&&(proizv(A[i],A[j],N,a)==0))
  70. {
  71. j=i+1;
  72. while ((j<=M-1)&&(proizv(A[i],A[j],N,a)==0)){j++;}
  73. i=i+1;
  74. }
  75. if (i>M-2)flag=1;
  76. }
  77. return (flag);
  78. }
  79. int main()
  80. {
  81. int N;
  82. int *a; //Указатель
  83. printf("Введите число столбцов");
  84. scanf("%i",&N);
  85. int A[M][E];
  86. a = (int*) malloc(M*N*sizeof(int)); //Указатель "а" указывает на начальный элемент выделенной памяти размера установленного массива
  87. vvod(A,N,a); //передаем 'a' как указатель
  88. //if (proverka(A,N,a)==1)printf("Условие выполнено");
  89. // else
  90. // {
  91. // printf("Условие не выполнено");
  92. // }
  93. vivod(A,N,a);
  94. free(a);
  95. return 0;
  96. }

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

textual
Листинг программы
  1. void input_a(int *a, int rows, int cols)
  2. {
  3.     for(i=0; i<rows; i++)
  4.         for(j=0; j<cols; j++)
  5.             scanf("%d", (a+i*cols+j));
  6. }
  7.  
  8. void print_a(int *a, int rows, int cols)
  9. {
  10.     for(i=0; i<rows; i++)
  11.        for(j=0; j<cols; j++)
  12.            printf("%d", *(a+i*cols+j));
  13. }
  14. int main()
  15. {
  16.     int rows, cols;
  17.     int *a;
  18.     printf("Введите число строк и столбцов через пробел");
  19.     scanf("%d %d" ,&rows, &cols);
  20.     a = (int*) malloc(rows * cols * sizeof(int)); //Указатель "а" указывает на начальный элемент выделенной памяти размера установленного массива
  21.     input_a(a, rows, cols); //передаем 'a' как указатель
  22.     print_a(a, rows, cols);
  23.     free(a);
  24.     return 0;
  25. }

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

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

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


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

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

11   голосов , оценка 3.636 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы