Форум программистов, компьютерный форум CyberForum.ru

Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
02.09.2012, 17:20     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #1
Задача:

Есть структура, содержащая массив и его длину. Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива (i передается как параметр). Написать функцию init, которая бы записывала в этот массив случайные числа без повторений. Для генерации случайных чисел использовать функцию rand. Случайные числа должны быть не больше длинны массива умноженной на два. Для доступа к элементам массива использовать функцию getElem.
Первое решение учитильница не принила. Сказала что все не правильно. Я эту задачу перерешал в 4 варантах. Все они очень похожи. И во всех вариантах не понятно зачем нужен i, без него можно прекрасно обойтись.

Вот одно из моих решений:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# include <stdio.h>
# include <iostream>
# include <time.h>
# define N 20
using namespace std;
 
struct AR {int arr[N];};
 
  int& getElem(struct AR *reference,int &i)   //что бы не передавать по значению (это плохо я слышал) 
 {                                                                   // будем через ссылку i передавать
     static int printcount;
                  
  if (printcount!=0) //если счетчик не 0 то печатай массив 
      for (i;i<N;i++)               
        cout<<reference->arr[i]<<' ';
   printcount++;
   return reference->arr[i];             //возвращаем ссылку на итый элемент 
 }
  int init(int *p)   // СЮДА ПЕРЕДАЕТСЯ УКАЗАТЕЛЬ КОТОРЫЙ ИМЕЕТ ДОСТУП К ПАМЯТИ в    котором лежит массив струкуры. 
  {                           // ТАК КАК ПО УСЛОВИЮ задачи ДОСТУП к структре МОЖЕТ ОСУШЕСТВЛЯТЬСЯ ТОЛЬКО ЧЕРЕЗ функцию getelem
      
   srand(time(NULL)|clock());
   static int end;  // для того что бы значение сохранялось
   int scan=0,r;
   r=rand()%N*2;
   while (scan<N)  //scanning from 0 to N
   {      
      if (p[scan]==r) // match!
     {  
         r=rand()%N*2;
         scan=0;
         continue;
     }            
       scan++;   
    }
   p[end++] = r;       //matches no found! Тут мы заполняем массив случайными цифрами
   return 0;
 }
 
int main()
{
  struct AR reference;
  int i=0;   // раз по условию задачи i  передается как параметр то она будет здесь.
  int* p=&getElem(&reference,i);  //тут i зачем то передается как параметр.
  for (int s=0;s<N;s++)                                         
     init(p);
  getElem(&reference,i);
  cout<<endl;
return 0;
}
Народ проверьте пожалуйста правильно ли я решил?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2012, 17:20     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива
Посмотрите здесь:

Написать функцию, которая возвращает количество неотрицательных элементов массива. C++
C++ Написать функцию, которая возвращает максимальный элемент одномерного массива
C++ Создать рекурсивную функцию recursiveMinimum, которая возвращает наименьший элемент массива
C++ Написать функцию, которая по двум заданным одномерным массивам вычисляет двумерный массив и возвращает его максимальный элемент
Написать функцию, которая возвращает сумму отрицательных элементов одномерного массива. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
02.09.2012, 17:52     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #2
Нет, неправильно. Я дописал к вашему коду такую строку:
C++
1
int f = getElem(&reference,i); cout<< f << endl;
Ответ получил f = -853534525


Добавлено через 6 минут
Ошибка в функции getElem. Там в цикле вы пользуетесь переданным параметром. И в вашем случае это не есть хорошо.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.09.2012, 17:53     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #3
int& getElem(struct AR *reference,int &i) //что бы не передавать по значению (это плохо я слышал)
Плохо слышали, надо сказать. Для встроенных типов передача по значению это вполне нормально.
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
02.09.2012, 18:06  [ТС]     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# include <stdio.h>
# include <iostream>
# include <time.h>
# define N 20
using namespace std;
 
 
 
struct AR {int arr[N];};
 
  int& getElem(struct AR *reference,int &i)
 {
   reference->arr[i]=0;
   return reference->arr[i];             
 }
  int init(int *p)           
  {                          
      
   srand(time(NULL)|clock());
   static int end;  // для того что бы значение сохранялось
   int scan=0,r;
   r=rand()%N*2;
   while (scan<N)  //scanning from 0 to N
   {    
       
       if (p[scan]==r) // match!
       {  
            r=rand()%N*2;
            scan=0;
            continue;
       }            
       scan++;   
    }
   p[end++] = r;      //заполняем массив
   return 0;
 }
 
int main()
{
  struct AR reference;
  int i=0;   
  int* p=&getElem(&reference,i);  
  for (int s=0;s<N;s++)                                         
  init(p);                
return 0;
}
вот так правильно?

зы. все равно не понятно зачем нужно i тый элемент возвращать
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
02.09.2012, 18:57     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #5

Не по теме:

Цитата Сообщение от VN Посмотреть сообщение
вот так правильно?
Не сочтите за оскорбление: сижу и "ржу"


Нет неправильно. Я указал вам на то, что ваш i изменяется в цикле, в результате getElem выдавал число, находящиеся в ячейке, следующей сразу за n+1 элементом (который не предусмотрен). Теперь же вы зануляете i элемент, т.е "сменили шило на мыло". А смысл в том, чтобы при помощи getElem получить значение i элемента. Т.е.
C++
1
2
3
4
 int& getElem(struct AR *reference,int &i)
 {
   return reference->arr[i];             
 }
и все. Так то.
p.s. вдумайтесь вообще в название функции, догадливый вы наш: get Elem(ent) т.е. получить элемент, а параметр i указывает какой именно элемент нужен.
VN
 Аватар для VN
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
02.09.2012, 19:10  [ТС]     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #6
C++ (Qt)
1
2
3
4
int& getElem(struct AR *reference,int &i)
 {
   return reference->arr[i];    //  можно еще так поделать return reference->arr[i] = 2 или  так  return reference->arr[i] = 32      
 }
Я не понял в этом смысл?

ну вернет ссылку на элемент где лежит мусор. Так как i = 0(т.е указывает на первый элемент в массиве). Функции init на это по барабану. Она все равно этот мусор заменит значениями (куда указала один раз i). И заполнит этот массив потом уже не используя i.

Добавлено через 5 минут
Ладно. Главное мне скажите.С такой функцией задача правильная?
C++
1
2
3
4
int& getElem(struct AR *reference,int &i)
 {
   return reference->arr[i];             
 }
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.09.2012, 19:18     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #7
Все элементарно же...
Есть структура, содержащая массив и его длину. Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива (i передается как параметр). Написать функцию init, которая бы записывала в этот массив случайные числа без повторений. Для генерации случайных чисел использовать функцию rand. Случайные числа должны быть не больше длинны массива умноженной на два. Для доступа к элементам массива использовать функцию getElem.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstdlib>
#include <ctime>
 
struct Array
{
   static const size_t array_length = 5;
   int array[array_length];
};
 
int& get_elem(Array& arr, int idx)
{
   return arr.array[idx];
}
 
void init(Array& arr)
{
   for (size_t i = 0; i < Array::array_length; ++i)
   {
      int current = rand() % (Array::array_length * 2);
      get_elem(arr, i) = current;
   }
}
 
int main()
{
   Array array;
   srand(time(0));
   init(array);
   for (size_t i = 0; i < Array::array_length; ++i)
   {
      std::cout << get_elem(array, i) << std::endl;
   }
}
http://liveworkspace.org/code/3c1327...f0c23e067f4951

Неповторяющиеся элементы сами пилите.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.09.2012, 19:19     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #8
А что по-твоему вообще getElem должна делать, и зачем?
Что делает твой вариант getElem и зачем ты в него передаешь i?
ForEveR, странное решение. Зачем хранить длину массива в виде static поля у структуры, если длину встроенного массива можно получить через sizeof. Наверное такое задание подразумевает динамический массив.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.09.2012, 19:25     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #9
Герц, Чтобы не было глобальных переменных (да понятно, что можно было бы написать просто константу, но...) На самом деле, я думал о динамическом, но в условии ТС ничего об этом нет. Динамический определенно был бы логичнее.
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
02.09.2012, 20:45     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #10
Вообще-то вы ТС разбирались в том, что от вас требуется? Ваша задача состоит в том, чтобы задать массив из случайных чисел (которые не повторяются), и получить значение элемента массива по его номеру (индексу, если вам так больше нравится). А вы говорите про какой-то "мусор". Вам, между прочим, нужно узнать что именно за "мусор" в i ячейке и все. Вам уже предоставили варианты я и ForEveR.

Не по теме:

Я еще таких людей не встречал. н да.



Добавлено через 1 минуту
Цитата Сообщение от VN Посмотреть сообщение
все равно не понятно зачем нужно i тый элемент возвращать
В этом и состоит задача

Добавлено через 6 минут
Цитата Сообщение от VN Посмотреть сообщение
Функции init на это по барабану. Она все равно этот мусор заменит значениями (куда указала один раз i). И заполнит этот массив потом уже не используя i.
Вы сначала инициализируете массив, а потом уже смотрите что в i-ой ячейке получилось а не наоборот. i не используется при инициализации, оно нужно для доступа к уже инициализированным элементам (УЖЕ ПОСЛЕ ПРИМЕНЕНИЯ init, А НЕ ДО)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 22:07     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива
Еще ссылки по теме:

Написать функцию, которая возвращает индекс последнего минимального элемента массива C++
C++ Написать функцию, которая возвращает среднее значение элементов одномерного массива
Создать рекурсивную функцию, которая возвращает наименьший элемент массива C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.09.2012, 22:07     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива #11

Не по теме:

Цитата Сообщение от VN Посмотреть сообщение
Сказала что все не правильно.
неправильно
Цитата Сообщение от VN Посмотреть сообщение
//что бы не передавать по значению ...
чтобы. отдельно было бы, если бы "что бы не передавать, ничего не помогает"
Цитата Сообщение от VN Посмотреть сообщение
// для того что бы значение сохранялось
чтобы.
Цитата Сообщение от VN Посмотреть сообщение
...заполняем массив случайными цифрами...
числами. цифры это с помощью чего записываются числа.
Цитата Сообщение от VN Посмотреть сообщение
//тут i зачем то передается как параметр.
зачем-то.



Добавлено через 22 минуты
Есть структура, содержащая массив и его длину. Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива (i передается как параметр). Написать функцию init, которая бы записывала в этот массив случайные числа без повторений. Для генерации случайных чисел использовать функцию rand. Случайные числа должны быть не больше длинны массива умноженной на два. Для доступа к элементам массива использовать функцию getElem.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#define MAX_SIZE 20
#define INVALID_ELEMENT_VALUE -1
 
 
struct StructArray {
  int _00_array [MAX_SIZE];
  int _01_size;
};
 
StructArray array;
 
int& getElem (int i){
  if (i >= 0 && i < MAX_SIZE){
    return *(array._00_array + i);
  } else {
    return INVALID_ELEMENT_VALUE;
  }
}
 
bool hasItem (int value){
  bool retval = false;
  for (int i = 0; i < array._01.size; i++){
    if (getElem(i) == value){
      retval = true;
      break;
    }
  }
  return retval;
}
 
void addItem (int value){
  if (array._01_size < MAX_SIZE - 1){
   *(array._00_array  + array._01_size++) = value;
  }
}
 
void init (){
  int rnd = 0;
  while (array._01_size < MAX_SIZE) {
    rnd = rand() % MAX_SIZE * 2;
    if (!hasItem(rnd)){
      addItem (rnd);
    }
  }
}
 
int main(){
  ::memset (&array, 0, sizeof(array));
  init();
  for (int i = 0; i < MAX_SIZE; i++){
    cout >> getElem (i); // или как там выводится таким образом, уже не помню.
  }
}
 
не проверял, написал тольк. попробуй запусти, должно работать.
Yandex
Объявления
02.09.2012, 22:07     Написать функцию getElem, которая возвращает ссылку на i - тый элемент массива
Ответ Создать тему
Опции темы

Текущее время: 23:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru