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

Разместить все элементы с нулевыми значениями в левой части массива - C++

Восстановить пароль Регистрация
 
Diw
0 / 0 / 0
Регистрация: 17.10.2009
Сообщений: 9
10.01.2010, 18:09     Разместить все элементы с нулевыми значениями в левой части массива #1
Помогите пожалуйста кому не трудно написать программу. Сам делаю, но результат выводится не тот, обидно последнее задание осталось, а сделать не получается.

задание такое:

Объявить массив целых чисел и заполнить его случайными значениями. Размерность массива 100. Диапазон значений -100 - 100. Разместить все элементы с нулевыми значениями в левой части массива, элементы с отрицательными значениями - за ними, а за ними - элементы с положительными значениями. Примечание: размер массива определяется в начале выполнения программы как случайное число в диапазоне 50 - 200; в тексте программы запрещается применять операцию индексации.

Вот пример есть:

Размерность массива 100.Диапазон значений -50 - 50. Во всех последовательностях отрицательных чисел ограничить значения тех элементов, абсолютное значение которых превышает абсолютное среднее для этой последовательности.

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
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar;       /* указатель на начало массива */
 int *Cr, *Ir;            /* текущие указатели */
 int av, nn;            /* среднее значение и
    количество элементов в последовательности  */
  randomize();  /* инициализация rand */
  size=random(151)+50;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Начальный массив:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(101)-50;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
  /* перебор массива */
  for (nn=0, Cr=Ar; Cr<Ar+size; Cr++) { 
    if (*Cr<0)
      /* обработка отрицательного элемента */
      if (!nn) {
          /* начало последовательности: запомнить адрес 
             начала в Ir, установить начальное значение 
               накопителя суммы и счетчике элементов */
         Ir=Cr; av=*Cr; nn=1;
         }
      else {
      /* подсчет суммы и количества элементов */
        av+=*Cr; nn++;
        }
    /* конец обработки отрицательного элемента */
    else /* обработка положительного элемента */
      if (nn) {
          /* если есть необработанная отрицательная последовательность: 
             усреднение и перебор с ограничением */
        for (av/=nn; Ir<Cr; Ir++)
          if (*Ir<av) *Ir=av;
        nn=0; /* последовательность обработана */
        }  /* конец если есть необработанная... */
    }  /* конец перебора массива */
  if (nn) /* если не обработана последняя 
             отрицательная последовательность */
    for (av/=nn; Ir<Cr; Ir++)
      if (*Ir<av) *Ir=av;
  /* вывод результатов */
  printf("Массив-результат:\n");
  for (Cr=Ar; Cr<Ar+size; printf("%3d ",*Cr++));
  putchar('\n');
  /* освобождение памяти */
  free(Ar);
  return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2010, 18:09     Разместить все элементы с нулевыми значениями в левой части массива
Посмотрите здесь:

Найти произведение всех элементов, стоящих между первым и вторым нулевыми значениями массива C++
Массив с нулевыми значениями C++
Разместить все элементы с положительными значениями в левой части массива, с отрицательными — в правой C++
Массив: Разместить все элементы с положительными значениями в левой части массива, элементы с отрицательными значениями - в правой C++
Определить минимальный элемент квадратной матрицы, расположенный в левой части, ограничен диагоналями, включая диагональные элементы C++
C++ Элементы одномерного массива A (n^2) разместить в матрице N (n, n) по строкам
C++ Разместить элементы массива в возрастающем порядке
Заменить элементы массива со значениями в заданном интервале на среднее арифметическое значение массива C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BigMax
3 / 2 / 1
Регистрация: 18.09.2009
Сообщений: 10
10.01.2010, 21:29     Разместить все элементы с нулевыми значениями в левой части массива #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include "stdafx.h"
#include <iostream>
#include <time.h>
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(NULL));
 
    int size = rand() % 150;
    size += 50;
 
    int *mas = new int [size];
 
    int *p = NULL;
    int *t = NULL;
 
    int r;
    int temp;
    int pos;
 
    // заполнение массива
    p = mas;
    for (int i = 0; i < size; i++, p++)
    {
        r = rand() % 200;
        r -= 100;
        *p = r;
    }
 
    cout << "size: " << size << '\n';
    cout << "massive before transformation:" << '\n';
    p = mas;
    for (int i = 0; i < size; i++, p++)
        cout << *p << ' ';
 
    // сортировка массива
    for (int i = 0; i < size; i++)
    {
        p = mas;
        t = (mas + 1);
        for (int j = 0; j < size - 1; j++, p++, t++)
            if (*p > *t)
            {
                temp = *p;
                *p = *t;
                *t = temp;
            }
    }
    // после сортировки числа больше нуля будут на своем месте
    // осталось поменять местами отрицательные с нулевыми
 
    p = mas;
    pos = size;
    // определяется позиция первого положительного
    for (int i = 0; i < size; i++, p++)
        if (*p > 0)
        {
            pos = i;
            break;
        }
    
    for (int i = 0; i < pos; i++)
    {
        p = mas;
        t = (mas + 1);
        for (int j = 0; j < pos - 1; j++, p++, t++)
            if (*p == 0)
            {
                temp = *p;
                *p = *t;
                *t = temp;
            }
    }
 
    cout << "\n\n" << "massive after transformation:" << '\n';
    p = mas;
    for (int i = 0; i < size; i++, p++)
        cout << *p << ' ';
 
    getchar();
 
    delete [] mas;
 
    return 0;
}
Добавлено через 6 минут
Там только надо поменять
C++
1
2
3
4
5
6
7
8
9
10
11
12
    for (int i = 0; i < pos; i++)
    {
        p = mas;
        t = (mas + 1);
        for (int j = 0; j < pos - 1; j++, p++, t++)
            if (*t == 0)
            {
                temp = *p;
                *p = *t;
                *t = temp;
            }
    }
Поменял в if (*p == 0) на *t == 0
Yandex
Объявления
10.01.2010, 21:29     Разместить все элементы с нулевыми значениями в левой части массива
Ответ Создать тему
Опции темы

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