c - 我的程序无限循环,我真的不知道为什么

标签 c

所以这里的问题是编写一个程序,使用指针指向函数,并以这样的方式编写它:收集 10 个 double ,向程序用户提供反馈,对它们进行排序并打印排序结果作为证明。问题是,程序要么无限地打印开头的 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]);

}

就像我说的,我期望它能够做的是将 double 收集到 scanf 方法中,然后在对它们进行排序后打印数字,但在这种情况下,for 循环似乎永远收集 double 而没有结束。

我究竟做错了什么?

最佳答案

在您的更新代码中查看我的评论。 还需要进行其他修改,但运行代码所需的最少更新如下

#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

}

Demo Here

关于c - 我的程序无限循环,我真的不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56230062/

相关文章:

java - java.library.path 中没有 dhtreader

c - 程序不显示下载速度和文件大小 (curl)

c - 在 Windows 上将 SQLite 与 C 结合使用

c - 虽然我的 INT0 初始化为数字输入,但它仍然给出 2.8V,这使得按钮并没有真正做出改变

c++ - 使用数组时的常见陷阱 : Trusting type-unsafe linking

在C中将FN LN格式的字符串转换为LN,FN(John Doe到Doe,John)

c - 如何在C中同时读取和删除文件内容

c - 无法将结构传递给结构内的指针

c - 作为软件指标,结意味着什么?

c - C 程序如何将空格参数传递给 libc system(3) 调用?