Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Указатели, массивы


Автор: Tester123 16.5.2012, 20:09
Вот такое задание нужно сделать на с++ в консольном приложении:

В одномерном массиве, состоящем из n вещественных элементов, вычислить: 
1) максимальный элемент массива; 
2) сумму элементов массива, расположенных до последнего положительного элемента. 
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [а, Ь]. Освободившиеся в конце массива элементы заполнить нулями. 
3) Создать вектор и поместить в него полученный в п.2 массив. Вывести содержимое вектора на экран. 

Для доступа к элементам массивов в работе пользоваться только указателями! 
Для заполнения массива использовать функцию int rand(), которая возвращает при каждом обращении к ней псевдослучайное целое число из диапазона 0...0x7fff. 

Сложно ли это сделать? Не могли бы помочь?

Автор: borisbn 16.5.2012, 20:40
> 2) сумму элементов массива, расположенных до последнего положительного элемента.
> псевдослучайное целое число из диапазона 0...0x7fff.

1) ты сам задание-то понял?
2) показывай, что у тебя получилось. Иначе -в ЦП 

Автор: Tester123 16.5.2012, 22:40
Честно? Я вообще не понимаю как это сделать. Думаю про псевдослучайное число можно опустить.

Автор: shara 17.5.2012, 09:01
Цитата(Tester123 @  16.5.2012,  19:09 Найти цитируемый пост)
Сложно ли это сделать?

нет


Цитата(borisbn @  16.5.2012,  19:40 Найти цитируемый пост)
показывай, что у тебя получилось. Иначе -в ЦП  

+1



Tester123, 
смысл "доброму дяде" за тебя выполнять задание школьного курса по программированию?

Автор: susanin 17.5.2012, 12:04
Цитата(borisbn @  16.5.2012,  20:40 Найти цитируемый пост)
псевдослучайное целое число из диапазона 0...0x7fff.

ну а чего тут такого то? функция rand() выдает как раз псевдослучайные числа..а значит надо нарандомить числа от 0 до 32767

Автор: bsa 17.5.2012, 12:37
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: borisbn 17.5.2012, 12:42
susanin, меня смутил пункт про 
Цитата(Tester123 @  16.5.2012,  20:09 Найти цитируемый пост)
 сумму элементов массива, расположенных до последнего положительного элемента. 

вкупе с тем, что все числа там положительные, а вовсе не то, что генератор д.б. от 0 до 32767

Автор: susanin 17.5.2012, 13:53
Цитата(borisbn @ 17.5.2012,  12:42)
susanin, меня смутил пункт про 
Цитата(Tester123 @  16.5.2012,  20:09 Найти цитируемый пост)
 сумму элементов массива, расположенных до последнего положительного элемента. 

вкупе с тем, что все числа там положительные, а вовсе не то, что генератор д.б. от 0 до 32767

ну я понимаю это следующим образом...есть массив
1 2 3 4 5 -6 -7 -9 5 13 28 - 163 - 13
смотрим в массив и ищем последнее положительно число..это 28..значит нужно посчитать сумму всех элементов, которые расположены в массиве до него..но тут правда вопрос действительно, почему генерировать от 0 тогда надо..

Автор: borisbn 17.5.2012, 14:13
Цитата(susanin @  17.5.2012,  13:53 Найти цитируемый пост)
ну я понимаю это следующим образом...есть массив

откуда в нём возьмутся отрицательные числа, если в задании сказано
Цитата(Tester123 @  16.5.2012,  20:09 Найти цитируемый пост)
Для заполнения массива использовать функцию int rand(), которая возвращает ... число из диапазона 0...0x7fff. 


Tester123, давай... включайся в дискуссию... или тебе это неинтересно ?

Автор: Dov 17.5.2012, 16:16
Цитата(borisbn @  17.5.2012,  14:13 Найти цитируемый пост)
откуда в нём возьмутся отрицательные числа

А если как-то так?
Код
    const int SIZE = 10;
    double arr[SIZE];

    for(double* p = arr; p < arr + SIZE; p++)    
        *p = double(rand() - rand());

Автор: borisbn 17.5.2012, 16:45
susanin, Dov, думаете, я не знаю, как можно при помощи rand() сделать отрицательные числа ?
я просто хотел, чтобы ТС поучаствовал в своей же теме

Автор: Tester123 17.5.2012, 18:36
Я думаю про генерацию чисел от нуля можно опустить. Числа могут быть положительные и отрицательные. Но как всё это сделать, ума не приложу.

Автор: t_gran 18.5.2012, 08:10
Код на C, но я думаю вас устроит. smile
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

//----------------------------------------------//
// Задание случайных значений
void Random(float* arr, size_t size)
{
   srand(time(NULL));

   float* end = arr + size;
   for (; arr < end; ++arr)
   {
      *arr = (float)(rand() - rand()) / 100;
   }
}
//----------------------------------------------//
// Вывод массива на экран
void Print(float* arr, size_t size)
{
   float* end = arr + size;
   for (; arr < end; ++arr)
   {
      printf("%0.2f ", *arr);
   }
   printf("\n");
}
//----------------------------------------------//
// Нахождение максимального элемента
float* GetMax(float* arr, size_t size)
{
   float* end = arr + size;
   float* min = arr;

   for (++arr; arr < end; ++arr)
   {
      if (*arr < *min)
      {
         min = arr;
      }
   }

   return min;
}
//----------------------------------------------//
// Поиск первого положительного элемента с хвоста
float* GetPositiveFromTail(float* arr, size_t size)
{
   float* end = arr + size - 1;

   for (; (arr <= end) && (*end < 0); --end);

   if (end < arr)
   {
      end = NULL;
   }

   return end;
}
//----------------------------------------------//
// Определение суммы элементов начиная с первого
// до последнего положительного
float GetSumm(float* arr, size_t size)
{
   float value = 0;

   float* end = GetPositiveFromTail(arr, size);

   for (; arr < end; ++arr)
   {
      value += *arr;
   }

   return value;
}
//----------------------------------------------//
// Обнуление элементов которые входят по модулю
// в диапазон [min, max]
void ZeroingElements(float* arr, size_t size, float min, float max)
{
   float* end = arr + size;
   for (; arr < end; ++arr)
   {
      if ((min <= abs(*arr)) && (abs(*arr) <= max))
      {
         *arr = 0;
      }
   }
}
//----------------------------------------------//
// Классический свап
void Swap(float* first, float* second)
{
   float buff = *first;
   *first = *second;
   *second = buff;
}
//----------------------------------------------//
// Упаковка массива путём смещения нулевых значений
// в хвост. Возвращает длину массива без учёта нулей.
size_t Pack(float* arr, size_t size)
{
   float* end = arr + size;
   float* cur = arr;

   while (cur < end)
   {
      for (; (cur < end) && (*cur == 0); ++cur);

      if ((cur < end) && (cur != arr))
      {
         Swap(cur, arr);
      }

      cur++;
      arr++;
   }

   return size - (cur-arr);
}
//----------------------------------------------//

int main()
{
   size_t sizeSrc;
   printf("input array size: ");
   scanf("%d", &sizeSrc);

   float* src = (float*)malloc(sizeof(float) * sizeSrc);

   Random(src, sizeSrc);
   Print(src, sizeSrc);

   printf("min = %0.2f\n", *GetMax(src, sizeSrc));
   printf("summ = %0.2f\n", GetSumm(src, sizeSrc));

   // Обнуляем диапазон от 0 до 100
   ZeroingElements(src, sizeSrc, 0, 100);
   Print(src, sizeSrc);

   size_t sizeDest = Pack(src, sizeSrc);
   float* dest = (float*)malloc(sizeof(float) * sizeDest);

   memcpy(dest, src, sizeof(float) * sizeDest);
   Print(dest, sizeDest);

   free(dest);
   free(src);

   system("pause");

   return 0;
}

http://s1.ipicture.ru/

Автор: Tester123 18.5.2012, 23:22
Большое спасибо. Только по-моему тут считается минимальное, а не максимальное число, или я не прав?

Автор: t_gran 19.5.2012, 05:28
Tester123, да, чуть ошибся. В функции GetMax меняем переменную min на max. В 38-ой строчке меняем знак "<" на ">"

Автор: Tester123 19.5.2012, 09:36
Спасибо!

Автор: Tester123 22.5.2012, 22:35
Возникла проблема, после сжатия нули должны быть в конце массива, а не на местах удалённых элементов. Вот мучаю код, это функцию Print нужно изменить? Может подскажите что добавить?

Автор: t_gran 23.5.2012, 02:44
Tester123, вы внимательно читали код? Кончено, функция ZeroingElements только обнуляет эти элементы. Но дальше, вызывается функция Pack, которая и смещает все нули в конец массива. Вызовите функцию Print после функции Pack.

Автор: Tester123 23.5.2012, 17:46
Я понял, благодарю!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)