程序设计实践——第二章
一、字符加密
编写程序,将“China”译成密码。密码规律:用原来的字母后面第4个字母代替原来的字母,例如:字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”并输出。
程序分析:
- 字符型数据在C语言当中实际上是以ASCII码的形式存储在内存单元中,例如‘a’的ASCII码值为97,字符b的ASCII码值为98。
- 由上图可知,字符’a’+1的值与字符’b‘的ASCII的码值相同。
示例代码
#include "stdio.h"
int main()
{char c='a',c2='b';c=c+1;printf("c=%c,c2=%c\n",c,c2);return 0;
}
输出结果
3.由此可知,若需要将密码翻译为字母后4位,只需要在原来的基础上把ASCII的码值加4即可。
示例代码
#include "stdio.h"
int main()
{char c1='C',c2='h',c3='i',c4='n',c5='a';c1+=4;c2+=4;c3+=4;c4+=4;c5+=4;printf("密码是%c%c%c%c%c\n",c1,c2,c3,c4,c5);return 0;
}
知识扩展
根据ASCII码表可知,大写字母和小写字母之间的码值相差32,即可得:
字符大写转小写 +32
字符小写转大写 -32
- 下面是一个字母大小写字符转换的程序案例。
#include "stdio.h"
int main()
{char c1='*';scanf("%c",&c1);if(c1>='A' && c1<='Z')//大写字母 {c1=c1+32; //由于在ASCII码表中,大小写字符的差值为32,所以+32转换成小写 }else if(c1>='a' && c1<='z')//小写字母 {c1=c1-32; //转换成大写 }printf("%c",c1);return 0;
}
输出结果
补充:
- (逻辑与)&&:
在两个条件同时达成时,条件为真。
例如:if( a>=3 && a<=8 )
则当a的值为 3~8之间时,if语句里面的条件才成立,否则都不成立
二、数值拆分
编写程序,将一个三位数整数256的个位、十位和百位分离后输出,输出结果为a=2,b=5,c=6。
程序分析
- 运算符
‘/’:取整运算符
‘%’取余运算符
任何大于10的数都不可以被10整除,所以任何数对10取余都可以得到这个数的个位。
例:
#include "stdio.h"
int main()
{int a;scanf("%d",&a);printf("%d",a%10) ;return 0;
}
输出结果
2. 我们现在已经可以获取个位的值了,那么怎么获得一个数的十位呢?我们只需要把这个数/10%10就可以得到这个数的10位,它的原理是通过取整10抹掉这个数的最后一位,然后十位就变成了个位,我们再进行取余就可以获得十位上的数值了!
#include "stdio.h"
int main()
{int a;scanf("%d",&a);printf("%d",a/10%10) ;return 0;
}
输出结果
3.依次类推,下面是获取256每一位值的程序代码。
#include "stdio.h"
int main()
{int x=256;int a=x/100%10;int b=x/10%10;int c=x%10;printf("a=%d\n",a) ;printf("b=%d\n",b) ;printf("c=%d",c) ;return 0;
}
输出结果
三、浮点数运算
已知x=3.6,y=4.2。编写程序,求表达式x+y及(int)x%(int)(x+y)的值。
程序分析:
- 取余运算
取余运算只能进行整数之间的运算,所以我们在进行小数之间的取余运算时,需要先把小数类型转换为整数类型,再进行运算。 - 类型转换
- 隐式类型转换(自动转换)
在有多种数据类型混合计算的时候,若未人为控制类型,系统会自动进行类型转换
转换的规则是:存储长度较短的转换成存储长度较长的,且不丢失数据
char—>short—>int—>unsigned int(—>long—>unsigned long)—>double
↑
float-------
- 强制类型转换
隐式类型转换或赋值转换有时不会得到我们预期的结果,这时我们可以使用强制类型转换来实现我们想要的类型转换结果。
强制类型转换:人为地将某类型转换为另一类型
强制类型转换符:()括号
3.下面是强制类型转换的示例代码
#include "stdio.h"
int main()
{float x=3.6,y=4.2; int c;c=(int)x%(int)(x+y); //通过(int)将float类型强制转换为整数,然后进行取余运算。 printf("x+y=%f, (int)x%%(int)(x+y)=%d \n",x+y,c);return 0;
}
运行结果
补充:
- 运算优先级
C语言中,运算符除了常见的三大类,算术运算符、关系运算符与逻辑运算符之外,还有一些用于完成特殊任务的运算符。
运算符的运算优先级共分为15 级,1 级最高,15 级最低。 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符 优先级相同时,则按运算符的结合性所规定的结合方向处理。
此处例程先进行强制类型转换,然后再进行取余运算。