簡體   English   中英

C 編程 - 在 main() 之外的函數中收集數據

[英]C Programming - Collecting data in a function outside of main()

編寫一個程序,要求用戶輸入每日降雨量。 您的程序需要接受 5 個每日降雨量輸入。 只允許非負降雨量。 當用戶輸入負數時,告訴他們該數字無效,他們應該輸入另一個有效值。

計算總降雨量和平均降雨量。 確定最大日降雨量和最小日降雨量。

使用信息性消息輸出總數、平均值、最大值和最小值。

以下事情不能在 main 中發生:

  1. 接受用戶輸入
  2. 計算總數或平均值
  3. 確定最大或最小
  4. 輸出結果

==============================================

現在我只是想弄清楚如何輸入 5 個數字,到目前為止我已經有了這個代碼,但它讓我把它輸入了無數次。 我已經在這個項目上工作了幾個小時,所以任何建議都會很棒。

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5 // have the user enter it 5 times

double CollectRainfall() {
    double amount;
    double rainfall[SIZE];
    int i;

    printf("Enter a rainfall amount: \n");  // enter amount
    scanf_s("%lf", &amount);

    for (i = 0; i < SIZE; i++) {
        rainfall[i] = CollectRainfall();
        while (amount < 0.0) {  // if it's a negative number
            printf("The number is invalid.\n");  // display error message if a negative # was entered
            printf("Enter another rainfall amount: \n");
        }
    }

}   
int main() {

    CollectRainfall();

    return 0;
}  

您可以創建一個結構來存儲數據並執行操作。

就像是:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 5 // have the user enter it 5 times


typedef struct data {
    double rainfall[SIZE];
    double average;
    double min;
    double max;
} data_t;

static void collectRainfall(double rainfall[SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        double amount;

        printf("Enter a rainfall amount: \n");  // enter amount
        scanf("%lf", &amount);
        while (amount < 0.0) {  // if it's a negative number
            printf("The number is invalid.\n");  // display error message if a negative # was entered
            printf("Enter a rainfall amount: \n");  // enter amount
            scanf("%lf", &amount);
        }
        rainfall[i] = amount;
    }
}

static void compute(data_t *data) {
     data->min = data->rainfall[0];
     data->max = data->rainfall[0];
     data->average = data->rainfall[0];

     for (int i = 1; i < SIZE; i++) {
         double rainfall = data->rainfall[i];
         if (rainfall > data->max) {
             data->max = rainfall;
         }
         if (rainfall < data->min) {
             data->min = rainfall;
         }
         data->average += rainfall;
     }
     data->average /= SIZE;
}

static void display(data_t *data) {
    printf("min %f, max %f, average %f\n",
            data->min, data->max, data->average);
}

int main() {
    data_t data;

    collectRainfall(data.rainfall);
    compute(&data);
    display(&data);

    return 0;
}

scanf在輸入錯誤的情況下很痛苦,最好是讀取一行然后解析它,檢查strtod是否正常

static void collectRainfall(double rainfall[SIZE]) {
    for (int i = 0; i < SIZE; i++) {
        char str[32];
        double amount = -1;

        printf("Enter a rainfall amount [%d/%d]: \n", i , SIZE);  
        while (42) {
            char *res = fgets(str, sizeof(str), stdin);
            if (res && (amount = strtod(str, &res)) >= 0 && res != str)
                break;
            printf("The number is invalid.\n");
            printf("Enter a rainfall amount [%d/%d]: \n", i , SIZE);  
        }
        rainfall[i] = amount;
    }
}

如前所述,遞歸實際上將創建一個無限循環,實際上,為此您也不需要它,您可以執行以下操作:

運行示例(注釋更改)

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

#define SIZE 5 // have the user enter it 5 times

void CollectRainfall() { //no return needed

    double rainfall[SIZE], sum = 0, max = 0, min = 0;
    int i;


    for (i = 0; i < SIZE; i++)
    {
        printf("Enter a rainfall amount: \n"); // enter amount
        scanf("%lf", &rainfall[i]); //save values into the array
        while (rainfall[i] < 0.0)
        {                                       // if it's a negative number
            printf("The number is invalid.\n"); // display error message if a negative # was entered
            printf("Enter another rainfall amount: \n");
            i--; // iterate back to replace negative number
        }
    }
    printf("Values:");
    for (i = 0, min = rainfall[i]; i < SIZE; i++)
    {
        printf(" %.2lf", rainfall[i]); // print all values
        sum += rainfall[i];          // sum values
        if(rainfall[i] > max){       //max value
            max = rainfall[i];      
        }
        if(min > rainfall[i]){       //min value
            min = rainfall[i];
        }
    }
    printf("\nSum: %.2lf", sum);            // print sum
    printf("\nMax: %.2lf", max);            // print max
    printf("\nMin: %.2lf", min);            // print min
    printf("\nAverage: %.2lf", sum / SIZE); //print average
}

int main() {
    CollectRainfall();
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM