Распечатайте указатели переменных, которые указывают на значение в последовательности - PullRequest
0 голосов
/ 09 сентября 2018

Я застрял в этом упражнении, в котором я не могу правильно вывести значения «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 голосов
/ 09 сентября 2018

Вы неправильно поняли причину , в которой используются указатели. Поскольку C позволяет возвращать только один элемент из функции, в упражнении вместо этого используются указатели для установки значений внутри функции.

Это означает, что вы не должны объявлять указатели в main. Вместо этого вы должны объявить int s и передать результат применения оператора address-of & к ним:

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 для повторного обращения к той же позиции, в противном случае неправильный вывод останется в последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...