打印出指向序列中值的指针变量

时间:2018-09-09 10:54:24

标签: c pointers

我被困在该练习中,无法在屏幕上正确打印“ maxcount”和“ mostnum”的值。

#include<stdio.h>
#include<stdlib.h>
#define size 100
void analyzeFrequencies(int sequence[], int* mostnum, int *maxcount, int 
length)
{
    int i=0, j=0, count=0;
    for(i=0;i < length;i++)
    {
        for(j=i; j < length; j++)
        {
          if(sequence[i]==sequence[j])
          {
            count++;
          }
        }
        if(count>=*maxcount)
        {
           maxcount=&count;
           mostnum=&sequence[i];
        }
    }
}

int main(void)
{
    int i, length;
    int *mostnum, *maxcount;
    int sequence[size]={};
    char answer;

    do
    {
        length=0;
        for(i=0; i<size; i++)
        {
            printf("Enter numbers between 0-1000: ");
            scanf("%d",&sequence[i]);
            if(sequence[i]<0)
            {
                break;
            }
            else if(sequence[i]>1000)
            {
                printf("Wrong input, try again.\n");
            }
            length++;
        }
        analyzeFrequencies(sequence, mostnum, maxcount, length);
        printf("The number %d occurs the most time, in total %d times\n", *mostnum, *maxcount);
        printf("Do you want to enter another sequence (yes = y, no= n)? ");
        scanf("%c",&answer);
    }while(answer == 'y');

    return 0;
}

在本练习中,我要做的是在屏幕上打印出序列中哪个数字出现最多,出现多少次。当我必须使用指针执行此操作时,会出现我的问题,因为我不确定自己正在得到什么并且没有任何意义。 在这里您可以看到规则。


  

您应该编写一个函数analyzeFrequencies()​​,该函数可以计算已发生的整数自从函数计算以来,序列中出现的次数最多,发生了很多次。两种不同的结果,函数应将这些结果作为指针变量作为参数。

     

analyzeFrequencies()​的规则:

     
      
  • 不应该返回一个值(通过指针计算结果)。
  •   
  • 该功能必须接受用户作为数组参数输入的序列
  •   
  • 应采用两个计算值(出现次数最多和发生次数)作为指针变量参数。
  •   
  • 该功能可能无法从用户那里获得任何更多输入,并且可能不会在其上打印任何内容屏幕。
  •   
     

其他规则:

     
      
  • 必须在​​main()​​中输入序列,并且也应从main()中输入所有打印输出 �。
  •   
  • 在对序列进行了分析之后,如果他或她想要的话,应该向用户询问输入新序列。
  •   

1 个答案:

答案 0 :(得分:1)

您误解了原因在这种情况下使用了指针。由于C仅允许您从函数返回一个项目,因此本练习使用指针在函数内部设置值。

这意味着您不应该在main中声明指针。相反,您应该声明int,然后将应用&地址的结果传递给它们:

int mostnum, maxcount;
analyzeFrequencies(sequence, &mostnum, &maxcount, length);

analyzeFrequencies内保留指针,并这样分配:

if(count>=*maxcount)
{
   *maxcount = count;
   *mostnum = sequence[i];
}

现在,在函数内部分配的值将在main中声明的局部变量上执行,因为您是通过指针传递它们的。

由于您在分配之前已在*maxcount中阅读了analyzeFrequencies,因此必须在进入循环之前添加一个分配,如下所示:

int i=0, j=0, count=0;
*maxcount = 0; // <<== Add this line
for(i=0;i < length;i++)

注意:您在代码中还有其他错误与传递指针无关。例如,当您打印“输入错误,请重试”时,应调整i以再次引用相同的位置,否则错误的输出将保留在序列中。