Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
FantazerMasha
0 / 0 / 5
Регистрация: 05.06.2016
Сообщений: 64
#1

Оставляет в массиве array не более n элементов, начиная с индекса first - C (СИ)

19.06.2016, 09:47. Просмотров 179. Ответов 2
Метки нет (Все метки)

void slice (Array *array, int first, int n);
Оставляет в массиве array не более n элементов, начиная с индекса first.

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
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void* mymalloc(size_t size) {
void *result = malloc(size);
if (result == NULL) {
fprintf(stderr, "mymalloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return result;
}
 
void* myrealloc(void *ptr, size_t size) {
void *res = realloc(ptr, size);
if (res == NULL && size != 0) {
fprintf(stderr, "myrealloc: не удалось выделить %zd байт\n", size);
exit(EXIT_FAILURE);
}
return res;
}
 
typedef struct Array {
int *data;
int n;
} Array;
 
Array* newArray(int n);
Array* copyArray(const Array *array);
void destroyArray(Array *array);
void slice(Array* array, int first, int n);
 
int main(void) {
Array * array = newArray(5);
for (int i = 0; i < array->n; i++) {
scanf("%d", &(array->data[i]));
}
 
slice(array, 1, 3);
for (int i = 0; i < array->n; i++)
{
printf("%d ", array->data[i]);
}
printf("\n");
destroyArray(array);
system("pause");
return 0;
}
 
Array* newArray(int n) {
Array* new_array = (Array*)mymalloc(sizeof(Array));
new_array->n = n;
new_array->data = (int*)mymalloc(n * sizeof(int));
return new_array;
}
 
Array* copyArray(const Array *array) {
Array* new_array = (Array*)mymalloc(sizeof(Array));
new_array->n = array->n;
new_array->data = (int*)mymalloc(array->n * sizeof(int));
for (int i = 0; i < array->n; i++) {
new_array->data[i] = array->data[i];
}
return new_array;
}
 
void destroyArray(Array *array) {
free[] array->data;
free array;
}
 
void slice(Array* array, int first, int n) {
if ((first + n) > array->n) {
printf("Ошибка ввода");
exit(EXIT_FAILURE);
}
 
Array * temp = newArray(n);
for (int i = 0; i < n; i++) {
temp->data[i] = array->data[i + first];
}
 
myrealloc(array->data, n);
for (int i = 0; i < n; i++) {
array->data[i] = temp->data[i];
}
array->n = n;
 
destroyArray(temp);
}
Пример. Исходный массив:
1 2 3 4 5 6 7 8 9 0
Вызов:
slice(array, 3, 5);
Результат:
4 5 6 7 8

не работает... что не так? чует моё сердце, что что-то не так с free...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2016, 09:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Оставляет в массиве array не более n элементов, начиная с индекса first (C (СИ)):

Количество элементов массива, каждый из которых встречается в массиве не более 3-х раз
Здравствуйте, помогите, пожалуйста, написать код для задачи :sigh: ~ Дан...

Определить, сколько значений элементов в массиве встречается более одного раза
Дан одномерный массив А, состоящий из N элементов. Сколько значений элементов...

Найти количество элементов массива, каждый из которых встречается в массиве не более 3-х раз
Дан массив. Размер не превышает 10000 элементов. Его вводят через стандартный...

Из ListBox скопировать элементы в массив, начиная с пятого индекса в массиве
Мне нужно из ЛистБокса скопировать в масив элементы (листбокса), но начиная с...

Определить в массиве среднее геометрическое элементов, у которых оба индекса нечетные
1) Ввести двумерный массив А 3х5. Определить в нём среднее геометрическое...

Найти в двумерном массиве среднее геометрическое элементов у которых оба индекса нечетные
как определить в двумерном массиве среднее геометрическое элементов у которых...

2
Геомеханик
785 / 592 / 937
Регистрация: 26.06.2015
Сообщений: 1,409
20.06.2016, 03:53 #2
Цитата Сообщение от FantazerMasha Посмотреть сообщение
free[] array->data;
Это что за "неблагоприятная мутация"?

FantazerMasha, вот набросал пример.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <memory.h>
 
int slice(int* arr, int num, int pos, int cnt){
    if((pos + cnt) <= num){
        memcpy(arr, arr + pos, (size_t)cnt * sizeof(int));
        return cnt;
    }
    return num;
}
 
int main(void){
    int i;
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    int n   = sizeof(a)/sizeof(a[0]);
    
    n = slice(a, n, 3, 5);
    for(i = 0; i < n; ++i)
        printf("%d ", a[i]);
    return 0;
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
20.06.2016, 15:26 #3
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
/* ANSI C 99 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
 
typedef int* int_array_t;
 
int_array_t int_array_new(int size) {
    assert(size > 0);
    int_array_t array = malloc(sizeof(int) * (size + 1));
    if ( ! array )
        return NULL;
    *array = size;
    
    return array;
}
 
void int_array_free(int_array_t array) {
    free(array);
}
 
int int_array_size(int_array_t array) {
    return *array;
}
 
int int_array_get_at(int_array_t array, int index) {
    assert(index >= 0 && index < *array);
    
    return array[index + 1];
}
 
void int_array_set_at(int_array_t array, int index, int value) {
    assert(index >= 0 && index < *array);
    array[index + 1] = value;
}
 
void int_array_random_fill(int_array_t array, int minval, int maxval) {
    for ( int i = 0; i < *array; ++i )
        array[i + 1] = rand() % (maxval - minval + 1) + minval;
}
 
int int_array_dump(int_array_t array, FILE * fout, const char * separator) {
    for ( int i = 0; i < *array; ++i )
        if ( fprintf(fout, "%d%s", array[i + 1], separator) < 0 )
            return -1;
            
    return 0;
}
 
int_array_t int_array_slice(int_array_t origin, int index, int count) {
    assert(index >= 0 && index < *origin && count >= 0);
    
    if ( count == 0 || count + index > *origin )
        count = *origin - index;
    
    int_array_t slice = int_array_new(count);
    if ( ! slice )
        return NULL;
        
    memcpy(&slice[1], &origin[index + 1], count * sizeof(int));
    
    return slice;
}
 
//////////////////////////////////////////////////////////////////////
 
#define DEFAULT_SIZE 10
#define MIN_VALUE 0
#define MAX_VALUE 9
 
int main(void) {
    int_array_t arr = int_array_new(DEFAULT_SIZE);
    assert(arr);
    
    srand(time(NULL));
    
    int_array_random_fill(arr, MIN_VALUE, MAX_VALUE);
    printf("Array:\n");
    int_array_dump(arr, stdout, " ");
    printf("\nStart index and number of elements to slice: ");
    
    int startIndex, elementsNumber;
    if ( scanf("%d%d", &startIndex, &elementsNumber) != 2 ) {
        fprintf(stderr, "Wrong input!\n");
        int_array_free(arr);
        exit(EXIT_FAILURE);
    }
    
    int_array_t slice = int_array_slice(arr, startIndex, elementsNumber);
    assert(slice);
    printf("Slice:\n");
    int_array_dump(slice, stdout, " ");
    printf("\n");
    
    int_array_free(arr);
    int_array_free(slice);
    
    exit(EXIT_SUCCESS);
}
Код
andrew@debppc:~/workspace/c/numbers$ gcc -std=c99 -Wall int_array.c 
andrew@debppc:~/workspace/c/numbers$ ./a.out 
Array:
2 2 3 6 3 1 8 5 4 8 
Start index and number of elements to slice: 2 0
Slice:
3 6 3 1 8 5 4 8 
andrew@debppc:~/workspace/c/numbers$ ./a.out 
Array:
9 0 3 4 2 5 6 9 8 9 
Start index and number of elements to slice: 0 3
Slice:
9 0 3 
andrew@debppc:~/workspace/c/numbers$
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2016, 15:26
Привет! Вот еще темы с решениями:

Поиск в заданном массиве В, состоящем из 10-ти элементов, третьего положительного элемента и его индекса
Для заданного условия составить процедуру и придумать несколько наборов...

В динамическом массиве удалить N элементов, начиная с номера K (ошибка)
Помогите, как исправить ошибку? Нужно из массива arr , который перед этим...

В данном линейном целочисленном массиве каждый элемент с четным индексом увеличить на значение индекса, с нечетным — уменьшить на значение индекса
В данном линейном целочисленном массиве каждый элемент с четным индексом...

Написать процедуру поиска в заданном массиве В, состоящем из 20-ти элементов, третьего положительного элемента и его индекса
Sub Lab_5() Dim A(1 To 20) Dim ind As Integer, K As Integer, P As Integer...


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

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

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