Пятница, 27 Декабря 2024, 02:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Задачка по Borland'y.
RamilyanamanaДата: Понедельник, 24 Ноября 2014, 12:25 | Сообщение # 1
Биззи Джей Ужасный
Сейчас нет на сайте
Нужно написать программу, согласно условиям:
1)ввод данных выполняется с клавиатуры
2)при работе с массивами использовать указатели и адресную арифметику
3)для создания текстовых сообщений, выводимых на экран, использовать указатели
вот сама задачка:
Поменять местами первый нулевой и последний отрицательный элементы в одномерном массиве. Посчитать разность элементов между ними.
Буду очень благодарен, если еще и комментарии приложите к коду. Заранее спасибо)



Cre-gameДата: Понедельник, 24 Ноября 2014, 17:46 | Сообщение # 2
старожил
Сейчас нет на сайте
Ramilyanamana, в консоле или в оконном варианте нужно сделать?

Добавлено (24 ноября 2014, 17:25)
---------------------------------------------
Цитата Ramilyanamana ()
Поменять местами первый нулевой и последний отрицательный элементы в одномерном массиве.

Код
#include <clx.h>
#include <algorithm>
#pragma hdrstop

//---------------------------------------------------------------------------
using namespace std;
#pragma argsused
int massiv[10] ={3,5,6,7,3,0,1,0,-7,5};
int one,last;
void main()
{
          for (int i = 0, j = 10; i < 10; i++, j--)  //Проверяем значения i - первый , j - последний
          {
          if (massiv[i] == 0)
          {
                  one = i;         //Забиваем индекс первого нулевого
          }
          if (massiv[j] < 0)
          {
                  last = j;       //Забиваем индекс последнего (тк считаем с конца) отрицательного
          }
          }
          swap(massiv[one],massiv[last]);    //Меняем местами по нашим индексам

}


Цитата Ramilyanamana ()
Посчитать разность элементов между ними.

Цитата Ramilyanamana ()
1)ввод данных выполняется с клавиатуры
2)при работе с массивами использовать указатели и адресную арифметику
3)для создания текстовых сообщений, выводимых на экран, использовать указатели


Это уже сам, там все просто.

Добавлено (24 ноября 2014, 17:35)
---------------------------------------------
Извиняюсь, кое-что забыл

Добавлено (24 ноября 2014, 17:46)
---------------------------------------------
Код
#include <clx.h>
#include <iostream>
#include <stdlib>
#pragma hdrstop

//---------------------------------------------------------------------------
using namespace std;
#pragma argsused
int massiv[10] ={3,5,6,7,3,0,1,0,-7,5};
int one,last;

void main()
{
          one = -1;
          last = -1;  //Не знаю для чего, нужно, чтобы работало. То есть для проверки найден ли элемент
          for (int i = 0, j = 10; i < 10; i++, j--)  //Проверяем значения i - первый , j - последний
          {
          cout<<massiv[i]<<"  ";
          if ((massiv[i] == 0) && (one<0))
          {
                  one = i;
                           //Забиваем индекс первого нулевого
          }

          if ((massiv[j] < 0) && (last<0))
          {
                  last = j;
                        //Забиваем индекс последнего (тк считаем с конца) отрицательного
          }

          }
          swap(massiv[one],massiv[last]);    //Меняем местами по нашим индексам
          system("pause");
}

Так будет правильно;
Сам доделаешь, не тупой же():


Всем добра

Сообщение отредактировал Cre-game - Понедельник, 24 Ноября 2014, 18:06
RamilyanamanaДата: Вторник, 25 Ноября 2014, 14:14 | Сообщение # 3
Биззи Джей Ужасный
Сейчас нет на сайте
Cre-game, ну сам код и я написать могу, а вот следуя этим условиям я написать код не могу, ибо не понимаю ни в указателях, ни в адресах ничегошеньки. потому и написал сюда


-l33t-h4xx-Дата: Вторник, 25 Ноября 2014, 14:19 | Сообщение # 4
участник
Сейчас нет на сайте
Ramilyanamana, если проблема только в этом, то потрудись объяснить, что именно непонятно.

Как правильно задавать вопросы
RamilyanamanaДата: Вторник, 25 Ноября 2014, 14:35 | Сообщение # 5
Биззи Джей Ужасный
Сейчас нет на сайте
-l33t-h4xx-, я не могу понять зачем, как и для чего использовать эти адреса и указатели


Cre-gameДата: Вторник, 25 Ноября 2014, 15:07 | Сообщение # 6
старожил
Сейчас нет на сайте
Ramilyanamana, указатель указывает на место в памяти, которое зарезервированно переменной. Делается это для оптимитизации приложения.

Всем добра
lvovandДата: Вторник, 25 Ноября 2014, 15:09 | Сообщение # 7
старожил
Сейчас нет на сайте
наверно имелось ввиду массив задать не
massiv[10] ={3,5,6,7,3,0,1,0,-7,5};
а
int *massiv;
потом выделить через функцию malloc память под нужное кол-во элементов, и к элеменам массива обращаться через *massiv


Разработка и продвижение сайтов. Дизайн
Cre-gameДата: Вторник, 25 Ноября 2014, 15:11 | Сообщение # 8
старожил
Сейчас нет на сайте
То есть ты задаешь одну переменную
int tmp;

и указываешь новому указателю адрес переменной в памяти
int *link = &tmp;


Всем добра
-l33t-h4xx-Дата: Среда, 26 Ноября 2014, 13:17 | Сообщение # 9
участник
Сейчас нет на сайте
Цитата Ramilyanamana ()
я не могу понять зачем, как и для чего использовать эти адреса и указатели

А тут объяснялки не помогут. Концепция сложная, её нужно прочувствовать. Нужно слиться с указателем, нужно думать, как указатель.

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

Указатель - абстракция над адресом. Каждому объекту в памяти компьютера присуще целое число - адрес, по которому он хранится. Естественно, адрес - число - можно получить и сохранить в переменной - в Си объект, соответствующий переменной, в которой сохранён адрес, называется указателем.
Переменная сама по себе тоже абстракция над адресом, но переменная - сущность сугубо виртуальная, адрес же, хранящийся в указателе - штука реальная, и с ней компьютер может делать интересные вещи. Например, стоит перед нами задача: написать функцию, которая в качестве побочного эффекта изменяет значение переменной во внешней программе. Самое практичное решение - использовать указатель:
Код

void set_to_8 (int* a)
{
      *a = 8;
}

int main (void)
{
      int a = 0;
      printf("%d\n", a); // 0
      set_to_8(&a);
      printf("%d\n", a); // 8
}

Другого способа - если не считать привлечения глобальных переменных - просто нет.
Ещё одно важное приложение указателей в Си (и в С++) - динамическое выделение памяти. Единственный способ не потерять кусок памяти, который для нас выделила система - это сохранить где-нибудь его адрес. Где-нибудь - это в указателе. Другого способа нет.
Также если возникает необходимость работать с объектом с фиксированным адресом - портом ввода-вывода, например - мы вынуждены применить указатель.


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Четверг, 27 Ноября 2014, 10:37
RamilyanamanaДата: Среда, 26 Ноября 2014, 15:02 | Сообщение # 10
Биззи Джей Ужасный
Сейчас нет на сайте
-l33t-h4xx-, за это спасибо. сейчас пытаюсь с этим разобраться. и вот проблемка по этой задаче: я уже прописал все, дошел до замены местами элементов и затух. подскажите, будет ли правильно написать вот так:
Код
*mas+*indexO=*z

где mas это массив, indexO это индекс элемента, который требуется заменить, z это то, на что меняется элемент под индексом indexO.



LetsOffBrainsДата: Среда, 26 Ноября 2014, 15:27 | Сообщение # 11
Project SoRDeLKa
Сейчас нет на сайте
Неопытный второкурсник скажет кое-что. Оператор * - разыменование и приенять его к индексу и значению по-моему странно.
Мой вариант: *mas + index = z
А может так: *(mas + index) = z





Сообщение отредактировал LetsOffBrains - Среда, 26 Ноября 2014, 15:33
RamilyanamanaДата: Среда, 26 Ноября 2014, 15:45 | Сообщение # 12
Биззи Джей Ужасный
Сейчас нет на сайте
LetsOffBrains, как и раньше выдает ошибку: Lvalue required

Добавлено (26 ноября 2014, 15:45)
---------------------------------------------
теперь Invalid pointer addition



froexДата: Среда, 26 Ноября 2014, 18:21 | Сообщение # 13
Руководитель Froexilize team
Сейчас нет на сайте
Цитата LetsOffBrains ()
Мой вариант: *mas + index = z
А может так: *(mas + index) = z

Слева от знака равенства должно быть что-то, куда можно поместить значение. По-любому, какая-то зпеременная. В приведённом примере будет ошибка lvalue required, т.к. слева от знака равенства стоит значение, а не переменная.
Цитата Ramilyanamana ()
ввод данных выполняется с клавиатуры

При работе с указателями очень наглядно работает функция scanf(), которая позволяет ввести значение с клавиатуры и занести его по определённому адресу в памяти. Оператором взятия адреса можно взять адрес требуемой переменной, либо подставить сразу указатель, который этот адрес содержит.
Пример:
Код
int value; // обычная переменная, содержит значение
int *pValue; // переменная-указатель, содержит адрес
// ...
scanf("%d", &value); // ввод целого числа с клавиатуры. Помещаем по адресу переменной value
scanf("%d", pValue); // ввод целого числа с клавиатуры. Помещаем по адресу, хранимому в переменной pValue

Обратите внимание, что я между объявлением и заданием значения с клавиатуры пропустил некоторое место. Изначально указатель никуда не показывает. Мы его объявили, чтобы потом хранить в нём адрес области памяти, которую запросим у операционной системы.
Пример-сравнение: в отеле Вам выдают ключ от номера с биркой. На бирке написано число. Это число является адресом номера, который Вам выделен. Сама бирка (не число) является указателем. Опять же: указатель содержит адрес, как бирка содержит номер комнаты. Чтобы получить значение, надо проследовать по адресу.
Вывод на экран будет таким:
Код
printf("%d", value); // вывод значения переменной value в формате целого числа
printf("%d", *pValue); // вывод значения, которое хранится по адресу, а этот адрес находится в переменной pValue

Прибыв в отель в первый раз, нельзя взять свою бирку и последовать в номер, указанный на ней, ведь бирка может быть с другого отеля, а может быть пустой. Поэтому надо подойти с биркой к менеджеру и попросить номер, куда можно поселиться. Менеджер напишет номер на бирке. Это и есть процесс выдачи комнаты, процесс выделения памяти: у вас есть бирка (указатель), на которую надо нанести номер комнаты (присвоить адрес), которую выдал менеджер (выделила операционная система). Как вариант, вы можете уже для заказанной комнаты использовать свою бирку и написать на ней номер, когда подойдёте к двери (узнаете, что это тот номер, что надо).
Процесс взятия адреса переменной уже был показан выше с использованием оператора & (амперсенд). Допустимо писать так:
Код
int value = 5;
int *pValue = &value;

Процесс взятия значения по указанному адресу называется разыменованием указателя и обозначается символом * (звёздочка) перед именем переменной-указателем.
Код
printf("%d", *pValue);

Т.к. наша бирка до запроса номера комнаты может содержать неправильный номер комнаты (тот, что нам недоступен или не существует), то надо обращаться к менеджеру. При необходимости хранения какого-либо значения в памяти, надо запросить операционную систему выделить эту память. Операционная система старается выделить столько памяти, сколько мы попросим. Когда мы попросим память, операционная система скажет, где она её выделила.
Код
int *pValue;
// стиль C
pValue = (int *)malloc(sizeof(int)); // просим выделить память размером sizeof(int) и сообщаем, что получаемый адрес указывает на целое число
// стиль C++
pValue = new(int);

Когда мы решим, что нам больше не нужен номер отела, мы говорим об этом менеджеру, тогда он сможет выдавать его другим постояльцам. В нашем случае просто надо сообщить операционной системе, что область памяти нам не нужна.
Код
// стиль С
free(pValue);
// стиль C++
delete pValue;


Накалякал решение в стиле Си. Можно было короче, но тогда менее наглядно будет.

Результат выполнения:
Код
Enter array size: 10
Enter all 10 values: 3 -5 6 7 3 0 -1 0 -7 5            
Array before:
3 -5 6 7 3 0 -1 0 -7 5         
Array after:
3 -5 6 7 3 -7 -1 0 0 5         
2 elements between


Результат выполнения для других данных:
Код
Enter array size: 6
Enter all 6 values: -1 1 1 1 1 0
Array before:
-1 1 1 1 1 0     
Array after:
0 1 1 1 1 -1     
4 elements between




Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.


Сообщение отредактировал froex - Среда, 26 Ноября 2014, 18:49
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг