需要有关数组和循环的帮助

时间:2011-07-18 03:44:58

标签: c++ arrays loops

使用单下标数组解决以下问题:读入20个数字,每个数字介于10和100之间(包括10和100)。读取每个数字时,仅在它与已读取的数字不重复时才打印。提供所有20个数字不同的“最坏情况”。使用尽可能小的数组来解决这个问题。

这是我到目前为止所做的:

#include <stdio.h>
#define SIZE 20

int duplicate (int num[] );
int main ()
{
    int i, numbers[ SIZE ];
    printf( " Enter 20 numbers between 10 and 100:\n " );
    scanf_s( "%d\n" );

    for (int i = 0; i < SIZE  - 1; i++ ); 
    {


int duplicate( int num[] )
{
    int i, hold;

    for ( i = 0; i <= SIZE - 1; i++ )
        if ( num[i] == num[i=1] ){
            hold = num[i];
            else
                hold = num[i+1];
        }

    printf( "%3d\n," num[ i ] );
}

4 个答案:

答案 0 :(得分:4)

不幸的是,你的教授可能不够聪明,无法解决自己的问题。这个问题的最小可能数组是2号(假设一个64位数据类型,这是标准规定的最大数据。对于32位整数,它需要三个元素,并且有128位整数,只有1)。

#include <stdint.h>
#include <stdio.h>
int main(void)
{
    int_fast64_t visited[2] = { 0 };
    int inputs_left = 20;
    do {
        int input, slot;
        int_fast64_t mask;
        puts("Enter an integer between 10 and 100: ");
        if (!scanf("%d", &input)) {
            puts("That's not a number!\n");
            continue;
        }
        if (input < 10 || input > 100) {
            puts("Out of range!\n");
            continue;
        }
        slot = (input - 10) >> 6;
        mask = 1 << ((input - 10) & 0x3F);
        if (visited[slot] & mask) {
             puts("Already seen, it is a duplicate.\n");
        }
        else {
            visited[slot] |= mask;
            printf("%d is new\n", input);
        }
        inputs_left--;
    } while (inputs_left);
    return 0;
}

如果您能正确解释它的工作原理,欢迎您在作业中使用此代码(我希望您的教授教您如何撰写评论)。

答案 1 :(得分:2)

这是我想出来的,感谢大家的帮助:

  #include <stdio.h>
  #define MAX 20

  int main()
  {
int a[ MAX ] = { 0 };  /* user input */
int i;                 /* counter */
int j;                 /* counter */
int k = 0;             /* number of integers entered */
int duplicate;         /* notify of duplicates */   
int value;              

printf( "Enter 20 numbers between  10 - 100;\n" );

      /* ask user for 20 numbers */
      for ( i = 0; i <= MAX - 1; i++ ){

    duplicate = 0;
    scanf( "%d", &value);

     /* decide if integer is duplicate */
    for ( j = 0; j < k; j++ ) {

     /* notify and stop loop if duplicate */
        if ( value == a[ j ] ) {
        duplicate = 1;
        break;
        { /* end if */



     /* enter number into array if it's not a duplicate */
        if ( !duplicate )
        a[ k++ ] = value;

} /* end if */

答案 2 :(得分:1)

您的代码存在一些问题:

  • 复制功能在主函数内。
  • 我被多次宣布
  • 在第一次for循环后不应该有分号。
  • 保持变量未用于任何内容。它只被分配了一个值。
  • num [i = 1] - 不确定你在这里尝试做什么,但是i = 1将i设置为1.
  • 在你的第一个for循环中,你的状况是i&lt; SIZE - 1,意味着它将循环19次,而不是20次。应该是i&lt; SIZE或i&lt; = SIZE - 1。
  • 你的if语句应该为每个if / else使用大括号({}),或者根本不使用。

    if (test) {
        // code
    }
    else {
        // code
    }
    

    if (test)
        // code
    else
        // code
    

至于逻辑:

  • 您只获得一个整数,而不是数字数组。您需要逐个获得20个整数,并在每次用户输入数字时检查数组。
  • 复制功能应该采用第二个参数,即您要检查的数字。 if语句将检查num [i]是否等于您要查找的数字。
  • 请记住初始化数组值并仅检查已设置的值。例如,当用户输入第三个数字时,您只想检查数组中的前两个数字,看它是否已经存在。

PS:请尝试正确缩进代码。如果没有正确缩进,许多人甚至都不会尝试提供帮助。

答案 3 :(得分:0)

我的C非常生疏,所以这是一个伪代码解决方案(因为这个功课,你应该为自己做一些):

print initial prompt;

declare nums[ array size 20 ]; // I later assume a 0-based index
declare boolean found;

for (i=0; i < 20; i++) {
  // prompt for next number if desired
  read next number into nums[i];
  found = false;
  // compare against all previously read numbers
  for (j=0; j < i; j++) {
    if (nums[j] == nums[i]) {
      found = true;
      break;
    }
  }
  if (!found) {
    print nums[i];
  }
}

注意:所述问题并未说明数字必须是整数。此外,它说“使用尽可能小的数组” - 如果你为当前数字引入一个非数组变量,你可以使用19个元素数组(因为第20个数字只需要检查前19个,而不是反对自己),但这会使代码更复杂。

另请参阅我上面发布的评论,其中提到了代码中的一些特定问题。并检查所有括号是否匹配。