C Программирование - сбор данных в функции вне main () - PullRequest
1 голос
/ 29 марта 2020

Напишите программу, которая просит пользователя вводить суточные суммы осадков. Ваша программа должна будет принять 5 ежедневных входов осадков. Разрешить только неотрицательные количества осадков. Когда пользователь вводит отрицательное число, скажите ему, что это неверное число, и что они должны ввести другое действительное значение.

Рассчитать общее количество осадков и среднее количество осадков. Определите самые большие суточные осадки и наименьшие суточные осадки.

Выведите общее, среднее, наибольшее и наименьшее значения с помощью информационных сообщений.

В основном не может происходить следующее:

  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;
}  

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Как уже говорилось, рекурсия, если она у вас есть, по существу создаст бесконечное l oop, и действительно, для этого она вам и не нужна, вы можете сделать что-то вроде:

Рабочий образец (комментируемые изменения)

#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;
}
0 голосов
/ 29 марта 2020

Вы можете создать структуру для хранения ваших данных и выполнения операции.

Что-то вроде:

#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;
    }
}
...