Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
viifelso
0 / 0 / 1
Регистрация: 24.01.2014
Сообщений: 51
1

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

04.01.2015, 03:07. Просмотров 1094. Ответов 5
Метки нет (Все метки)

Добрый день! Помогите пожалуйста разобраться почему программа автоматически определяет нулевой элемент как число 0, и не работает с другими числами помещённые в x[0] ?
Почему когда мы вызываем ф-ю put , число равное нулевому элементу(например 5) записываеться в одномерный массив, ведь должен произойти выход из ф-ии!
C
1
2
3
4
void put(int i,int j,unsigned short int c)
{
  if (c==x[0])
    return;
. Прорабатываемые темы
Простейшие статические структуры данных
3. Постановка задачи
Разработать способ экономного размещения в памяти заданного разреженного массива.

Разреженный массив - массив, большинство элементов которого равны между собой, так что хранить в памяти достаточно лишь небольшое число значений отличных от основного (фонового) значения остальных элементов.

Разработать процедуры/функции, обеспечивающие доступ к элементам массива по номерам строки и столбца. В контрольной программе обеспечить запись и чтение всех элементов массива.

Элементы, значения которых являются фоновыми, называют нулевыми; элементы, значения которых отличны от фонового, - ненулевыми. Но нужно помнить, что фоновое значение не всегда равно нулю.
Ненулевые значения хранятся, как правило, в одномерном массиве, а связь между местоположением в исходном, разреженном, массиве и в новом, одномерном, описывается математически с помощью формулы, преобразующей индексы массива в индексы вектора.
На практике для работы с разреженным массивом разрабатываются функции:
• а) для преобразования индексов массива в индекс вектора;
• б) для получения значения элемента массива из ее упакованного представления по двум индексам (строка, столбец);
• в) для записи значения элемента массива в ее упакованное представление по двум индексам.
При таком подходе обращение к элементам исходного массива выполняется с помощью указанных функций.

Индивидуальное задание: все элементы четных строк – нулевые.

Решение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#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;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2015, 03:07
Ответы с готовыми решениями:

Разработать способ экономного размещения в памяти заданной разреженной таблицы
Быть может кто-нибудь может сделать задачу? Был бы очень благодарен. Разработать способ экономного...

Разработать способ экономного хранения в памяти разреженных матриц
Помогите плз зделать Задание 1 Разработать способ экономного хранения в памяти разреженных матриц...

Однонаправленный не связанный (векторный способ размещения в памяти) список
Необходимо написать строковый список(в названии) с удалением/добавлением элементов. Не знаю...

Разработать способ экономического хранения в памяти разреженных матриц
задание Разработать способ экономического хранения в памяти разреженных матриц. Разработать...

Присвоить указателю адрес начала размещения массива в памяти
Заполнить массив Х(10) случайными значениями. Организовать вывод на экран. Присвоить указателю...

5
Curry
2872 / 1924 / 240
Регистрация: 01.06.2013
Сообщений: 4,017
Записей в блоге: 7
04.01.2015, 03:52 2
Лучший ответ Сообщение было отмечено viifelso как решение

Решение

Цитата Сообщение от viifelso Посмотреть сообщение
C
1
scanf("%d",x[0]);
тут ошибка.
C
1
scanf("%d",&(x[0])); /* или, проще, scanf("%d",x); */
1
viifelso
0 / 0 / 1
Регистрация: 24.01.2014
Сообщений: 51
04.01.2015, 04:02  [ТС] 3
Благодарю! Заработало! Не могли бы Вы пояснить почему так?
0
Curry
2872 / 1924 / 240
Регистрация: 01.06.2013
Сообщений: 4,017
Записей в блоге: 7
04.01.2015, 04:13 4
Цитата Сообщение от viifelso Посмотреть сообщение
Не могли бы Вы пояснить почему так?
Функция scanf, же, должна ИЗМЕНИТЬ значение x[0]. Значит, само значение ей передавать бессмысленно, нужно передавать адрес значения с помощью которого она изменит само значение.
2
viifelso
0 / 0 / 1
Регистрация: 24.01.2014
Сообщений: 51
04.01.2015, 04:16  [ТС] 5
доступно и просто ) спасибо
0
Байт
Эксперт C
20467 / 12992 / 2733
Регистрация: 24.12.2010
Сообщений: 27,183
04.01.2015, 14:57 6
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
само значение ей передавать бессмысленно,
не только бессмысленно, но и крайне опасно! Ибо она воспримет это значение, как адрес, и по этому адресу запишет результат.
1
04.01.2015, 14:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2015, 14:57

Заполнить массив М(10) случайными значениями. Присвоить указателю адрес начала размещения массива в памяти
Заполнить массив М(10) случайными значениями. Организовать вывод на экран. Присвоить указателю...

Способ Размещения(одно действие)
На книжной полке расставляют 20 книг. Сколько существует способов расположения среди них пяти...

Заполнить массив У(10) случайными значениями. Организовать вывод на экран. Присвоить указателю адрес начала размещения массива в памяти
Заполнить массив У(10) случайными значениями. Организовать вывод на экран. Присвоить указателю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru