Есть ли способ изменить значения в массиве за одну операцию? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, недавно начал осваивать Си. Изучил K&R, полистал несколько разных мануалов. Нигде не увидел ответа на простой вопрос: есть ли способ, как в других языках программирования, изменить значения в массиве за одну операцию? Ведь при инициализации такая функциональность имеется:
Листинг программы
  1. #define K 8
  2. int ar1[3] = { 1, 6, 3 }; // инициализация - корректно
  3. /** можно изменить значения только в три строки
  4. но это же неудобно и длинно **/
  5. ar1[0] = K+2;
  6. ar1[1] = 5;
  7. ar1[2] = 4;
  8. /** может есть какой-то способ присвоения инициализирванному массиву значений?? **/
  9. ar1 = { 2+K, 5, 4}; // ошибка
  10. ar1[] = { 2+K, 5, 4}; // ошибка

Решение задачи: «Есть ли способ изменить значения в массиве за одну операцию?»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4. #include <locale.h>
  5.  
  6. #define DECLARE_FUN(type)\
  7.     void set_##type##_array(type* ptr,unsigned count,...)\
  8.     {\
  9.         va_list v;\
  10.         va_start(v,count);\
  11.         for(unsigned i = 0; i < count;++i)\
  12.             ptr[i] = va_arg(v,type);\
  13.         va_end(v);\
  14.     }
  15. #define CALL_FUN(type,ptr,count,...)\
  16.     set_##type##_array(ptr,count,__VA_ARGS__);
  17.  
  18. #define DECLARE_PRINT(type,flag)\
  19. void print_##type(type* ptr,unsigned size)\
  20. {\
  21.     for(unsigned i = 0; i < size; ++i)\
  22.         printf("array[%u]:"flag"\n",i,ptr[i]);\
  23.     printf("\n");\
  24. }
  25. #define CALL_PRINT(type,ptr,size)\
  26.     print_##type(ptr,size);
  27.  
  28. DECLARE_FUN(int);
  29. DECLARE_PRINT(int,"%d");
  30. DECLARE_FUN(double);
  31. DECLARE_PRINT(double,"%f");
  32.  
  33. int main()
  34. {
  35.     setlocale(LC_ALL,".1251");
  36.     int array[10] = {1,2,3,4,5,6,7,8,9,10};//инициализируем как обычно
  37.     double array2[10] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.0};//инициализируем double
  38.     printf("Начальный массив int\n");
  39.     CALL_PRINT(int,array,10);
  40.     CALL_FUN(int,array,5,10,9,8,7,6);
  41.     CALL_FUN(int,array+5,5,5,4,3,2,1);//остальные 5 меняем смещением указателя
  42.     printf("Измененный массив int\n");
  43.     CALL_PRINT(int,array,10);
  44.     printf("Начальный массив double\n");
  45.     CALL_PRINT(double,array2,10);
  46.     CALL_FUN(double,array2,5,10.0,9.9,8.8,7.7,6.6);//тоже самое для double
  47.     CALL_FUN(double,array2+5,5,5.5,4.4,3.3,2.2,1.1);
  48.     printf("Измененный массив double\n");
  49.     CALL_PRINT(double,array2,10);
  50.     return 0;
  51. }

Объяснение кода листинга программы

Этот код использует функции и макросы для работы с массивами в языке C.

  1. DECLARE_FUN(type) - это макрос, который определяет функцию с именем set_type_array, принимающую указатель на массив типа type, количество элементов count и переменное количество аргументов типа type. Эта функция заполняет массив за одну операцию.
  2. CALL_FUN(type,ptr,count,...) - это макрос, который вызывает функцию set_type_array с указанными аргументами.
  3. DECLARE_PRINT(type,flag) - это макрос, который определяет функцию print_type, которая выводит элементы массива типа type с помощью функции printf.
  4. 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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы