C语言程序设计
1.程序设计基本概念
- 程序和程序设计
- 算法
- 结构化程序设计和模块化结构
1.C程序
程序是指人们存储在计算机内部存储器中,可以连续执行的条条指令的集合。它是人与机器进行“对话”的语言,也就是我们常说的“程序设计语言”
C语言是一种“高级语言”,另外的BASIC、PASCAL等也属于高级语言。这些语言都是接近人们习惯的自然语言和数学语言作为语言的表达形式,人们学习和操作起来感动十分方便。蛋对于计算机本身来说,它并不能直接识别由高级语言编写的程序,它只能接受和处理由0和1的代码构成的二进制指令或数据。由于这种形式的指令是面向机器的,因此也被称为“机器语言”。
我们把由高级语言编写的程序称为“源程序”由二进制代码表示的程序称为“目标程序”,而“编译程序”是指可以把源程序转换成目标程序的软件,即可以把用户按规定语法写出的语句逐一翻译成二进制的机器指令。每一种高级语言都有它对应的编译程序。
每条C语句经过编译(Compile)最终都将转换成二进制的机器指令。由C语言构成的指令序列称C源程序,按C语言的语法编写C程序的过程,称为C语言的代码编写。
C语言源程序经过编译后生成一个后缀为.OBJ的二进制文件称为目标文件),最后还要由“连接程序”( Link)将此OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。在DOS状态下,只须打入此文件的名字(不必打入后缀EXE)就可以运行
编辑——编译——连接——exe可执行文件
重点:
高级语言编写的程序称为“源程序”二进制代码表示的程序称为“目标程序“,而“编译程序”是指可以把源程序转换成目标程序的软件。每条C语句经过编译(Compile)最终都将转换成二进制的机器指令(.OBJ的文件)。最后由“连接程序”(Link)将此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件
程序设计的一般过程
- 根据要求确定存放数据的数据结构
- 针对数据结构来确定完成任务的步骤,即确定算法
- 根据1和2使用选定的计算机语言编写程序代码输入到计算机中,即编程
2.算法
-
在编写程序时,除了选定合理的数据结构外,还需要十分关一个好的算法,就可以用任一种计键的一步就是设计算法,有了算机高级语言把算法转换为程序。
-
算法是指为解决某个特定问题而采取的确定且有限的步骤
-
算法的五个特性:
- 有穷性
- 确定性
- 可行性
- 有零个活多个输入
- 有一个或多个输出
-
算法描述
- 伪代码:它是一种近似高级语言但又不受语法约束的一种语言描述
- 流程图:它也是描述算法的很好的工具
- N-S流程图
- 这种流程图完全去掉了流程线,算法的每一步都用个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一完整的算法描述。
- 一般我们最常用的描述方法是伪代码和流程图
- 重点算法的5个特点
3.结构化程序设计
- 三种基本结构
- 顺序结构
- 顺序结构的程序在执行时按照先后顺序逐条进行,没有分支,没有转移
- 选择结构
- 选择结构的程序要根据不同的条件去执行不同分支中的语句
-
循环结构
-
不同形式的循环结构要根据各自的条件,使同一组语句重复执行多次或一次也不执行。循环结构包括当型循环(如图1.4所示当型循环的特点是:当指定的条和直到型循环(如图1.5所示)件满足时,就执行循环体,否则就不执行。直到型循环的特点是执行循环体直到指定的条件满足,就不在执行循环。
-
当型循环
- 直到型循环
- 模块化结构
计算机在处理复杂任务时,常常需要把这个大任务分解为若千个子任务,每个子任务又分成很多个小子任务,每个小子任务只完成一项简单的功能。在程序设计时,用一个个小模块来实现这些功能。我们称这样的程序设计方法为“模块化”,由一个个功能模块构成的程序结构就称为模块化结构。模块化结构可以大大提高程序编制的效率。
软件人员在进行程序设计时,首先应集中考虑主程序中的算法,写出主程序后再逐步完成子程序的调用。而对这些“子程序也可以用调用主程序的方法逐步完成其下一层子程序的调用。这就是自顶向下、逐步细化、模块化的程序设计。
c语言是一种结构化程序设计语言。它直接提供了三种基本结构的语句,提供了定义“函数”的功能,在C语言中没有子程字的概念,它提供的函数可以完成子程序的所有功能;c语言允许对函数单独进行编译,从而可以实现模块化。
2.C语言程序设计初步知识
- 简单C语言程序的构成和格式
- 常量、变量和标识符
- 整型数据
- 实型数据
- 算术表达式
- 赋值表达式
- 自加、自减运算符和逗号运算符
1.简单C语言程序的构成和格式
- 简单C语言程序
- 求矩形面积
/*
例题:求矩阵面积
作者:古月
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
double a,b,area; //a=长,b=宽,area=面积
a = 1.2;
b = 3.6;
area = a*b;
printf("a=%f,b=%f,area=%f\n",a,b,area);
system("pause");
return 0;
}
- 如果直接点调试会直接一闪而过
- 然后可以按Ctrl +F5
- 或者输system(“pause”);
- 或者输getch();
C语言的结构特征
- main函数作为主函数
- main()的括号不能省略
- 必须只有一个主函数,C语言总是从主函数开始执行
- 函数体用大括号括起来
- 一般是赋值和执行语句
- 每个语句后面要有分号。分号是C语句的必要组成成分
- 注释:/* */是多行注释,中间不能有空格
- //是单行注释,一个好的C程序应有必要的注释,以便阅读
- #include <stdio.h>是引用头文件
- 必须用#开头不接分号,是预处理命令
- stdio是系统退供的文件名
- 包含着输入输出函数的信息
- 调用不同的库函数,应当包含不同的头文件。
2.常量和标识符
- 标识符=名字
1.命名规则
- 只能用数字字母下划线组成
- 不能以数字开头
- 区分大小写
- 习惯:变量名用小写,常量名用大写
2.注意事项
- 标识符的命名区分大小写
- C语言的关键字是一类特殊的标识符
- C语言中提供了大量的库函数与头文件,标识符应注意避免和预定义标识符重名。
3.标识符的分类
- 关键字,在程序中代表着固定的含义,不能另作他用。如用来说明变量类型的标识符char、 float以及for、if等都已有专门的用途
它们不能用作变量名或函数名。 - 预定义标识符在c语言中也有特定的含义,如库函数的名字和预编译处理命令等。C语言语法允许用户把这类标识符另作他用,但是失去了在系统中规定的原意。为了避免误解,建议用户不要把这些预定义标识符另作它用。
- 用户标识符,由用户根据需要定义的标识符称为用户标识符。一般用来给变量、函数、数组或文件等命名。
- 如果用户标识符与关键字相同,程序会给出出错信息;若与预定义标识符相同,则预定义标识符将失去原来的含义
4.常量
不能被改变的量
- 整型常量
- 实型常量
- 字符常量
- 字符串常量
- 表现形式不同的常量:转义字符常量和符号常量。
1.整型常量
包括正整数、负整数、零
2.实型常量
实数又称为浮点数
3.字符常量
单引号包围,的单个字符。
- 单引号只是定界符
- 单引号包围的不是单引号或者反斜杠
- 字符常量在机器中以整形存放,与整形等价
4.字符串常量
- 字符串常量是由一对双引号括起来的字符序列
- 存放时需要放在一个字符型数组中
5.符号常量
- #define 标识符 值
- 这种方式定义
- 一个#define 只能定义一个符合常量
- 末尾没有分号
5.变量
- 要提前说明类型,编译时好分配空间
例题:
6.整型常量
C语言中整型常量有如下三种表示形式:
- 十进制。用一串连续的数字来表示
- 八进制。0开头,各位用0-7这八个数之一表示
- 十六进制。用0x或0X开头,各位使用0-9以及A-F这十六个数之一表示
整型常量又有短整型(short int)、基本类型(long int)、无符号(unsigned)的区分
7.整型变量
- 为整数的变量,命名与标识符规则相同。
- 变量一经说明,编译时就能为其分配相应的存储单元。
- 基本的整型变量用类型名关键字int进行定义
-
整型常量又有短整型(short int)、基本类型(long int)、无符号(unsigned)的区分
-
基本类型用int定义
-
基本型整型变量占4字节的存储单元,允许范围为-2147483648–+2147483647
-
C语言规定,可以在定义变量的同时,给变量初始化
main() { int a=1,b=4,i=8; ..... }
-
整数数据的分类
- 长整型后面加L或l
- 短整型以short int 或 short表示
- 无符号对应的就是在前面加上unsigned
int i; // 范围同上
unsigned int i; // 范围为0-65535
存储形式
-
计算机中最小的存储单位为位
-
8个二进制位组成一个字节(byte)
-
若干个字节组成一个字(word)
-
C语言中一个int型整数通常用4个字节存放
-
最高位为符合位
-
最高位为0时为正整数
-
最高位为1时为负整数
-
正整数用原码存放,负整数用补码存放
- 求原码的反码:0变1,1变0
- 将所得的反码加1,即得原码的补码
无符号整数
- 无符号整数的最高位不再用来存放整型的符号
- 因此比有符合的整数范围大了一倍
8.实型常量
又称实数
两种存放形式
-
小数形式,如0.78,0.0
-
指数形式,如12.34E+9,-5.453e-10
-
重点:+/-尾数部分E或e +/-指数部分,指数部分只能是整数
-
实型变量是指指为实数的变量。其命名规则与标识符的规则相同。
-
分类
-
单精度型(float),分配了4个字节的存储单元
-
范围-10的38次方到+10的38次方,小于-10的38次方的数被处理成0
-
双精度型(Double),分配了8个字节的存储单元
-
数值范围-10的308次方到+10的308次方,同上,小于-10的308次方的值被处理成0
-
-
在计算机内存中,实数一律是以指数形式存放,而不是小数形式。
-
例如:
float a; double b;
a=123456.789e5; b=123456.789;
3.基本运算符
- 加减乘除取摸都是双目运算符
- 如果双目运算符如果两边类型不一致,就转换成一样的类型再运算
- 小的类型往大的转换
- 求余要求参与的数必须为整数
- C语言中,所有实型数据的单精度都转换成双精度进行运算
- 每一个用运算符连起来的式子都有一个值,这个式子称为表达式
-
除了单目运算符±是从右到左,其余都是从左到右。
-
算术表达式
- 用算术运算符连接起来,符合C语言规范的式子称C算术表达式
- 有多层园括号时,运算时从最内层开始计算
强制类型转换
强制类型转换表达式的形式:(类型名)(表达式)
例如:
(float)(x)指把x转换成float类型
4.赋值表达式
赋值运算符是将一个数据或者运算表达式赋给另一个变量。
- 赋值运算符:注意左边必须是变量,右边既可以是常量,变量,也可以是函数调用或者表达式。
- 赋值表达式:先求出右边的值再赋值给左边
- 可以给一个变量多次赋值,他的值是最后一次赋值结果。
- 赋值表达式加上了一个分号就构成了一个语句(凡是加分号的都是语句)
- 赋值运算符的左边只能是变量,不能是常量或者表达式
复合的赋值运算符
作用:
- 简化程序
- 提高编程效率
- *有+= -= = %=
- 位运算 <<= >>= &= ^= = |=**
注意:
- 复合运算符的优先级与赋值运算符的优先级相同
类型转换
- 大转小丢失精度
- 小转大,不会丢失,但是会自动补零
- 将字符型变量赋值给整型时,将低八位赋值给字符变量
- 将整型变量赋值给字符变量时,将低八位赋值给字符变量即可
自加自减运算符
- ++a a加1后再参与运算
- a ++ a参与运算后再加1
注意:
- 只能用于变量,不能用于常量或表达式
- 但是自增自减运算符和其他运算符混合使用时,应该注意其结合性为“自右向左”
- 如 -a++ 和 -(a++)是等价的
逗号运算符和逗号表达式
- 计算顺序,从左至右
- 优先级最低
3.顺序结构
1.赋值语句
- 尾部加了分号构成了表达式语句
- 分号不可或缺
- 表达式和赋值语句的区别是有没有分号再结尾
2.数据输出
- printf()是标准的输出函数
- 格式控制字符串,它总是以%符合开始,紧跟其后的是格式描述符。
- 原样输出
- 分三类:格式说明符,转义字符,普通字符
1.格式字符
格式说明符由%和格式字符组成,如%d、%f等。作用是转换输出数据的格式。对于不同类型的数据用不同的格式字符。下面详细介绍几种常用的格式字符。
- 常见的格式字符:%d 用来输出十进制整数
- %ld 输出长整型数据
- %-md看图
- %f格式字符:整数位全部输出,小数部分保留6位
- %mf 输出的实数共占m位,小数部分保留六位
- %c 用来输出一个字符
-
%s 输出一个字符串
-
%m.ns and %-m,ns 看图
2.格式字符输出表
附加格式字符
3.长度修饰符
- 长整型加l 如 %ld
- 短整型short 加 h
- 无符号短整型
4.转义字符
-
\n \b \f \t \r \344
-
\n是换行 \b是制表位
*注意事项
- 类型必须相同
- 格式必须相同
- 数量必须相同
- 多余将输出不定值
3.数据的输入
1.scanf函数
-
scanf(“格式控制”,输入项表)
-
格式控制同printf,输入项表,是由若干个变量地址组成的序列,用“&”取地址
-
有次序之分
-
输入用空格隔开
-
输入项地址序列中的变量前需要加“&”
-
格式字符
- 常用附加字符
2.几点说明
- 可以指定输入数据所占列数,系统自动按它截取所需数据
- 标准C在scanf()函数中不使用%u说明符,对unsigned型数据,以%d,%o,%x输入
- 在输入的时候如果想跳过某个数据可以在%后加一个“*”
- 输入数据时不能规定精度
- 如上图,在输入a与b的值时,中间的","不能省略,否则出问题
4.复合语句与空语句
1.复合语句
- 在C语言中,可以用一对大括号"{}"把一些语句括起来构成复合语句,又称分程序或语句块。
- {语句1;语句2;…语句n;}
- 在复合语句内,不仅可以有执行语句,还可以有定义部分,定义部分应出现在可执行语句的前面。
- 复合语句中最后一个语句的最后一个分号不能省略。
- 复合语句可以嵌套。即复合语句内部可以包含其他复合语句。
- 单行语句的整合->完成一个统一的目标
2.程序举例
/*
例题:交换两个变量的值
作者:古月
*/
#include <stdio.h>
int main()
{
int x,y,temp;
printf("请输入x和y:");
// 输入
scanf("%d%d",&x,&y);
printf("交换前,x的值%d,y的值%d\n",x,y);
// 交换
temp = x;
x = y;
y = temp;
// 输出
printf("交换后,x的值%d,y的值%d\n",x,y);
}
/*
例题:输入一个double类型的数,使该数保留小数点后两位,第三位进行四舍五入处理,然后输出此数
作者:古月
*/
#include <stdio.h>
int main()
{
double x;
printf("请输入一个double类型的数字:");
scanf("%lf",&x);
printf("第一个输出,x为%lf\n",x);
// 把x扩大100倍,然后做四舍五入
x *= 100;
x += 0.5;
x = (int)x;
x /= 100;
printf("第二个输出,x = %lf\n",x);
}
4.选择结构
1.关系运算和逻辑运算
- C语言中的逻辑值
- 非零值为true 零值为false
2.关系运算符
- < <= > >=
- 优先级相同,从左至右开始运算
- 没有等于的大于有等于的
3.优先级
算术运算符 >关系运算符>赋值运算符
顺序:自左向右
用关系运算符将两个表达式连接起来的式子称为关系表达式
If语句
三种形式
-
if
-
if~else
-
if-else if ~ else
-
用大括号括起来,先计算判断值然后再执行括号内的复合语句
例题:
/*
例题:输入两个数,如果不相等输出大数,相同输出其中一个数即可
作者:古月
*/
#include <stdio.h>
int main()
{
int x,y;
printf("请输入两个数字:\n");
scanf("%d%d",&x,&y);
printf("x=%d y=%d\n",x,y);
if(x == y){
printf("x==y x=%d\n",x);
}else if(x>y) {
printf("x!=y,x大,x=%d",x);
}else{
printf("x!=y,y大,y=%d\n",y);
}
}
/*
例题:输入abc三个数,升序排列,最后输出abc的值
作者:古月
*/
#include <stdio.h>
int main()
{
int x,y,z,temp;
printf("请输入三个数字:\n");
scanf("%d%d%d",&x,&y,&z);
printf("x=%d y=%d z=%d \n",x,y,z);
// abc进行比较交换
if(x > y){
temp = x;
x = y;
y = temp;
}
if(x > z){
temp = x;
x = z;
z = temp;
}
if(y > z){
temp = y;
y = z ;
z = temp;
}
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
-
if-else
-
注意一个语句可以写再后面,多个语句必须用括号括起来
-
if-else-if-if
-
只有可能执行一个分支
例题
/*
例题:输入两个数,输出最大数
作者:古月
*/
#include <stdio.h>
int main()
{
int x,y,temp;
printf("请输入三个数字:\n");
scanf("%d%d",&x,&y);
printf("x=%d y=%d\n",x,y);
// abc进行比较交换
if(x > y){
temp = x;
x = y;
y = temp;
}
printf("最大数=%d\n",y);
}
/*
例题:判断是否能被3整除
作者:古月
*/
#include <stdio.h>
int main()
{
int x;
printf("请输入一个数字:\n");
scanf("%d",&x);
printf("x=%d\n",x);
if(x%3 == 0){
printf("Yes\n");
}else{
printf("No\n");
}
}
- 嵌套IF
如图
else是离最近的if来配对
/*
例题:判断学生成绩等级
作者:古月
*/
#include <stdio.h>
int main()
{
int grade;
// 输入数据
printf("请输入成绩\n");
scanf("%d",&grade);
printf("g = %d \n",grade);
// 判断等级
if(grade >= 90){
printf("A\n");
}else if(grade >=80){
printf("B\n",grade);
}else if(grade >= 70){
printf("C\n",grade);
}else if(grade >= 60){
printf("D\n",grade);
}else{
printf("E\n",grade);
}
}
三目运算符
- 条件运算符由 ? : 组成,要求有3个操作对象
- 表达式1?表达式2:表达式3
-
如果表达式为true(非零)走表达式2,否则(为0)走表达式3
-
表达式1为关系表达式或逻辑表达式
-
表达式2和3可以为常量或变量或表达式
-
条件表达式的优先级高于赋值运算符
-
多个条件表达式的结合方向(阅读方向),自右向左
switch语句
作用:多分支条件处理语句(开关语句)
switch(表达式)
-
switch case break default 均为C语言的保留字(关键字)
-
注意,执行default语句后会退出switch语句
例子:
- default 有没有break都会退出switch语句
例题:
/*
例题:判断学生成绩等级,用switch
作者:古月
*/
#include <stdio.h>
int main()
{
int grade;
// 输入数据
printf("请输入成绩\n");
scanf("%d",&grade);
printf("g = %d \n",grade);
// 判断等级
switch(grade/10){
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("E\n");
}
}
语句标号和goto语句
标号:标识符后加一个冒号
- goto时也只用加上标识符然后加一个分号即可
- 可以在任何语句之前加上标号
- goto语句被称为无条件转向语句
- 标号与goto语句必须在同一个函数内
- 少用少用
5.循环结构
1.while
- while是C语言中的关键字
- 后的表达式可以是任何合法的表达式,非零时条件为真,零时为假
- 先计算表达式再循环
do-while和while循环区别就是是否先循环再判断
例题:
/*
例题:求阶乘和大于1万
作者:古月
*/
#include <stdio.h>
int main()
{
int i,sum;
i = 0;
sum = 0;
while(sum < 10000){
sum += i * i;
i++;
}
printf("最终n值为%d\nsum = %d\n",i-1,sum);
}
/*
例题:用π/4 = 1 - 1/3 + 1/5 - 1/7 ... 求π的近似值,直到最后一项小于十的负6次方为止
作者:古月
*/
#include <stdio.h>
#include <math.h>
int main()
{
int s;
float n,t,pi;
t = 1.0; // t 中存放每项的值
pi = 0; // pi 中存放pi值
n = 1.0; // 存放 分母
s = 1; // 存放符合位 每次计算完后变换符合
while(fabs(t) >= 1e-6 ){
pi += t;
n += 2.0;
s = -s;
t = s/n;
}
printf("π=%f\n",pi*4);
}
/*
例题:用迭代法求方程x=cosx的根,要求误差小于10的负6次方
作者:古月
*/
#include <stdio.h>
#include <math.h>
int main()
{
double x1,x2;
x1 = 0;
x2 = cos(x1);
while(fabs(x2 - x1) > 1e-6){
x1 = x2;
x2 = cos(x1);
}
printf("%f",x1);
}
2.do-while
先执行一次循环语句,然后再判断
- 直到型循环语句
例子:
/*
例题:Fibonacci数列,直到某项大于1000为止,并输出改项的值。
作者:古月
*/
#include <stdio.h>
int main()
{
int f1,f2,fi;
f1 = 0;
f2 = 1;
do{
fi = f1 + f2;
f1 = f2;
f2 = fi;
}while(f2 <= 1000);
printf("F = %d",f2);
}
3.for循环
- for循环的三个表达式都要合法,有规定
-
for的表达式1可以省略,分号不能省略,应该在for循环之前给变量赋初值
-
如果省略表达式2,会变成死循环
-
如果省略表达式3,也将产生无限循环,如果想终止循环,可以将i的变化放在循环体中
-
同时省略表达式1和表达式3,完全等价于while循环
-
如果省略表达式1和2和3,持续为真,将是一个死循环
-
表达式1和3不仅可以使用简单表达式,可以使用逗号表达式
-
for循环的循环体可以是空语句,用来实现延迟如for(i=1;i<=1000;i++);
-
如果循环体只有一条语句,可以不用花括号
例题:
/*
例题:求1到100的数字和
作者:古月
*/
#include <stdio.h>
int main()
{
int i=0,sum=0;
for(i=0;i<100;i++,sum+=i);
printf("sum=%d\n",sum);
}
4.循环的嵌套
- while于while的嵌套
- do-while和do-while的嵌套
- for和for的嵌套
- 还可以相互嵌套
- 不要交叉嵌套
- 使用的变量名不同同名
例子:
/*
例题:使用双层循环打印倒三角图形
作者:古月
*/
#include <stdio.h>
#define PI 3.1415926
int main()
{
int i,j;
for(i = 0; i < 4; i++){
for(j=0;j<i;j++){
printf(" ");
}
// * 的数量7 - 2*(i-1) = 9-2i
for(j=1;j<=7-2*i;j++){
printf("*");
}
printf("\n");
}
}
/*
例题:找出2-100内的所有素数
作者:古月
*/
#include <stdio.h>
#define PI 3.1415926
int main()
{
int k,i,tag;
for(i = 2;i <= 100; i++){
tag = 0;
for(k=2;k<i;k++){
if(i%k == 0){
tag = 1;
}
}
if(tag == 0){
printf("%d,",i);
}
}
}
5.break和continue
- break跳出本次循环
- continue结束本次循环
- continue完后执行表达式3
例子:
/*
例题:在循环体中执行continue的示例
作者:古月
*/
#include <stdio.h>
#include <math.h>
int main()
{
int k=0,s=0,i;
for(i=1;i<=5;i++){
s += i;
if(s>5){
printf("*** i = %d ,s = %d k = %d\n",i,s,k);
continue;
}
k=k+s;
printf("i = %d , s = %d ,k = %d\n",i,s,k);
}
}
6.程序练习
/*
例题:从输入的若干个数中选出最大值,用-1结束输入。
作者:古月
*/
#include <stdio.h>
#include <math.h>
int main()
{
int x,max;
printf("请输入x,-1是结束符号\n");
do
{
printf("Enter x;");
scanf("%d",&x);
}while(x < 0 && x != -1);
max = x;
while(x != -1){
printf("Entet x");
scanf("%d",&x);
if(x>0 && x>max){
max = x;
}
}
if(max != -1){
printf("max = %d\n",max);
}
}
/*
例题:求标准sqrt
作者:古月
*/
#include <stdio.h>
#include <math.h>
int main()
{
float a,x,y;
printf("请输入一个a值:");
scanf("%f",&a);
if(a<0){
printf("error\n");
}else{
x = a/2;
y = (x+a/x)/2;
do{
x = y;
y = (x + a/x);
}while(fabs(x-y) < 1e-6);
}
printf("sqrt=%f",y);
}
6.字符型数据
1.字符常量
- 单引号引起来
- 特殊字符和转义字符都不能出现
- 存储用ASCII码表的值来存储
- 占一个字节,可以参与运算,先转为整型
2.转义字符常量
如图:
-
使用双引号一个字符占两个字节,单引号而占一个字节
-
字符常量也可以进行关系运算
-
也可以进行逻辑运算
-
都会转成整数进行运算
3.字符变量
char 字符变量表;
/*
例题:
作者:古月
*/
#include <stdio.h>
#include <math.h>
int main()
{
char ch;
ch = 'A';
printf("ch is %c , ch = %d \n",ch,ch);
}
4.字符的输入与输出
-
printf和scanf都必须使用%c说明符,但可以在格式字符前加一整数m,用来指定输出字符的宽度。
-
scanf中的%c是一个挨着一个
-
putchar的作用是向终端输出一个字符,参数可以是字符变量,字符常量,整型变量,也可以是ASCII值
-
getchar从终端接收一个字符
-
getchar
-
putchar
5.程序举例
/*
例题:输出26个大写字母和他们的ASCII码
作者:古月
*/
#include <stdio.h>
#include <math.h>
int main()
{
char ch = 'A';
int i=0;
for(i=0 ; i<26 ; i++){
ch = i + ch;
if(i %2 == 0){
printf("\n");
}
printf("ch = %c i = %d\t",ch,ch);
}
}
/*
例题:程序段等待终端输入,当按下enter键时,程序才继续往下执行
作者:古月
*/
#include <stdio.h>
int main()
{
printf("Please Enter to continue!\n");
while(getchar() != '\n');
}
/*
例题:把终端输入的所有小写字母转变为大写字母
作者:古月
*/
#include <stdio.h>
int main()
{
char c;
while((c = getchar()) != '\n'){
if(c >= 'a' && c <= 'z'){
c = c - 'a' + 'A';
putchar(c);
}
}
}
/*
例题:统计空格符换行符横向跳格符的格式 !结束输入
作者:古月
*/
#include <stdio.h>
int main()
{
long n1 = 0;
long n2 = 0;
long n3 = 0;
char c;
while((c=getchar()) != '!'){
if(c == ' '){
n1++;
}else if(c == '\t'){
n2++;
}else if(c== '\n'){
n3++;
}
}
printf("n1 = %d n2 = %d n3 = %d\n",n1,n2,n3);
}
/*
例题:把一串密文译成明文,密文以字符@表示结束。译码规则如下.
1)
如果是字母,转成字母序列的下一个字母,如A译成B,B译成C等
2)
如果是字母Z,译成A
3)
无论是大小写字母都译成小写字母
4) 其他字符一律原样译出
作者:古月
*/
#include <stdio.h>
#include <ctype.h>
int main()
{
char c ;
while((c= getchar()) != '@'){
if(isalpha(c)){
c = tolower(c);
c = (c - 'a' + 1)%26 + 'a';
}
putchar(c);
}
printf("\n");
}