Форум программистов, компьютерный форум CyberForum.ru

C для начинающих

Войти
Регистрация
Восстановить пароль
 
Odinokiii
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 4
#1

Функция с переменным числом параметров - C (СИ)

11.01.2017, 23:00. Просмотров 143. Ответов 8
Метки нет (Все метки)

Написать функцию с переменным кол-вом параметров (использовать бестиповой указатель). Найти сумму чисел int и float. Функция возвращает 2 полученные суммы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2017, 23:00     Функция с переменным числом параметров
Посмотрите здесь:

C (СИ) Макрос с переменным числом аргументов
Функции с переменным числом параметров C (СИ)
Разработать функцию с переменным числом параметров для вычисления выражения C (СИ)
Функции с переменным числом параметров: объяснить код C (СИ)
C (СИ) Void указатель в функции с переменным числом параметров
Функция с переменным количеством параметров C (СИ)
Функция с переменным числом аргументов C (СИ)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 23:06     Функция с переменным числом параметров #2
Цитата Сообщение от Odinokiii Посмотреть сообщение
с переменным кол-вом параметров (использовать бестиповой указатель
А как бестиповый указатель относится к переменному кол-ву аргументов?
Odinokiii
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 4
11.01.2017, 23:18  [ТС]     Функция с переменным числом параметров #3
так в задаче написано

Добавлено через 40 секунд
да хоть как-то ее решить

Добавлено через 9 минут
nimazzzy, я не знаю так в задаче написано, хоть как-то ее решить
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 23:20     Функция с переменным числом параметров #4
Цитата Сообщение от Odinokiii Посмотреть сообщение
я не знаю так в задаче написано
Я тоже не знаю. Две суммы чего вернуть? Что за параметры должна принимать функция?
Odinokiii
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 4
11.01.2017, 23:27  [ТС]     Функция с переменным числом параметров #5
nimazzzy, сумму int чисел и сумму float чисел
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 23:30     Функция с переменным числом параметров #6
Цитата Сообщение от Odinokiii Посмотреть сообщение
сумму int чисел и сумму float чисел
Функция не может возвращать 2 значения.
Odinokiii
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 4
11.01.2017, 23:34  [ТС]     Функция с переменным числом параметров #7
nimazzzy, если бы это было так я бы не писал ))
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3510 / 1792 / 472
Регистрация: 18.10.2014
Сообщений: 3,308
11.01.2017, 23:50     Функция с переменным числом параметров #8
Цитата Сообщение от Odinokiii Посмотреть сообщение
сумму int чисел и сумму float чисел
В смысле? В принципе всех возможных в нашей Вселенной чисел типа int и типа float?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2017, 12:04     Функция с переменным числом параметров
Еще ссылки по теме:

Функция с переменным числом параметров ошибка C (СИ)
C (СИ) Функция с переменным числом параметров
Функция с переменным количеством параметров C (СИ)
C (СИ) Функция с переменным числом параметров определяющая длину вектора
C (СИ) Функции с переменным числом аргументов

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

Или воспользуйтесь поиском по форуму:
HighPredator
5428 / 1811 / 332
Регистрация: 10.12.2010
Сообщений: 5,356
Записей в блоге: 3
12.01.2017, 12:04     Функция с переменным числом параметров #9
К лешему указатели на воид, надо делать по науке. Вот тут поддерживаются основные спецификаторы:
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
 
#define MAX_FORMAT_SPECIFIER_LENGTH     3
#define FORMAT_STRING_TRAVERSED(arg)    (*(arg) == '\0')
#define ADVANCE_TO_NEXT_SPECIFIER(arg)  \
  do \
  { \
    (arg)++; \
  } while ((*(arg) != '\0') && (*(arg) != '%'))
    
enum DataTypes
{
  type_signed_integer,            // %d   -> int / signed int
  type_signed_integer_char,       // %hhd -> char / signed char
  type_signed_integer_short,      // %hd  -> short / signed short int
  type_signed_integer_long,       // %ld  -> long / signed long int
  type_signed_integer_long_long,  // %lld -> long long / signed long long int
  
  type_unsigned_integer,          // %u   -> unsigned int
  type_unsigned_integer_char,     // %hhu -> unsigned char
  type_unsigned_integer_short,    // %hu  -> unsigned short / unsigned short int
  type_unsigned_integer_long,     // %lu  -> unsigned long / unsigned long int
  type_unsigned_integer_long_long,// %llu -> unsigned long long / unsigned long long int
  
  type_float,                     // %f   -> float
  type_double,                    // %lf  -> double
  type_unknown
};
 
enum DataTypes DetermineType(const char* const specifier)
{
  if (strcmp(specifier, "d"  ) == 0) return type_signed_integer;
  if (strcmp(specifier, "hhd") == 0) return type_signed_integer_char;
  if (strcmp(specifier, "hd" ) == 0) return type_signed_integer_short;
  if (strcmp(specifier, "ld" ) == 0) return type_signed_integer_long;
  if (strcmp(specifier, "lld") == 0) return type_signed_integer_long_long;
  
  if (strcmp(specifier, "u"  ) == 0) return type_unsigned_integer;
  if (strcmp(specifier, "hhu") == 0) return type_unsigned_integer_char;
  if (strcmp(specifier, "hu" ) == 0) return type_unsigned_integer_short;
  if (strcmp(specifier, "lu" ) == 0) return type_unsigned_integer_long;
  if (strcmp(specifier, "llu") == 0) return type_unsigned_integer_long_long;
  
  if (strcmp(specifier, "f"  ) == 0) return type_float;
  if (strcmp(specifier, "lf" ) == 0) return type_double;
  
  return type_unknown;
}
    
static inline const char* ExtractFormatSpecifier(const char* startPtr)
{
  static char specifier[MAX_FORMAT_SPECIFIER_LENGTH + 1];
  
  const char* endPtr = startPtr;
  
  ADVANCE_TO_NEXT_SPECIFIER(endPtr);
  
  memcpy(specifier, startPtr + 1, endPtr - startPtr - 1);
  specifier[endPtr - startPtr - 1] = '\0';
  
  return (const char*) &specifier[0];
}
 
double Sum(const char* fmt, ...)
{
  double result = 0.0;
  
  va_list args;
  va_start(args, fmt);
  
  while (!FORMAT_STRING_TRAVERSED(fmt))
  {
    enum DataTypes correspondingDataType = DetermineType(ExtractFormatSpecifier(fmt));
    
    switch (correspondingDataType)
    {
      case type_signed_integer_char:
      case type_signed_integer_short:
      case type_signed_integer:
      {
        int number = va_arg(args, int);
        result += number;
        break;
      }
      case type_signed_integer_long:
      {
        long int number = va_arg(args, long int);
        result += number;
        break;
      }
      case type_signed_integer_long_long:
      {
        long long int number = va_arg(args, long long int);
        result += number;
        break;
      }
      
      case type_unsigned_integer_char:
      case type_unsigned_integer_short:
      case type_unsigned_integer:
      {
        unsigned int number = va_arg(args, unsigned int);
        result += number;
        break;
      }
      case type_unsigned_integer_long:
      {
        unsigned long int number = va_arg(args, unsigned long int);
        result += number;
        break;
      }
      case type_unsigned_integer_long_long:
      {
        unsigned long long int number = va_arg(args, unsigned long long int);
        result += number;
        break;
      }
        
      case type_float:      
      case type_double:
      {
        double number = va_arg(args, double);
        result += number;
        break;
      }
      case type_unknown:
        printf("Unknown specifier\n");
        break;
    }
    
    ADVANCE_TO_NEXT_SPECIFIER(fmt);
  }
  
  va_end(args);
  
  return result;
}
 
int main(void)
{
  double result = Sum("%d%d%d%f%f%f%d", 1, 2, 3, 6.0f, 8.0f, 10.5f, 5);
 
  printf("%.4f\n", result);
 
  return 0;
}
Добавлено через 1 минуту
По аналогии можно сделать для двух сумм, а то я провтыкал этот момент.
Yandex
Объявления
12.01.2017, 12:04     Функция с переменным числом параметров
Ответ Создать тему
Опции темы

Текущее время: 15:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru