我必须编写一个包含数字数组的程序,然后我需要编写一个函数来获取arr[0]
和数组的长度,然后它将打印所有数字,不包括重复的数字。
我做了这个程序,它工作得很好,但我觉得我在这个程序中使用了太多变量。(我最近几周才开始学,所以看起来不太好)
#include <stdio.h>
#define N 10
void print_set(int *arr, int n) {
int i = 1;
int duplicate_num, check_num, count;
printf(" %d", *arr); //printing the first number (arr[0]).
//starting to check the other number. if they new I'll print them. (start from arr[1]).
arr++;
while (i < n) {
if (*arr != duplicate_num) {
printf(" %d", *arr);
check_num = *arr;
// becouse I found new number, I change it no be equal to the first duplicate_num. (if there are more like him, I change them too).
while (i < n) {
if (*arr == check_num) {
*arr = duplicate_num;
}
arr++;
i++;
count++;
}
i = i - count;
arr = arr - count;
count = 0;
}
arr++;
i++;
}
}
int main() {
int arr[N] = {4, 6, 9, 8, 6, 9, 6, 1, 6, 6};
print_set(&arr[0], N);
return 0;
}
程序输出:4 6 9 8 1
我很高兴看到一个好方法使这个程序不那么混乱。
对于初学者,该函数具有未定义的行为。用户可以传递0作为第二个参数。这意味着数组是空的,没有元素。在本例中,表达式*arr
是未定义的。
第二个问题是在if语句
中使用未初始化的变量duplicate_num
if (*arr != duplicate_num) {
和未初始化的变量count
count++;
另一个问题是该函数改变了数组
if (*arr == check_num) {
*arr = duplicate_num;
}
如果你只需要在数组中输出唯一的值,那么源数组不需要改变。
函数可以如下方式定义
void print_set( const int *a, size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
size_t j = 0;
while ( j != i && a[i] != a[j] ) ++j;
if ( j == i ) printf( "%d ", a[i] );
}
putchar( 'n' );
}