C 给定10个输入数字并存储在一个数组中,如何检查下一个值是否与上一个值不同?

C 给定10个输入数字并存储在一个数组中,如何检查下一个值是否与上一个值不同?,c,arrays,loops,for-loop,unique,C,Arrays,Loops,For Loop,Unique,这是我第一次使用数组,所以我试着在我的课本上做一些练习。任务如下: 将10个数字存储在一个数组中,无需打印即可打印每个数字 同样的数字是两次 示例: 数组值:1,2,4,6,3,7,8,44,2,1 可打印值:1、2、4、6、3、7、8、44 我设法做了一个for循环来存储数组中10个值中的每一个,但我不知道如何检查彼此之间存储的值 我的代码到目前为止 int main() { int array[10], values[10], i; printf("insert 10 in

这是我第一次使用数组,所以我试着在我的课本上做一些练习。任务如下:

将10个数字存储在一个数组中,无需打印即可打印每个数字 同样的数字是两次

示例:

数组值:1,2,4,6,3,7,8,44,2,1

可打印值:1、2、4、6、3、7、8、44

我设法做了一个for循环来存储数组中10个值中的每一个,但我不知道如何检查彼此之间存储的值

我的代码到目前为止

int main()
{
    int array[10], values[10], i;

    printf("insert 10 integers:");
    for(i=0; i<10; i++)
    {
        printf("\n");
        scanf("%d", &array[i]);
    }

    return 0;
}
intmain()
{
int数组[10],值[10],i;
printf(“插入10个整数:”);

对于(i=0;i我喜欢戈文德·帕尔马的建议

另一种方法可能是在打印时保留“副本”列表

例如(伪代码):

#定义数组大小10
void get_值(int[]数组,int n_元素){
printf(“插入%d个整数:”,n_个元素);
对于(inti=0;i来说,这很容易

对于初学者来说,如果你被要求只输出一个数组,不要改变它。输出一个数组和改变它是两件不同的事情

另外,声明一个大小相同的辅助数组以输出原始数组也会消耗资源

您需要的是两个嵌套循环,仅此而已

不要在你的程序中使用像10这样的幻数。使用命名常量

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    int array[] = { 1, 2, 4, 6, 3, 7, 8, 44, 2, 1 };
    const size_t N = sizeof( array ) / sizeof( *array );

    for ( size_t i = 0; i < N; i++ )
    {
        size_t j = 0;
        while ( j != i && array[j] != array[i] ) ++j;

        if ( j == i ) printf( "%d ", array[i] );
    }

    putchar( '\n' );

    return 0;
}

只要元素的数量较少,就不需要担心性能。因此,您可以在当前元素之前循环所有元素,查看当前值是否已打印

换句话说,如果您当前想知道是否打印索引3中的元素,那么请查看索引0、1或2中的元素是否具有相同的值

这可以通过多种方式实现-以下是一种:

for(int i=0; i<10; i++)
{
    // Flag to tell if current element shall be printed.
    //       Set flag to 1, i.e. assume current element shall be printed
    int doPrint = 1;

    // Now check for duplicates in the elements before the i'th element
    for(int j=0; j<i; j++)
    {
        if (values[i] == values[j])
        {
            // Duplicate found. Don't print. Clear flag.
            doPrint = 0;
        }
    }

    // Print if doPrint-flag is still 1
    if (doPrint) printf("%d ", values[i]);
}
printf("\n");

for(int i=0;ii如果您先对数组排序,这将更容易跟踪。这是家庭作业吗?一个简单的方法是有两个嵌套循环,外部循环从
0
9
,内部循环(
for(int j=0;j
)它将检查数组直到索引
i
。例如,如果
i
2
,则内部循环将只检查索引
0
1
。如果在到达
j==i
之前中断此循环,则不要打印数字。对于较大的数组,正确的方法是使用数据结构which会很快告诉您是否已经输入了数字(哈希表或树)。@GovindParmar True。但是a)似乎所需的输出没有排序(当然取决于您读取“可打印值”的方式)b)我估计在这门课的前面大约有两章是排序的。你会怎么在纸上做呢?提示:你所有的数字都写在A纸上。从A纸上取第一个数字,检查它是否已经写在B纸上,如果没有,就写在B纸上。然后从pa纸上取第二个数字根据A,检查它是否已经写在B张纸上,如果没有,则写在B张纸上,依此类推。@Jabberwocky是的,它应该是1,3,4,5,7,8。如果用户多次输入相同的数字,打印值时不重复两次或更多,基本上是这样。@4386427-我同意,我已经相应地更新了回复。
#include <stdio.h>

int main(void) 
{
    int array[] = { 1, 2, 4, 6, 3, 7, 8, 44, 2, 1 };
    const size_t N = sizeof( array ) / sizeof( *array );

    for ( size_t i = 0; i < N; i++ )
    {
        size_t j = 0;
        while ( j != i && array[j] != array[i] ) ++j;

        if ( j == i ) printf( "%d ", array[i] );
    }

    putchar( '\n' );

    return 0;
}
1 2 4 6 3 7 8 44 
for(int i=0; i<10; i++)
{
    // Flag to tell if current element shall be printed.
    //       Set flag to 1, i.e. assume current element shall be printed
    int doPrint = 1;

    // Now check for duplicates in the elements before the i'th element
    for(int j=0; j<i; j++)
    {
        if (values[i] == values[j])
        {
            // Duplicate found. Don't print. Clear flag.
            doPrint = 0;
        }
    }

    // Print if doPrint-flag is still 1
    if (doPrint) printf("%d ", values[i]);
}
printf("\n");