возврат нескольких значений в функции возврата значения

#c #function #c 14

#c #функция #c 14

Вопрос:

Я хочу написать программу, которая подсчитывает, сколько раз в строке появляется определенная гласная, но каждое значение должно быть возвращено.

 int vowel_count(string);
int main()
{
  string str;
  cout << "Enter a string";
  cin >> str;
  // Calling funtion:
  vowel_count(str);
}

int vowel_count(string var)
{
  int sum_a = 0;
  int sum_e = 0;
  int sum_i = 0;
  int sum_o = 0;
  int sum_u = 0;
  
  for (int j = 0; j < var.length(); j  )
  {
        if (Var.at(j) == 'a')
            sum_a  ;
        if (Var.at(j) == 'e')
            sum_e  ;
        if (Var.at(j) == 'i')
            sum_i  ;
        if (Var.at(j) == 'o')
            sum_o  ;
        if (Var.at(j) == 'u')
            sum_u  ;
  }
    return sum_a;
    return sum_e;
    return sum_i;
    return sum_o;
    return sum_u;
}
 

Каждый раз, когда я возвращаюсь, программа завершается, я хотел бы знать, как мне выполнить функцию возврата.

Комментарии:

1. Вы можете вернуть только одну вещь из функции. Но эта вещь может быть настолько сложной, насколько вы хотите. Вы можете создать свою собственную структуру со многими членами, или вы можете использовать std::vector или std::array .

Ответ №1:

Вы можете использовать std::tuple для возврата нескольких значений из функции. Затем вы можете либо использовать std::get , либо std::tie получить значения в кортеже. Это позволяет избежать необходимости определять структуру / класс просто с целью возврата результата из вашей функции vowel_count() .

Поскольку вы отметили свой вопрос C 14, я предполагаю, что у вас нет C 17. Однако в C 17 вместо этого вы можете использовать структурированные привязки для извлечения значений.

Для C 11 / C 14:

 #include<iostream>  
#include<tuple>

using TupleVowel = std::tuple<int, int, int, int, int>;

TupleVowel vowel_count(std::string var)
{
    int sum_a = 0;
    int sum_e = 0;
    int sum_i = 0;
    int sum_o = 0;
    int sum_u = 0;

    for (int j = 0; j < var.length(); j  )
    {
        if (var.at(j) == 'a')
            sum_a  ;
        if (var.at(j) == 'e')
            sum_e  ;
        if (var.at(j) == 'i')
            sum_i  ;
        if (var.at(j) == 'o')
            sum_o  ;
        if (var.at(j) == 'u')
            sum_u  ;
    }

    return std::make_tuple(sum_a, sum_e, sum_i, sum_o, sum_u);
}

int main(void)
{
    int sum_a = 0;
    int sum_e = 0;
    int sum_i = 0;
    int sum_o = 0;
    int sum_u = 0;
 
    std::tie(sum_a, sum_e, sum_i, sum_o, sum_u) = vowel_count("hello world");
    std::cout << "sum_a = " << sum_a << ", sum_e = " << sum_e << ", sum_i = " << sum_i << ", sum_o = " << sum_o << ", sum_u = " << sum_u << std::endl;
}
 

Живая демонстрация.

Вы также можете использовать std::get() с индексом элемента, подобного этому, без необходимости «привязывать» элементы кортежа к переменным:

 auto tup = vowel_count("hello world");
std::cout << "sum_a = " << std::get<0>(tup) << ", sum_e = " << std::get<1>(tup) << ", sum_i = " << std::get<2>(tup) << ", sum_o = " << std::get<3>(tup) << ", sum_u = " << std::get<4>(tup) << std::endl;
 

В C 17 вы можете просто сделать:

 auto [sum_a, sum_e, sum_i, sum_o, sum_u] = vowel_count("hello world");
 

Живая демонстрация.

Ответ №2:

Когда тип возвращаемой переменной один и тот же, вы можете использовать a std::array (также std::vector или std::deque , но, учитывая, что номер возвращаемой переменной фиксирован, я полагаю std::array , предпочтительнее)

Я имею в виду, что-то вроде следующего

 #include <array>
#include <iostream>

auto vowel_count (std::string var)
 {
   int sum_a = 0;
   int sum_e = 0;
   int sum_i = 0;
   int sum_o = 0;
   int sum_u = 0;
  
   for ( auto const amp; ch : var )
      if ( ch == 'a')        sum_a;
      else if ( ch == 'e')   sum_e;
      else if ( ch == 'i')   sum_i;
      else if ( ch == 'o')   sum_o;
      else if ( ch == 'u')   sum_u;

   return std::array<int, 5u>{ sum_a, sum_e, sum_i, sum_o, sum_u };
 }

int main()
{
   std::string str;
   std::cout << "Enter a string";
   std::cin >> str;

   auto vc = vowel_count(str);

   std::cout << "a: " << vc[0] << std::endl;
   std::cout << "e: " << vc[1] << std::endl;
   std::cout << "i: " << vc[2] << std::endl;
   std::cout << "o: " << vc[3] << std::endl;
   std::cout << "u: " << vc[4] << std::endl;
 }
 

Обратите внимание, что, начиная с C 17, вы можете использовать структурированные привязки, точно так, как предложено jignatius в std::tuple базовом решении.

 auto [sum_a, sum_e, sum_i, sum_o, sum_u] = vowel_count(str);

std::cout << "a: " << sum_a << std::endl;
std::cout << "e: " << sum_e << std::endl;
std::cout << "i: " << sum_i << std::endl;
std::cout << "o: " << sum_o << std::endl;
std::cout << "u: " << sum_u << std::endl;
 

Ответ №3:

Приведенные выше ответы слишком сложны. Самым простым решением является простая структура.

 struct VowelResult {
    int a;
    int e;
    int i;
    int o;
    int u;
};
VowelResult func () {
    int sumA = 0;
    int sumE = 0;
    int sumI = 0;
    int sumO = 0;
    int sumU = 0;

    //your code goes here...

    return {sumA,sumE,sumI,sumO,sumU}; // order matters here
    // alternatively:
    // VowelResult res{};
    // res.a = sumA;
    // res.e = sumE;
    // and so on...
    // return res;
    // alternatively alternativey you can simply use the struct directly to store the sums
}