Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
1

Из массива удалить самую длинную цепочку четных элементов

21.12.2014, 16:50. Показов 1739. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Достался такой вариант по контрольной:
Из массива удалить самую длинную цепочку четных элементов. Пример, из массива A[8]: 4 1 4 2 1 2 4 6 должен получиться массив A[5]: 4 1 4 2 1 (самая длинная цепочка четных чисел включает элементы с 6 по 8: 2 4 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
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
 
 
void FormArr(int *A,int n);
void PrintArr(int *A,int n);
int FindChet(int *A,int n);
void DelChet(int *A, int *B,int n);
int main (void)
{
    int n, k, *A,*B;
    do
    {
        printf("Vvedite kolichestvo elementov massiva A:\n");
        scanf("%d",&n);
    }
    while(n<0);
    A = (int*) malloc(n*sizeof(int));
    FormArr(A,n);
    printf("\nMassiv posle zapolneniya:\n");
    PrintArr(A,n);
    int ind = FindChet(A,n);
    if (ind > -1)
    {
        DelChet(A,&n,ind);
        printf("\nMassiv posle udaleniya:\n");
        PrintArr(A,n);
    }
    else
    printf("\nV massive net chetnyh elementov!");
    return 0;
    free(A);
}
 
 
 
void FormArr(int *A,int n)
{
    int i;
    printf("Vvedite znacheniya elementov massiva A:\n");
    for (i=0;i<n;i++)
    {
        printf("A[%d] =", i+1);
        scanf("%d",&A[i]);
    }
}
 
void PrintArr(int *A,int n)
{
    int i;
    printf("Rezultat massiva:\n");
    for (i=0;i<n;i++)
    {
        printf("%d\t", A[i]);
        printf("\n");
    }
}
 
 
int FindChet(int *A, int n)
{
  int i,del;
  for (i=0;i<n;i++)
  {
    if ((A[i]%2==0) and (A[i+1]%2==0)
    {
        del=i;
    }
    return -1;
  }
}
 
void DelChet(int *A, int *B, int del)
{
    int  i;
    for (i=del; i<*B-1;i++)
    {
        A[i] = A[i+1];
    }
    (*B)--;
}
Подскажите, пожалуйста, кто знает.

Добавлено через 2 часа 11 минут
Попробовал ещё такой вариант (по коду в C#), но результат в виде бессмысленного набора цифр:
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 <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
 
void FormArr(int *A,int n);
void PrintArr(int *A,int n);
int Chet(int *A, int *B, int n);
void VivodB(int *A, int *B, int n);
int main (void)
{
    int start, count, maxCount, MaxStart, n, j, *A,*B;
    do
    {
        printf("Vvedite kolichestvo elementov massiva A:\n");
        scanf("%d",&n);
    }
    while(n<0);
    A = (int*) malloc(n*sizeof(int));
    FormArr(A,n);
    printf("\nMassiv posle zapolneniya:\n");
    PrintArr(A,n);
    j=Chet(A,B,n);
    B = (int*) malloc(j*sizeof(int));
    VivodB(A,B,n);
    PrintArr(B,j);
    free(A);
    free(B);
}
 
void FormArr(int *A,int n)
{
    int i;
    printf("Vvedite znacheniya elementov massiva A:\n");
    for (i=0;i<n;i++)
    {
        printf("A[%d] =", i+1);
        scanf("%d",&A[i]);
    }
}
 
void PrintArr(int *A,int n)
{
    int i;
    printf("Rezultat massiva:\n");
    for (i=0;i<n;i++)
    {
        printf("%d\t", A[i]);
        printf("\n");
    }
}
 
int Chet(int *A, int *B, int n)
{
    int i,j,maxCount,maxStart,count,start;
    maxCount=0;
    maxStart=n;
    for (i=0;i<n;i++)
    {
        if (A[i]%2==0)
        {
            count=1;
            j=i+1;
            while (j<n&&B[j]%2==0)
            {
                ++count;
                ++j;
            }
            if (count>maxCount)
            {
                maxCount=count;
                maxStart=i;
            }
            i=j;
        }
    }
}
    
void VivodB(int *A, int *B, int n)
{
    int i,j,maxCount,maxStart;
    if ((i<maxStart)||(i>=maxStart+maxCount))
    {
        B[j]=A[i];
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2014, 16:50
Ответы с готовыми решениями:

Из массива удалить самую длинную цепочку четных элементов
2. Из массива удалить самую длинную цепочку четных элементов. Пример: из массива A: 4 1 4 2 1 2 4...

Из массива удалить самую длинную цепочку четных элементов
Из массива удалить самую длинную цепочку четных элементов.Пример,из массива А:4 1 4 2 1 2 4 6...

Из массива удалить самую длинную цепочку четных элементов
из массива удалить самую длинную цепочку четных элементов. Пример, из массива А: 4 1 4 2 1 2 4 6...

Из массива удалить самую длинную цепочку четных элементов
Из массива удалить самую длинную цепочку четных элементов. Пример: из массива A: 4 1 4 2 1 2 4 6...

7
18 / 18 / 24
Регистрация: 21.06.2014
Сообщений: 147
21.12.2014, 21:30 2
Программа рабочая, но возможно я вписал что нибудь лишнее, так что можете её улучшить)) Можно к примеру сократить в не создавать новый массив в конце и записывать все значение. А просто через один оператор for и if вывести

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
#include <stdio.h>
#define SIZE 10
#include <time.h>
int main()
{
    int mass[SIZE];
    int i, j, k = 0, a = 0, t, b;
 
srand(time(NULL));
for(i = 0; i <= SIZE - 1; i++)
    printf("%3d", mass[i] = 1 + rand()% 10);
 
for(i = 0; i <= SIZE - 1; i++){
 
    if( mass[i] % 2 == 0){ j = i;
    k = 0;
 
     while(mass[j] % 2 == 0 && j != SIZE){
        j++;
        k++;
    }
    if(a < k){
        a = k; t = i;
    }
}
}
printf("\n%d %d", a, t);
printf("\n");
for(i = t; i <= (t + a - 1); i++)
    mass[i] = 0;
b = SIZE - a;
int mass2[b];
j = 0;
 
for(i = 0; i <= SIZE - 1; i++)
    
if(mass[i] != 0) {
               printf("%3.d", mass2[j] = mass[i]);
j++;
}
    return 0;
}
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
21.12.2014, 21:31  [ТС] 3
Kommersantt,
Спасибо огромное!
0
18 / 18 / 24
Регистрация: 21.06.2014
Сообщений: 147
21.12.2014, 21:39 4
Обращайся))
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
21.12.2014, 22:03  [ТС] 5
Kommersantt,
Спасибо) Ещё такой вопрос: можно ли как-то оставить в программе те подпрограммы, которые у меня были, вроде FormArr, PrintArr? Без них сдать не получится.

Добавлено через 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
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
 
void FormArr(int *mass,int n);
void PrintArr(int *mass,int n);
void Mass1(int *mass, int n);
int main (void)
{
    int n, j, k,*mass;
    do
    {
        printf("Vvedite kolichestvo elementov massiva Mass:\n");
        scanf("%d",&n);
    }
    while(n<0);
    mass = (int*) malloc(n*sizeof(int));
    FormArr(mass,n);
    printf("\nMassiv posle zapolneniya:\n");
    PrintArr(mass,n);
    Mass1 (mass,n);
    PrintArr(mass,n);
    free(mass);
}
 
void FormArr(int *mass,int n)
{
    int i;
    printf("Vvedite znacheniya elementov massiva mass:\n");
    for (i=0;i<n;i++)
    {
        printf("mass[%d] =", i+1);
        scanf("%d",&mass[i]);
    }
}
    
void Mass1(int *mass, int n)
{
    int k = 0, a = 0, t, b,i,j;
    for(i=0;i<=n-1;i++)
    {
        if(mass[i]%2==0)
        {
            j=i;
            k=0;
            while(mass[j]%2==0&&j!=n)
            {
                j++;
                k++;
            }
            if(a<k)
            {
                a=k;
                t=i;
            }
        }
    }
    printf("\n%d %d", a, t);
    printf("\n");
    for(i=t;i<=(t+a-1);i++)
    mass[i]=0;
    b=n-a;
    int mass2[b];
    j=0;
    for(i=0;i<=n-1;i++)
    if(mass[i]!=0)
    {
        printf("%3.d", mass2[j] = mass[i]);
        j++;
    }
}
 
void PrintArr(int *mass,int n)
{
    int i;
    printf("Rezultat massiva:\n");
    for (i=0;i<n;i++)
    {
        printf("%d\t", mass[i]);
        printf("\n");
    }
}
Добавлено через 2 минуты
Стоп, всё, я понял ошибку.
0
18 / 18 / 24
Регистрация: 21.06.2014
Сообщений: 147
21.12.2014, 22:33 6
конечно можно запихнуть

Добавлено через 4 минуты
чуть позже могу сделать
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 13
21.12.2014, 22:36  [ТС] 7
Kommersantt,
Да всё ок, я уже сделал, спасибо. Просто не нужно было запихивать PrintArr в конец, результат выводится и без этого.

Добавлено через 38 секунд
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 <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
 
void FormArr(int *mass,int n);
void PrintArr(int *mass,int n);
void Mass1(int *mass, int n);
int main (void)
{
    int n, j, k,*mass;
    do
    {
        printf("Vvedite kolichestvo elementov massiva Mass:\n");
        scanf("%d",&n);
    }
    while(n<0);
    mass = (int*) malloc(n*sizeof(int));
    FormArr(mass,n);
    printf("\nMassiv posle zapolneniya:\n");
    PrintArr(mass,n);
    Mass1 (mass,n);
    free(mass);
}
 
void FormArr(int *mass,int n)
{
    int i;
    printf("Vvedite znacheniya elementov massiva mass:\n");
    for (i=0;i<n;i++)
    {
        printf("mass[%d] =", i+1);
        scanf("%d",&mass[i]);
    }
}
    
void Mass1(int *mass, int n)
{
    int k = 0, a = 0, t, b,i,j;
    for(i=0;i<=n-1;i++)
    {
        if(mass[i]%2==0)
        {
            j=i;
            k=0;
            while(mass[j]%2==0&&j!=n)
            {
                j++;
                k++;
            }
            if(a<k)
            {
                a=k;
                t=i;
            }
        }
    }
    for(i=t;i<=(t+a-1);i++)
    mass[i]=0;
    b=n-a;
    int mass2[b];
    j=0;
    for(i=0;i<=n-1;i++)
    if(mass[i]!=0)
    {
        printf("%3.d", mass2[j] = mass[i]);
        j++;
    }
}
 
void PrintArr(int *mass,int n)
{
    int i;
    printf("Rezultat massiva:\n");
    for (i=0;i<n;i++)
    {
        printf("%d\t", mass[i]);
    }
}
0
18 / 18 / 24
Регистрация: 21.06.2014
Сообщений: 147
21.12.2014, 22:41 8
красавчик))
0
21.12.2014, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2014, 22:41
Помогаю со студенческими работами здесь

Удалить самую длинную цепочку четных элементов
Помогите пожалуйста с задачей. Удалить самую длинную цепочку четных элементов. Полученный...

В одномерном массиве найти самую длинную цепочку подряд стоящих элементов, которая является «палиндромом»
в одномерном массиве найти самую длинную цепочку подряд стоящих элементов, которая является...

Найти самую длинную цепочку нулей в последовательности
Дана последовательность нулей и единиц, требуется найти самую длинную цепочку нулей в ней, и...

Определить самую длинную непрерывную цепочку нулей
Всем вечер добрый. Нужна помощь с задачкой. Условие такое: Есть последовательность из нулей и...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru