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

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

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

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

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

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

Функция с переменным числом параметров - C (СИ)
Кто может помочь с задачей? Нужно на C написать В главной функции main ( ) ввести число n , что задает количество строк , вводимых а...

Функция с переменным числом параметров ошибка - C (СИ)
Есть функция с переменным числом параметров, которая вставляет 0 в след параметр если не вписать то что записано в комментарии(p++). Почему...

Функция с переменным числом параметров определяющая длину вектора - C (СИ)
Добрый день! Помогите,пожалуйста написать программу!!)) Нужно написать функцию с переменным числом параметров,которая определяет...

Функции с переменным числом параметров - C (СИ)
Ребят, всем привет. У меня к вам небольшой вопрос. Я ищу теоретический материал на вот такую тему: "Функции с переменным числом...

Задание с функцией с переменным числом параметров - C (СИ)
Написать функцию с переменным числом параметров, которая для заданных чисел типа int находит сумму по формуле S = a1 * a2 - a2 * a3 + a3...

Void указатель в функции с переменным числом параметров - C (СИ)
Добрый вечер. Суть задачи: посчитать значение выражения (x1+x3+x5+...) / (x2+x4+x6). Количество парметров четное. Основной вопрос: ...

8
nimazzzy
Заблокирован
11.01.2017, 23:06 #2
Цитата Сообщение от Odinokiii Посмотреть сообщение
с переменным кол-вом параметров (использовать бестиповой указатель
А как бестиповый указатель относится к переменному кол-ву аргументов?
0
Odinokiii
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 4
11.01.2017, 23:18  [ТС] #3
так в задаче написано

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

Добавлено через 9 минут
nimazzzy, я не знаю так в задаче написано, хоть как-то ее решить
0
nimazzzy
Заблокирован
11.01.2017, 23:20 #4
Цитата Сообщение от Odinokiii Посмотреть сообщение
я не знаю так в задаче написано
Я тоже не знаю. Две суммы чего вернуть? Что за параметры должна принимать функция?
0
Odinokiii
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 4
11.01.2017, 23:27  [ТС] #5
nimazzzy, сумму int чисел и сумму float чисел
0
nimazzzy
Заблокирован
11.01.2017, 23:30 #6
Цитата Сообщение от Odinokiii Посмотреть сообщение
сумму int чисел и сумму float чисел
Функция не может возвращать 2 значения.
0
Odinokiii
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 4
11.01.2017, 23:34  [ТС] #7
nimazzzy, если бы это было так я бы не писал ))
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3875 / 2133 / 548
Регистрация: 18.10.2014
Сообщений: 3,746
11.01.2017, 23:50 #8
Цитата Сообщение от Odinokiii Посмотреть сообщение
сумму int чисел и сумму float чисел
В смысле? В принципе всех возможных в нашей Вселенной чисел типа int и типа float?
0
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,468
Записей в блоге: 2
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 минуту
По аналогии можно сделать для двух сумм, а то я провтыкал этот момент.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2017, 12:04
Привет! Вот еще темы с ответами:

Функции с переменным числом параметров: объяснить код - C (СИ)
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int sum(int k, ...) { int s = 0, *p = &amp;k+1 ;//настроили...

Разработать функцию с переменным числом параметров для вычисления выражения - C (СИ)
Помогите, пожалуйста, разработать функцию с переменным числом параметров (x1, x2, x3, x4, ...), которая вычисляет значение выражения: -...

Функция с переменным числом аргументов - C (СИ)
Здравствуйте, у меня возникла трудность я пытаюсь сделать функцию с переменным числом аргументов и подаю ей на вход адрес вещественных...

Функция с переменным количеством параметров - C (СИ)
Почему выводит всякую ерунду #include &lt;stdio.h&gt; #include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; int sumf(int n, ...); int main() { ...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
12.01.2017, 12:04
Ответ Создать тему
Опции темы

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