Конвертер температуры таблицы Фаренгейта в Цельсия в градусах Цельсия

Я новичок в программировании на C. Я слежу за книгой «Язык программирования C, второе издание». По мере продвижения я вношу свои собственные модификации в пример кода, представленный в книге. В любом случае я размещаю здесь свой код для проверки, потому что хочу убедиться, что у меня хороший старт. В частности, есть несколько вещей, в которых я хочу убедиться, что делаю правильно, чтобы не развить в будущем никаких вредных привычек:

  1. Я хотел бы убедиться, что соблюдаю стандарты C. Основываясь на моем исследовании, я обнаружил, что текущий и самый последний стандарт для C — C17 или ISO / IEC 9899: 2018, поправьте меня, если я ошибаюсь. В результате я скомпилировал код со следующими параметрами: gcc -Wall -pedantic-errors -std=c17 source.c Это хорошая практика?

  2. Я знаю, что я новичок, но хочу убедиться, что даже самые простые вещи делаю чисто и эффективно.

Так что, если я смогу получить обзор этого образца кода, это будет здорово.

/* This program uses the formula C = (5/9)(F-32) to print a table of Farenheit
 * temperatures and their Centigrade or Celsius equivalents. Adapted from:
 * Kernighan, B. W., & Ritchie, D. M. (1988). The C programming language. */

#include <stdio.h>

/* Print Fahrenheit-Celsius table for Fahrenheit = 0, 20, ..., 300. */

int main(void)
{
    float fahr, celsius;
    int lower, upper, step;

    lower = 0;   /* Lower limit of temperature table. */
    upper = 300; /* Upper limit. */
    step = 20;   /* Step size. */

    printf("Fahrenheit to Celsiusn"); /* Table header */
    printf("%3s %6sn", "F", "C");     /* Temperature label */

    fahr = lower;
    while (fahr <= upper) {
        celsius = (5.0/9.0) * (fahr-32.0);
        printf("%3.0f %6.1fn", fahr, celsius);
        fahr = fahr + step;
    }
}

1 ответ
1

Я хочу убедиться, что у меня хороший старт.

float против double

Сохранить float в случаях, когда требуется серьезное сокращение памяти или когда производительность вынуждает использовать узкую плавающую точку, иначе используйте double как переходный тип с плавающей запятой.

Единицы измерения

300 что?
Физические единицы заслуживают ясности, возможно, комментария в коде. Будьте ясны или ой!.

// upper = 300; /* Upper limit. */
upper = 300 /* F */; /* Upper limit. */

убедитесь, что я придерживаюсь стандартов C.

Предупреждения

Использование современного компилятора со многими, если не всеми, предупреждениями — это хороший предмет. Может быть, добавить -Wetra.


убедитесь, что я делаю даже самые простые вещи чисто и эффективно.

В общем и целом

Код выглядит очень чистым и в основном эффективным.

Ненужные смешанные операции FP

Уведомление с помощью float объекты, пока double константы, код выглядит так, как показано ниже, с повышающими и понижающими преобразованиями FP.

celsius = (float)((5.0/9.0) * ((double)fahr-32.0));
printf("%3.0f %6.1fn", (double)fahr, (double)celsius);

Если вы хотите остаться с float, использовать float константы

celsius = (5.0f/9.0f) * (fahr-32.0f);

Идея: абстрактное форматирование

#define F_WIDTH1 3
#define C_WIDTH2 6

printf("%*s %*sn", F_WIDTH, "F", C_WIDTH, "C");
...
    printf("%*.0f %*.1fn", F_WIDTH, fahr, C_WIDTH, celsius);

  • Большое спасибо. Я обязательно буду реализовывать и изучать ваши предложения. Я понимаю предложение float vs double, но мне нужно провести дальнейшее исследование абстрактного форматирования, поскольку я еще не знаком с этим.

    — дребрб

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *