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

проще и короче - C++

Восстановить пароль Регистрация
 
Vredinka_6
0 / 0 / 0
Регистрация: 05.02.2011
Сообщений: 32
09.03.2012, 14:18     проще и короче #1
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <math.h>
 
using namespace std;
 
/*
Динамическое выделение памяти, каждый пункт ф-ция, данные- через пар-ры, глобал.переменные - не допускаются.
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) количество отриц. элементов массива;
2) сумму модулей элементов массива, расположенных после минимального по
   модулю элемента.
3) Заменить все отриц. элементы массива их квадратами.
4) Упорядочить элементы массива по возрастанию.
*/
 
#define n 10 // длина массива
 
// Заполнение массива случайными значениями
void MakeArray(double *X)
{
  for (int Index = 0; Index != n; Index++)
    X[Index] = (double)(rand() - rand()) / 0xfc;
}
 
// Подсчёт отрицательных элементов массива
unsigned GetNegativeCount(double *X)
{
  unsigned Count = 0;
  for (int Index = 0; Index != n; Index++)
    if (X[Index] < 0) Count++;
  return Count;
}
 
// Вычисление суммы модулей элементов массива,
// расположенных после минимального по модулю элемента.
double GetSum(double *X, unsigned *MinIndex)
{
  double Min = fabs(X[0]), Sum = 0.0;
  *MinIndex = 0;
 
  for (int Index = 1; Index != n; Index++)
    if (fabs(X[Index]) < Min)
    {
      Min = fabs(X[Index]);
      *MinIndex = Index;
    }
 
  for (int Index = 0; Index != *MinIndex; Index++)
    Sum += fabs(X[Index]);
 
  return Sum;
}
 
// Замена все отриц. элементы массива их квадратами.
void NegativeToSquare(double *X)
{
  for (int Index = 0; Index != n; Index++)
    if (X[Index] < 0)
      X[Index] *= X[Index];
}
 
// Сортировка по возрастанию
void Sort(double *X)
{
  double Temp;
 
  for (int Index1 = 0; Index1 != n; Index1++)
    for (int Index2 = Index1; Index2 != n; Index2++)
      if (X[Index1] > X[Index2])
      {
        Temp = X[Index1];
        X[Index1] = X[Index2];
        X[Index2] = Temp;
      }
}
 
// Вывод массива на консоль
void OutArray(double *X)
{
  for (int Index = 0; Index != n; Index++)
    printf("  %0.2f", X[Index]);
  printf("\n");
}
 
int main(int argc, char *argv[])
{
  double X[n]; // массив из n элементов
  double Sum;  // сумма модулей элементов массива,
               // расположенных после минимального по модулю элемента.
  unsigned MinIndex; // номер элемента, минимального по модулю
 
  MakeArray(X);
 
  printf("Source array:\n");
  OutArray(X);
 
  printf("\nNegative items: %d\n", GetNegativeCount(X));
 
  Sum = GetSum(X, &MinIndex);
  printf("\nSum of absolute values before absolute minimum (%0.2f): %0.2f\n", X[MinIndex], Sum);
  printf("\nAfter changes negative items to it's squares:\n");
  NegativeToSquare(X);
  OutArray(X);
 
  printf("\nArray after sorting:\n");
  Sort(X);
  OutArray(X);
 
  printf("\n\n");
  system("PAUSE");
  return EXIT_SUCCESS;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.03.2012, 14:22     проще и короче #2
и где вопрос?
Vredinka_6
0 / 0 / 0
Регистрация: 05.02.2011
Сообщений: 32
09.03.2012, 14:30  [ТС]     проще и короче #3
нужно короче и проще
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.03.2012, 14:33     проще и короче #4
Написано относительно хорошо. все разбито на функции и main как раз таки простой и понятный. Сами функции тоже простые и понятные. Имплемент функций конечно же можно поменять так, чтобы вместо самодельных проходов по массиву использовались алгоритмы и прочее, но это наверно лишнее.
Vredinka_6
0 / 0 / 0
Регистрация: 05.02.2011
Сообщений: 32
09.03.2012, 14:42  [ТС]     проще и короче #5
а проще можно как то написать?
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
09.03.2012, 14:44     проще и короче #6
Vredinka_6, я так понимаю писали не вы?)
Проще здесь уже практически некуда.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
09.03.2012, 14:54     проще и короче #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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "iostream"
#include "ctime"
#include "cmath"
#include <iomanip>
 
using namespace std;
 
int main()
{
        setlocale(0,"");
        srand(time(0));
        double n, mas[100] = {0}, sum = 0, min, mini;
        int Count = 0;
 
        cout << "Введите количество элементов в массиве - ";
        cin >> n;
        cout << "\nСгенерированный массив:\n\n";
        
        for(int i = 0; i < n; i++)
        {
                mas[i] = (50)*(double)rand() / RAND_MAX - 25;
                cout <<  fixed << setprecision(2) << mas[i] << " "; 
        }
 
        min = mas[0];
        for(int i = 0; i < n; i++)
        {
                if(mas[i] < 0)
                {
                        Count++;
                }
 
                if( abs(mas[i]) < abs(min) )
                {
                        min = mas[i];
                        mini = i;
                }
        }
 
        
        for(int i = mini + 1; i < n; i++)
        {
                sum += mas[i];
        }
 
        cout << "\n\nКоличество отрицательных элементов в массиве - " << Count;
        cout << "\n\nМинимальный по модулю элемент массива - " << min;
        cout << "\n\nСумму модулей элементов,расположенных после минимального по модулю элемента " << sum;
 
        cout << "\n\nМассив после замены отрицательных элементов их квадратами:\n\n";
        for(int i = 0; i < n; i++)
        {
                if(mas[i] < 0)
                {
                        mas[i] = mas[i] * mas[i];
                }
                cout <<  fixed << setprecision(2) << mas[i] << " ";
        }
 
        cout << "\n\nМассив упорядоченный по возрастанию:\n\n";
        for(int i = 0; i < n; i++)
        {
       for(int j = n - 1; j > i; j--)
           {
          if (mas[j-1] > mas[j])  
           {
              double x = mas[j-1]; 
              mas[j-1] = mas[j]; 
              mas[j] = x;
           }
           }
        }
 
        for(int i = 0; i < n; i++) 
        {
                cout << mas[i] << " "; //выводим массив после сортировки
        }
 
        system("pause >> null");
        return 0;
}
Vredinka_6
0 / 0 / 0
Регистрация: 05.02.2011
Сообщений: 32
09.03.2012, 15:15  [ТС]     проще и короче #8
оно то проще, но надо с динамическим выделением памяти, каждый пункт ф-ция, данные- через пар-ры, глобал.переменные - не допускаются.
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
09.03.2012, 15:22     проще и короче #9
Цитата Сообщение от Vredinka_6 Посмотреть сообщение
надо
Вам же надо? Пробуйте переделать пример как Вам надо! что не получиться пишите, поможем!
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
09.03.2012, 18:14     проще и короче #10
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <numeric>
using namespace std;
 
/*
Динамическое выделение памяти, каждый пункт ф-ция, данные- через пар-ры, глобал.переменные - не допускаются.
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) количество отриц. элементов массива;
2) сумму модулей элементов массива, расположенных после минимального по
   модулю элемента.
3) Заменить все отриц. элементы массива их квадратами.
4) Упорядочить элементы массива по возрастанию.
*/
 
#define n 10 // длина массива
 
// Заполнение массива случайными значениями
void MakeArray(double *X)
{
    for (int Index = 0; Index != n; Index++)
        X[Index] = (double)(rand() - rand()) / 0xfc;
}
 
// Подсчёт отрицательных элементов массива
unsigned GetNegativeCount(double *X)
{
    unsigned Count = 0;
    for (int Index = 0; Index != n; Count += X[Index++] < 0) { }
    return Count;
}
 
// Вычисление суммы модулей элементов массива,
// расположенных после минимального по модулю элемента.
bool absLess(double a, double b)
{
    return abs(a) < abs(b);
}
double absSum(double a, double b)
{
    return a + abs(b);
}
double GetSum(double *X, unsigned *MinIndex)
{
    *MinIndex = std::min_element(X, X + n, absLess ) - X;
    return std::accumulate(X + *MinIndex, X + n, 0., absSum);
}
 
// Замена все отриц. элементы массива их квадратами.
void NegativeToSquare(double *X)
{
    for (int Index = 0; Index != n; Index++)
        X[Index] *= X[Index] < 0 ? X[Index] : 1;
}
 
// Сортировка по возрастанию
void Sort(double *X)
{
    std::sort(X, X + n);
}
 
// Вывод массива на консоль
void OutArray(double *X)
{
    for (int Index = 0; Index != n; Index++)
        printf("  %0.2f", X[Index]);
    printf("\n");
}
 
int main(int argc, char *argv[])
{
  double X[n]; // массив из n элементов
  double Sum;  // сумма модулей элементов массива,
               // расположенных после минимального по модулю элемента.
  unsigned MinIndex; // номер элемента, минимального по модулю
 
  MakeArray(X);
 
  printf("Source array:\n");
  OutArray(X);
 
  printf("\nNegative items: %d\n", GetNegativeCount(X));
 
  Sum = GetSum(X, &MinIndex);
  printf("\nSum of absolute values before absolute minimum (%0.2f): %0.2f\n", X[MinIndex], Sum);
  printf("\nAfter changes negative items to it's squares:\n");
  NegativeToSquare(X);
  OutArray(X);
 
  printf("\nArray after sorting:\n");
  Sort(X);
  OutArray(X);
 
  printf("\n\n");
  system("PAUSE");
  return EXIT_SUCCESS;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2012, 19:53     проще и короче
Еще ссылки по теме:

C++ как короче?
А+Б на АСМП, как написать короче? C++
C++ Ввести текст, который состоит из нескольких слов. Слова, которые короче 6 символов дополнить хэштегом в конце

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.03.2012, 19:53     проще и короче #11
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <functional>
#include <iomanip>
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
 
/*
Динамическое выделение памяти, каждый пункт ф-ция, данные- через пар-ры, глобал.переменные - не допускаются.
В одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) количество отриц. элементов массива;
2) сумму модулей элементов массива, расположенных после минимального по
   модулю элемента.
3) Заменить все отриц. элементы массива их квадратами.
4) Упорядочить элементы массива по возрастанию.
*/
 
#define n 10 // длина массива
 
// Заполнение массива случайными значениями
void MakeArray(double *X)
{
    for (int i = 0; i - n; )
        X[i++] = (double) ( rand() - rand() ) / 0xfc;
}
 
// Подсчёт отрицательных элементов массива
unsigned GetNegativeCount(double *X)
{
        return std::count_if( X, X + n, std::bind2nd( std::less< double > (), 0 ) );
}
 
// Вычисление суммы модулей элементов массива,
// расположенных после минимального по модулю элемента.
double GetSum(double *X, unsigned *MinIndex)
{
        *MinIndex = std::distance(X, std::min_element(X, X + n, [] (int a, int b) { return fabs(a) < fabs(b); } ) );
        return std::accumulate( X + *MinIndex + 1, X + n, 0, [] ( int total, int z ) { return total + fabs(z); } );
}
 
// Замена все отриц. элементы массива их квадратами.
void NegativeToSquare(double *X)
{
  std::transform(X, X + n, X, [] (double a) { return a < 0 ? a * a : a;  } );
}
 
// Сортировка по возрастанию
void Sort(double *X)
{
        std::sort(X, X + n);
}
 
// Вывод массива на консоль
void OutArray(double *X)
{
  std::cout << std::fixed << std::setprecision(2);
  std::copy( X, X + n, std::ostream_iterator< double > (std::cout, " ") );
}
 
int main(int argc, char *argv[])
{
  double X[n]; // массив из n элементов
  double Sum;  // сумма модулей элементов массива,
               // расположенных после минимального по модулю элемента.
  unsigned MinIndex; // номер элемента, минимального по модулю
 
  MakeArray(X);
 
  printf("Source array:\n");
  OutArray(X);
 
  printf("\nNegative items: %d\n", GetNegativeCount(X));
 
 
  Sum = GetSum(X, &MinIndex);
 
  printf("\nSum of absolute values before absolute minimum (%0.2f): %0.2f\n", X[MinIndex], Sum);
  printf("\nAfter changes negative items to it's squares:\n");
        
  NegativeToSquare(X);
  OutArray(X);
 
  printf("\nArray after sorting:\n");
  Sort(X);
  OutArray(X);
 
  printf("\n\n");
  system("PAUSE");
  return EXIT_SUCCESS;
  
}
Там, кстати, во втором пункте ошибка - находится сумма элементов до минимального, а нужно после минимального.
Yandex
Объявления
09.03.2012, 19:53     проще и короче
Ответ Создать тему
Опции темы

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