C语言中的简单单元转换器
我为我的程序编程课买了一本“C语言书”,我正在做一些练习。第2章练习9是关于设计一个单位转换器,它可以处理盎司、磅、克和千克 我写的代码很有效,但我真的认为它可以做得更干净。使用嵌套的if语句似乎是一种混乱的方法 另外,我注意到的一个问题是,如果在第27行上给scanf()一个char或string,它将持续存在,然后被传递到第95行上的scanf()。例如,如果输入“y”作为要转换的值,程序将转到开始,而不允许用户回答“是否要执行其他转换?”我如何着手解决此问题,以便在输入NaN时丢弃它 我的代码位于:C语言中的简单单元转换器,c,C,我为我的程序编程课买了一本“C语言书”,我正在做一些练习。第2章练习9是关于设计一个单位转换器,它可以处理盎司、磅、克和千克 我写的代码很有效,但我真的认为它可以做得更干净。使用嵌套的if语句似乎是一种混乱的方法 另外,我注意到的一个问题是,如果在第27行上给scanf()一个char或string,它将持续存在,然后被传递到第95行上的scanf()。例如,如果输入“y”作为要转换的值,程序将转到开始,而不允许用户回答“是否要执行其他转换?”我如何着手解决此问题,以便在输入NaN时丢弃它 我的
最可靠的方法是使用fgets()函数读取输入字符串,使用isdigit()检查它是否包含数字(字符串中的所有字符),然后使用atoi()将其转换为数值
顺便说一句,最后两个操作可以替换为strtol()清理if结构的一种方法是将值从“fromUnit”转换为公共值,然后将其转换为“toUnit”。它简化了结构,只留下两个if结构。(它的伸缩性也更好)因此,它更像:
if (!strcmp(fromUnit, "pound")) {
tempval = input / 16;
} else if (!strcmp(fromUnit, "gram") == 0) {
tempval = input * OUNCESTOGRAMS;
}
if (!strcmp(toUnit, "pound")) {
output = tempval * 16;
} else if (!strcmp(toUnit, "gram")) {
output = tempval / OUNCESTOGRAMS;
}
当然,这个数学是不正确的,这只是一个例子。您只需(1)选择要使用的临时单元(2)从输入单元转换为该单元,以及(3)从临时单元转换为输出单元
正如其他人所提到的,gets()绝对是一种方式。我会这样做:
#include <stdio.h>
typedef struct _unit {
char * name;
float grams;
} unit;
unit units[] = {
{"gram", 1.0},
{"kilogram", 1000.0},
{"pound", 500.0},
{"ounce", 28.3495231}
};
unit * search_unit(char * name)
{
int i;
for (i = 0; i < (sizeof(units) / sizeof(unit)); i++)
{
printf("%d %s\n", i, units[i].name);
if (0 == strcmp(units[i].name, name))
{
return & units[i];
}
}
return NULL;
}
int main() {
char line[10];
char unitname[10];
int number;
unit * found_unit;
while (1)
{
fgets(line, sizeof(line), stdin);
if (1 == sscanf(line, "%d", &number))
{
break;
}
printf("not a number\n");
}
while (1)
{
fgets(line, sizeof(line), stdin);
sscanf(line, "%s\n", unitname);
found_unit = search_unit(unitname);
if (found_unit)
{
printf("%d %s is %f grams\n", number, unitname, found_unit->grams * number);
break;
}
printf("unknown unit\n");
}
}
#包括
类型定义结构单元{
字符*名称;
浮克;
}单位;
单位[]={
{“gram”,1.0},
{“千克”,1000.0},
{“磅”,500.0},
{“盎司”,28.3495231}
};
单位*搜索单位(字符*名称)
{
int i;
对于(i=0;i<(sizeof(单位)/sizeof(单位));i++)
{
printf(“%d%s\n”,i,单位[i]。名称);
如果(0==strcmp(单位[i]。名称,名称))
{
收益和单位[i];
}
}
返回NULL;
}
int main(){
字符行[10];
字符单位名称[10];
整数;
单位*已找到单位;
而(1)
{
fgets(生产线、尺寸(生产线)、标准DIN);
如果(1==sscanf(行、%d、&number))
{
打破
}
printf(“不是数字”);
}
而(1)
{
fgets(生产线、尺寸(生产线)、标准DIN);
sscanf(第%s\n行,单位名称);
找到单位=搜索单位(单位名称);
如果(找到单位)
{
printf(“%d%s是%f克\n”,编号,单位名称,找到单位->克*号);
打破
}
printf(“未知单位”);
}
}
- 将数据存储在某些数据结构中,而不是代码中
- 首先读一行文字,然后检查它是否是数字
- 从stdin读取时,请考虑缓冲区的大小
- 使用循环而不是转到
- 使用一些常用单位,例如克,来计算任何东西对任何东西
gets()
不安全,它允许缓冲区溢出。改用fgets(str,len,stdin)。我正要提出类似的建议。使用N个转换因子比使用N²转换因子要好得多。我真的记不起读取完整字符串的细微差别。我知道此时您可能希望阅读整行内容,而不仅仅是单个项目。执行两次转换可能会影响精度。没错,但精度不是问题。简单的代码是目标。