Улучшение программы преобразования Фаренгейта в Цельсий и выбор вывода

Я только начал программировать на C несколько дней назад и хочу улучшить свою программу, но не знаю, как это сделать.

Эта программа конвертирует градусы Фаренгейта в градусы Цельсия и наоборот. Я сделал это самым простым способом. Но теперь я хочу сделать так, чтобы у меня было 2 функции c2f и f2c, которые принимают температуру в качестве параметра, и когда я запускаю программу, я хочу выбрать, хочу ли я скрыть от F до C или от C до F (что-то вроде TempConverter -f 32 должен преобразовывать только 32 в градусы Цельсия, а TempConverter -c 100 должен преобразовывать 100 в градусы Фаренгейта).

Я думаю, что мои функции должны быть примерно такими: float c2f (float c) и float f2c (float f)

Но как именно это сделать, когда я запускаю что-то вроде > TempConverter -f 50.0, я получаю, скажем, что-то вроде этого? 10,00°C = 50,00°F

#include<stdio.h>

int main(void)
{
    // Local Declarations
    float Celsius, Fahrenheit, Fahrenheit_1, Celsius_2;

    // Statements
    printf("Enter the temperature in Fahrenheit: ");
    scanf("%f", &Fahrenheit);
    printf("Fahrenheit temperature is: %5.1f F\n\a", Fahrenheit);

    Celsius = (100.0 / 180.0) * (Fahrenheit - 32);

    printf("Celsius temperature is: %8.1f C\n\n\a", Celsius);

    printf("Enter the temperature in Celsius: ");
    scanf("%f", &Celsius_2);
    printf("Celsius temperature is: %8.1f C\n\a", Celsius_2);

    Fahrenheit_1 = 32 + (Celsius_2 * (180.0 / 100.0));

    printf("Fahrenheit temperature is: %5.1f F\a", Fahrenheit_1);

    return 0;

}

Текущий вывод:

*Введите температуру в градусах Фаренгейта: 20

Температура по Фаренгейту: 20,0 F

Температура по Цельсию: -6,7 C

Введите температуру в градусах Цельсия: 40

Температура по Цельсию: 40,0 C

Температура по Фаренгейту: 104,0 F*

Желаемый результат

Преобразователь температуры -f 50.0

10.00°C = 50.00°F


person Sarah97    schedule 16.10.2013    source источник
comment
Если вы хотите реагировать на переключатели командной строки, вам нужно добавить argc и argv в файл main. И просмотрите argv и выясните, какие функции вызывать.   -  person Charlie Burns    schedule 17.10.2013
comment
float c2f (float c) { return 32 + (c * (180,0/100,0)); } и т.д   -  person Charlie Burns    schedule 17.10.2013
comment
Есть несколько сообщений об обработке аргументов командной строки. Например, stackoverflow.com/questions/13766985/   -  person lurker    schedule 17.10.2013
comment
Первый шаг — определить вашу основную функцию как int main(int argc, char *argv[]). Затем вы можете получить аргументы, переданные программе в argv   -  person damienfrancois    schedule 17.10.2013
comment
Второстепенный: измените %.1f на %.2f, чтобы получить 2 цифры справа от ..   -  person chux - Reinstate Monica    schedule 17.10.2013
comment
Расслабьтесь, вы вернетесь к этому позже в книге (при условии, что вы читаете K&R).   -  person Filipe Gonçalves    schedule 17.10.2013


Ответы (2)


Первое, что вам нужно сделать, это добавить в код аргументы командной строки, например:

int main( int argc, char **argv )

argc содержит количество параметров, введенных в командной строке; это всегда >= 1.

argv содержит указатели на каждую из строк аргументов командной строки. argv[0] всегда указывает на строку, которую вы использовали для запуска программы. argv[argc] всегда равно NULL.

Итак, если вы назвали свою программу как

TempConverter -f 50.00

тогда

argc == 3
argv[0] == "TempConverter"
argv[1] == "-f"
argv[2] == "50.00"
argv[3] == NULL

Обратите внимание, что для использования последнего параметра в ваших функциях преобразования вам необходимо преобразовать его из строки в значение с плавающей запятой. strtod — библиотечная функция для этого:

char *check;
double intemp = strtod(argv[2], &check);

После преобразования check будет указывать на первый символ в строке, который не был преобразован в значение с плавающей запятой. Если этот символ отличается от пробела или 0, то входное значение не является допустимой строкой с плавающей запятой.

Итак, общий порядок действий:

  1. Проверьте значение argc. Для ваших целей должно быть 3.
  2. Преобразуйте argv[2] в значение с плавающей запятой, используя strtod. Убедитесь, что контрольным символом является либо 0, либо пробел.
  3. Проверьте переключатель Фаренгейта/Цельция; это должно быть либо "-f", либо "-c" (или то, что вы решите).
  4. Вызовите соответствующую функцию преобразования на основе переключателя Фаренгейта/Цельция и отобразите результат.
person John Bode    schedule 16.10.2013
comment
Эй, Джон, я считаю, что sscanf был бы лучшим способом преобразовать строку в число с плавающей запятой, не так ли? Хотя я не совсем уверен, как правильно его использовать. - person Sarah97; 17.10.2013
comment
Нет. Представьте, что вы толстым пальцем набираете строку типа 3.1r159. sscanf преобразует и назначит часть "3.1" и вернет 1, чтобы указать на успешное преобразование, оставив остальную часть во входном потоке, чтобы испортить следующее чтение. strtod позволит вам поймать ошибку и полностью отклонить ввод. - person John Bode; 17.10.2013
comment
Прохладный! Я этого не знал! Спасибо за объяснение Джон! - person Sarah97; 17.10.2013
comment
Гах, я имел в виду scanf, а не sscanf; у вас не будет остатков дерьма во входном потоке. Но главное остается в силе - sscanf будет означать успех для того, что должно быть неправильным вводом. - person John Bode; 17.10.2013

Вы хотите использовать аргументы командной строки, которые являются аргументами для main

int main(int argc, char *argv[])

Здесь argc соответствует количеству предоставленных аргументов, а аргументы хранятся в argv. Обратите внимание, что имя программы также считается аргументом и сохраняется в argv[0]. Предполагая, что вы ожидаете флаг -f или -c, за которым следует float, вы можете использовать их внутри main следующим образом:

/** 
 * Check for the expected number of arguments (3)
 * (0) program name
 * (1) flag
 * (2) temperature
 */
if (argc!=3)
    printf("Incorrect number of arguments");

if (!strcmp(argv[1], "-f"))
   // process from fahrenheit to celsius
else if (!strcmp(argv[1], "-c"))
   // process from celsius to fahrenheit
else
   printf("Invalid flag\n");

Обратите внимание: всякий раз, когда вы имеете дело с пользовательским вводом, очень важно проверить, что ввод соответствует тому, что вы ожидаете. Мой предложенный код дает несколько примеров, но вам следует хорошенько подумать о том, как сделать его еще более безопасным.

person Pankrates    schedule 16.10.2013
comment
Спасибо за ответ Pankrates! Просто вопрос: почему у нас есть ! перед стркмп? Почему мы это отрицаем? - person Sarah97; 17.10.2013
comment
Функция strcmp возвращает 0 при успешном совпадении - person Pankrates; 17.10.2013