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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
#1

Неограниченное количество значений - C++

27.08.2009, 19:24. Просмотров 1225. Ответов 10
Метки нет (Все метки)

Задали вот такую задачку , до сих пор не могу решить. Помогите.
Код
 1) Программа должна позволять ввести неограниченное количество значений и сохранить их в масив, размещённый в свободном хранилище.
Программа должны вывести введённые значения, по пять в строке, 
после чего вычислить и показать их среднюю величину. начальный размер
 масива должен состовлять 5 элементов. При необходимости, программа должна создавать
 масив с пятью добавочными элементами и копировать содержимое 
старого масива в новый..
2)Сделать тоже самое что в первом,только с использованием new...delete.
Вот,что получилось, какой-то бред,не знаю как переделать,она ещё не компилится..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{   
int z = 0, k = 0;
 
int mas[z];
    cout<<"Vvedite kolichestvo znacheniy -> ";
    cin>>z;
for(int i = 1; i<=z; i++)
{
k++;
cout<<i/k;
}
cin.get();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2009, 19:24     Неограниченное количество значений
Посмотрите здесь:

количество значений функции C++
количество отрицательных значений функции C++
C++ Ввод чисел неограниченное количество раз
C++ Определить количество различных значений матрицы
Посчитать количество различных значений в массиве C++
C++ Вводить неограниченное количество чисел
Определить наибольшее из всех отрицательных значений, наибольшее из всех значений, количество нулевых значений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 20:00     Неограниченное количество значений #2
C++
1
2
3
4
5
int *pArray = (int*)::malloc (5*sizeof(int));
int reserved = 5;// проверить бы хорошо дали ли нам память. особенно для "неограниченного количества" важно
int size = 0;
 
...
далее пишете в эту память ваши значения последовательно, перед этим проверяя, есть ли куда и корректируя счетчик. если некуда - вызвать некую подпрограммку, которй дать указатель на массив и указатель на его размер. она должна выделить новый кусок, переписать содержимое из старого, старый освободить, вернуть новый указатель. скорректировать размер. в общем в этом направлении.

вот эта ф-я вам может пригодиться:
void *realloc( void *memblock, size_t size );
Evg
Эксперт CАвтор FAQ
17310 / 5558 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
27.08.2009, 20:09     Неограниченное количество значений #3
Цитата Сообщение от novi4ok Посмотреть сообщение
вот эта ф-я вам может пригодиться:
void *realloc( void *memblock, size_t size );
А как, на твой взгляд, при таком подходе поступить с пунктом 2?
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
27.08.2009, 21:30  [ТС]     Неограниченное количество значений #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
#include <iostream>
using namespace std;
 
int main()
{
  int *a = new int[5];
  int *b;
  int new_item;
  int i = 0;
  int size = 5; // Размер массива
  for(;;)
  {
    cin >> new_item;
    // Если ввели что-то неправильное, то прекращаем ввод
    if (cin.fail())
      break;
    if (i >= size) // Новый элемент не умещается в массив
    {
      size += 5;
      b = new int[size];
      memcpy(b,a, size*sizeof(int)); // Копируем значения из массива а в массив b
      delete[] a; // Удаляем массив a
      a = b; // в а прописываем указатель на массив b
    }
   a[i] = new_item; // Записываем новое значение в массив
    ++i;
  }
  cout<<a[i];
  // Тут уже в массив a записано i чисел
  // а памяти выделено под size элементов
  // size кратно пяти всегда
  // Среднее уже самостоятельно найдете надеюсь
 
  // Ну и в конце не забываем
  // освобождать память из под массива
  delete[] a;
}
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 21:46     Неограниченное количество значений #5
Цитата Сообщение от Evg Посмотреть сообщение
А как, на твой взгляд, при таком подходе поступить с пунктом 2?
при чем здесь "подход" и п.2? вы что - прочитали "пригодится на все случаи жизни"? я такого не написано.
Evg
Эксперт CАвтор FAQ
17310 / 5558 / 347
Регистрация: 30.03.2009
Сообщений: 15,127
Записей в блоге: 26
27.08.2009, 22:58     Неограниченное количество значений #6
Цитата Сообщение от novi4ok Посмотреть сообщение
при чем здесь "подход" и п.2? вы что - прочитали "пригодится на все случаи жизни"? я такого не написано.
Использование new и delete косвенно означает, что нужно без realloc'а

Добавлено через 1 минуту
Другими словами, не вводи людей в заблуждение
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
31.08.2009, 14:51  [ТС]     Неограниченное количество значений #7
Вот попробывал ещё так, но что-то не выходит. Помогите пожалуйста исправить код.

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
#include <iostream>
using namespace std;
 
 
int main()
{
  int *a = new int[5];
  int *b;
  int new_item;
  int i = 0;
  int size = 5; // Размер массива
  for(;;)
  {
    cin >> new_item;
    // Если ввели что-то неправильное, то прекращаем ввод
    if (cin.fail())
      break;
    if (i >= size) // Новый элемент не умещается в массив
    {
      size += 5;
      b = new int[size];
      memcpy(b,a, size*sizeof(int)); // Копируем значения из массива а в массив b
      delete[] a; // Удаляем массив a
      a = b; // в а прописываем указатель на массив b
    }
    a[i] = new_item; // Записываем новое значение в массив
    ++i;
  }
  // Тут уже в массив a записано i чисел
  // а памяти выделено под size элементов
  // size кратно пяти всегда
  // Среднее уже самостоятельно найдете надеюсь
 
  // Ну и в конце не забываем
  // освобождать память из под массива
  delete[] a;
  for (int k = 0; k < i; k += 5)
{
  cout << a[k] << '\t'
         << a[k+1] << '\t'
         << a[k+2] << '\t'
         << a[k+3] << '\t'
         << a[k+4] << '\t' << endl;
}
int sum = 0;
for (int k = 0; k < i; ++k)
{
  sum += a[k];
}
// Вывод среднего арифметического
cout << sum/i << endl;
 
}
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
31.08.2009, 15:26     Неограниченное количество значений #8
Цитата Сообщение от Syltan Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
delete[] a;
 for (int k = 0; k < i; k += 5)
{
 cout << a[k] << '\t'
 << a[k+1] << '\t'
 << a[k+2] << '\t'
 << a[k+3] << '\t'
 << a[k+4] << '\t' << endl;
}
int sum = 0;
for (int k = 0; k < i; ++k)
{
 sum += a[k];
}
Вообще-то Вы сначала уничтожили массив а, потом пытаетесь использовать его елементы. Так не получиться!
Надо перенести строку
C++
1
delete[] a;
в самый конец функции main(), после определения среднего
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
31.08.2009, 15:40  [ТС]     Неограниченное количество значений #9
Если написать вот так,программа вроде компилируется, но просто она не соответсвуте условию, в самом начале темы. Происходит просто бесконечный ввод чисел и больше эта программа ничего не делает.

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
#include <iostream>
using namespace std;
 
 
int main()
{
  int *a = new int[5];
  int *b;
  int new_item;
  int i = 0;
  int size = 5; // Размер массива
  for(;;)
  {
    cin >> new_item;
    // Если ввели что-то неправильное, то прекращаем ввод
    if (cin.fail())
      break;
    if (i >= size) // Новый элемент не умещается в массив
    {
      size += 5;
      b = new int[size];
      memcpy(b,a, size*sizeof(int)); // Копируем значения из массива а в массив b
      delete[] a; // Удаляем массив a
      a = b; // в а прописываем указатель на массив b
    }
    a[i] = new_item; // Записываем новое значение в массив
    ++i;
  }
  // Тут уже в массив a записано i чисел
  // а памяти выделено под size элементов
  // size кратно пяти всегда
  // Среднее уже самостоятельно найдете надеюсь
 
  // Ну и в конце не забываем
  // освобождать память из под массива
 
   for (int k = 0; k < i; k += 5)
{
  cout << a[k] << '\t'
         << a[k+1] << '\t'
         << a[k+2] << '\t'
         << a[k+3] << '\t'
         << a[k+4] << '\t' << endl;
}
int sum = 0;
for (int k = 0; k < i; ++k)
{
  sum += a[k];
}
// Вывод среднего арифметического
cout << sum/i << endl;
  delete[] a;
 }
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
31.08.2009, 16:02     Неограниченное количество значений #10
Все правильно, программа выполняет бесконечный цикл:
Цитата Сообщение от Syltan Посмотреть сообщение
C++
1
2
3
4
5
6
for(;;)
 {
    if (cin.fail())
      break;
--------
 }
выход из которого "если ввели что-то неправильное"
Определите "нормальный" выход из цикла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2009, 16:16     Неограниченное количество значений
Еще ссылки по теме:

Прочитать неограниченное количество строк, а после нажатия Enter выйти из цикла C++
C++ Матрицы. Определить количество различных значений
Программа, которая позволяет ввести неограниченное количество значений и сохранить их в массив, размещенный в свободном хранилище C++
C++ Подсчитать количество значений
C++ Определить количество ненулевых значений

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

Или воспользуйтесь поиском по форуму:
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
31.08.2009, 16:16     Неограниченное количество значений #11
Замените
C++
1
2
3
4
5
6
for(;;)
  {
    cin >> new_item;
    // Если ввели что-то неправильное, то прекращаем ввод
    if (cin.fail())
      break;
на
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
do
  {
    cin >> new_item;
if (i >= size) // Новый элемент не умещается в массив
    {
      size += 5;
      b = new int[size];
      memcpy(b,a, size*sizeof(int)); // Копируем значения из массива а в массив b
      delete[] a; // Удаляем массив a
      a = b; // в а прописываем указатель на массив b
    }
    a[i] = new_item; // Записываем новое значение в массив
    ++i;
 
  } while(new_item != 0);
Yandex
Объявления
31.08.2009, 16:16     Неограниченное количество значений
Ответ Создать тему
Опции темы

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