Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 24.01.2014
Сообщений: 51

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

04.01.2015, 03:07. Показов 3318. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2015, 03:07
Ответы с готовыми решениями:

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

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

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

5
Модератор
 Аватар для Curry
5158 / 3480 / 536
Регистрация: 01.06.2013
Сообщений: 7,542
Записей в блоге: 9
04.01.2015, 03:52
Лучший ответ Сообщение было отмечено viifelso как решение

Решение

Цитата Сообщение от viifelso Посмотреть сообщение
C
1
scanf("%d",x[0]);
тут ошибка.
C
1
scanf("%d",&(x[0])); /* или, проще, scanf("%d",x); */
1
0 / 0 / 1
Регистрация: 24.01.2014
Сообщений: 51
04.01.2015, 04:02  [ТС]
Благодарю! Заработало! Не могли бы Вы пояснить почему так?
0
Модератор
 Аватар для Curry
5158 / 3480 / 536
Регистрация: 01.06.2013
Сообщений: 7,542
Записей в блоге: 9
04.01.2015, 04:13
Цитата Сообщение от viifelso Посмотреть сообщение
Не могли бы Вы пояснить почему так?
Функция scanf, же, должна ИЗМЕНИТЬ значение x[0]. Значит, само значение ей передавать бессмысленно, нужно передавать адрес значения с помощью которого она изменит само значение.
2
0 / 0 / 1
Регистрация: 24.01.2014
Сообщений: 51
04.01.2015, 04:16  [ТС]
доступно и просто ) спасибо
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.01.2015, 14:57
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
само значение ей передавать бессмысленно,
не только бессмысленно, но и крайне опасно! Ибо она воспримет это значение, как адрес, и по этому адресу запишет результат.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2015, 14:57
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru