2015-06-09 5 views
1
for(int i=0; i<len_arr; i++) 
    if(arr[i] == some_num){ 
     printf("The idx of %d is: %d\n", some_num, i); 
     break; 
    } 
if(i == len_arr) 
    printf("Number not found.\n"); 

Это не работает. Потому что i не может быть доступен за пределами цикла.Как узнать, что цикл был разбит раньше?

Я подумал о двух способах достижения того, что я хочу.

Но мой вопрос: Есть ли какой-либо другой более элегантный способ, чтобы сделать эффект?

Способ 1:

int i; 
for(i=0; i<len_arr; i++) 
    if(arr[i] == some_num){ 
     printf("The idx of %d is: %d\n", some_num, i); 
     break; 
    } 
if(i == len_arr) 
    printf("Number not found.\n"); 

Способ 2:

for(int i=0; (i<len_arr) && (printf("Number not found.\n")); i++) 
    if(arr[i] == some_num){ 
     printf("The idx of %d is: %d\n", some_num, i); 
     break; 
    } 
+2

Я бы проголосовал Way1. Или добавьте логический флаг, который не является таким элегантным, но четко указывает, что вы хотите сделать. – marom

+0

Вы уверены, что ваш второй способ работает? – CinCout

+1

Первый вопрос..Что вы не создаете свой собственный объем «для цикла». просто поставьте скобки. Я что-то упускаю? – Spanky

ответ

2

Я нахожу решение Luka Rahne в наиболее ideomatic.

Если вы действительно хотите сделать петлю вы могли бы сделать это следующим образом:

for(size_t i(0); i <= len_arr; ++i) 
{ 
    if(i == len_arr) 
    { 
     std::cout << "Number not found." << std::endl; 
    } 
    else if(arr[i] == some_num) 
    { 
     std::cout << "Found " << some_num << " at index: " << i << std::endl; 
     break; 
    } 
} 
1

Есть много способов для достижения этой цели. Я обычно делал вот так:

bool found = false; 
for(int i=0; i<len_arr; i++) 
{ 
    if(arr[i] == some_num) 
    { 
     printf("The idx of %d is: %d\n", some_num, i); 
     found = true; 
     break; 
    } 
} 
if(!found) 
    printf("Number not found.\n"); 

Этот вариант выглядит наиболее понятным для меня.

+1

Даже с решением Луки Ране? – Jarod42

+1

Ну, вопрос был «Как узнать, что цикл был разорван раньше?». Я предположил, что код был просто примером для демонстрации идеи, а не «производственного кода». Если вопрос заключается в «правильном написании данного кода?», То решение Luka Rahne - это путь. –

+0

@SergiiKhaperskov Вы правы. Код - это демонстрация. В моей реальной ситуации я ничего не нахожу. –

9

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

auto start = arr; 
auto end = arr + len; 
auto val = std::find(start,end,some_num); 
if (val != end) 
    printf("The idx of %d is: %d\n", some_num, std::distance(start,val)); 
else 
    printf("Number not found.\n"); 
+0

это * есть * самый элегантный способ. – Massa

0

Лично я не люблю перерыв в цикле, и это мое решение:

bool found = false; 
for(int i=0; i<len_arr && !found; i++){ 
    if(arr[i] == some_num){ 
     printf("The idx of %d is: %d\n", some_num, i); 
     found = true; 
    } 
} 
if(!found) 
    printf("Number not found.\n"); 
1

Если вы не хотите использовать зЬй как Лука говорит, и только хочет сделать простой цикл, вы можете сделать как я всегда делаю:

int i; 
for(i = 0; i < len_arr && arr[i] != some_num; i++); 
if(i < len_arr) 
    printf("The idx of %d is: %d\n", some_num, i); 
else 
    printf("Number not found.\n"); 
Смежные вопросы