-2

我想减少一个指向数组最后一个元素的指针,并检查如果指针的值小于 5,什么都不做,然后进入下一轮循环,如果不是,那就是值是等于或大于 5,打印该值。因此,对于示例中的数组,我只希望打印 6,这是第一次遇到等于或大于 5 的值。我尝试了下面的代码,但是在编译时没有错误,它不打印任何价值。我很感激你对此的评论。

#include<stdio.h>

//The is a C program to decrement an array from the last element to the first. 
    int x[11] = {5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2}; 
    int *lastElem, count;
int main (void) {
    lastElem = &x[10];
    for (count = 0; count < 11; count++)
        if (abs(*lastElem) < 5)
        continue;
        else 
        printf("%d\n", *lastElem--); 
    return 0;
}
4

4 回答 4

3

你的递减逻辑有问题。如果该值小于 5,则您错过了减量。

检查下面的代码。

#include<stdio.h>

//The is a C programme to decrement an array from the last element to the first. 
    int x[11] = {5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2};
    int *lastElem, count;
int main (void) {
    lastElem = &x[10];
    for (count = 0; count < 11; count++)
    {
        if (*lastElem >= 5)
            {
            printf("%d\n", *lastElem);
             break ;
             }
        lastElem--;
    }
return 0;
}

编辑:

当您修改问题以包含absolute value比较时,更改如下所示。

注意:当对原始问题进行一些重大更改[这将改变行为和输出]时,请记下这一点,如果可能,请正确提及编辑。

#include<stdio.h>
#include <stdlib.h>

//The is a C programme to decrement an array from the last element to the first. 
int x[11] = {5, -6, -4, -3, -2, -1, 4, 3, 2, 1, -2};
int *lastElem, count;
int main (void) {
        lastElem = &x[10];
        for (count = 0; count < 11; count++)
        {
                if ( abs(*lastElem) >= 5)
                {
                        printf("%d\n", *lastElem);
                        break;
                }
                lastElem--;
        }
        return 0;
}
于 2014-12-01T12:35:01.430 回答
3

您永远不会lastElem为初始值(即第 10 个元素)分配另一个地址。此外,如果你想倒退,设置count为 10 并让它计数为 0。在每个循环中,你必须分配&x[count]lastElem或递减它,因为它是一个指针,并且地址将根据它指向的对象递减) )。

于 2014-12-01T12:35:45.837 回答
1

该行printf("%d\n", *lastElem--);并不总是执行,它仅在abs(*lastElem) >= 5. 你应该这样做

#include<stdio.h>

//The is a C programme to decrement an array from the last element to the first. 
int x[11] = {5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2}; 
int *lastElem, count, value;
int main (void) 
{
    lastElem = &x[10];
    for (count = 0; count < 11; count++)
    {
        value = *(lastElem--);
        if (value < 5)
            continue;
        printf("%d\n", value);
        break;
    }
    return 0;
}

这将使用continue.

于 2014-12-01T12:38:27.473 回答
1

这是执行任务的其他答案中唯一正确的代码。:)

实际上,您需要一个程序来向后搜索满足给定条件的数组元素。如果有这样的元素,那么输出它。

#include <stdio.h>
#include <stdlib.h>

int main( void ) 
{
    int a[] = { 5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2 }; 
    const size_t N = sizeof( a ) / sizeof( *a );
    int *first = a, *last = a + N;

    while ( first != last && ( unsigned int )abs( *( last - 1 ) ) < 5 ) --last;

    if ( first != last ) printf( "%d\n", *--last );

    return 0;
}

输出是

6

下面展示了此类任务的一般方法

#include <stdio.h>
#include <stdlib.h>

int * find_backward( const int a[], size_t n, int ( *predicate )( int ) )
{
    const int *first = a, *last = a + n;

    while ( first != last && !predicate( *( last -1 ) ) ) --last;

    return ( int * )last;
}

int is_greater_or_equal_to_5( int x )
{
    return 5 <= ( unsigned int )abs( x );
}

int main( void ) 
{
    int a[] = { 5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2 }; 
    const size_t N = sizeof( a ) / sizeof( *a );


    int *target = find_backward( a, N, is_greater_or_equal_to_5 );  

    if ( target != a ) printf( "%d\n", *--target );

    return 0;
}

使用这种方法,您可以使用任何整数数组(即使大小为零)和通过谓词设置的任何条件。

例如,如果您想找到可被 3 整除的数组的最后一个元素,您可以编写

#include <stdio.h>
#include <stdlib.h>

int * find_backward( const int a[], size_t n, int ( *predicate )( int ) )
{
    const int *first = a, *last = a + n;

    while ( first != last && !predicate( *( last -1 ) ) ) --last;

    return ( int * )last;
}

int divisible_by_3( int x )
{
    return x % 3 == 0;
}

int main( void ) 
{
    int a[] = { 5, 6, -4, -3, -2, -1, 4, 3, 2, 1, -2 }; 
    const size_t N = sizeof( a ) / sizeof( *a );


    int *target = find_backward( a, N, divisible_by_3 );    

    if ( target != a ) printf( "%d\n", *--target );

    return 0;
}

输出是

3

考虑到这个函数还允许处理常量数组。:)

于 2014-12-01T13:01:44.480 回答