Разработать способ экономного размещения в памяти заданного разреженного массива - 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]);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д