Разработать способ экономного размещения в памяти заданного разреженного массива - C (СИ)
Формулировка задачи:
Добрый день! Помогите пожалуйста разобраться почему программа автоматически определяет нулевой элемент как число 0, и не работает с другими числами помещённые в x[0] ?
Почему когда мы вызываем ф-ю put , число равное нулевому элементу(например 5) записываеться в одномерный массив, ведь должен произойти выход из ф-ии!
. Прорабатываемые темы
Простейшие статические структуры данных
3. Постановка задачи
Разработать способ экономного размещения в памяти заданного разреженного массива.
Разреженный массив - массив, большинство элементов которого равны между собой, так что хранить в памяти достаточно лишь небольшое число значений отличных от основного (фонового) значения остальных элементов.
Разработать процедуры/функции, обеспечивающие доступ к элементам массива по номерам строки и столбца. В контрольной программе обеспечить запись и чтение всех элементов массива.
Элементы, значения которых являются фоновыми, называют нулевыми; элементы, значения которых отличны от фонового, - ненулевыми. Но нужно помнить, что фоновое значение не всегда равно нулю.
Ненулевые значения хранятся, как правило, в одномерном массиве, а связь между местоположением в исходном, разреженном, массиве и в новом, одномерном, описывается математически с помощью формулы, преобразующей индексы массива в индексы вектора.
На практике для работы с разреженным массивом разрабатываются функции:
• а) для преобразования индексов массива в индекс вектора;
• б) для получения значения элемента массива из ее упакованного представления по двум индексам (строка, столбец);
• в) для записи значения элемента массива в ее упакованное представление по двум индексам.
При таком подходе обращение к элементам исходного массива выполняется с помощью указанных функций.
Индивидуальное задание: все элементы четных строк – нулевые.
Решение
void put(int i,int j,unsigned short int c)
{
if (c==x[0])
return;#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]);