Консультация № 188828
19.02.2016, 11:45
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста, исправить ошибку в коде.
Условия задачи:
Дано целое число L (> 0) и целочисленный массив размера N.
Заменить каждую серию массива, длина которой равна L, на один элемент с нулевым значением. Серия — группа подряд идущих одинаковых элементов. Длина серии — количество этих элементов (может быть равна 1).




Приложение:
/**
Дано целое число L (> 0) и целочисленный массив размера N.
Заменить каждую серию массива, длина которой равна L,
на один элемент с нулевым значением.
Серия — группа подряд идущих одинаковых элементов.
Длина серии — количество этих элементов (может быть равна 1 */

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

void remove_series(int *a, int *size, int *end, int lenght);

int main()
{
srand(time(NULL));

printf("Input array size: ");
int n; scanf("%d", &n);

int *a = NULL;
a = (int*)malloc(n * sizeof(int));
int i;
for(i = 0; i < n; i++)
{
a[i] = rand() % 10;
printf("%d ", a[i]);
}
printf("\nInput seria lenght: ");
int l; scanf("%d", &l);
int lenght = 0;
for(i = 0; i < n - 1; i++)
{
if(a[i] == a[i + 1])
{
lenght++;
if((i + 1) == (n - 1) && lenght == l - 1)
{
//printf("\nlenght %d", lenght + 1);
remove_series(a, &n, &i, lenght);
}
}
else
{
if(lenght == l - 1)
{
//printf("\nlenght %d", lenght + 1);
remove_series(a, &n, &i, lenght);
}

lenght = 0;

if((i + 1) == (n - 1) && lenght < l )
{
//printf("\nlenght %d", lenght + 1);
i++;
remove_series(a, &n, &i, lenght);
}
}
}

printf("\nNew array\n");
for(i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
system("pause");
return 0;
}
void remove_series(int *a, int *size, int *end, int lenght)
{
a[*end - lenght] = 0;
if(lenght)
{
int i;
for(i = *end + 1; i < *size; i++)
{
a[i - lenght] = a[i];
}
*end -= lenght;
*size -= lenght;
a = (int*)realloc(a, *size * sizeof(int));
}
}

Обсуждение

давно
Посетитель
7438
7205
19.02.2016, 14:20
общий
это ответ
Здравствуйте, fridge!
Я немного переделал. Посмотрите комментарий.
[code h=200]
/**
Дано целое число L (> 0) и целочисленный массив размера N.
Заменить каждую серию массива, длина которой равна L,
на один элемент с нулевым значением.
Серия — группа подряд идущих одинаковых элементов.
Длина серии — количество этих элементов (может быть равна 1 */

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

void remove_series(int *a, int *size, int *end, int lenght);

int main()
{
srand(time(NULL));

printf("Input array size: ");
int n; scanf("%d", &n);

int *a = (int*)malloc(n * sizeof(int));
int i,j;

for(i = 0; i < n; i++)
{
a[i] = (rand() % 9) + 1; //Пусть числа будут [1;9], чтобы 0 был только для замены
printf("%d ", a[i]);
}
printf("\nInput seria lenght: ");
int l; scanf("%d", &l);
int lenght;
i=0;
while(i < n) //по всем числам, количество одинаковых может быть и 1,
{ // поэтому просматриваем до последнего
lenght=1; //считаем текущего первым в последовательности равных
for(j=i+1; j<n; j++) //со следующего
{
if(a[i] == a[j])
lenght++; //считаем одинаковые
else
break; //встретился отличный
}
if (lenght == l) //нужное количество?
remove_series(a, &n, &i, lenght); //заменяем последовательность нулем
else
i+=lenght; //иначе - сдвигаем индекс на количество просмотренных одинаковых,
// количество которых отлично от заданного
}

printf("\nNew array\n");
for(i = 0; i < n; i++)
{
printf("%d ", a[i]);
}

printf("\n"); //перевод строки
free(a); //освобождаем память!

system("pause");
return 0;
}
void remove_series(int *a, int *size, int *end, int lenght)
{
a[*end] = 0; //на место текущего ставим 0
if(lenght>1) //если один,то сдвигать не требуется
{
int i;
for(i = *end + 1; i < (*size)-1; i++) //сс следующего до предпоследнего
a[i] = a[i+1]; //сдвигаем на один в начало
*size -= lenght-1; //количество уменьшим на число одинаковых -1 (т.к. остается 0)
a = (int*)realloc(a, *size * sizeof(int));
}
*end += 1; //по-любому, индекс сдвигаем на 1 дальше
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа