简体   繁体   English

短程序挂在C中

[英]Short program hangs in C

Every time this code runs in UNIX, it hangs and displays a new line without a prompt. 每次此代码在UNIX中运行时,它都会挂起并显示新行,而不显示提示。 It compiles without error. 它编译没有错误。 Anyone know what's up here? 有人知道这是怎么回事吗?

/*
This program uses a Monte Carlo simulation to maximize widget profits.
 */

#include <stdio.h>
#include <stdlib.h>

// constant values used in the simulation
#define MIN_WIDGETS 1000 // minimum widgets per month
#define MAX_WIDGETS 1500 // maximum widgets per month

#define MIN_COST 0.25 // minimum cost per widget
#define MAX_COST 0.82 // maximum cost per widget

#define MIN_CONVERSION 0.01 // minimum converstion rate
#define MAX_CONVERSION 0.05 // maximum converstion rate

#define MIN_PROFIT 38 // minimum profit per sale
#define MAX_PROFIT 43 // maximum profit per sale

#define FIXED_OVERHEAD 400 // fixed overhead cost

#define NUM_SIMULATIONS 100 // number of simulations performed

void main()
{

  // to keep track of inputs in highest-profit simulation
  int bestW = 0; // widgets per month
  float bestC = 0; // cost per widget
  float bestR = 0; // rate of converstion
  float bestP = 0; // profit per sale
  float bestProfit = 0; // highest profit

  srand(time(0)); // initialize the random number generator
  float h = FIXED_OVERHEAD;

  int i; // loop index 
  for(i = 0; i < NUM_SIMULATIONS; i++)
    {
        // initialize inputs for this individual simulation
        int w = 0; // quantity of widgets bought
        float c = 0; // cost of a widget
        float r = 0; // conversion rate
        float p = 0; // profit per sale
        float profit = 0; // profit

        // simulate quantity of widgets bought per month, between MIN_WIDGETS and MAX_WIDGETS
        w = random() % (MAX_WIDGETS + 1); // to set the maximum value of w at MAX_WIDGETS
        while (w < MIN_WIDGETS) {
            w = random() % (MAX_WIDGETS + 1); // fetch new random number that may fit parameters
        }

        // simulate cost per widget, between MIN_COST and MAX_COST
        c = random() % 100; // to convert random number into an integer between 0 and 99
        while (c < (MIN_COST*100) || c > (MAX_COST*100)) {
            c = random() % 100; // fetch new random number that may fit parameters
        }
        c = c / 100.0; // convert cost back from cents into dollars

        // simulate conversion rate, between MIN_CONVERSION and MAX_CONVERSION
        r = random() % 100; // to convert random number into an integer between 0 and 99
        while (r < (MIN_CONVERSION*100) || r > (MAX_CONVERSION*100)) {
            r = random() % 100; // fetch new random number that may fit parameters
        }
        r = r / 10.0; // convert back into fraction

        // simulate profit per sale, between MIN_PROFIT and MAX_PROFIT
        p = random() % ((MAX_PROFIT + 1)*100); // to convert random number into an integer between 0 and 4300
        while (p < MIN_PROFIT*100) {
            p = random() % (MAX_PROFIT + 1); // fetch new random number that may fit parameters
        }
        p = p / 100.0; // convert back into floating point with two decimal places after period

        profit = (w * r * p) - (h + c * w);

        printf("Current profit is $%.2f, with %d widgets at a %.2f cost per widget with a %.1f conversion rate and %.2f profit/sale.\n",
            profit, w, c, r, p);

        if (profit > bestProfit) {
            bestW = w;
            bestC = c;
            bestR = r;
            bestP = p;
            bestProfit = profit;
        }

    }

  printf("Maximum profit is $%.2f, with %d widgets at a %.2f cost per widget with a %.1f conversion rate and %.2f profit/sale.\n",
    bestProfit, bestW, bestC, bestR, bestP);

}

I think the error is here: 我认为错误在这里:

while (p < MIN_PROFIT*100) {
    p = random() % (MAX_PROFIT + 1); // fetch new random number that may fit parameters
}

If the loop body is entered p will be set to a number between 0 and MAX_PROFIT (= 43). 如果输入了循环体,则p将设置为0到MAX_PROFIT (= 43)之间的数字。 It will never be greater than or equal to MIN_PROFIT*100 (= 3800), so it will go into an infinite loop. 它永远不会大于或等于MIN_PROFIT*100 (= 3800),因此它将进入无限循环。

As a side-note, you might want to consider using do { } while loops here instead of using a while loop and writing the loop body twice. 附带说明一下,您可能要考虑do { } while此处使用do { } while循环,而不是使用while循环并编写两次循环主体。 Writing code twice is an excellent way to make errors, because when you change one of the implementations you always have to remember to change the other. 两次编写代码是产生错误的绝妙方法,因为当您更改一个实现时,您始终必须记住要更改另一个实现。 If you forget to update both you will introduce a bug. 如果您忘记同时更新两者,则会引入错误。 And that seems to be what happened here. 这似乎就是这里发生的事情。

Hard to tell from that wall of code, but it is either taking longer than you think it should or one of your many while statements is incorrect. 从那段代码很难说出来,但是它花费的时间比您想象的要长,或者您的while语句之一是不正确的。

You could replace the while statements and speed the whole thing up by getting a random number between 0 and the difference between your various min and max parameters, then adding that to the min parameter, instead of what you are doing at the moment which is getting a random number up to the value of your max parameter, then trying again if is below your min. 您可以替换while语句,并通过在0和各个min和max参数之间的差之间获得一个随机数,然后将其添加到min参数中,而不是现在正在执行的操作中,来加速整个过程一个随机数,最高为您的max参数的值,如果低于您的最小值,则再试一次。 In the case of your widgets, for example, you are throwing away 2/3 of your results. 例如,对于小部件,您将丢弃结果的2/3。

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

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