什么是计算机程序
计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
什么是计算机语言
计算机语言(Computer Language)指用于人与计算机之间通讯的语言。
C语言的发展及其特点
C语言演变的过程
C语言的祖先是BCLP语言。
1967剑桥大学的马丁·理查兹(Martin Richards)推出了没有类型的BCLP语言。
1970 贝尔实验室的研究员肯·汤普森以 BCPL 为基础设计出了简单且接近硬件的B语言。肯·汤普森用B语言做了一件很重要的事情,他用B语言写出了世界上第一个操作系统——UNIX 操作系统。
1972 丹尼斯·里奇在B语言的基础上最终设计出了C语言。
1973 年初,C语言的主体完成【面向过程语言】。肯·汤普森和丹尼斯·里奇开始用C语言完全重写 UNIX,这就是 UNIX 第 5 版。
C++【面向对象的程序设计语言】 是本贾尼·斯特劳斯特卢普编写的,他也来自贝尔实验室,是C语言创始人丹尼斯·里奇的下属。
Sun 公司又对 C++ 进行改写,产生了 Java
微软公司发现 Java 很流行,就造出了一个类似的语言C#
Java 和 C# 都源自于 C++
可见C语言的重要性。
开发C语言的目的
尽可能降低用它所写的软件对硬件平台的依赖程度,使之具有可移植行。
C语言的特点
具有多种数据类型(如数字,数组,字符,结构体和指针等)。
语言简洁紧凑,使用方便,灵活。
运算符丰富。
数据类型丰富。
具有结构化的控制语句。
语法设计不太严格,程序设计自由的大。
C语言允许访问物理地址,能够进行位操作,能实现汇编语言的大部分功能,可以对硬件直接进行操作。
用C语言编写的程序移植性好。
生成目标代码质量高,程序执行效率高。
C语言程序举例(以题的形式)
-
例子:要求在屏幕上输出下一行信息
This is a C progream.
解题思路:在主函数中用printf函数原样输出以上文字
-
编写程序
#include
//编译预处理指令 int main(){ //定义主函数 printf("This is a C progream."); //输出函数指定的一行信息 return 0; //函数执行完毕时返回函数值0 } -
运行结果
This is a C progream. -------------------------------- Process exited after 0.03664 seconds with return value 21 请按任意键继续. . .
-
例子:求两数的和
解题思路:设置三个变量sum,a,b;sum用于存储a,b的和;用赋值运算符"="把结果传给sum
-
编写程序
#include
//编译预处理指令 int main(){ //定义主函数 int sum,a,b; //定义整型变量 a=3; //给a赋值 b=5; //给b赋值 sum=a+b; //运行a+b的运算把结果存放在sum中 printf("sum is %d\n",sum); //输出结果 %d:指的是输出格式,d表示用“十进制整数输出” return 0; //函数执行完毕时返回函数值0 } -
运行结果
sum is 8 -------------------------------- Process exited after 0.03384 seconds with return value 0 请按任意键继续. . .
-
例子:比较两个整数中的较大者
解题思路:用一个函数来实现求两个整数中的较大者。
-
编写程序
#include
//编译预处理指令 int main() { //定义主函数 int max(int x,int y); //对被调用的函数max声明 int max_num,x,y; //定义整型变量 scanf("%d,%d",&x,&y); //输入x,y的值,其中&在c语言中是地址符,,&x是x的变量的地址 max_num=max(x,y); //调用max printf("max=%d\n",max_num); //输出最大值 return 0; //函数执行完毕时返回函数值0 } int max(int x,int y) { //定义一个含两个整型参数,返回值为整型的max函数 int z; //定义一个整型的变量用于接收 if(x>=y) { //判断与比较 z=x; } else { z=y; } return z; //输出最大值 } -
运行结果
1,2 max=2 -------------------------------- Process exited after 3.688 seconds with return value 0 请按任意键继续. . .
C语言程序的结构
1. 一个程序由一个或多个源程序文件组成。
* 预处理指令
* 全局声明
* 函数定义
2. 函数是C语言的重要组成部分
3. 一个函数包括两部分
* 函数首部
* 函数体
* 声明部分
* 执行部分
4. 程序总是从main函数开始执行的
5. 程序中对计算机的操作都是由函数中的C语句完成的
6. 在每个数据的声明和语句的末尾必须有一个分号
7. C语言本身不提供输入和输出语句
8. 程序应当包含注释
运行C语言程序的步骤
程序设计的任务
1. 问题分析
2. 设计算法
3. 编写程序
4. 对源程序进行编辑,编译和连接。
5. 运行程序,分析结果
6. 编写程序文档
习题
-
求解梯形的面积
-
题目描述
-
题目内容:从键盘上输入一个梯形的上底a、下底b和高h,输出梯形的面积。
输入样例:2,4,3
输出样例:9.000000
-
编写程序
#include
int main() { float width_up,width_butt,height; float result; scanf("%f,%f,%f",&width_up,&width_butt,&height); result = ((width_up + width_butt) * height)/2; printf("%f",result); } -
运行结果
2,3,4 10.000000 -------------------------------- Process exited after 5.387 seconds with return value 9 请按任意键继续. . .
-
-
-
求解矩形的面积
题目描述
-
题目内容:编写一个程序,从键盘读入一个矩形的两个边的值(整数),输出矩形面积。
输入样例:3,5
输出样例:15
-
编写程序
#include
int main() { int width,height; int result; scanf("%d,%d",&width,&height); result = width*height; printf("%d",result); } -
运行结果
3,4 12 -------------------------------- Process exited after 2.639 seconds with return value 2 请按任意键继续. . .
C语言中的关键字(37)
原来的K&R关键字共27个:auto double int struct break else long switch case register typedef char extern return union float short unsigned continue for default goto sizeof do if while static
ISO/ANSI C90新增5个:enum signed void volatile const
C99新增5个: inline restrict _Bool _Complex _Imaginary
总共27+5+5=37个
根据关键字的作用,可以将关键字分为**数据类型关键字**和**流程控制关键字**两大类
数据类型关键字(20)
基本数据类型(5个)
1. void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
2. char:字符型类型数据,属于整型数据的一种
3. int:整型数据,通常为编译器指定的机器字长
4. float:单精度浮点型数据,属于浮点数据的一种
5. double:双精度浮点型数据,属于浮点数据的一种
类型修饰关键字(4个)
6. short:修饰int,短整型数据,可省略被修饰的int
7. long:修饰int,长整形数据,可省略被修饰的int
8. signed:修饰整型数据,有符号数据类型
9. unsigned:修饰整型数据,无符号数据类型
复杂类型关键字(5个)
10. struct:结构体声明
11. union:共用体声明
12. enum:枚举声明
13. typedef:声明类型别名
14. sizeof :得到特定类型或特定类型变量的大小
存储级别关键字(6个)
15. auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
16. static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
17. register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
18. extern:指定对应变量为外部变量
19. const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
20. volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
流程控制关键字(12个)
跳转结构(4个)
21. return:用在函数体中,返回特定值(或者是void值,即不返回值)
22. continue:结束当前循环,开始下一轮循环,执行到此只结束本轮循环,继续新一轮循环
23. break:跳出当前循环或switch结构,执行到此跳出所有的循环,即结束for语句等
24. goto:无条件跳转语句
分支结构(5个)
25. if:条件语句
26. else:条件语句否定分支(与if连用)
27. switch:开关语句(多重分支语句)
28. case:开关语句中的分支标记
29. default:开关语句中的“其他”分治,可选。
循环结构(3个)
30. for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件
31. do:do循环结构,do 1 while(2);的执行顺序是1->2->1...循环,2为循环条件
32. while:while循环结构,while(1) 2;的执行顺序是1->2->1...循环,1为循环条件
- (以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。)
- PS:C语言把0作为false假,非0为true真
C99新增(5个)
33. inline:内联函数,是为了解决C 预处理器宏存在的问题所提出一种解决方案,用来提高函数使用效率。内联函数使用inline关键字定义,并且函数体和申明必须结合在一起, 否则编译器将他作为普通函数对待。
34. restric:关键字只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。
35. Bool:布尔类型,用来表示真或假,零表示假,非零表示真。所有非零的数赋值给布尔型变量,最终的值还是1,包含标准头文件 stdbool.h 后,我们可以用 bool 代替 _Bool ,true 代替 1 ,false 代替 0
36. _Complex:表示复数,复数类型包括一个实部和一个虚部_
37. Imaginary:表示虚数,虚数类型没有实部,只有虚部
C语言中的运算符(34)
C语言中一共有34个运算符,大致的优先级别是:初等运算符、单目运算符、算数运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符、逗号运算符。
第一优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
[] | 数组下标 | 数组名[常量表达式] | 从左到右 | |
() | 圆括号 | (表达式)/函数名(表达式) | ||
. | 结构体运算符 | 结构体.成员名 | ||
-> | 指向结构体运算符(指针) | 结构体->成员名 |
第二优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
- | 符号运算符 | -表达式 | 从右到左 | 单目运算符 |
(类型) | 强制类型转化 | (数据类型)表达式 | ||
++ | 自增运算符 | ++表达式/表达式++ | ||
-- | 自减运算符 | --表达式/表达式++ | ||
* | 取值运算符 | *指针变量 | ||
& | 取地址运算符 | &变量名 | ||
! | 逻辑非 | !表达式 | ||
~ | 逻辑取反 | ~表达式 | ||
sizeof | 长度运算符 | sizeof(表达式) |
第三优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
/ | 除 | 表达式/表达式 | 从左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | ||
% | 取余 | 整型表达式%整型表达式 |
第四优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
+ | 加 | 表达式+表达式 | 从左到右 | 双目运算符 |
- | 减 | 表达式-表达式 |
第五优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
<< | 左移 | 变量<<表达式 | 从左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 |
第六优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
> | 大于 | 表达式>表达式 | 从左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | ||
< | 小于 | 表达式<表达式 | ||
<= | 小于等于 | 表达式<=表达式 |
第七优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
== | 等于 | 表达式==表达式 | 从左到右 | 双目运算符 |
!= | 不等于 | 表达式!=表达式 |
第八优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
& | 按位与 | 表达式&表达式 | 从左到右 | 双目运算符 |
第九优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
^ | 按位异或 | 表达式^表达式 | 从左到右 | 双目运算符 |
第十优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
| | 按位或 | 表达式|表达式 | 从左到右 | 双目运算符 |
第十一优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
&& | 逻辑与 | 表达式&&表达式 | 从左到右 | 双目运算符 |
第十二优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
|| | 逻辑或 | 表达式||表达式 | 从左到右 | 双目运算符 |
第十三优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
?: | 条件运算符 | 表达式1?表达式2:表达式3 | 从右到左 | 三目运算符 |
第十四优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
= | 赋值 | 变量=表达式 | 从右到左 | 双目运算符 |
/= | 除后赋值 | 变量/=表达式 | ||
*= | 乘后赋值 | 变量*=表达式 | ||
%= | 取余后赋值 | 变量*=表达式 | ||
+= | 加后赋值 | 变量+=表达式 | ||
-= | 减后赋值 | 变量-=表达式 | ||
<<= | 左移后赋值 | 变量<<=表达式 | ||
>>= | 右移后赋值 | 变量>>=表达式 | ||
&= | 按位与后赋值 | 变量&=表达式 | ||
^= | 按位异或后赋值 | 变量^=表达式 | ||
|= | 按位或否赋值 | 变量|=表达式 |
第十五优先级:
运算符 | 名称(含义) | 使用形式 | 结合方式 | 说明 |
---|---|---|---|---|
, | 逗号运算符 | 表达式,表达式,表达式,... | 从左到右 |
优先级说明:
同一优先级的运算符,运算次序由结合方向决定。例如*与/具有相同的有限级别,其结合方向为自左至右,因此3*5/4的运算次序是先乘后除。-和++为同一优先级,结合方向为自右至左,因此,-i++相当于-(i++)
不同的运算符要求有不同的运算对象个数,如+(加)和-(减)为双目运算符,要求在运算符两侧各有一个运算对象(3+5,8-3等)。而++和-(负号)运算符是单目运算符,只能在运算符的一侧出现一个运算对象(如-a、i++、--i、(float)i、sizeof(int)、*p等)。条件运算符是C语言中唯一的一个三目运算符,如x?a:b。
C语言中的数据类型(8)
整型,浮点型,字符型,数组类型,指针型,结构体类型,共用体类型
C语言的控制语句(9)
-
条件控制语句
if()...else{}... switch(){case:...}
-
循环控制语句
for(){...} while(){...} do...while(){...}
-
转移语句
break、continue、goto、return
C语言的标识符
预定义标识符
-
系统标准库函数
scanf、printf、putchar、getchar、strcpy、strcmp、sqrt等等
-
编译预备处理命令
include、define等等
用户定义标识符
-
对用户定义标识符的规定
1. 不能含有字母,数字,"_"以外的其他字符 2. 必须以字母或者"_"开头 3. 标识符中大小写字母含义不同 4. 长度:一般系统规定标识符的长度<=8 5. 标识符的选择要有意义,例如:name,city,data等 6. 不能使用关键字
-
对标识符的规定
1. 关键字必须用小写字母。不允许使用关键字为变量,数组,函数等操作对象命名 2. 预定义标识符允许用户对他们重新定义,当重新定义后将改变他们原来的含义
原码、反码、补码及位操作符操作详解
正数的原码、反码、补码均相同。
进制的详解
二进制由0、1组成,以ob开头
八进制由0、1、...、7组成,以0开头
十进制由0、1、...、9组成,以0开头
十六进制由0、1...、9、a、b、c、d、e、f组成,以0x开头
任意进制到十进制的转换
进制:数 | 运算 | 十进制 |
---|---|---|
十进制:12345 | 1*104+2*103+3*102+4*101+5*10^0 | 12345 |
二进制:100 | 1*22+0*21+0*2^0 | 4 |
八进制:100 | 1*82+0*81+0*8^0 | 64 |
十六进制:100 | 1*162+0*161+0*16^0 | 256 |
总结:(位权转换法)转换为十进制,由系数*进制的(位数-1)次方:1\*10^4
练习:以下进制转换为10进制
-
0b10101
二进制,1*24+0*23+1*22+0*21+1*2^0=21
-
0123
八进制,1*82+2*81+3*8^0=83
-
0x3c
十六进制,3*161+12*160=60
十进制到任意进制的转换
| 十进制:12345 12345/10 =1234……5
1234/10=123……4 ; 123/10=12……3 ; 12/10=1……2 1/10=0……1 | 转换到 十进制 从下往上写余数即:12345 |
---|---|
十进制:20;20/2=10……0;10/2=5……0;5/2=2……1;2/2=1……0;1/2=0……1 | 转换到 二进制;从下往上写余数即:10100 |
除以进制取余数,直到商为0,余数反转
练习:52分别得到二进制,八进制,十六进制
二进制 | 十进制 | 十六进制 |
---|---|---|
52/2=26……0;26/2=13……0;13/2=6……1;6/2=3……0;3/2=1……1;1/2=0……1 | 52/8=6……4;6/8=0……6; | 52/16 =3……4;3/10=0……3 ; |
0b110100 | 064 | 0x34 |
8421码
在这种编码方式中每一位二进制代码的1都代表着一个固定的值,把每一位的1代表的十进制加起来,加起来的结果就是它所代表的十进制编码
一种快速转进制的方式
二进制 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|---|
十进制 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
二进制转十进制:
1010100 = 64+16+4 = 84
十进制转二进制:
100=0b1100100
100里面,,没有128,所以第8位(首位)补0
下一位100里面有64,所以第7位补1
下一位(100-64=36)36里有32,所以第6位补1
下一位(36 - 32 = 4)4里面没有16,所以所以第5位补0
下一位4里面没有8,所以所以第4位补0
下一位4里面有4,所以所以第3位补1
下一位(4 - 4 = 0)0里面没有2,所以所以第2位补0
下一位0里面没有1,所以所以第1位补0
所得到的二进制带上0b,所以二进制为:0b1100100
其他进制转换,例如:
(方式一)二进制转换为八进制:二进制转换为十进制,十进制转换为八进制
(方式二)以例子来描述
0b1011001
三三一组最高位不够补0: 001 011 001
对应的十进制: 1 3 1
对应的八进制(组合在一起):0131
四四一组是十六进制,最高位不够补0:0101 1001
对应的十进制: 5 9
对应的八进制(组合在一起):59
码的详解
3+4 是计算机将其转换为补码后做的运算。
原码:用最高位表示符号位,其余位表示数值位的编码称为原码。其 中,正数的符号位为 0,负数的符号位为 1。
反码:把原码的符号位保持不变,数值位逐位取反,即可得原码的反码。【**整数的反码与源码相同**】
补码:在反码的基础上加 1 即得该原码的补码。
例如:+7,-7
-
源码:
- +7 0 0000111
- -7 1 0000111
-
反码:
- +7 0 0000111
- -7 1 1111000
-
补码
- +7 0 0000111
- -7 1 1111001 【加1可能导致符号位改变】
练习:已知某数X的原码为10110100B,试求X的补码与反码
原码:1 0110100
反码:1 1001011
补码:1 1001100
练习:已知某数X的补码为11101110B,试求X的原码
补码:1 1101110
反码:1 1101101
原码:1 0010010
位操作符
计算机中位运算操作,均是以二进制补码形式进行的。
运算符 | 功 能 | 运算规则 |
---|---|---|
& | 按位与 | 对应位均为 1 时,结果才为 1 |
| | 按位或 | 两位中只要有一位为 1,结果为 1。 只有两位同时为 0 时,结果为才为 0。 |
^ | 按位异或 | 两位相异时,结果为 1;两位相同时,结果为 0。 |
<< | 左移 | 将运算数的各二进制位均左移若干位,高位丢弃(不包括 1),低位补 0,每左移一位,相当于该数乘以 2。 |
>> | 右移 | 将运算数的各二进制位均右移若干位,正数补左补 0,负数左补 1,右边移出的位丢弃。 |
~ | 按位取反 | 0 变 1,1 变 0。 |
C语言运算符
按位与(&)
只要两位中有一位为 0,则结果为 0;
山不在高有仙则名,水不在深,有龙则灵(类比:雨(与)不在大,有0则0)
1 & 1 = 1
1 & 0 = 0
0 & 0 = 0
0 & 1 = 0
练习: 求3和 4按位与的结果
-
转换为二进制
3的二进制是:11 00000000 00000000 00000000 00000011 4的二进制是:100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000011 & 00000000 00000000 00000000 00000100 ---------------------------------------------- 00000000 00000000 00000000 00000000 得到的结果是:0
按位或(|)
两位中只要有一位为 1,结果为 1
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
练习: 求3和 4按位或的结果
-
转换为二进制
3的二进制是:11 00000000 00000000 00000000 00000011 4的二进制是:100 00000000 00000000 00000000 00000100 00000000 00000000 00000000 00000011 | 00000000 00000000 00000000 00000100 ---------------------------------------------- 00000000 00000000 00000000 00000111 得到的结果是:7
按位异或(^)
两位相异时,结果为 1;两位相同时,结果为 0。
相同为 0,相异为 1
一个数字对另一个数字异或两次,该数本身不变
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
练习: 求3和 4按位或的结果
3的二进制是:11
00000000 00000000 00000000 00000011
4的二进制是:100
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000100
----------------------------------------------
00000000 00000000 00000000 00000111
得到的结果是:7
左移(<<)
运算数的各二进制位均左移若干位,高位丢弃(不包括 1),低位补 0
每左移一位,相当于该数乘以 2。(左移几位就是乘以2的几次方)
3<<2=3*2^2=12
右移(>>)
将运算数的各二进制位均右移若干位,**正数补左补 0,负数左补 1**,右边移出的位丢弃。
24>>2=24/2^2=6
按位取反(~)
0变1,1变0
~ 1 = 0
~ 0 = 1
练习: 求3按位取反的结果
3的二进制是:11
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000011
~ ----------------------------------------------
11111111 11111111 11111111 11111100 (这是补码)
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
得到的结果是:-4
路漫漫其修远兮,吾将上下而求索。
喜欢的话关注一下,一起进步啦~~~