Я пытаюсь найти номер индекса, просматривая массив, но не могу использовать цикл. Является ли это возможным?
Я прикрепил код, чтобы сделать это с помощью цикла.
#include <iostream>
using namespace std;
const char digits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', \
'A', 'B', 'C', 'D', 'E', 'F', };
int find_index(string str);
int main()
{
string str = "A";
cout << find_index(str) << endl;
}
int find_index(string str)
{
// using a loop, in this case for loop.
for (int i = 0 ; i < 16 ; i++)
{
// cout << digits[i] << endl;
if ( digits[i] == str[0] )
{
return i;
}
}
return -1;
}
Можно ли сделать то же самое без цикла?
Без рукописного шлейфа? Да, можно вызвать std::find (а лучше - std::string::find), например. Без всяких петель? Да, вы можете использовать схематичные приемы, такие как goto и тому подобное, но я думаю, что смысл задания, которое вам дали, не в этом.
, \ не обязательно, кстати, вы можете опустить \ Должен ли он работать с этим массивом или любым конкретным массивом. В первом случае это можно сделать с четырьмя сравнениями. Кроме того, если вам нужно проверить, является ли символ буквенно-цифровым, есть стандартная функция.





if (loopsAllowed == false) {
useRecursion();
}
else {
useLoops();
}
Это довольно стандартный способ сделать что-то, если у вас есть странные требования к школьному проекту. Чего я бы избегал, так это использования goto для перехода к предыдущим разделам кода. Это буквально цикл.
Кроме того, все, что использует циклы, технически возможно с рекурсией, при наличии достаточного количества стековой памяти.
Строковый литерал лучше заменить массивом
const char *digits = { "0123456789ABCDEF" };
и использовать стандартную функцию C strchr. Например
size_t find_index( char c )
{
const char *digits = { "0123456789ABCDEF" };
c = std::toupper( ( unsigned char )c );
const char *p = std::strchr( digits, c );
return p == nullptr ? -1 : p - digits;
}
Вот демонстрационная программа.
#include <iostream>
#include <string>
#include <cstring>
#include <cctype>
size_t find_index( char c )
{
const char *digits = { "0123456789ABCDEF" };
c = std::toupper( ( unsigned char )c );
const char *p = std::strchr( digits, c );
return p == nullptr ? -1 : p - digits;
}
int main()
{
std::string s( "0123456789abcdef" );
for ( char c : s )
{
size_t i = find_index( c );
if ( i == size_t( -1 ) )
{
std::cout << "c is not a valid digit\n";
}
else
{
std::cout << c << ": " << i << '\n';
}
}
}
Вывод программы
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
a: 10
b: 11
c: 12
d: 13
e: 14
f: 15
Более строгая реализация функции (исключающая символ '\0' ) может выглядеть следующим образом:
size_t find_index( char c )
{
const char *digits = { "0123456789ABCDEF" };
const char *p = nullptr;
if ( c != '\0' )
{
c = std::toupper( ( unsigned char )c );
p = std::strchr( digits, c );
}
return p == nullptr ? -1 : p - digits;
}
Другой способ — использовать стандартные алгоритмы.
Например
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
size_t find_index( char c )
{
static const char digits[] =
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F',
};
auto it = std::find( std::begin( digits ), std::end( digits ), std::toupper( ( unsigned char )c ) );
return it == std::end( digits ) ? -1 : std::distance( std::begin( digits ), it );
}
int main()
{
std::string s( "0123456789abcdef" );
for ( char c : s )
{
size_t i = find_index( c );
if ( i == size_t( -1 ) )
{
std::cout << "c is not a valid digit\n";
}
else
{
std::cout << c << ": " << i << '\n';
}
}
}
Вывод будет таким же, как показано выше.
Поскольку массив отсортирован, вы также можете использовать стандартный алгоритм std::lower_bound вместо std::find для символов ASCII (не для EBCDIC).
Почему? Вы можете заставить компилятор развернуть цикл и сгенерировать много
if, если размер массива известен во время компиляции.