扫描多个输入并根据数量真/假输出 - 在C中

时间:2016-06-07 21:44:08

标签: c if-statement nested scanf

我的作业应该向用户询问有关飞机发射温度的一些问题。

EX:

  • 平均温度是多少?
  • 过去一天的最低气温?
  • 下雨了吗?

现在程序假设接受输入并将其基于几个条件

  • 温度必须为42度
  • 温度不能低于32
  • 不能下雨

所以我得到的结果是“好的'通过嵌套一些“如果陈述”来进行飞机发射,这一切都很好。问题是,根据不正确的陈述的数量,它会输出不同的东西。

EX:

如果唯一的问题是温度低于32度,它会输出:

" 飞机没有启动,因为过去一天温度已降至32度以下"

如果温度降至32度以下并且下雨,程序会吐出来

" 飞机未启动,因为:

温度低于32度

下雨"

我知道我可以针对每种情况制作一大堆if语句,但这只会让我的代码变得庞大而且令人困惑。当然必须有一种更简单的方法来设置它,其中有2个语句是假的,所以打印这个取决于哪个2'。我应该做一个转换声明吗?

我接受的最后一课我把所有的工作分成了函数,然后在需要的时候将每个工作调成main。在本课程中,我们必须完成主要功能中的所有工作,这有点令人困惑,因为我开始学习不同的方式。

提前致谢。

2 个答案:

答案 0 :(得分:1)

ternary operator结合格式字符串是解决此问题的便捷方法。

三元运算符允许您根据某些布尔表达式有条件地分配值,格式字符串允许您将其他字符串注入printfs,甚至是空字符串:

char *cond1 = temperature_is_low ? "the temperature is low" : "";
char *cond2 = is_raining ? "it's raining" : "";
char *sep = (temperature_is_low && is_raining) ? " and " : "";
printf("The plane will not launch because %s%s%s.\n", cond1, sep, cond2);

如果你不能使用三元运算符或格式化字符串,你可以通过多行分隔打印来做同样的事情:

printf("The plane will not launch because ");
if (temperature_is_low)
    printf("the temperature is low");
if (temperature_is_low && is_raining)
    printf(" and ");
if (is_raining)
    printf("it's raining");
printf(".\n");

答案 1 :(得分:0)

您可以执行以下操作:

#define avgTmpErrMsg "the temperature is below 42 degrees"
#define lowTmpErrMsg "the temperature has dropped below 32 degrees in the past day"
#define rainingErrMsg "it's raining"


short state = (avgTmp < 42) + ((lowTmp < 32)<<1) + ((raining)<<2); // store the state in one simple variable
short nErr = (avgTmp < 42) + (lowTmp < 32) + (raining); // number of error
switch(nErr){
   case 0: // no error
      printf("could launch\n");
      break;
   case 1: // one error
      printf("The plane is not launching because %s\n", msg(state,1));
      break;
   case 2: // 2 errors
      printf("The plane is not launching because:\n%s\n%s\n",msg(state,1),msg(state,2));
      break;
   case 3: // 3 errors
      printf("The plane is not launching because:\n%s\n%s\n%s\n",msg(state,1),msg(state,2),msg(state,3));
      break;
}



char* msg(short err,short n) {
    /* print the nth error stored in err */
    return ((err&1 && (!(--n)))? avgTmpErrMsg : ((err&2 && (!(--n)))? lowTmpErrMsg : rainingErrMsg));
}