Есть ли способ изменить значения в массиве за одну операцию? - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д