Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатели с++ / 13 сообщений из 13, страница 1 из 1
09.11.2015, 17:04
    #39098662
fr0st1k123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
Найти минимальный элемент в массиве A и обнулить все элементы , стоящие в массиве после него. Решить задачу , используя указатели.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include "stdafx.h"
#include "iostream"
using namespace std;
int main()
{
	int a[5] = { 7,3,6,9,11 };
	int min=0;
	for (int i = 0; i < 5; i++)
		if (a[i] < a[min])
			min = i;
	for (int i = min; i < 5; i++)
		if (a[i]>a[i - 1])
			a[i] = 0;
	for (int i = 0; i < 5; i++)
		cout << a[i];
	return 0;
}


саму программу смог написать , как ее сделать через указатели ?
...
Рейтинг: 0 / 0
09.11.2015, 17:07
    #39098663
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
int *p = a;

в цикле вместо i++ и a[i], используй ++p и *p;
...
Рейтинг: 0 / 0
09.11.2015, 18:09
    #39098736
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
mcureenab,

Вижу, в Мурманске знают С++!
Ну так надо, чтобы и в Томске тоже знали!
...
Рейтинг: 0 / 0
09.11.2015, 18:10
    #39098741
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
fr0st1k123Найти минимальный элемент в массиве A и обнулить все элементы , стоящие в массиве после него. Решить задачу ,
саму программу смог написать , как ее сделать через указатели ?

Не использовать индексы массивов и операцию [i]
...
Рейтинг: 0 / 0
09.11.2015, 18:56
    #39098802
fr0st1k123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
Так правильно ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include "stdafx.h"
#include "iostream"
using namespace std;
int main()
{
	int a[5] = { 7,8,6,9,11 };
	int min(a[0]);
	
	

	for (int *p = a, *m = a; p != &a[5]; p++)
		if (*p < *m)
		{
			m = p;
			for (int *p = m; p != &a[5]; p++)
				if (*p > *(p - 1))
					*p = 0;
		}
	for (int *p = a; p!= &a[5]; p++)    
		cout << *p;
	return 0;
}
...
Рейтинг: 0 / 0
09.11.2015, 19:04
    #39098814
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
fr0st1k123,

Неправильно логически, ты не обязательно найдёшь сразу минимальный элемент.
А у тебя если ты найдёшь первого кандидата, то ты тут же сотрёшь весь остаток массива.
...
Рейтинг: 0 / 0
09.11.2015, 22:04
    #39098921
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
fr0st1k123,

Код: plaintext
1.
2.
3.
	int a[5] = { 7,3,6,9,11 };
        int *p = a;
        std::fill(std::min_element(p, p + 5), p + 5, 0);
...
Рейтинг: 0 / 0
09.11.2015, 22:59
    #39098949
Alex the coder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
Mozok,

Вы бы еще буст предложили :) человек только учится, незачем травмировать ему так психику.
Достаточно действительно заменить синтаксический сахар для работы с массивом на арифметику указателей, как указали выше.
...
Рейтинг: 0 / 0
10.11.2015, 02:51
    #39099067
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
fr0st1k123Так правильно ?



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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int* search_min_and_init_zeros_after(int* buf, size_t len)
{
	int* min = buf+len-1;
	for (int* i = buf + len - 2; i - buf; --i){
		if (*i < *min){
			for (int* j = min; j - i + 1; --j){
				*j = 0;
			}
			min = i;
		}
	}
	return min;
}
...
Рейтинг: 0 / 0
10.11.2015, 02:55
    #39099068
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
SashaMercuryfr0st1k123Так правильно ?



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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int* search_min_and_init_zeros_after(int* buf, size_t len)
{
	int* min = buf+len-1;
	for (int* i = buf + len - 1; i - buf; --i){
		if (*i < *min){
			for (int* j = min; j - i + 1; --j){
				*j = 0;
			}
			min = i;
		}
	}
	return min;
}



к сожалению придётся начать именно с buf + len - 1, а не buf + len - 2
...
Рейтинг: 0 / 0
10.11.2015, 02:57
    #39099069
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
Хотя может кто-нибудь предложит другой вариант обхода одномерного массива в обратную сторону с использованием указателей ;)
...
Рейтинг: 0 / 0
10.11.2015, 10:34
    #39099266
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
SashaMercurySashaMercuryпропущено...



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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int* search_min_and_init_zeros_after(int* buf, size_t len)
{
	int* min = buf+len-1;
	for (int* i = buf + len - 1; i - buf; --i){
		if (*i < *min){
			for (int* j = min; j - i + 1; --j){
				*j = 0;
			}
			min = i;
		}
	}
	return min;
}




к сожалению придётся начать именно с buf + len - 1, а не buf + len - 2

Алгоритмически хорошо выглядит, практически может быть лучше найти минимальный элемент и отдельно обнулить хвост массива функцией memset. цикл по j можно от i+1 до min сделать. цикл по i можно на len завязать:

for (int* i = min - 1; --len; --i)

и как раз начинать с len - 2. Конечно, если 0<len.

Пожалейте читателя. Вот это сложно сразу понять: "; j - i + 1;", "; i - buf;" что к чему стремится.

И еще один момент, символ * относится не к типу, а к переменной. Лучше лепить его к переменной: int *min; или int *search_min_and_init_zeros_after. Когда идет объявление int *a, b, c; легче заметить, что b и c не указатели, а целые. Объявляя int* a, b, c; неопытный программист может подумать, что все три переменных - указатели.
...
Рейтинг: 0 / 0
10.11.2015, 13:54
    #39099546
RedWalter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатели с++
Что то мне кажется, что исходная программа делает немного больше телодвижений, чем требуется

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

Во втором цикле индекс минимального значения уже определен, поэтому новые сравнения не нужны :
for (int i = min+1; i < 5; i++)
a[i] = 0;
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатели с++ / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]