Моя программа зацикливается бесконечно, и я, честно говоря, не уверен, почему - PullRequest
0 голосов
/ 21 мая 2019

Таким образом, проблема здесь заключалась в том, чтобы написать программу, которая использует указатели для указания на функции и написать ее таким образом, чтобы она собирала 10 двойных чисел, давала обратную связь пользователю программы, сортировала их и печатала отсортированные результаты в качестве доказательства. , Проблема в том, что программа либо печатает оператор printf в начале бесконечно, либо собирает числа бесконечно.

Вот код

#include <stdio.h>


void func1(double x);
void below_five(void);
void above_five(void);
void other(void);
void sort(double *p[], int n);
void print_doubles(double *p[], int n);

int main(void){

  double *numbers[9];
  int nbr;
  printf("\nEnter 10 doubles that are less than 5 or greater than 5, type 0 to exit");
  for(int i = 0; i < 10 ; i++)
  {

      scanf("%d", &nbr);
      func1(nbr);
      numbers[i] = nbr;

      if(nbr == 0)
        break;


  }
  sort(numbers, 10);
  print_doubles(numbers, 10);
  return 0;
}

void func1(double val)
{
  double (*ptr)(void);

  if(val <= 5.00){
    ptr = below_five;
  }else if((val > 5.00) && (val <= 10.00)){
    ptr = above_five;
  }else
    ptr = other;
}

void below_five(void){
  puts("You entered a number below or equal to five");
}

void above_five(void){
  puts("You entered a number above five");
}

void other(void){
  puts("You entered a number well above five.");
}

void sort(double *p[], int n)
{
double *tmp;
for(int i = 0; i < n; i++)
{
  if(p[i] > p[i+1]){
  tmp = p[i];
  p[i] = p[i+1];
  p[i + 1] = tmp;
}
}
}

void print_doubles(double *p[], int n)
{
  int count;
  for(count = 0; count < n; count++)
    printf("%d\n", p[count]);

}

Как я и сказал, я ожидаю, что он сможет собрать двойные числа в методе scanf, а затем распечатать числа после их сортировки, но, похоже, цикл for собирает двойные навсегда без конца.

Что я сделал не так, точно?

1 Ответ

0 голосов
/ 21 мая 2019

Смотрите мои комментарии в вашем обновленном коде. Требуются другие модификации, но минимальные обновления, необходимые для работы вашего кода, ниже

#include <stdio.h>


void func1(double x);
void below_five(void);
void above_five(void);
void other(void);
    void sort(double p[], int n);  /* Simply use a array notation, 
arrays passed to functions decays to pointer */
    void print_doubles(double p[], int n); /* Simply use a array notation,
 arrays passed to functions decays to pointer */

int main(void){

  double numbers[10];
  double nbr; // Change type to double, as you're reading doubles
  printf("\nEnter 10 doubles that are less than 
           5 or greater than 5, type 0 to exit\n");
  for(int i = 0; i < 10 ; i++)
  {

      scanf("%lf", &nbr); // Use correct format specifier to read doubles
      func1(nbr);
      numbers[i] = nbr;

      if(nbr == 0)
        break;


  }
  sort(numbers, 10);
  print_doubles(numbers, 10);
  return 0;
}

void func1(double val)
{
  double (*ptr)(void);

  if(val <= 5.00){
    ptr = below_five;
  }else if((val > 5.00) && (val <= 10.00)){
    ptr = above_five;
  }else
    ptr = other;
  /* Why you set the pointer to function if you don't call it, 
     so call it here*/    
        (*ptr)();  
    }

void below_five(void){
  puts("You entered a number below or equal to five");
}

void above_five(void){
  puts("You entered a number above five");
}

void other(void){
  puts("You entered a number well above five.");
}

void sort(double p[], int n)  /* Your sorting routine is wrong ,
   see the modified code */
{
double tmp;
    for(int j = 0; j < n-1; j++)
    for(int i = 0; i < n-j-1; i++)
{
  if(p[i] > p[i+1]){
  tmp = p[i];
  p[i] = p[i+1];
  p[i + 1] = tmp;
}
}
}

void print_doubles(double p[], int n)
{
  int count;
  for(count = 0; count < n; count++)
    printf("%lf\n", p[count]); // Use correct format specifier

}

Демонстрация здесь

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