【问题标题】:C Program to Count Frequency of Element计算元素频率的C程序
【发布时间】:2021-12-04 17:04:39
【问题描述】:

我有这个代码可以从用户输入的数字中找到数字的出现。我的问题是如何首先按用户输入数字,然后要求用户在序列中找到他的号码。如果这个问题很愚蠢,我很抱歉,但我只是一个试图自学编程的初学者:) 非常感谢你的帮助!

这是我当前的代码:

int main()
{
    int num, remainder, k, count = 0;

    printf("Which number do you want to find:  \n");
    scanf("%d", &k);

    while(1)
    {
        printf("Enter numbers(end by pressing 0): ");
        scanf("%d", &num);

        remainder=num;
        if(remainder==k)count++;
        if(remainder==0) break;

    }


    printf("\Number %d occurs %d times.\n", k, count);


    getch();
    return 0;
}

这是我尝试过的:

int main()
{
    int num, remainder, k, count = 0;


    while(1)
    {
        printf("Enter numbers(end by pressing 0): ");
        scanf("%d", &num);

        remainder=num;
        if(remainder==k)count++;
        if(remainder==0) break;

    }

    printf("Which number do you want to find:  \n");
    scanf("%d", &k);

    printf("\Number %d occurs %d times.\n", k, count);


    getch();
    return 0;

【问题讨论】:

  • 您通常应该在编译器中调高警告级别。对于gcc,您可以使用-Wall -Wextra。您应该得到一些提示,例如“使用变量 k 而不进行初始化”。

标签: c find-occurrences


【解决方案1】:

如果你想先读取数字列表,你需要使用变量以某种方式将它存储在内存中,然后你才能在该列表中找到数字。

这可以通过在 C 中使用 arrays 的概念来完成。

一般来说,一个数组存储一个明确的集合/类似类型数据的列表。 例如,int 的数组存储整数集合。

您可以阅读更多关于他们的信息here,甚至可以通过 Google 搜索。

来到你的代码,你可以像这样在一个数组中声明和存储数据,

int numbers[10]; // stores 10 integers, size 10 is static here.
int remainder, k, count = 0;

printf("Enter 10 digits to store : ");
for(int i = 0; i < 10; i++) { // this is a for-loop that executes below block 10 times
    scanf("%d", &numbers[i]); // read a number to location i
}


printf("Which number do you want to find:  \n");
scanf("%d", &k);

// now use for-loop to iterate over the numbers array(while-loop can also be used)
for(int i = 0; i < 10; i++) {
    remainder=numbers[i];
    if(remainder==k)count++; // you can also directly compare numbers[i] to k
    // below line is not needed since the loop stops at 10th iteration
    // if(remainder==0) break;
}

printf("\Number %d occurs %d times.\n", k, count);

注意:

上面的代码只在用户想给出正好 10 个数字时才有效。如果用户需要提供可变数量的数字来从中找到k,那么您必须从用户那里读取数组的大小并创建一个该大小的动态数组。参考this

【讨论】:

    【解决方案2】:

    对于您的任务,您需要称为单链表的数据结构。理论上它没有限制,你可以输入任何数字序列,直到输入 0。

    这是一个演示程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct node
    {
        int number;
        struct node *next;
    };
    
    struct sequence
    {
        struct node *head;
        struct node *tail;
    };
    
    int append( struct sequence *seq, int number )
    {
        struct node *new_node = malloc( sizeof( *new_node ) );
        int success = new_node != NULL;
    
        if( success )
        {
            new_node->number =number;
            new_node->next = NULL;
            
            if ( seq->head == NULL )
            {
                seq->head = new_node;
            }
            else
            {
                seq->tail->next = new_node;
            }
    
            seq->tail = new_node;
        }
    
        return success;
    }
    
    size_t count( const struct sequence *seq, int number )
    {
        size_t cnt = 0;
    
        for ( const struct node *current = seq->head; current != NULL; current = current->next )
        {
            if ( current->number == number ) ++cnt;
        }
    
        return cnt;
    }
    
    void clear( struct sequence *seq )
    {
        while ( seq->head != NULL )
        {
            struct node *current = seq->head;
            seq->head = seq->head->next;
            free( current );
        }
    
        seq->tail = NULL;
    }
            
    int main(void) 
    {
        struct sequence seq = { .head = NULL, .tail = NULL };
    
        printf( "Enter numbers (end by entering 0): " );
    
        int number;
    
        while ( scanf( "%d", &number ) == 1 && number != 0 && append( &seq, number ) );
    
        number = 0;
    
        printf( "Which number do you want to find: " );
    
        scanf( "%d", &number );
    
        printf( "\nNumber %d occurs %zu times.\n", number, count( &seq, number ) );
    
        clear( &seq );
    
        return 0;
    }
    

    它的输出可能看起来像

    Enter numbers (end by entering 0): 1 2 3 4 5 6 7 8 9 1 8 7 6 5 4 3 2 1 0
    Which number do you want to find: 1
    Number 1 occurs 3 times.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 2011-01-10
      • 2017-09-14
      • 2021-07-28
      • 2021-08-19
      • 1970-01-01
      • 2011-08-18
      • 2014-03-01
      相关资源
      最近更新 更多