提问人:Carlos Barrett 提问时间:11/3/2023 更新时间:11/3/2023 访问量:37
为什么我的半数组测试和奇数组测试不起作用?(我用assert调试)
Why won't my half array test and odd array test work? ( I used assert to debug)
问:
我的任务是使用一个函数来打印一个完整的数组,也是一个半数组,也是一个只有奇数的数组。我使用 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
}
修复半阵列测试,但它没有用。
答:
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 分。 工作完美
评论
assert(np == 10 && "np should be equal to 10");
np