Зачем мне нужно вводить здесь? - PullRequest
0 голосов
/ 20 февраля 2020

Итак, в моей викторине C была задача написать программу, которая предлагает пользователю ввести три целочисленных значения, затем передает их адреса в виде указателей на функцию, которая применяет изменения к этим значениям в соответствии с некоторыми условиями, затем отправьте среднее значение этих ОБНОВЛЕННЫХ значений в виде числа с плавающей запятой.

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

float Update(int *x, int *y, int *z);
int main()
{
    float avg;
    int x, y, z;
    printf("Please enter three intger values for x, y, and z respectively:");
    scanf("%d %d %d", &x, &y, &z);
    printf("\n\nthe values that you entered are:\n\tx = %d\n\ty = %d\n\tz = %d", x, y, z);
    avg = Update(&x, &y, &z);
    printf("\nthe UPDATED values are:\n\tx = %d\n\ty = %d\n\tz = %d", x, y, z);
    printf("\nthe average of the updated values are: %.1f\n\n", avg);
    system("pause");
    return 0;
}

float Update(int *x, int *y, int*z)
{
    float AVERAGE;
    if (*x % 2 == 0)    // for x
        *x *= 3;
    else
        *x -= 8;

    if (*y % 2 == 0)  // for y
        *y *= 3;
    else
        *y -= 8;

    if (*z % 2 == 0)  // for z
        *z *= 3;
    else
        *z -= 8;
    AVERAGE = (*x + *y + *z) / 3;
    return AVERAGE;
}

Ввод 5, 10, 7 должен дать мне среднее значение 8,0 вместо 8,7.
Я знаю, что (хотя AVERAGE и avg все с плавающей запятой) Типизация решает это, но почему?

1 Ответ

3 голосов
/ 20 февраля 2020

Типотипирование не требуется. Вам просто нужно убедиться, что целочисленного деления избегают:

AVERAGE = ((*x)*1.0f + (*y)*1.0f + (*z)*1.0f) / 3;

Это более явно выражено (обращает внимание на то, почему это делается), чем более короткое и, вероятно, более читаемое альтернативное решение SomeProgrammerDude (которое я включаю). для полноты):

(*x + *y + *z) / 3.0f
...