Есть ли способ изменить значения в массиве за одну операцию? - C (СИ)
Формулировка задачи:
Здравствуйте, недавно начал осваивать Си. Изучил K&R, полистал несколько разных мануалов. Нигде не увидел ответа на простой вопрос: есть ли способ, как в других языках программирования, изменить значения в массиве за одну операцию? Ведь при инициализации такая функциональность имеется:
#define K 8 int ar1[3] = { 1, 6, 3 }; // инициализация - корректно /** можно изменить значения только в три строки но это же неудобно и длинно **/ ar1[0] = K+2; ar1[1] = 5; ar1[2] = 4; /** может есть какой-то способ присвоения инициализирванному массиву значений?? **/ ar1 = { 2+K, 5, 4}; // ошибка ar1[] = { 2+K, 5, 4}; // ошибка
Решение задачи: «Есть ли способ изменить значения в массиве за одну операцию?»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <locale.h> #define DECLARE_FUN(type)\ void set_##type##_array(type* ptr,unsigned count,...)\ {\ va_list v;\ va_start(v,count);\ for(unsigned i = 0; i < count;++i)\ ptr[i] = va_arg(v,type);\ va_end(v);\ } #define CALL_FUN(type,ptr,count,...)\ set_##type##_array(ptr,count,__VA_ARGS__); #define DECLARE_PRINT(type,flag)\ void print_##type(type* ptr,unsigned size)\ {\ for(unsigned i = 0; i < size; ++i)\ printf("array[%u]:"flag"\n",i,ptr[i]);\ printf("\n");\ } #define CALL_PRINT(type,ptr,size)\ print_##type(ptr,size); DECLARE_FUN(int); DECLARE_PRINT(int,"%d"); DECLARE_FUN(double); DECLARE_PRINT(double,"%f"); int main() { setlocale(LC_ALL,".1251"); int array[10] = {1,2,3,4,5,6,7,8,9,10};//инициализируем как обычно double array2[10] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.0};//инициализируем double printf("Начальный массив int\n"); CALL_PRINT(int,array,10); CALL_FUN(int,array,5,10,9,8,7,6); CALL_FUN(int,array+5,5,5,4,3,2,1);//остальные 5 меняем смещением указателя printf("Измененный массив int\n"); CALL_PRINT(int,array,10); printf("Начальный массив double\n"); CALL_PRINT(double,array2,10); CALL_FUN(double,array2,5,10.0,9.9,8.8,7.7,6.6);//тоже самое для double CALL_FUN(double,array2+5,5,5.5,4.4,3.3,2.2,1.1); printf("Измененный массив double\n"); CALL_PRINT(double,array2,10); return 0; }
Объяснение кода листинга программы
Этот код использует функции и макросы для работы с массивами в языке C.
- DECLARE_FUN(type) - это макрос, который определяет функцию с именем
set_type_array
, принимающую указатель на массив типаtype
, количество элементовcount
и переменное количество аргументов типаtype
. Эта функция заполняет массив за одну операцию. - CALL_FUN(type,ptr,count,...) - это макрос, который вызывает функцию
set_type_array
с указанными аргументами. - DECLARE_PRINT(type,flag) - это макрос, который определяет функцию
print_type
, которая выводит элементы массива типаtype
с помощью функцииprintf
. - CALL_PRINT(type,ptr,size) - это макрос, который вызывает функцию
print_type
с указанными аргументами. В функцииmain
создаются два массива:array
типаint
иarray2
типаdouble
. Затем эти массивы инициализируются и выводятся на экран с помощью функцийprintf
иprint_int
,print_double
. Затем с помощью функцийset_int_array
иset_double_array
значения в обоих массивах изменяются за одну операцию. Наконец, измененные массивы снова выводятся на экран с помощью функцийprint_int
иprint_double
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д