Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868

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

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

Студворк — интернет-сервис помощи студентам
Задали вот такую задачку , до сих пор не могу решить. Помогите.
Code
1
2
3
4
5
6
7
 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();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.08.2009, 19:24
Ответы с готовыми решениями:

Программа, которая позволяет ввести неограниченное количество значений и сохранить их в массив, размещенный в свободном хранилище
Напишите программу на «родном» С++, которая позволяет ввести неограниченное количество значений и сохранить их в массив, размещенный в...

Вводить неограниченное количество чисел
Составьте программу, которая позволяет вводить неограниченное количество чисел. После каждого ввода на экран выводится наибольшее и...

Ввод чисел неограниченное количество раз
здравствуйте! нужно составить прогу: нужно сделать, чтобы можно было вводить числа неограниченное кол-во раз то есть не пойдёт такое ...

10
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 20:00
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 );
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.08.2009, 20:09
Цитата Сообщение от novi4ok Посмотреть сообщение
вот эта ф-я вам может пригодиться:
void *realloc( void *memblock, size_t size );
А как, на твой взгляд, при таком подходе поступить с пунктом 2?
0
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
27.08.2009, 21:30  [ТС]
ПОдсказали так, но программа не доделана, не знаю как вывести результат в этом коде.
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;
}
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2009, 21:46
Цитата Сообщение от Evg Посмотреть сообщение
А как, на твой взгляд, при таком подходе поступить с пунктом 2?
при чем здесь "подход" и п.2? вы что - прочитали "пригодится на все случаи жизни"? я такого не написано.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.08.2009, 22:58
Цитата Сообщение от novi4ok Посмотреть сообщение
при чем здесь "подход" и п.2? вы что - прочитали "пригодится на все случаи жизни"? я такого не написано.
Использование new и delete косвенно означает, что нужно без realloc'а

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

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;
 
}
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
31.08.2009, 15:26
Цитата Сообщение от 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(), после определения среднего
0
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
31.08.2009, 15:40  [ТС]
Если написать вот так,программа вроде компилируется, но просто она не соответсвуте условию, в самом начале темы. Происходит просто бесконечный ввод чисел и больше эта программа ничего не делает.

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;
 }
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
31.08.2009, 16:02
Все правильно, программа выполняет бесконечный цикл:
Цитата Сообщение от Syltan Посмотреть сообщение
C++
1
2
3
4
5
6
for(;;)
 {
    if (cin.fail())
      break;
--------
 }
выход из которого "если ввели что-то неправильное"
Определите "нормальный" выход из цикла.
0
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
31.08.2009, 16:16
Замените
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);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2009, 16:16
Помогаю со студенческими работами здесь

Прочитать неограниченное количество строк, а после нажатия Enter выйти из цикла
Здравствуйте. Столкнулся с такой проблемой: необходимо прочитать неограниченное количество строк, а после нажатия Enter выйти из цикла. ...

Реализовать ввод названий книг и имён авторов неограниченное количество раз
необходимо вводить названия книг и авторов неограниченное количество раз, но после того как введешь первый раз, возникает ошибка, так как...

Неограниченное количество плей листов
Господа программисты! Подскажите пожалуйста, как с помощью TabControl можно динамически создавать неограниченное количество плей листов.

Как добавить неограниченное количество виджетов?
Опишу всё по сути: Существует область - GridLayout. Существует кнопка - добавить По нажатию кнопки &quot;добавить&quot; в область...

Выполнять действие неограниченное количество раз
Всем привет. Можете подсказать, как сделать возможность нажимать на кнопку и выполнять действие бесконечное количество раз в одном...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru