首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >想要写一个4路温度转换器的目标c控制台程序。

想要写一个4路温度转换器的目标c控制台程序。
EN

Stack Overflow用户
提问于 2010-08-10 00:20:50
回答 1查看 3.4K关注 0票数 4

正如你们中的一些人可能已经看到我试验了一个程序从华氏温度转换到摄氏,而visa相反的目标C基于控制台的输入和输出。我这样做只是为了更好地学习语言,我认为这是展示我接触过的一些东西的好方法。

所以,无论如何,我想把开尔文和兰肯量表都纳入我的计划,一个好的建议,我想采纳由梦想提出。

到目前为止,我的程序在华氏温度和摄氏温度之间的转换方面运作得相当好,但是如果我需要在这四个不同的尺度之间转换,我认为我必须以不同的方式来实现它。

首先,我需要为最终用户提供他们的起始温度,他们想要转换的温度的选择。

为了做到这一点,我需要用一个NSLog或printf语句提示他们这样做。

现在,我宁愿让他们打印出华氏,摄氏,开尔文或兰肯,在此基础上,他们想要的,而不是0-3。现在,我不认为扫描是有能力的,但是如果我错了,我想知道它是否有这个功能,或者这是我可以利用的另一种方法将它添加到我的程序中。

接下来,我有点迷路了。我显然需要指示他们选择他们的目标温度,换句话说,他们想要转换到的温度。

我需要一些关于如何在我的项目中组织这个项目的建议方面的帮助。我应该只用一节课吗?另外,我想我可以这样设置它:

代码语言:javascript
运行
复制
string baseTemp
string targetTemp

NSLog(@"Please type Fahrenheit, Celsius, Kelvin or Rankine to select your base temperature");
scanf or some other method here("string format specifier here" &baseTemp);
NSLog(@"Please type Fahrenheit, Celsius, Kelvin or Rankine to select your target temperature");
scanf or some other method here("string format specifier here" &targetTemp);

现在,我需要一个决策者来决定华氏温度指数( Fahrenheit == baseTemp )和摄氏零度指数( == targetTemp ),然后制定出相应的公式。

这可能会变得乏味,我首先需要那个特殊的决策者,或者只是另一个更简单的方法。

很抱歉,这段代码可能相当笨拙,我正在尝试使用到目前为止学到的内容。

任何建议,调整,想法和任何介于两者之间的东西都是非常感谢的!

谢谢!!

更新更新:

H类、class.m和main.m程序文件的代码包含最终代码,至少在这个项目中是这样的,该项目与我合作,极大地帮助我们实现了我的目标。再次感谢梦想松懈!!

H班:

代码语言:javascript
运行
复制
#import <Cocoa/Cocoa.h>


@interface Temperature : NSObject

{
    double kelvin;
}

//Instance methods to convert argument to kevin
-(void) setFahrenheitValue: (double) f;
-(void) setCelsiusValue: (double) c;
-(void) setKelvinValue: (double) k;
-(void) setRankineValue: (double) r;

//Instance methods for extracting the kelvin value using any scale
-(double) fahrenheitValue;
-(double) celsiusValue;
-(double) kelvinValue;
-(double) rankineValue;

@end

M班:

代码语言:javascript
运行
复制
#import "class.h"

@implementation Temperature;

-(void) setFahrenheitValue: (double) f
{
    kelvin = ((f + 459.67)*(5.0/9.0));
}

-(void) setCelsiusValue: (double) c
{
    kelvin = (c + 273.15);
}

-(void) setKelvinValue: (double) k
{
    kelvin = k;
}

-(void) setRankineValue: (double) r
{
    kelvin = (r*(5.0/9.0));
}



-(double) fahrenheitValue
{
    return ((kelvin*(9.0/5.0)) - 459.67);
}

-(double) celsiusValue
{
    return (kelvin - 273.15);
}

-(double) kelvinValue
{
    return (kelvin);
}

-(double) rankineValue
{
    return (kelvin * (9.0/5.0));
}

@end

M:

代码语言:javascript
运行
复制
#import <Cocoa/Cocoa.h>
#import "class.h"

int main(int argc, char *argv[])
{
    int result;
    int prompt;
    double sourceTemp;

    printf("Please choose a source temperature scale:\n[1] Fahrenheit\n[2] Celsius\n[3] Kelvin\n[4] Rankine\n\n");

    result = scanf("%i", &prompt);

    if (result != 1)
        printf("I couldn't understand your input, I need only one number!");

    else if (result == EOF)
        printf("I apologize, I encountered an error when trying to read your input.");

    else if (result == 1)
    {
    printf("\nNow, please enter the temperature you would like to convert:\n\n");

    scanf("%lf", &sourceTemp);

    Temperature *converter = [[Temperature alloc] init];

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

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

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

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

    printf("\nNow, please choose a target temperature scale:\n[1] Fahrenheit\n[2] Celsius\n[3] Kelvin\n[4] Rankine\n\n");

    scanf("%i", &prompt);

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

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

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

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

    }

}

我试图实现的一个想法是得到最后的提示符,它显示转换后的温度,如下所示:

假设最终用户选择Fahrenheit作为他/她的源温度,希望将212度转换为他/她的目标摄氏度。转换明显应该等于摄氏100度,但我认为这个程式会更好地显示结果如下:

212华氏度( Fahrenheit )是摄氏100华氏度( 100 )。

现在,我用粗体表示需要用变量替换的值。我有很容易解决的212和100个值,因为100已经存在了,而且212可以很容易地用sourceTemp变量的字符串格式化程序来替换它。

现在,华氏字符串有点不同。

我试图在我们原来的交换机中建立一些新的东西,比如:

代码语言:javascript
运行
复制
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,与最终用户选择选择他/她的源温度值相同。

下面是我尝试用最后的开关向最终用户显示最后提示符的方法:

代码语言:javascript
运行
复制
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插入到字符串中,相反,也许我必须使用字符串格式化程序,但我不确定。这应该是一个简单的解决办法,我只是想把它扔到这里!:)

希望下一个项目是..。GUI GUI!xD

EN

回答 1

Stack Overflow用户

发布于 2010-08-10 01:01:13

关于你们的班级,我在上一个问题中简要提到的一种方法可能是:

  1. 它应该只使用一个温度刻度来存储值。记住,兰肯之于华氏,犹如凯尔文之于摄氏。我的意思是,朗肯只是华氏,但有不同的偏移量,而开尔文只是摄氏,但偏移量不同(兰肯和凯尔文都认为0°是http://en.wikipedia.org/wiki/Absolute_Zero)。科学上,开尔文将是一个很好的选择,因为它是国际标准的温度测量(美国,缅甸和利比里亚是唯一没有采用SI系统)。只使用一个温标有一些优点和缺点:
代码语言:javascript
运行
复制
- There will be a loss of precision because you are converting twice (once to convert the source scale to kelvin, and then another conversion to convert to the user's desired scale)
- However, the implementation of your class will be simpler because there is only one variable.

  1. 您只需要转换器类的一个实例。当从命令行读取输入时,可以告诉转换器类实例测量值以及用户选择的标度。例如,转换器接口可以采用以下方法: @界面温度: NSObject {双开尔文;}- (void) setCelsiusValue:( double ) c;// kelvin = (c + 273.15) - (void) setKelvinValue:(double) k;// kelvin =k- (void) setFahrenheitValue;// kelvin = (f + 459.67)×5⁄9 - (void) setRankineValue:(double) r;// kelvin = (f×5/9) @end 所有这些方法都应该将论点转化为开尔文尺度。
  2. 您的类还应该实现使用任何比例提取值的方法。为此目的,委员会可采取下列方法: @界面温度: NSObject {双开尔文;} //包括以上方法-(双) celsiusValue;//返回开尔文- 273.15 -(双) kelvinValue;//返回开尔文-(双) fahrenheitValue;//返回开尔文×9⁄5−459.67 -(双) rankineValue;//返回开尔文×9/5 @结束 这些方法中的每一种都应使用适当的公式将开尔文值转换成相应的标度。

关于用户交互,通常NSLog只用于在运行时记录有关应用程序的信息(例如,检查对象的值或确定应用程序中的执行点)。对于提问来说,使用printf通常是比较主流的。

你可以打印出这样的菜单:

代码语言:javascript
运行
复制
Please choose a source temperature scale:
[1] Celsius
[2] Kelvin
[3] Fahrenheit
[4] Rankine

然后打印另一个用于目标温标的菜单,然后向用户询问源温度测量。通常,您不应该要求用户键入完整的单词,因为它比简单的数字更容易输入错误。还有一个叫做switch的特殊编程结构。它有一些警告,但很好地与多个选择的问题/答案。一旦使用scanf读取了用户的输入,就可以这样做:

代码语言:javascript
运行
复制
int prompt;
double sourceTemp;
// use scanf to read values into prompt and sourceTemp variables

Temperature *converter = [[Temperature alloc] init];
switch(prompt)
{
    case 1: // the user chose celsius
        [converter setCelsiusValue:sourceTemp];
        break; // if you don't break, it will execute all other cases

    case 2: // user chose kelvin
        [converter setKelvinValue:sourceTemp];
        break;

    case 3:
        [converter setFahrenheitValue:sourceTemp];
        break;

    case 4:
        [converter setRankineValue:sourceTemp];
        break;
}

// prompt the user again here to determine the target temperature scale
// use the same menu again and read the user's input into the prompt variable

case (prompt)
{
    case 1: // user wants to convert to celsius
         printf("%f degrees C\n", [converter celsiusValue]);
         break;

    case 2: // user wants kelvin
         printf("%f degrees K\n", [converter kelvinValue]);
         break;

    case 3:
         printf("%f degrees F\n", [converter fahrenheitValue]);
         break;

    case 4:
         printf("%f degrees R\n", [converter rankineValue]);
         break;
}

关于scanf,它做了两件事。首先,它扫描输入到提供的变量,其次,它返回成功扫描的项目数。例如:

代码语言:javascript
运行
复制
int result;
int first;
int second;

printf("Please type two numbers: ");
result = scanf("%d %d", &first, &second);

如果scanf成功地读取了两个数字,那么result应该等于2,如果它等于2,那么您可以确定firstsecond包含良好的数据,您可以确定scanf已经成功地扫描了输入。类似地,如果您只要求scanf读取一个数字,那么如果result等于1,那么它成功地读取了这个数字。

如果result为1,则意味着它只扫描了一个数字,然后遇到了一个问题。例如,如果用户输入了“100 abc”,scanf将只能读取一个数字,但我们要求两个数字。在这种情况下,它将返回1来告诉我们,它只扫描了一个整数。

如果result为0,则意味着scanf无法扫描任何与我们要求的内容相匹配的内容(例如,如果用户输入“abc”)。

最后,如果没有需要读取的数据,result将是EOF (文件结束)。

因此,重要的是检查scanf调用的返回值,以确保用户输入了有效的内容。如果结果为0,您知道用户输入了一些无效的内容,如果结果是EOF,那么读取任何数据都会出现问题。所以,我们可以有这样的设置:

代码语言:javascript
运行
复制
int result;
int first;
int second;

printf("Please type two numbers: ");
result = scanf("%d %d", &first, &second);

if (result == 0)
    printf("I couldn't understand what you gave me, I need numbers!\n");
else if (result == 1)
    printf("I was only able to read one number!\n");
else if (result == EOF)
    printf("Whoops, there was some problem trying to read your input\n");
else if (result == 2) // scanf was able to read two numbers
    printf("Great! The sum of those two numbers is: %d\n", first + second);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3445142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档