Почему не вернуть истину, даже если мое условие проверено - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в программировании и работаю над этой программой.

Требование: Напишите программу C для проверки заданного массива (длина будет не менее 2) целых чисел и возврата true если рядом два значения 15, 15.

Хотя мое условие проверено, функция не возвращает истину, если я не исключу «else». Но если я исключаю else, он возвращает не 0, когда ложно, а любое другое случайное число. Не понимаю, почему и как это исправить.

#include <stdio.h>
#include <stdbool.h>

int check_fifteen(int a[], int size);

int main(){
   int a[]={1, 6, 15, 15, 3, 5, 15};
   int size= sizeof(a) / sizeof(a[0]);

   printf( "%d", check_fifteen(a, size));

}
int check_fifteen(int a[], int size){
   int i=0;

   if(size < 2){
       return 0;
   }
   for(i=0; i<size-1; i++){
       if( ( a[i] == 15 ) && ( a[i+1] == 15  ) ){
           return true;
       }
       else
           return false;
   }
}

Ответы [ 4 ]

1 голос
/ 04 августа 2020

l oop прерывается, как только встречаются два последовательных элемента массива, которые либо равны друг другу и равны 15, либо не равны.

   for(i=0; i<size-1; i++){
       if( ( a[i] == 15 ) && ( a[i+1] == 15  ) ){
           return true;
       }
       else
           return false;
   }  

По крайней мере, место оператор return false за пределами l oop.

   for(i=0; i<size-1; i++){
       if( ( a[i] == 15 ) && ( a[i+1] == 15  ) ){
           return true;
       }
   }
   return false;

Было бы лучше объявить и определить функцию следующим образом:

int check_fifteen( const int a[], size_t size )
{
    const int Target = 15;
    int success = 0;

    for ( size_t i = 1; !success && i < size; i++ )
    {
        if ( a[i] == Target ) success = a[i-1] == Target;
    }

    return success;
}

и переменная size объявить например,

size_t size = sizeof(a) / sizeof(a[0]);

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

Вот, пожалуйста.

#include <stdio.h>

int check_equal_adjacent( const int a[], size_t size, int value )
{
    int success = 0;

    for ( size_t i = 1; !success && i < size; i++ )
    {
        if ( a[i] == value ) success = a[i-1] == value;
    }

    return success;
}

int main(void) 
{
    int a[] = { 1, 6, 15, 15, 3, 5, 15 };
    size_t size = sizeof( a ) / sizeof( *a );

    printf( "%s\n", check_equal_adjacent( a, size, 15 ) ? "true" : "false" );
   
    return 0;
}

Вывод программы

true
1 голос
/ 04 августа 2020

Даже если одна пара не удовлетворяет if condition, вы возвращаете false. Этого не должно происходить, вы должны проверить все пары и затем вернуть false, если ни одна из них не удовлетворяет.

if( ( a[i] == 15 ) && ( a[i+1] == 15  ) ){
           return true;
       }
       else
           return false;
}

To

for(i=0; i<size-1; i++){
       if( ( a[i] == 15 ) && ( a[i+1] == 15  ) ){
           return true; // if any pair satisfies you return true there itself
       }
}

// you will reach here only if every pair doesn't satisfy the requirement. 
return false;
0 голосов
/ 04 августа 2020

Ошибки этого типа легко избежать, если вы будете следовать правилу (директива, стили c предпочтение), согласно которому каждая функция должна иметь только одну точку возврата. Просто поддерживайте флаг, который устанавливается, когда вы видите условие проверки. Что-то вроде:

int
check_fifteen(const int *a, int size)
{
        int status = 0;
        const int *b = a + size;
        while( a + 1 < b && !status ) {
                status = a[0] == 15 && a[1] == 15;
                a += 1;
        }
        return status;
}

Обратите внимание, что вы можете немного сократить работу с помощью простой «оптимизации» (помня, что преждевременная оптимизация - это root всех зол):

int
check_fifteen(const int *a, int size)
{
        int status = 0;
        const int *b = a + size;
        while( a + 1 < b && !status ) {
                if( a[1] == 15 ) {
                        status = *a++ == 15;
                } else {
                        a += 2;
                }
        }
        return status;
}
0 голосов
/ 04 августа 2020

Проблема в том, что функция check_fifteen уже возвращает false на первой итерации, потому что, поскольку условие if не выполняется (первые два элемента указанного массива не содержат значения 15 ) внутри оператора else вы сразу же возвращаете false.

for (i = 0; i < size-1; i++){
   if ( ( a[i] == 15 ) && ( a[i+1] == 15  ) ){
       return true;
   }
   else
       return false;    // You tell: If the 'if' condition is not matched, return `false`.
}

Поместите return false; после l oop, чтобы оператор else не возвращал функцию уже на первой итерации, когда if ( a[i] == 15 && a[i+1] == 15 ) не соответствует действительности.

for (i = 0; i < size-1; i++){
   if ( a[i] == 15  && a[i+1] == 15 ) {
       return true;
   }
}

return false;
...