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