Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 22:06   #1
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию Вставка элемента в массив

Здравствуйте! У меня есть некоторый вопрос. Поставлена задача - написать функцию, которая принимает 3 параметра и производит вставку указанного значения в указанный массив по указанному индексу, причём все остальные элементы массива автоматически сдвигаются. Подскажите, как эту функцию лучше реализовать? Написал свой вариант, но он не работает, не пойму почему даже, помогите разобраться, что не так в моём варианте, как можно исправить его и если есть кривоватости, то посоветуйте, что можно исправить. Вот мой вариант.

Код:
int *ins(int mass[N],int el,int idx) {

         int arr[N+1],*a;

         int i,j;

         for(i=0;i<idx;i++) {

                 arr[i] = mass[i];

         }

         arr[idx] = el;

         for(i=idx,j = ++idx;i<N,j<(N+1);i++,j++) {

                 arr[j] = mass[i];

         }

         a = arr;

         return a;

 }
Здесь mass[N] - массив, в который нужно вставить, el - число, которое нужно вставить, idx - индекс вставляемого элемента, причём N - константа, в которой содержится в данном случае размер массива до вставки.

Заодно хочу узнать, как лучше обойти проблему, когда нужно возвратить массив, но в с++ такого нельзя. Уместна ли здесь идея использования возврата указателя на первый элемент массива? Заранее спасибо )

P.S. И ещё, все элементы массива должны сдвигаться именно на индекс к концу массива и ещё кое-что: если сможете, реализуйте именно с помощью циклов, без STL, как уже советовали везде, а то я пока новичок и мне нужны ваши советы!
С++ - сила
Rait-spider вне форума Ответить с цитированием
Старый 01.11.2012, 22:15   #2
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

Передавать в функцию целый массив - это круто)
только если так:
func(*mas,...){} попробуй через динамический массив

а хотя нет, можно.. попробуй так:
Код:
void ins(char mass[], int el, char idx)
{
    int size=0;
    size=strlen(mass);
    for(int i=size;i> el;i--) mass[i]=mass[i-1];
    mas[el]=elem;
}
мейн будет выглядеть так:
Код:
char mas[5]="abcd";
ins(mas,2,'5');
printf("%s", mas)
писал не компиля, попробуй так


а на счёт возврата массива: да, конечно можно.. используя адрес в памяти)
объявление массива:
char *mem(char*) malloc(size*sizeof(char )); //хотя можно сайзоф и не писать, т.к. занимает один байт char) ну мало ли на int захочешь поменять)

free(mas); освобождаем память//

отправлять в функцию так: f(mas);
принимаем так: void f(*m,...){...} ничего возвращать не надо, всё итак норм будет

Последний раз редактировалось Stilet; 01.11.2012 в 22:47.
Murashov вне форума Ответить с цитированием
Старый 01.11.2012, 22:34   #3
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию

Спасибо. сейчас попробую, надеюсь получится. Насчёт передачи указателя на массив идея не совсем понятна. Не понятно только то, что если я не укажу размер массива в аргументе, то будет неясно, какой размер выделять. Вот в этом-то вся проблема.
И ещё, где вы написали char idx, этот параметр задаёт индекс, а не символ или я что-то не так понимаю?

И ещё, хотелось бы более подробно узнать про идею передавать сам указатель на первый элемент массива вместо массива как такового. непонятно то, как мы определим его фактический размер уже в теле функции? Ну например, если задан такой параметр

func(int *arr)

то если мы передадим следующим образом массив

func(mass[15]), то как узнать то, что размер этого массива равен 15? Не сочтите меня глупым, впервые изучаю указатели и всё такое )) Ис кал в инете, инфы кажется много, но того чего надо, нет )
С++ - сила

Последний раз редактировалось Stilet; 01.11.2012 в 22:48.
Rait-spider вне форума Ответить с цитированием
Старый 01.11.2012, 22:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
непонятно то, как мы определим его фактический размер уже в теле функции?
Почему бы в функцию не передавать размер?
Или как я люблю делать - первый элемент массива - фактический размер (кол-во элементов если точнее).
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.11.2012, 22:54   #5
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию

я бы так и делал, но многие пишут, что слишком большие накладные расходы возникают, если в функцию передавать массив. Или если вы имели в виду про передачу как отдельный параметр, то тут я позабыл про эту возможность. Буду иметь к сведению. Спасибо
С++ - сила
Rait-spider вне форума Ответить с цитированием
Старый 01.11.2012, 22:57   #6
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

Цитата:
Не понятно только то, что если я не укажу размер массива в аргументе, то будет неясно, какой размер выделять.
int size=0;
while(mas[++size]);
size - узнать размер массива


Цитата:
И ещё, где вы написали char idx, этот параметр задаёт индекс, а не символ или я что-то не так понимаю?
индекс - второй аргумент, а 3 - это то, на что заменять

Цитата:
И ещё, хотелось бы более подробно узнать про идею передавать сам указатель на первый элемент массива вместо массива как такового. непонятно то, как мы определим его фактический размер уже в теле функции? Ну например, если задан такой параметр

func(int *arr)

то если мы передадим следующим образом массив

func(mass[15]), то как узнать то, что размер этого массива равен 15? Не сочтите меня глупым, впервые изучаю указатели и всё такое )) Ис кал в инете, инфы кажется много, но того чего надо, нет )
как я сказал ранее есть на то функция strlen(mas), которая возвращает размер массива или самому написать: int size=0;while(mas[++size]); и не надо передавать [15], оставь их пустыми.. func(mas[],...) для статического массива
Murashov вне форума Ответить с цитированием
Старый 01.11.2012, 22:58   #7
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Rait-spider Посмотреть сообщение
я бы так и делал, но многие пишут, что слишком большие накладные расходы возникают, если в функцию передавать массив. Или если вы имели в виду про передачу как отдельный параметр, то тут я позабыл про эту возможность. Буду иметь к сведению. Спасибо
ничего не возникают, передавать массив в функцию совершенно нормально.. только делать это нужно через динамическое выделение памяти функцией malloc и передачей в функцию указателя(второй пост)
Murashov вне форума Ответить с цитированием
Старый 01.11.2012, 23:02   #8
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию

Проверил только что, всё работает. Спасибо бльшое, если что, то я обращусь ещё к вам, как к профи ) сейчас подредактирую код под свои нужды и всё )
С++ - сила
Rait-spider вне форума Ответить с цитированием
Старый 02.11.2012, 08:40   #9
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

я профи? это вряд ли :D
Murashov вне форума Ответить с цитированием
Старый 02.11.2012, 09:18   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я профи? это вряд ли :D
Тебе ничто не мешает им стать )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерный массив. Вставка элемента. Stwl3 Паскаль, Turbo Pascal, PascalABC.NET 3 09.01.2011 22:52
Вставка элемента Dmitry73 Помощь студентам 0 06.12.2010 19:04
вставка элемента Dmitry73 Помощь студентам 2 05.12.2010 11:06
Вставка элемента в массив Yulya Помощь студентам 2 31.03.2009 10:34
Вставка элемента в массив Игорь777 Помощь студентам 1 04.12.2008 18:57