练习基本的 - 程序问题
practicing the basic - problem with program
我是这个网站的新人,希望可以回答 post 这样的问题。
我正在尝试学习 C 语言,但我遇到了一个问题,我一直坚持着。
-- 我需要得到 10 个数字然后打印它但没有重复的数字:
就像我得到 1 2 3 4 5 6 1 2 3 - 我只需要打印 1 2 3 4 5 6. --
这就是我所做的:
#include <stdio.h>
int main()
{
int arr1[10] = {0};
int arr2[10] = {0};
int i, j, c;
printf("Please enter 10 numbers:\n");
for (i=0; i<10; ++i) {
scanf(" %d", &arr1[i]);
}
i = j = c = 0;
for (i=0; i<10; ++i) {
while (arr1[i] != arr2[j], j<10) {
++j;
}
if (j==10) {
arr2[c] = arr1[i];
++c;
}
j=0;
}
for (i=0; i<10; ++i) {
printf("%d ", arr2[i]);
}
return 0;
}
输入 - 8 1 2 1 2 3 4 5 6 7
输出 - 8 1 2 1 2 3 4 5 6 7(我不应该打印重复的数字)
在这个 while 循环中
while (arr1[i] != arr2[j], j<10)
使用了带逗号运算符的表达式。逗号运算符第一个操作数 arr1[i] != arr2[j]
的值被丢弃,表达式的结果是逗号运算符 j<10
.
第二个操作数的值
因此在循环之后变量 j
将始终等于 10
。事实上你有以下循环
while ( j < 10 ) {
++j;
}
因为逗号运算符的第一个操作数没有副作用。
你必须写
while ( j < c && arr1[i] != arr2[j] )
++j;
}
if (j==c) {
arr2[c] = arr1[i];
++c;
}
即只需要检查第二个数组的 c
个元素。
还有这个for循环
for (i=0; i<10; ++i) {
printf("%d ", arr2[i]);
}
应该改写成
for (i=0; i < c; ++i) {
printf("%d ", arr2[i]);
}
实际上,要输出数组的唯一元素,无需创建第二个数组。该程序可以如下所示
#include <stdio.h>
int main( void )
{
enum { N = 10 };
int arr1[N] = {0};
printf( "Please enter %d numbers:\n", N );
for ( size_t i = 0; i < N; ++i )
{
scanf( "%d", &arr1[i] );
}
for ( size_t i = 0; i < N; ++i )
{
size_t j = 0;
while ( j != i && arr1[i] != arr1[j] ) ++j;
if ( j == i ) printf( "%d ", arr1[i] );
}
putchar( '\n' );
}
请注意,您应该使用命名常量而不是像 10 这样的幻数,并且您应该在使用它们的最小范围内声明变量。
我是这个网站的新人,希望可以回答 post 这样的问题。 我正在尝试学习 C 语言,但我遇到了一个问题,我一直坚持着。
-- 我需要得到 10 个数字然后打印它但没有重复的数字: 就像我得到 1 2 3 4 5 6 1 2 3 - 我只需要打印 1 2 3 4 5 6. --
这就是我所做的:
#include <stdio.h>
int main()
{
int arr1[10] = {0};
int arr2[10] = {0};
int i, j, c;
printf("Please enter 10 numbers:\n");
for (i=0; i<10; ++i) {
scanf(" %d", &arr1[i]);
}
i = j = c = 0;
for (i=0; i<10; ++i) {
while (arr1[i] != arr2[j], j<10) {
++j;
}
if (j==10) {
arr2[c] = arr1[i];
++c;
}
j=0;
}
for (i=0; i<10; ++i) {
printf("%d ", arr2[i]);
}
return 0;
}
输入 - 8 1 2 1 2 3 4 5 6 7
输出 - 8 1 2 1 2 3 4 5 6 7(我不应该打印重复的数字)
在这个 while 循环中
while (arr1[i] != arr2[j], j<10)
使用了带逗号运算符的表达式。逗号运算符第一个操作数 arr1[i] != arr2[j]
的值被丢弃,表达式的结果是逗号运算符 j<10
.
因此在循环之后变量 j
将始终等于 10
。事实上你有以下循环
while ( j < 10 ) {
++j;
}
因为逗号运算符的第一个操作数没有副作用。
你必须写
while ( j < c && arr1[i] != arr2[j] )
++j;
}
if (j==c) {
arr2[c] = arr1[i];
++c;
}
即只需要检查第二个数组的 c
个元素。
还有这个for循环
for (i=0; i<10; ++i) {
printf("%d ", arr2[i]);
}
应该改写成
for (i=0; i < c; ++i) {
printf("%d ", arr2[i]);
}
实际上,要输出数组的唯一元素,无需创建第二个数组。该程序可以如下所示
#include <stdio.h>
int main( void )
{
enum { N = 10 };
int arr1[N] = {0};
printf( "Please enter %d numbers:\n", N );
for ( size_t i = 0; i < N; ++i )
{
scanf( "%d", &arr1[i] );
}
for ( size_t i = 0; i < N; ++i )
{
size_t j = 0;
while ( j != i && arr1[i] != arr1[j] ) ++j;
if ( j == i ) printf( "%d ", arr1[i] );
}
putchar( '\n' );
}
请注意,您应该使用命名常量而不是像 10 这样的幻数,并且您应该在使用它们的最小范围内声明变量。