powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатели с++
13 сообщений из 13, страница 1 из 1
указатели с++
    #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
указатели с++
    #39098663
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
int *p = a;

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

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

Не использовать индексы массивов и операцию [i]
...
Рейтинг: 0 / 0
указатели с++
    #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
указатели с++
    #39098814
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fr0st1k123,

Неправильно логически, ты не обязательно найдёшь сразу минимальный элемент.
А у тебя если ты найдёшь первого кандидата, то ты тут же сотрёшь весь остаток массива.
...
Рейтинг: 0 / 0
указатели с++
    #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
указатели с++
    #39098949
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozok,

Вы бы еще буст предложили :) человек только учится, незачем травмировать ему так психику.
Достаточно действительно заменить синтаксический сахар для работы с массивом на арифметику указателей, как указали выше.
...
Рейтинг: 0 / 0
указатели с++
    #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
указатели с++
    #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
указатели с++
    #39099069
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя может кто-нибудь предложит другой вариант обхода одномерного массива в обратную сторону с использованием указателей ;)
...
Рейтинг: 0 / 0
указатели с++
    #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
указатели с++
    #39099546
RedWalter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то мне кажется, что исходная программа делает немного больше телодвижений, чем требуется

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

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


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