任务描述
本关任务:统计大写字母个数。
相关知识
视频1 初识文本处理之单词计数II — C 语言的逻辑运算符
逻辑运算符
C 语言定义了3个逻辑运算符,其表示方法及含义如下表所示。
逻辑运算 | C语言符号表示 | 说明 |
---|---|---|
与 | && | 双目运算符,若两个操作数都是非 0 值,运算结果为真(1),否则为假(0) |
或 | || | 双目运算符,两个操作数中任一个的值非 0 ,运算结果为真( 1 ),否则为假( 0 ) |
非 | ! | 单目运算符,若操作数的值为 0 ,则运算结果为真( 1 ),否则为假( 0 ) |
下表列出了目前学习过的部分 C 语言运算符的优先级。
优先级 | 运算符 | 结合性 |
---|---|---|
高 ↑ 低 | ! ++ -- & | 从右至左 |
* / | 从左至右 | |
+ - | ||
< <= > >= | ||
== != | ||
&& | ||
|| | ||
= | 从右到左 |
逻辑表达式的求值次序
下面的代码片段将根据表达式((a < b)&&(x < y))||(c = b - !c)
的值输出不同的内容。
int a = 10, b = 20, c = 5;
float x = 1.8, y = 2.4;
if (((a < b) && (x < y)) || (c = b - !c)) {
printf("该表达式值为真(1),");
printf("c = %d\n", c);
}
else {
printf("该表达式值为假(0),");
printf("c = %d\n", c);
}
输出结果:
该表达式值为真(1),c = 5
若变量a
的值为30,上述程序代码的输入结果为:
该表达式值为真(1),c = 20
在上面两个输出结果中,变量c
的值不一样,这是 C 语言对逻辑表达式规定的特殊求值次序造成的。下面来看一下表达式((a < b)&&(x < y))||(c = b - !c)
的求值次序。
- 根据运算符优先级,首先计算逻辑与运算表达式
(a < b)&&(x < y)
的左操作数(a < b)
,若其值为 1 ,则继续计算右操作数(x < y)
的值,并根据逻辑与运算规则计算表达式的值;若左操作数的值为 0 ,则可以直接得到逻辑与运算的结果值为 0 ,此时不再计算右操作数。 - 若逻辑或运算的左操作数,即表达式
(a < b)&&(x < y)
的值为 1 ,则可以直接得到逻辑或运算的结果值为 1 ,此时不再计算其右操作数(c = b - !c)
;若左操作数的值为 0 ,再计算右操作数,并根据逻辑或运算规则计算表达式的值。
根据上面描述的表达式求值次序,可以看到:
- 当变量
a
的值为 10 时,逻辑或运算||
的左操作数(a < b)&&(x < y)
的值为 1 ,其右操作数(c = b - !c)
不会计算,变量c
仍然保持原值 5 ,整个表达式的求值计算终止,表达式的结果为 1 。 - 当变量
a
的值为 30 时,逻辑或运算||
的左操作数(a < b)&&(x < y)
的值为 0 ,这时需计算右操作数(c = b - !c)
的值,变量c
的值变为 20 ,整个表达式的值为 1 。
注意:当逻辑或运算 || 和逻辑与运算 && 构成表达式,并从左到右求值时,若根据左操作数就能判断最终结果为真或假时,求值立即终止,右操作数不会被计算。
下面列出了几类常用的逻辑表达式。 若要判断变量x
是否在 [ 1 , 100 ) 区间中,正确的表达式如下所示。
x >= 1 && a < 100 // 正确表示 x ∈ [ 1 , 100 )
不是采用如下代码。
1 <= x < 100 // 错误表示 x ∈ [ 1 , 100 )
当要判断一个变量是大写字母 'A'、换行符,或者是空格符时,应该用如下表达式。
c == 'A'||c == '\n'||c == ' '
编程要求
根据提示,在右侧编辑器中的 Begin-End 区间补充代码。读入一行文本,统计里面大写字母的个数。 格式要求详见测试说明。
测试说明
平台会对你编写的代码进行测试。
测试输入:safgakghJAadfg
预期输出:
该文本流大写字母共有2个。
测试输入:safgakgfg
预期输出:
该文本流大写字母共有0个。
代码展示:
#include<stdio.h>
int main()
{
int i,a,m=0;
for(i=0;i<30;i++)
{a=getchar();
if(a<='Z'&&a>='A')
{m=m+1;
}
}
printf("该文本流大写字母共有%d个。\n",m);}/* 本程序用于计算大写字母个数 */
/* 请在此处添加代码,统计大写字母 */
/********** Begin **********/
/********** End **********/