今天学第三章的第二节,我们先上一道题再说:
例. 求解简单的四则运算表达式。输入一个形式如 " 操作数 运算符 操作数 " 的四则运算表达式,输出运算结果,要求对除数为0的特殊情况做特殊处理。
咱们先上代码再解释:
#include <stdio.h>
int main(void)
{
double value1, value2;
char op;
printf("Type in an expression:");
scanf("%lf%c%lf", &value1, &op, &value2);
if(op=='+'){
printf("=%.2f\n", value1+value2);
}else if(op=='-'){
printf("=%.2f\n", value1-value2);
}else if(op=='*'){
printf("=%.2f\n", value1*value2);
}else if(op=='/'){
if(value2!=0){
printf("=%.2f\n", value1/value2);
}
}else{
printf("Unknown operator!\n");
}
return 0;
}
今天要讲的东西有点多,慢慢理解。
一、 字符型数据:
首先讲大家最关心的怎么用,然后再讲原理。
1、首先,最重要的就是字符的定义,字符变量在定义的时候用的类型名为:char 。给字符变量赋值的时候,记得要用 ' ' 括起来,如:
#include<stdio.h>
int main(void)
{
char op;
op = 'a';
printf("%c\n", op);
return 0;
}
这里要注意的是 op = 'a' :就是把 a 赋值给 op 。如果是 op = 'abcd' ,输出出来的结果就会是最后一个字符 d 。我也不知道是什么原理。一定要注意要区分数字和数字字符,例如:1 是整型数字,而 '1' 是字符。
2、字符的输入与输出可以调用函数scanf() 、printf() 和 getchar() 、putchar() 。输入可以调用函数:getchar() 、scanf() ,输出可以调用函数 printf() 、putchar()。
(1)、调用函数 seanf() 和 printf() 输入输出字符。
函数 scanf() 和 printf() 除了处理整型数据和浮点型数据的输入输出外,也可以处理字符型数据的输入输出。此时,在函数调用的格式控制字符串中相应的格式控制说明为 %c , 如:
#include<stdio.h>
int main(void)
{
char op;
printf("Please enter a character:");
scanf("%c", &op);
printf("%c\n", op);
return 0;
}
(2)、调用函数 getchar() 和 putchar() 输入输出字符。
调用字符输入函数 getchar() 可以从键盘输入一个字符。设 ch 是字符型变量,函数 getchar() 的一般调用格式为:
ch = getchar();
其功能是从键盘输入一个字符,并赋值给变量ch。
调用字符输出函数 putchar() 可以输出一个字符。函数 putchar() 的一般调用格式为:
putchar(输出参数);
其功能是输出参数是字符型变量或字符型常量。
由于函数 getchar() 和 putchar() 分别只能输入和输出一个字符,如果要处理多个字符的输入和输出,就需要多次调用函数,一般采用循环调用的方式,如:
for(i=1;i<=n;i++){
ch = getchar();
putchar(ch);
}
最基本的使用讲了,然后我们看看具体的细节。
首先,字符型常量指单个字符,用一对单引号及其所括起的字符来表示。例如:'A' 、'a' 、'9' 、'$' 是字符型常量,它们分别表示字母 A 、a 、数字字符 9 和符号 $ 。
然后,先讲逻辑运算再补充字符的东西。
我的理解就是数学里面的或、且、非。当然所表达的意思也就和数学一样了,比如:
1、(op>='a')&&(op<='z') 表达的意思就是 op 属于字符 'a'、'b'、... 、'z' 这个区间。
2、(a>=1)||(a<=9) 表达的意思就是 a 属于[1,9]这个区间。
3、a ! = b 表达的意思就是 a 不等于 b 。
我们直接上一道题实战一下:
#include<stdio.h>
int main(void)
{
int i, n, Numeric_characters, English_characters, Other_characters;
char ch;
printf("Enter n:");
scanf("%d", &n);
getchar();
printf("Enter %d characters:",n);
Numeric_characters = 0;
English_characters = 0;
Other_characters = 0;
for(i=1;i<=n;i++){
ch = getchar();
if((ch>='0')&&(ch<='9')){
Numeric_characters++;
}else if((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='z')){
English_characters++;
}else{
Other_characters++;
}
}
printf("Numeric_characters=%d\nEnglish_characters=%d\nOther_characters=%d\n", Numeric_characters, English_characters, Other_characters);
return 0;
}
这道题其实并不难,重在对知识的理解。
在打代码的时候遇到了个问题,我相信你们应该也会遇到,我们就拿出来看看,减少犯错:
比如,我们要输入n个字符,然后再输出这n个字符,并且在每个字符之间加上一个链接符(-)。
代码按道理应该长这样:
#include<stdio.h>
int main(void)
{
int i, n;
char op;
printf("Please enter n:");
scanf("%d", &n);
printf("Please enter %d character:", n);
for(i=1;i<n;i++){
scanf("%c", &op);
printf("%c-", op);
}
scanf("%c", &op);
printf("%c", op);
printf("\n");
return 0;
}
但是,运行一下你会发现一个离谱的事情:结果不对!
当我们输入 6 时,程序已经运行了一次了。怎么会这样呢?因为我们输入 6 后,我们还按了一下Enter键从而让程序继续运行,但是别忘了,回车也是一个字符,程序把回车也当成了一个字符,并把它赋值给了 op 。那这个问题怎么解决呢?其实很简单,我们只需要在循环之外把回车赋给 op ,然后循环里面再次赋值的时候就会把回车给覆盖掉,这个问题就被完美解决了。也就是在
printf("Please enter %d character:", n);
for(i=1;i<n;i++){
这两句之间加一句:
op = getchar();
就行了。
突然还想到一个:在输入 n 个字符的时候,必须连续输入,字符之间不能有间隔哟,因为空格也是算一个字符的。
今天就打到这里吧,我打不动了,嘿嘿。