为什么我的半数组测试和奇数组测试不起作用?(我用assert调试)

Why won't my half array test and odd array test work? ( I used assert to debug)

提问人:Carlos Barrett 提问时间:11/3/2023 更新时间:11/3/2023 访问量:37

问:

我的任务是使用一个函数来打印一个完整的数组,也是一个半数组,也是一个只有奇数的数组。我使用 assert 和 print 语句进行调试,但没有成功。

这是我的问题。

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

// DO NOT EDIT MAIN
/* Usage: ./mysolution [np] [n]*/

int main(int argc, char *argv[])
{
    int n = atoi(argv[2]);
    int arr[n];
    for (int i = 0; i < n; i++)
    {
        arr[i] = i;
    }

    pprintarr(arr, n, atoi(argv[1]));
    return 0;
}

这是我执行函数的地方

#include "pprint.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

/*
 * pprintarr
 * AKA Pretty Print Array
 *
 * Input:
 * arr -- ptr to an integer array
 * n -- number of members in the array
 * np -- number of members to print out
 *
 * Constraints:
 * np <= n
 * np > 0
 * n > 0
 *
 * Output:
 * if np == 5, then print:
 *  [a0 a1 a2 ... an-1 an]
 * Note that "..." should be placed in the middle
 * For odd numbers, make the head longer than the tail.
 * if n == np, then "... should not be printed."
 */

void pprintarr(int *arr, int n, int np) {
    // Ensure n and np are within valid constraints
    assert(n > 0 && "The elements in the array have to be more than zero");
    assert(np <= n && "Only able to print the numbers in the array and not beyond");
    assert(np >= 0 && "Print an empty array");
    assert(arr != NULL && "Array pointer is NULL");
    assert(np == 10 && "np should be equal to 10");
   
    // If np is 0, print an empty array and return
    if (np == 0) {
        printf("[]\n");
        return;
    }

    // Begin printing the array
    printf("[");

    if (np < n) {
        int half = np / 2; // Determine the middle point

        for (int i = 0; i < half; i++) {
            printf("%d", arr[i]);

            if (i < half - 1) {
                printf(" "); // Add a space between elements in the first half
            }
        }

        if (np % 2 == 0) {
            printf("... "); // If np is even, add "..." between the two middle elements
        } else {
            printf(" "); // Add a space in the middle for odd numbers
        }

        for (int i = n - half; i < n; i++) {
            printf("%d", arr[i]);

            if (i < n - 1) {
                printf(" "); // Add a space between elements in the second half
            }
        }
    } else {
        // If np is greater than or equal to n, print the entire array
        for (int i = 0; i < n; i++) {
            printf("%d", arr[i]);

            if (i < n - 1) {
                printf(" "); // Add a space between elements except for the last one
            }
        }
    }

    // Close the array and add a newline character
    printf("]\n");
}

这是我的测试结果

Dots Placement - Points: 10
------------------------------------------------------------
  Even (100)
   ['6', '100']
    FAIL ✗ 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
YOURS stdout: 

b''

~~~~~~~~~~
OURS : 
[0 1 2  ... 97 98 99]

b'[0 1 2  ... 97 98 99]\n' 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Odd (100)
   ['7', '100']
    FAIL ✗ 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
YOURS stdout: 

b''

~~~~~~~~~~
OURS : 
[0 1 2 3  ... 97 98 99]

b'[0 1 2 3  ... 97 98 99]\n' 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Points per Test: 5.0 pts
 Total Points for Suite: 0.0 / 10 pts

我试过使用

if (np < n) {
    int half = np / 2; // Determine the middle point

    for (int i = 0; i < half; i++) {
        printf("%d ", arr[i]); // Print the first half with spaces
    }

修复半阵列测试,但它没有用。

数组 C 函数 断言

评论

0赞 John Bollinger 11/3/2023
这。。。。。。似乎这会导致很多可能的测试用例失败。assert(np == 10 && "np should be equal to 10");
0赞 John Bollinger 11/3/2023
一旦解决了这个问题,你是否打印省略号的条件似乎是错误的。如果跳过任何数组元素,则需要省略号,这与打印的元素数的奇偶校验关系不大。
0赞 John Bollinger 11/3/2023
与是否奇数相关的指令不是关于是否打印省略号,而是关于如何选择在省略号之前打印多少个元素,在省略号之后打印多少个元素。np

答:

0赞 NoDakker 11/3/2023 #1

在尝试您的代码(停用断言测试)时,我在测试一百元素数组中的 6 个元素和一百元素数组中的 7 个元素的数组打印时在终端上收到了以下输出。

craig@Vera:~/C_Programs/Console/Arrays/bin/Release$ ./Arrays 6 100
[0 1 2... 97 98 99]
craig@Vera:~/C_Programs/Console/Arrays/bin/Release$ ./Arrays 7 100
[0 1 2 97 98 99]

偶数子集似乎非常接近预期结果,但奇数子集缺少一个元素,并且“ ...“ 垫片。似乎主要的症结在于中途值的确定以及如何为奇数子集操纵它。

考虑到这一点,以下是在函数中重构的两段代码。

    // Begin printing the array
    printf("[");

    if (np < n) {
        int half = np / 2; // Determine the middle point

        if (np % 2 != 0)        /* Add "1" to the halfway value if np is an odd number */
            half++;

发生的额外测试是,如果要打印奇数子集,由于整数除法,中间值需要增加“1”。因此,在打印了七个元素的示例中,前半部分需要是四个(根据您注意到的较大半部分是前半部分的要求)。

重构的另一点是在打印“ ...“垫片和随后的下半部分印刷。

        /* Deactivated this block of code and use the following block 
        if (np % 2 == 0) {
            printf("... "); // If np is even, add "..." between the two middle elements
        } else {
            printf(" "); // Add a space in the middle for odd numbers
        }
        */

        if (np < n)
            printf(" ... ");    /* Print the ellipses if a subset of the array is requested */

        if (np % 2 != 0)        /* Subsequently, subtract "1" from the halfway value if np is an odd number */
            half--;

在上面的叙述中从您的测试输出中评估所需的答案时,任何数组子集都应包含“ ...“间隔,而不仅仅是偶数编号的子集。此外,如果子集大小为奇数,则中间值随后需要减去“1”。

通过这些重构,以下是一些使用上述叙述中提到的数组大小和子集大小的测试,以及打印完整数组的测试。

craig@Vera:~/C_Programs/Console/Arrays/bin/Release$ ./Arrays 6 100
[0 1 2 ... 97 98 99]
craig@Vera:~/C_Programs/Console/Arrays/bin/Release$ ./Arrays 7 100
[0 1 2 3 ... 97 98 99]
craig@Vera:~/C_Programs/Console/Arrays/bin/Release$ ./Arrays 10 10
[0 1 2 3 4 5 6 7 8 9]

从你的叙述来看,这似乎是预期结果应该是什么样子。

对其进行审查,看看是否符合任务的标准。

评论

0赞 Carlos Barrett 11/4/2023
全阵列 (10) ['10', '10'] 通过 ✓ 你的: [0 1 2 3 4 5 6 7 8 9] 半阵列 (10) ['5', '10'] 通过 ✓ 你的: [0 1 2 ...8 9] 每次测试得分:5.0 分 套件总得分:10.0 / 10 分 ************************ 点位置 - 点数:10 ------------------------------------------------------------ 偶数 (100) ['6', '100'] 通过 ✓ 你的:[0 1 2 ...97 98 99] 单数 (100) ['7', '100'] PASS ✓ YOURS: [0 1 2 3 ...97 98 99] 每次测试得分:5.0 分 套件总分:10.0 / 10 分。 工作完美