简体   繁体   English

计算元素频率的 C 程序

[英]C Program to Count Frequency of Element

I have this code which finds occurrence of number from numbers entered by user.我有这个代码,它从用户输入的数字中找到数字的出现。 My question is how to firstly enter numbers by user and then ask user to find his number in the sequence.我的问题是如何首先由用户输入数字,然后让用户在序列中找到他的号码。 I'm sorry if this question is stupid, but I'm just a beginner trying to teach myself how to program :) Thank you so much for your help!如果这个问题很愚蠢,我很抱歉,但我只是一个试图自学编程的初学者:) 非常感谢您的帮助!

This is my current code:这是我当前的代码:

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;
}

This is what I tried:这是我尝试过的:

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;

If you want to read the number list first, you need to store it somehow in the memory using variables and then you can find the number in that list.如果您想先读取数字列表,则需要使用变量以某种方式将其存储在内存中,然后才能在该列表中找到数字。

This can be done by using the concept of arrays in C.这可以通过使用 C 中的arrays概念来完成。

In general, an array stores a definite collection/list of similar typed data.通常,数组存储类似类型数据的明确集合/列表。 For example, an array of int stores a collection of integers.例如,一个int数组存储一个整数集合。

You can read more about them here , or even you can google it.你可以在这里阅读更多关于它们的信息,甚至你也可以用谷歌搜索。

Coming to your code, You can declare and store data in an array like this,来到您的代码,您可以像这样在数组中声明和存储数据,

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);

Note:笔记:

The above code works only when the user wants to give exactly 10 numbers.上面的代码仅在用户想要给出 10 个数字时才有效。 If the user needs to give variable number of numbers to find k from, then you will have to read the size of the array from user and create a dynamic array of that size.如果用户需要提供可变数量的数字以从中找到k ,那么您必须从用户读取数组的大小并创建该大小的动态数组。 Refer this参考这个

You can safely ignore all answers except mine.:)您可以放心地忽略除我之外的所有答案。:)

For your task you need the data structure that is called singly-linked list.对于您的任务,您需要称为单链表的数据结构。 Theoretically it does not have a limit and you can enter any sequence of numbers until 0 will be entered.理论上它没有限制,您可以输入任何数字序列,直到输入 0。

Here is a demonstrative program.这是一个演示程序。

#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;
}

Its output might look like它的输出可能看起来像

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.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM