C程序设计【第一章:程序设计和C语言】

什么是计算机程序

计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。

什么是计算机语言

计算机语言(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语言程序的步骤

运行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)

  1. 条件控制语句

    if()...else{}...
    switch(){case:...}
    
  2. 循环控制语句

    for(){...}
    while(){...}
    do...while(){...}
    
  3. 转移语句

    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

路漫漫其修远兮,吾将上下而求索。

喜欢的话关注一下,一起进步啦~~~

你可能感兴趣的:(C程序设计【第一章:程序设计和C语言】)