Разработать способ экономного размещения в памяти заданного разреженного массива - C (СИ)

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

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

Добрый день! Помогите пожалуйста разобраться почему программа автоматически определяет нулевой элемент как число 0, и не работает с другими числами помещённые в x[0] ? Почему когда мы вызываем ф-ю put , число равное нулевому элементу(например 5) записываеться в одномерный массив, ведь должен произойти выход из ф-ии!
Листинг программы
  1. void put(int i,int j,unsigned short int c)
  2. {
  3. if (c==x[0])
  4. return;
. Прорабатываемые темы Простейшие статические структуры данных 3. Постановка задачи Разработать способ экономного размещения в памяти заданного разреженного массива. Разреженный массив - массив, большинство элементов которого равны между собой, так что хранить в памяти достаточно лишь небольшое число значений отличных от основного (фонового) значения остальных элементов. Разработать процедуры/функции, обеспечивающие доступ к элементам массива по номерам строки и столбца. В контрольной программе обеспечить запись и чтение всех элементов массива. Элементы, значения которых являются фоновыми, называют нулевыми; элементы, значения которых отличны от фонового, - ненулевыми. Но нужно помнить, что фоновое значение не всегда равно нулю. Ненулевые значения хранятся, как правило, в одномерном массиве, а связь между местоположением в исходном, разреженном, массиве и в новом, одномерном, описывается математически с помощью формулы, преобразующей индексы массива в индексы вектора. На практике для работы с разреженным массивом разрабатываются функции: • а) для преобразования индексов массива в индекс вектора; • б) для получения значения элемента массива из ее упакованного представления по двум индексам (строка, столбец); • в) для записи значения элемента массива в ее упакованное представление по двум индексам. При таком подходе обращение к элементам исходного массива выполняется с помощью указанных функций. Индивидуальное задание: все элементы четных строк – нулевые. Решение
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. int m,n,nx;
  5. int *x;
  6. int *y;
  7. void put(int i,int j,unsigned short int c)
  8. {
  9. if (c==x[0]) //почему здесь не происходит выхода?
  10. return;
  11. int k=j*n+i; //индекс в одномерном
  12. int t=1;
  13. int kx;//кол-во шагов в массиве
  14. while ((t<nx)&&(x[t]<k))
  15. {
  16. t+=2;
  17. kx++;
  18. };
  19. // printf("t=%5d c=%5d \n",t,c);
  20. if ((t>=nx)|| //добавить в конец
  21. (kx==0)||//добавить в начало
  22. ((kx>0)&&(t<nx)&&(x[t]==k)&&(x[t+1]!=c))) //эл-т найден
  23. // но значение другое
  24. {
  25. //добавить эл-т
  26. nx+=2;
  27. x[t]=k;
  28. x[t+1]=c;
  29. }
  30. }
  31. char get(int i,int j)
  32. {
  33. int k=j*n+i; //индекс в одномерном
  34. int t=1;
  35. int kx;
  36. while ((t<nx)&&(x[t]<k))
  37. {
  38. t+=2;
  39. kx++;
  40. };
  41. if ((t>nx)||((kx==0)&&(x[t]!=k)))
  42. return(x[0]);
  43. else
  44. if (x[t]==k)
  45. return (x[t+1]); //эл-т найден
  46. else return (x[0]); //эл-т <нулевой> ,почему определило нулевой элемент как чисо 0, хотя //например мы присваивали x[0]=5
  47. }
  48. void main (void)
  49. {
  50. int i,j,a;
  51. x=new int[100];
  52. nx=1;
  53. for (i=0;i<100;i++)
  54. x[i]=0;
  55. clrscr();
  56. printf("Введите нулевой элемент : ");
  57. scanf("%d",x[0]);
  58. printf("Введите размерность матрицы m,n : ");
  59. scanf("%d%d",&m,&n);
  60. printf("Введите эл-ты матрицы : \n");
  61. for (j=0;j<=m-1;j++)
  62. {
  63. printf("%d-я строка : ",j+1);
  64. for (i=0;i<=n-1;i++)
  65. {
  66. scanf("%d",&a);
  67. put(i,j,a);
  68. }
  69. }
  70. printf("Исходная матрица:\n");
  71. int nl=1;//предположим что все эл-ты четных строк - нулевые
  72. for (j=0;j<=m-1;j++)
  73. {
  74. for (i=0;i<=n-1;i++)
  75. {
  76. a=get(i,j);
  77. if (((j+1)%2==0)&&//если четная строка
  78. (a!=x[0]))
  79. nl=0; //найден ненулевой эл-т
  80. printf("%3d",a);
  81. }
  82. printf("\n");
  83. }
  84. if (m==1) printf("Нет четных строк\n");
  85. else
  86. if (nl==1) printf("Все эл-ты четных строк - нулевые\n");
  87. else printf("Не вcе эл-ты четных строк - нулевые\n");
  88. printf("нажите любую клаившу\n");
  89. getch();
  90. delete [] x;
  91. }

Решение задачи: «Разработать способ экономного размещения в памяти заданного разреженного массива»

textual
Листинг программы
  1. scanf("%d",x[0]);

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


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

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

7   голосов , оценка 3.714 из 5

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

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

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