Задача по ЦЕдваплюса

Статус: Offline
Реєстрація: 30.03.2011
Повідом.: 148
Задача по ЦЕдваплюса

Задачка такая есть. Надо написать функцию, которая принимает два параметра: F(int a[], b).
Функция возвращает массив чисел содержащихся в а[], убрав из них число б.
Пример:
int a[] = {1,2,3,4,3,3,4,5,6,2};
F(a, 3);
получаем массив {1,2,4,4,5,6,2};

У меня не получается получить размер массива, вместо этого я получаю размер типа int:

#include <iostream>

using namespace std;
int* Function(int a[], int Del)
{
int b[sizeof a];
int e = 0;
int i = 0;
while(i++ < sizeof a)
{
if(a == Del) continue;
b[e++] = a;
}
int* c = &b[0];
return c;
}
int main()
{
int a[]= {1,2,3,4,5,6,7,8};
int i =0;
int* b = Function(a, 3);
while(b)
cout << b[i++] <<" ";
}
 
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
 
Тільки зареєстровані користувачі бачать весь контент у цьому розділі

Это гениально:
Как я не додумался...

Возник ещё один вопрос:

int* Function(int a[], int Del)
{

int size = 0;
int i = 0;
while(a[i++] != '\0')
size++;
int b[size];
int e = 0;
for(int i = 0; i < (size+1); i++)
{
if(a != Del) b[e++] = a;
}
int* c = b;
return c;
}
int main()
{
int a[]= {1,2,3,4,5,6,7,8,9,9,9,9,9};
int i =0;
int* b = Function(a, 3);
while(b!='\0')
cout << b[i++] <<" ";
}


В результате получается мусор кусками. Я так понимаю это потому что после возвращения из функции указатель остается, а память освобождается?
Есть какой-то выход? Или единственный выход это передавать массив по ссылке, пихать в него новый получившийся массив и возвращать указатель на этот же массив?
 
ну ты либо высвобождаешь память и возвращаешь новый массив, либо редактируешь старый и оставляешь в памяти мусор, потом высвобождаешь, всегда придется выбирать экономить память или проц, тенденция идет к тому что памяти всегда дофига и выбирать особо не надо - всегда беречь ресурс проца
 
Не совсем понятно, как с++ определяет инициализированный массив:
Вот функция.
int* Function(int a[], int Del)
{

int size = 0;//( ( (int)(&a+1) - (int)(&a)) ) / sizeof(int);
for(int i = 0; a != '\0'; i++)
{
size = size + 1;
}
cout << size;
int *b = new int[size];
int e = 0;

for(int i = 0; i < (size); i++)
{
if(a != Del) b[e++] = a;
}
return b;
}


Если в нее передать такой массив: int a[]= {1,2,3,4,5,6,7686};

то size = 22

Но если к примеру так: int a[15]= {1,2,3,4,5,6,7686};

тогда все сходится: size = 7

В этом случае: int a[]= {1,2,3,4,5,6,7686}; компилятор страхуется и бронирует в несколько раз больше памяти?)))
 
это уже вопрос к тому что на плюсах пишет :)

либо про запас, либо обманываешь с инициализацией, либо у массива в конце нет нульбита и ты просто случайно нашел рядом его с другой структуры
 
С функцией так не получится, просто потому что в нее передается только адрес первого элемента массива, а размер всего массива ты не можешь узнать никак. Только явно его задать как параметр.
Это вообще бред, у тебя массив int, а не строка из char. Так твой цикл будет чесать по всей памяти пока случайно не встретит символ конца строки. Поэтому твой типа size может быть какой угодно, смотря какой мусор в памяти валяется в данный момент
 
ужос. выбрал комент с рейтингом -5. это никак не гениально. вот у тебя size и получается непонятных значений.

можно тогда уже написать используя счет пока код не сломается.
Код:
int i = 0;
while(true)
{
 try
 {
  auto el = a[i];
  i++;
 }
 catch
 {
 break;// кидается исключение попытки доступа к запрещенной памяти
 }
}
// (i) тут содержит длину массива
Но это тоже бред и дикий говно код. не делай так. используй STL, это не так сложно и гемора отвалится сразу много.
 
омг я не заметил что тс выбрал самый худший вариант :) еще и думаю разве кроме строки на нульбит что-то заканчивается?
 
Но это тоже бред и дикий говно код. не делай так. используй STL, это не так сложно и гемора отвалится сразу много.

А есть более простой выход, без использования STL и без говно-кода?)
 
ТС, в вашем случае, необходимо указывать размер массива и передавать его как аргумент в функцию, но есть одно "НО" - в задании четко указано, что параметра у функции может быть всего два!
Проверять каждый элемент на 0, как конец массива, тоже нельзя, потому как ноль может легко быть членом данного массива.
+ есть еще один немаловажный момент, - при выводе обработанного массива схожие элементы не указываются как 0, а заменяются следующими за ними элементами (4 и 12345 становится, к примеру, не 12305, а 1235), т.е. размер массива для вывода на дисплей должен меняться тоже!
Решением данной задачи может послужить неоговоренная структуризация самого массива данных, а именно - "кто мешает или запрещает нам использовать его нулевой элемент как параметр рамера?"
Т.е. вы передаете в функцию указатель на нулевой элемент массива, который, по сути, является размером данного массива!
Т.е. , как пример:
unsigned int array[] = {6,1,2,3,4,5};
Вызываем функцию обработчик массива, в качестве аргументов передав ей указатель на данный массив и число для выборки:
Function(array, 4);
Так вот ваш нулевой элемент массива array[0] и будет рамером данного массива!
Далее, в цикле сравнения, вы смещаетесь на один элемент и в конце процедур сравнений и смещений массива, задаете ему новую размерность (!!! размер самого массива не меняется, просто вы укажете сколько элементов осталось после обработки, и сколько их нужно вывести фактически на печать) опять таки присвоив нулевому элементу размерность полученного (обработанного) массива.
Т.е. :
unsigned int array[] = {6,1,2,3,4,5};
....
....
Function(array, 4); // We've got next result -> {5,1,2,3,5};
...
...
unsigned int i;

for(i = 1; i < array[0]; i++) // i = 1 is offset for array[0] element
{
cout << array;
}

As result: 1235
Это примитивно, но в вашем случае удовлетворяет всем условиям задачи! :)

И еще, вы писали, что получали неверный размер массива, а именно размер int, что в вашем случае было абсолютно верно, ибо вы пытались узнать размер переданного в функцию указателя на начало массива, типа int.
Да и сам размер массива, до передачи его в функцию в качестве нулевого члена массива, корретно было бы узнать вот таким вот образом:
unsigned int array[] = {6,1,2,3,4,5};
unsigned int sizeOfArray = (sizeof(array) / sizeof(array[0]));
 
Останнє редагування:
Задачка такая есть. Надо написать функцию, которая принимает два параметра: F(int a[], b).
Функция возвращает массив чисел содержащихся в а[], убрав из них число б.
Пример:
int a[] = {1,2,3,4,3,3,4,5,6,2};
F(a, 3);
получаем массив {1,2,4,4,5,6,2};

У меня не получается получить размер массива, вместо этого я получаю размер типа int:

Це три плюса, блиать.
Пастановка задачи - дебильная - плюнь в лицо тому кто тебе ее дал.
В таких случае размер всегда передаеться параметром, причем ин\аутом если массив планируеться минять.
Нет в природе способов внутри функции определить размер внешнего массива.
Ну и реализация - отдельный шедегр, несчитая некоректного сайзофа:
Возврат адресса внутреннего массива наружу - ф топку.
конструкция int* c = &(b[0]) - ту да же.
while (b) - та же.

Тільки зареєстровані користувачі бачать весь контент у цьому розділі

о_О

Это гениально:
Как я не додумался...
:рл: ипаный стыд...
Это у тебя строка что ли? Тебя удивит результат для a[] = {0, 1, 2, 3, 4}

Возник ещё один вопрос:
В результате получается мусор кусками. Я так понимаю это потому что после возвращения из функции указатель остается, а память освобождается?
Правильно понял. Прогрессируешь.

Есть какой-то выход? Или единственный выход это передавать массив по ссылке, пихать в него новый получившийся массив и возвращать указатель на этот же массив?
А почему бы не передать массив по указателю или не возвращать ссылку на массив? :іржач: Все равно же думать в падлу, книжки читать тоже. А там на самой первой странице написано - любой нативный массив это указатель, мазафака!



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

Шта? Как мине это развидеть?

Не совсем понятно, как с++ определяет инициализированный массив:
Вот функция.


Если в нее передать такой массив: int a[]= {1,2,3,4,5,6,7686};

то size = 22

Но если к примеру так: int a[15]= {1,2,3,4,5,6,7686};

тогда все сходится: size = 7

В этом случае: int a[]= {1,2,3,4,5,6,7686}; компилятор страхуется и бронирует в несколько раз больше памяти?)))

ЗАбудь о це два плюса, забудь и не вспоминай - это точно не твое. Есть много замечательный языков - це-решетка, жаба, пехапе, наконец!

З.Ы. Ты что с чем сравниваешь? Где ты этот бред вообще взял?
З.З.Ы. Он возвращает индекс первого вхождения нуля! Тоесть аэто рандомный аксес виолейшен!
 
Останнє редагування:
Це три плюса, блиать.
Пастановка задачи - дебильная - плюнь в лицо тому кто тебе ее дал.

Тесты. Чето типа собеседования в компанию.
Це два плюса давно учил, сейчас учу джаву и собеседование было по нему, но можно было писать на любом языке, чего-то решил на С++ писать.

ЗАбудь о це два плюса, забудь и не вспоминай - это точно не твое. Есть много замечательный языков - це-решетка, жаба, пехапе, наконец!

Не все рождаются мидлами или хотя бы Junior' ами. Я хотя бы пытаюсь разобраться
 
Тесты. Чето типа собеседования в компанию.
Це два плюса давно учил, сейчас учу джаву и собеседование было по нему, но можно было писать на любом языке, чего-то решил на С++ писать.
Если ничего не напутал, то я бы туда тоже не ходил. Но ны таки напутал у жабы - есть встроенные методы определения длинны массива и там задача в подобной формулировке решаеться как два бита переслать.

Не все рождаются мидлами или хотя бы Junior' ами. Я хотя бы пытаюсь разобраться
В чем? В приведенных кусках кода лажа на лаже лаже погоняет на уровне трейни, нет даже на уровне элементари, потому как явное непонимание сути С на лицо, о каком собеседовании может идти речь дальше?
 
а шо сиплюплюс оно настоко припизженное что там еще и размер массива дето рядом хранить надо?
эта пиздец товарищи :ги:

Тесты. Чето типа собеседования в компанию.
Це два плюса давно учил, сейчас учу джаву и собеседование было по нему, но можно было писать на любом языке, чего-то решил на С++ писать.
выкинь нахуй этот цыплюплюс и учи джаваскрипт
в люди выйдешь
а в цыплюсплюс токо и будешь, что понтоваться властью над указателями и длину масива отдельно сохранять
чтоб не забыть
 
а шо сиплюплюс оно настоко припизженное что там еще и размер массива дето рядом хранить надо?
эта пиздец товарищи :ги:

:D Вы шарпейчики так далеки от народа, что вам даже не в домек что в сях то и массивов нет :D
 
:D Вы шарпейчики так далеки от народа, что вам даже не в домек что в сях то и массивов нет :D

то есть если тебе нужен типизированный массив, ты просто берешь создаешь указатель и хуяришь туда всякий мусор, учитывая некое смещение (ну типа размер размер указателя на объект который я кобы лежит в этом массивчике), а потом когда надо обратится к 30-му элементу массива ты сам ручками должен высчитать где он хранится учитывая всю эту хуйню с указателями и смещениями?
И при этом типы объектов засовываемых в массив нихуя не контролируются и тебе руками нужно следить за корректностью всей этой поебени?
по мужски, чо :D
 
Та то вы оба немного перегнули палку. Есть массивы, возможно не в том виде как в других языках, ничего высчитывать не надо, типы проверяются, длина только нигде не указана.
 
Назад
Зверху Знизу