Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
SantaStanta
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 9
1

Вычислить сумму элементов массива, расположенных между первым и последним нулевыми элементами

06.07.2015, 05:50. Просмотров 2093. Ответов 12
Метки нет (Все метки)

Помогите составить программу, формирующую одномерный массив, состоящий из N целых элементов. Вычислить сумму элементов массива, расположенных между первым и последним нулевыми элементами. Вычислить произведение элементов массива с четными номерами. Упорядочить отрицательные элементы массива по убыванию. Порядок следования остальных элементов не изменять. Я совершенно не могу понять логику.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2015, 05:50
Ответы с готовыми решениями:

Вычислить сумму элементов массива, расположенных между первым и последним положительными элементами
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива,...

Вычислить сумму элементов массива, расположенных между первым и последним нулевым элементами
В одномерном массиве, состоящем из целых элементов вычислить А) количество элементов массива,...

Вычислить сумму элементов массива, расположенных между первым и последним отрицательными элементами
В одномерном массиве, состоящем из и вещественных элементов, вычислить: - сумму элементов массива,...

Вычислить сумму элементов массива, расположенных между первым и последним отрицательными элементами
НАИДИТЕ ОШИБКУ ПОЖАЛУИСТА! в одномерном массиве, состоящем из n вещественных элементов,...

Вычислить минимум и сумму элементов массива, расположенных между первым и последним положительным элементами
В одномерном массиве, состоящем из п вещественных элементов, вычислить: - минимальный элемент...

12
Mr Crowley
1 / 1 / 7
Регистрация: 06.07.2015
Сообщений: 55
06.07.2015, 19:24 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
int main(){
 
    int n = 0;
    printf("Vvedite razmer mas = ");
    scanf_s("%d", &n);
    /*Ввели размер массива с клавиатуры*/
 
    int *mas = (int*)malloc(n*sizeof(*mas));
    /*создали массив*/
 
    for (int i = 0; i < n; i++){
        printf("mas[%d] = ", i);
        scanf_s("%d", &mas[i]);}
    /*ввели значения для него с клавиатуры*/
 
    int sum = 0;
    for (int i = 1; i < n; i++){
        sum += mas[i];
    }
    printf("sum = %d\n", sum);
    /*нашли сумму*/
 
    int pro = 1;
    for (int i = 2; i < n; i += 2){
        pro *= mas[i];
    }
    printf("pro = %d\n", pro);
    /*нашли произведение*/
Сортивроку попробывал сделать так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
    for (int j = 0; j < n; j++){
        for (int i = 0; i < n; i++){
            if ((mas[j] < 0) && (mas[i +1]< 0)){
                if (mas[j] < mas[i + 1]){
                
                    int tmp = mas[j];
                    mas[j] = mas[i + 1];
                    mas[i + 1] = tmp;
                }
            }
        }
    }
    for (int i = 0; i < n; i++) printf("mas[%d] = %d\n", i, mas[i]);
Но работает не верно, очень хотелось бы увидеть правильный результат сортировки.
0
UnknownPlayer
9 / 9 / 9
Регистрация: 30.05.2015
Сообщений: 28
06.07.2015, 19:50 3
Цитата Сообщение от Mr Crowley Посмотреть сообщение
for (int i = 0; i < n; i++){
C
1
2
3
4
while (флаг!=1){
for (int j = 0; j < n-1; j++){
for (int i = j+1; i < n; i++){
if (mas[j] < mas[i]) замена + флаг=1}
Как-то так мб?
0
Mr Crowley
1 / 1 / 7
Регистрация: 06.07.2015
Сообщений: 55
06.07.2015, 19:52 4
Выложи рабочий код пожалуйста.
0
UnknownPlayer
9 / 9 / 9
Регистрация: 30.05.2015
Сообщений: 28
06.07.2015, 20:04 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int f=1;
while(f==1)
  {
  f=0;
  for (int j = 0; j < n-1; j++)
    for (int i = j+1; i < n; i++)
      if ((mas[j] < 0) && (mas[i]< 0) && (mas[j] < mas[i]))
        {
          int tmp = mas[j];
          mas[j] = mas[i + 1];
          mas[i + 1] = tmp;
          f=1;
        }
  }
Что-то в этом роде я имел ввиду.
0
Bazil
8 / 8 / 6
Регистрация: 02.09.2014
Сообщений: 19
06.07.2015, 22:31 6
Как-то так

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 <stdio.h>
#include <stdlib.h>
 
int *InputMass(int *size_of_mass)
{
    int size=0, i=0, *mass=NULL;
    printf("Input size of mass: ");
    if((scanf("%d", &size)!=1)||(size<=0))
    {
        printf("Illegal size of mass\n");
        exit(1);
    }
    mass=(int*)malloc(size*sizeof(int));
    if(!mass)
    {
        printf("Cannot allocate memory\n");
        exit(1);
    }
    for(i=0;i<size;i++)
    {
        printf("Input mass[%d]: ", i);
        if(scanf("%d", &mass[i])!=1)
        {
            printf("Illegal value\n");
            exit(1);
        }
    }
    printf("mass: ");
    for(i=0;i<size;i++)
        printf("%d ", mass[i]);
    printf("\n");
    *size_of_mass=size;
    return mass;
}
 
int main()
{
    int *mass=NULL, size=0;
    int sum=0, prod=1;
    int i=0;
    mass=InputMass(&size);   //создаем массив
    //ищем сумму между первым и последним нулевыми элементами
    for(i=0;i<size;i++)
    {
        static int first=0, second=0;
        if(mass[i]==0&&first==1)
            second=1;
        else if(mass[i]==0)
            first=1;
        if(first==1&&second==0)
            sum+=mass[i];
    }
    //ищем произведение элементов с четными номерами (0-тоже четный номер)
    for(i=0;i<size;i+=2)
        prod*=mass[i];
    //сортировка отрицательных чисел по убыванию
    {
        int *tmp_mass=(int*)malloc(size*sizeof(int));
        int *p=tmp_mass;
        int count=1;
        //выделяем память под временный массив
        if(!tmp_mass)
        {
            printf("Cannot allocate memory\n");
            exit(1);
        }
        //во временный массив записываем все отрицательные числа по порядку
        for(i=0;i<size;i++)
        {
            if(mass[i]<0)
            {
                *p=mass[i];
                p++;
            }
        }
        //во временный массив записываем все положительные числа по порядку
        for(i=0;i<size;i++)
        {
            if(mass[i]>=0)
            {
                *p=mass[i];
                p++;
            }
        }
        //сортируем отрицательные числа
        while(count)
        {
            count=0;
            for(i=0;i<size-1;i++)
            {
                if(tmp_mass[i+1]<0)
                {
                    if(tmp_mass[i]<tmp_mass[i+1])
                    {
                        int tmp=tmp_mass[i];
                        tmp_mass[i]=tmp_mass[i+1];
                        tmp_mass[i+1]=tmp;
                        count++;
                    }
                }
            }
        }
        free(mass);     //удаляем основной массив
        mass=tmp_mass;  //"подменяем" основной массив временным
    }
    printf("sum=%d\n", sum);
    printf("product=%d\n", prod);
    printf("sort mass: ");
    for(i=0;i<size;i++)
        printf("%d ", mass[i]);
    printf("\n");
 
    return 0;
}
0
Mr Crowley
1 / 1 / 7
Регистрация: 06.07.2015
Сообщений: 55
07.07.2015, 00:35 7
Вот что я выстрадал:
1. Считаю отрицательные значения в первом созданном массиве
2. Объявляю второй массив длинной=количеству отрицательных значений в первом
3. Все элементы первого массива<0 присваиваю значениям второго массива
В итоге получаю второй массив, в котором все элементы отрицательные
4. Сортирую второй массив
5. Проверяю элементы первого массива и если элемент первого массива<0, то присваиваю ему значение второго отсортированного массива
Но объясните пожалуйста почему я на месте отрицательных элементов вижу мусор?

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
int main(){
 
    int n = 0;
    printf("Vvedite razmer mas = ");
    scanf_s("%d", &n);
    /*Ввели размер массива с клавиатуры*/
 
    int *mas = (int*)malloc(n*sizeof(*mas));
    /*создали массив*/
 
    for (int i = 0; i < n; i++){
        printf("mas[%d] = ", i);
        scanf_s("%d", &mas[i]);
    }
    /*ввели значения для него с клавиатуры*/
 
    int index = 0;
    for (int i = 0; i < n; i++)
    if (mas[i] < 0) index++; 
    printf("index = %d\n", index);
    /*считаю количество отрицательных значений*/
 
    int *masotr = (int*)malloc(index*sizeof(*masotr));
    /*создаю новый массив длинной равной количеству отрицательных значений*/
 
    int j = 0;
    for (int i = 0; i < n; i++){
        if (mas[i] < 0){
            masotr[j] = mas[i];
            j++;
        }
    }
    for (int j= 0; j < index; j++) printf("masotr[%d] = %d\n", j, masotr[j]);
    /*если значение первого массива<0, то это значение помещаю в новый массив*/
    
    for (int i = 0; i < index-1; i++){
        for (int j = 0; j < index-1; j++){
            if (masotr[j]>masotr[j + 1]) {
                int temp = masotr[j+1];
                    masotr[j+1] = masotr[j];
                    masotr[j] = temp;
            }
        }
    }
    printf("sortirovka:\n");
    for (int j = 0; j < index; j++) printf("masotr[%d] = %d\n", j, masotr[j]);
    /*сортирую массив с отрицательными числами по убыванию */
    
    for (int i = 0; i < n; i++){
        if (mas[i] < 0){
            mas[i] = masotr[j];
            j++;
        }
    }
        for (int i = 0; i < n; i++) printf("mas[%d] = %d\n", j, mas[i]);
 
    _getch();
}
Добавлено через 1 час 46 минут
Поправил, теперь вроде все работает

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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main(){
 
    int n = 0;
    printf("Vvedite razmer mas = ");
    scanf_s("%d", &n);
    /*Ввели размер массива с клавиатуры*/
 
    int *mas = (int*)malloc(n*sizeof(*mas));
    /*создали массив*/
 
    for (int i = 0; i < n; i++){
        printf("mas[%d] = ", i);
        scanf_s("%d", &mas[i]);
    }
    /*ввели значения для него с клавиатуры*/
 
    int index = 0;
    for (int i = 0; i < n; i++)
    if (mas[i] < 0) index++;
    /*считаю количество отрицательных значений*/
 
    int *masotr = (int*)malloc(index*sizeof(*masotr));
    /*создаю новый массив длинной равной количеству отрицательных значений*/
 
    int j = 0;
    for (int i = 0; i < n; i++){
        if (mas[i] < 0){
            masotr[j] = mas[i];
            j++;
        }
    }
    /*если значение первого массива<0, то это значение помещаю в новый массив*/
 
    for (int i = 0; i < index - 1; i++){
        for (int j = 0; j < index - 1; j++){
            if (masotr[j]>masotr[j + 1]) {
                int temp = masotr[j + 1];
                masotr[j + 1] = masotr[j];
                masotr[j] = temp;
            }
        }
    }
    printf("sortirovka:\n");
    for (int j = 0; j < index; j++) printf("masotr[%d] = %d\n", j, masotr[j]);
    /*сортирую массив с отрицательными числами по убыванию */
 
 
    int k = 0;
    for (int i = 0; i < n; i++){
        if (mas[i] < 0){
            mas[i] = masotr[k];
            k++;
        }
    }
    for (int i = 0; i < n; i++) printf("mas[%d] = %d\n", i, mas[i]);
 
    free(mas);
    free(masotr);
 
    _getch();
}
0
SantaStanta
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 9
08.07.2015, 05:53  [ТС] 8
А как сделать чтобы случайные числа копировать в массив? Тут дублируется лишь последнее число.
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
int x;
int *InputMass(int *size_of_mass)
 
{
    int size=0, i=0, *mass=NULL;
    printf("vvedite razmer massiva: ");
    if((scanf("%d", &size)!=1)||(size<=0))
    {
        printf("error\n");
        exit(1);
    }
    mass=(int*)malloc(size*sizeof(int));
    if(!mass)
    {
        printf("net mesta v pamyati\n");
        exit(1);
    }
    for(i=0;i<size;i++)
 
    {x=(rand()%90);
        printf("\nNomer chisla v massive[%d]:%d ", i, x);
        /*if(scanf("%d", &mass[i])!=1)*/
        {
            /*printf("nevernoe znachenie\n");
            exit(1);*/
        }
    }/*mass[i]=rand()%100-rand()%100;*/
    printf("\nmass:  ");
    for(i=0;i<size;i++)
         printf("%d ", x);
 
    *size_of_mass=size;
    return mass;
}
0
Bazil
8 / 8 / 6
Регистрация: 02.09.2014
Сообщений: 19
08.07.2015, 07:06 9
Добавьте после x=(rand()%90); строку mass[i]=x, так как Вы по сути не записывали x в массив. И исправьте строку printf("%d ", x); на printf("%d ",mass[i]).
0
SantaStanta
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 9
08.07.2015, 18:48  [ТС] 10
Цитата Сообщение от SantaStanta Посмотреть сообщение
Упорядочить отрицательные элементы массива по убыванию. Порядок следования остальных элементов не изменять
А как это провести?
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int x;
int *InputMass(int *size_of_mass)
 
{srand(time(NULL));
    int size=0, i=0, *mass=NULL;
    printf("vvedite razmer massiva: ");
    if((scanf("%d", &size)!=1)||(size<=0))
    {
        printf("error\n");
        exit(1);
    }
    mass=(int*)malloc(size*sizeof(int));
    if(!mass)
    {
        printf("net mesta v pamyati\n");
        exit(1);
    }
 
   for(i=0;i<size;i++)
 
                {
                int x=(rand()%20-rand()%20);
                mass[i]=x;
                printf("\nNomer chisla v massive[%d]:%5d ", i, x);}
                printf("\nmass:  ");
                for(i=0;i<size;i++)
                printf("%d ",mass[i]);
    *size_of_mass=size;
    return mass;
}
 
int main()
{
    int *mass=NULL, size=0;
    int sum=0, pro=1;
    int i=0;
    mass=InputMass(&size);   //создаем массив
    //ищем сумму между первым и последним нулевыми элементами
    static int first=0, last=0;
    for(i=0;i<size;i++)
    {
        if(mass[i]==0)
 
         {if   (first>0)
            last=i;
        else first=i;
         }
 
 
    }for(i=first;i<last;i++)
         {sum+=mass[i];}
 printf("\nfirst=%d   last=%d",first, last);
 
    //ищем произведение элементов с четными номерами (0-тоже четный номер)
    for(i=0;i<size;i+=2)
        pro*=mass[i];
        //сортировка отрицательных чисел по убыванию
    {
        int *tmp_mass=(int*)malloc(size*sizeof(int));
        int *p=tmp_mass;
        int count=1;
        //выделяем память под временный массив
        if(!tmp_mass)
        {
            printf("Cannot allocate memory\n");
            exit(1);
        }
        //во временный массив записываем все отрицательные числа по порядку
        for(i=0;i<size;i++)
        {
            if(mass[i]<0)
            {
                *p=mass[i];
                p++;
            }
        }
 
    printf("\nsum=%d\n", sum);
    printf("proizvedenie=%d\n", pro);
    return 0;
}
}
0
UnknownPlayer
9 / 9 / 9
Регистрация: 30.05.2015
Сообщений: 28
09.07.2015, 02:39 11
Да забейте, он кучу памяти тратит на лишние массивы и использует указатели, из-за которых у вас вообще голова кругом пойдет. Еще использует динамическое выделение памяти. Если этого нет в задании, то зачем мудрствовать?
0
SantaStanta
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 9
09.07.2015, 06:47  [ТС] 12
это как раз в задании есть. нужно сделать по следующему примеру: имеем массив - 1 3 -9 2 -5 7 -3 0 9 3 -4 0; преобразовать к следующему виду: 1 3 -3 2 -4 7 -5 0 9 3 -9 0.
0
Bazil
8 / 8 / 6
Регистрация: 02.09.2014
Сообщений: 19
09.07.2015, 20:52 13
Цитата Сообщение от UnknownPlayer Посмотреть сообщение
кучу памяти тратит на лишние массивы и использует указатели
Я неправильно понял задание, поэтому и выделил дополнительный массив. Если преобразовывать к виду 1 3 -3 2 -4 7 -5 0 9 3 -9 0, то дополнительный массив не нужен:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while(1)
{
        int pos=0, count=0;
        for(i=0;i<size;i++)
        {
            if((mass[i]<0)&&(pos!=i))
            {
                if(mass[i]>mass[pos])
                {
                    int tmp=mass[i];
                    mass[i]=mass[pos];
                    mass[pos]=tmp;
                    count++;
                }
                pos=i;
            }
        }
        if(count==0)
            break;
}
0
09.07.2015, 20:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 20:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Найти сумму элементов массива, расположенных между первым и последним положительными элементами
Задание: сумму элементов массива, расположенных между первым и последним положительными...

Найти сумму элементов, расположенных между первым и последним положительными элементами массива
Отредактируйте, ничего не работает. Бесы берут!!!:wall: #include &lt;conio.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.