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

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

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

Добрый день! Помогите пожалуйста разобраться почему программа автоматически определяет нулевой элемент как число 0, и не работает с другими числами помещённые в x[0] ? Почему когда мы вызываем ф-ю put , число равное нулевому элементу(например 5) записываеться в одномерный массив, ведь должен произойти выход из ф-ии!
void put(int i,int j,unsigned short int c)
{
  if (c==x[0])
    return;
. Прорабатываемые темы Простейшие статические структуры данных 3. Постановка задачи Разработать способ экономного размещения в памяти заданного разреженного массива. Разреженный массив - массив, большинство элементов которого равны между собой, так что хранить в памяти достаточно лишь небольшое число значений отличных от основного (фонового) значения остальных элементов. Разработать процедуры/функции, обеспечивающие доступ к элементам массива по номерам строки и столбца. В контрольной программе обеспечить запись и чтение всех элементов массива. Элементы, значения которых являются фоновыми, называют нулевыми; элементы, значения которых отличны от фонового, - ненулевыми. Но нужно помнить, что фоновое значение не всегда равно нулю. Ненулевые значения хранятся, как правило, в одномерном массиве, а связь между местоположением в исходном, разреженном, массиве и в новом, одномерном, описывается математически с помощью формулы, преобразующей индексы массива в индексы вектора. На практике для работы с разреженным массивом разрабатываются функции: • а) для преобразования индексов массива в индекс вектора; • б) для получения значения элемента массива из ее упакованного представления по двум индексам (строка, столбец); • в) для записи значения элемента массива в ее упакованное представление по двум индексам. При таком подходе обращение к элементам исходного массива выполняется с помощью указанных функций. Индивидуальное задание: все элементы четных строк – нулевые. Решение
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int m,n,nx;
int *x;
int *y;
 
void put(int i,int j,unsigned short int c)
{
  if (c==x[0]) //почему здесь не происходит выхода?
    return;
  int k=j*n+i; //индекс в одномерном
  int t=1;
  int kx;//кол-во шагов в массиве
  while ((t<nx)&&(x[t]<k))
  {
    t+=2;
    kx++;
  };
//    printf("t=%5d  c=%5d  \n",t,c);
  if ((t>=nx)|| //добавить в конец
      (kx==0)||//добавить в начало
      ((kx>0)&&(t<nx)&&(x[t]==k)&&(x[t+1]!=c))) //эл-т найден
      // но значение другое
  {
    //добавить эл-т
    nx+=2;
    x[t]=k;
    x[t+1]=c;
  }
}
char get(int i,int j)
{
  int k=j*n+i; //индекс в одномерном
  int  t=1;
  int kx;
  while ((t<nx)&&(x[t]<k))
  {
    t+=2;
    kx++;
  };
  if ((t>nx)||((kx==0)&&(x[t]!=k)))
    return(x[0]);
  else
    if (x[t]==k)
      return (x[t+1]); //эл-т найден
    else return (x[0]);  //эл-т <нулевой> ,почему определило нулевой элемент как чисо 0, хотя //например мы присваивали x[0]=5
}
void main (void)
{
  int i,j,a;
  x=new int[100];
  nx=1;
  for (i=0;i<100;i++)
    x[i]=0;
  clrscr();
  printf("Введите нулевой элемент : ");
  scanf("%d",x[0]);
  printf("Введите размерность матрицы m,n : ");
  scanf("%d%d",&m,&n);
  printf("Введите эл-ты матрицы : \n");
  for (j=0;j<=m-1;j++)
  {
    printf("%d-я строка : ",j+1);
    for (i=0;i<=n-1;i++)
    {
      scanf("%d",&a);
      put(i,j,a);
    }
  }
  printf("Исходная матрица:\n");
  int nl=1;//предположим что все эл-ты четных строк - нулевые
  for (j=0;j<=m-1;j++)
  {
    for (i=0;i<=n-1;i++)
    {
      a=get(i,j);
      if (((j+1)%2==0)&&//если четная строка
        (a!=x[0]))
          nl=0; //найден ненулевой эл-т
      printf("%3d",a);
    }
    printf("\n");
  }
  if (m==1) printf("Нет четных строк\n");
  else
    if (nl==1) printf("Все эл-ты четных строк - нулевые\n");
    else printf("Не вcе эл-ты четных строк - нулевые\n");
  printf("нажите любую клаившу\n");
  getch();
  delete [] x;
}

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

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

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


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

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

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