string-c string, string-formatter - PullRequest
       0

string-c string, string-formatter

0 голосов
/ 11 августа 2010

У меня есть программа, с которой Dreamlax много работал со мной, в которой используется Objective-C для преобразования температур между шкалами температур по Фаренгейту, Цельсию, Кельвину и Ренкина, но преобразование ввода с консоли в Кельвин, а затем из Кельвина в желаемая шкала температуры конечного пользователя.

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

x градусов шкала температур

Где x = конечная преобразованная температура, а температурная шкала = шкала, в которую пользователь хочет преобразовать свою температуру.

Предположим, что конечный пользователь выбрал Фаренгейт в качестве своей исходной температуры, желая преобразовать 212 градусов в свою целевую температурную шкалу Цельсия. Очевидно, что конверсия должна равняться 100 градусам Цельсия, но я думаю, что программа будет лучше отображать результат следующим образом:

212 градусов по Фаренгейту составляет 100 градусов по Цельсию.

Теперь я сделал значения, которые нужно заменить на переменные, выделенные жирным шрифтом. У меня есть значения 212 и 100, которые легко решить, потому что переменная 100 была там, во-первых, и 212 можно легко исправить, заменив ее строковым форматером переменной sourceTemp, переменной, которая содержит исходную введенную пользователем температуру.

Теперь строка по Фаренгейту немного отличается.

Я попытался установить что-то новое в исходном переключателе, например:

switch (prompt) 
{
    case 1:
        //end-user chooses Fahrenheit
        [converter setFahrenheitValue:sourceTemp];
        sourceTempText = 1;
        break;

    case 2:
        //end-user chooses Celsius
        [converter setCelsiusValue:sourceTemp];
        sourceTempText = 2;
        break;

    case 3:
        //end-user chooses Kelvin
        [converter setKelvinValue:sourceTemp];
        sourceTempText = 3;
        break;

    case 4:
        //end-user chooses Rankine
        [converter setRankineValue:sourceTemp];
        sourceTempText = 4;
        break;
}

ОК, поэтому я добавил к каждому отдельному случаю, установив новую переменную с именем sourceTempText равной 1-4, то же значение, которое конечный пользователь выбрал для выбора его / ее температуры источника.

Теперь вот как я пытался отобразить окончательное приглашение для конечного пользователя с помощью последнего переключателя:

switch (prompt2) 
{
    case 1:
        //end-user chooses Fahrenheit
        printf("%lf degrees sourceTempText is %lf degrees Fahrenheit\n", sourceTemp, [converter fahrenheitValue]);
        break;

    case 2:
        //end-user chooses Celsius
        printf("%lf degrees sourceTempText is %lf degrees Celsius\n", sourceTemp, [converter celsiusValue]);
        break;

    case 3:
        //end-user chooses Kelvin
        printf("%lf degrees sourceTempText is %lf degrees Kelvin\n", sourceTemp, [converter kelvinValue]);
        break;

    case 4:
        //end-user chooses Rankine
        printf("%lf degrees sourceTempText is %lf degrees Rankine\n", sourceTemp, [converter rankineValue]);
        break;
}

Сейчас я не уверен, смогу ли я вставить sourceTempText в строку, как здесь, вместо этого, возможно, мне придется использовать форматировщик строки, но я не уверен. Это должно быть легко исправить, я просто хотел выбросить это здесь! :)

P.S. извините за неправильное форматирование вопроса, я вроде не знал, как его сформулировать, поэтому, пожалуйста, попросите разъяснений, если это необходимо.

1 Ответ

2 голосов
/ 11 августа 2010

Замените sourceTempText на% s, а над оператором switch объявите возможные строки следующим образом:

char *scales[4] = { "Fahrenheit", "Celsius", "Kelvin", "Rankine" };

Затем добавьте и аргументируйте каждый printf после sourceTemp, следующим образом:

printf("%lf degrees %s is %lf degrees Fahrenheit\n",
                   sourceTemp, scales[prompt-1], [converter fahrenheitValue]);

Это prompt-1, потому что отсчет начинается с нуля, а вы начинаете с 1.


пс. Теперь я вижу, вы установили sourceTempText = 1/2/3/4;- Я просто использовал prompt, поскольку он имеет то же значение.Что вы могли бы сделать, это установить

char *scales[5] = { "Error!", "Fahrenheit", "Celsius", "Kelvin", "Rankine" };

и использовать scales[sourceTempText], убедившись, что перед switch, sourceTempText = 0.Это было бы хорошим примером очистки ввода: что бы пользователь ни вводил prompt, ваша программа всегда будет отображать корректный текст.

...