Нужно написать программу, согласно условиям: 1)ввод данных выполняется с клавиатуры 2)при работе с массивами использовать указатели и адресную арифметику 3)для создания текстовых сообщений, выводимых на экран, использовать указатели вот сама задачка: Поменять местами первый нулевой и последний отрицательный элементы в одномерном массиве. Посчитать разность элементов между ними. Буду очень благодарен, если еще и комментарии приложите к коду. Заранее спасибо)
//--------------------------------------------------------------------------- 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) ---------------------------------------------
//--------------------------------------------------------------------------- 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
Cre-game, ну сам код и я написать могу, а вот следуя этим условиям я написать код не могу, ибо не понимаю ни в указателях, ни в адресах ничегошеньки. потому и написал сюда
наверно имелось ввиду массив задать не massiv[10] ={3,5,6,7,3,0,1,0,-7,5}; а int *massiv; потом выделить через функцию malloc память под нужное кол-во элементов, и к элеменам массива обращаться через *massiv Разработка и продвижение сайтов. Дизайн
я не могу понять зачем, как и для чего использовать эти адреса и указатели
А тут объяснялки не помогут. Концепция сложная, её нужно прочувствовать. Нужно слиться с указателем, нужно думать, как указатель.
А если без сантиментов, то сейчас я, не вдаваясь в детали использования (которые ты всё равно прочтёшь в учебнике), расскажу, зачем указатели могут быть нужны.
Указатель - абстракция над адресом. Каждому объекту в памяти компьютера присуще целое число - адрес, по которому он хранится. Естественно, адрес - число - можно получить и сохранить в переменной - в Си объект, соответствующий переменной, в которой сохранён адрес, называется указателем. Переменная сама по себе тоже абстракция над адресом, но переменная - сущность сугубо виртуальная, адрес же, хранящийся в указателе - штука реальная, и с ней компьютер может делать интересные вещи. Например, стоит перед нами задача: написать функцию, которая в качестве побочного эффекта изменяет значение переменной во внешней программе. Самое практичное решение - использовать указатель:
Код
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
-l33t-h4xx-, за это спасибо. сейчас пытаюсь с этим разобраться. и вот проблемка по этой задаче: я уже прописал все, дошел до замены местами элементов и затух. подскажите, будет ли правильно написать вот так:
Код
*mas+*indexO=*z
где mas это массив, indexO это индекс элемента, который требуется заменить, z это то, на что меняется элемент под индексом indexO.
Неопытный второкурсник скажет кое-что. Оператор * - разыменование и приенять его к индексу и значению по-моему странно. Мой вариант: *mas + index = z А может так: *(mas + index) = z
Сообщение отредактировал LetsOffBrains - Среда, 26 Ноября 2014, 15:33
Мой вариант: *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;
Накалякал решение в стиле Си. Можно было короче, но тогда менее наглядно будет.
Код
#include <stdio.h> #include <stdlib.h>
int main() { int sizeOfArray; int *pArray = 0; int i, iBegin, iEnd; int *pFirstZero = 0; int *pLastNegative = 0;
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