C 给定10个输入数字并存储在一个数组中,如何检查下一个值是否与上一个值不同?
这是我第一次使用数组,所以我试着在我的课本上做一些练习。任务如下: 将10个数字存储在一个数组中,无需打印即可打印每个数字 同样的数字是两次 示例: 数组值:1,2,4,6,3,7,8,44,2,1 可打印值:1、2、4、6、3、7、8、44 我设法做了一个for循环来存储数组中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
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");