1程序结构

顺序结构、选择结构(分支结构)、循环结构

2.位 字节

bit是位 是指为0或者1,byte是指字节,一个字节 = 八个位

3.基础认识

  • c语言编写的程序称为源程序,又称为编译单位
  • 只有一个main函数,是程序运行的起点

4.标识符

  • 关键词不能作为标识符号
  • 预定义标识符:define scanf printf include
    • 可以做为用户标识符

5.进制转换

  • 十进制转换成二、八、十六进制

  • 二、八、十六进制转换成十进制

  • C语言只有八、是、十六进制,没有二进制

    • !!!但运行的时候,所有的进制都要转换成为二进制来进行处理
  • C语言中八进制规定要义 0 开头,八进制没有8,逢8进1

  • C语言中十六进制规定要义 0x 开头

  • 整型一般是 4个字节, 字符型是 1个字节,双精度一般是 8个字节

    • long int x;表示x是长整型
    • unsigned int x;表示x是无符号整型

6.算术表达式和赋值表达式

6.1算术表达式

  • / 两边是整型,结果为整型
  • / 一边是小数,结果为小数
  • % 余数,求整,两边均需为整型

6.2赋值表达式

  • 定义时不可用连续赋值 eg: int x=y=10 ❌
  • 定义完变量后,可以连续赋值 eg: int x,y; x=y=10;✔️

6.3自加表达式

++在前 先加后用, ++在后 先用后加 自减表达式相同

7.注释

  • 注释不是C语言
  • 不占运行时间
  • 没有分号
  • 不可以嵌套

8.三种取整丢小数的情况

  1. int a = 1.6;
  2. (int) a;
  3. 1/2; 3/2;

9.字符

9.1字符数据的合法形式

  • ‘1’ 是字符占一个字节, "1"是字符串占两个字节(含有一个结束符号)
  • ‘0’ 的ASCII码表的数值为48,'a’为87,‘A’为65
    • 字符可以进行算术运算 ‘0’ - 0 = 48
    • 大写字母和小写字母的转换的方法 ‘A’ + 32 = ‘a’ 相互之间一般相差32

9.2转义字符

  • 转义字符

    • \0 ,\n ,’ ‘’,\
  • 八进制转义字符
    • ‘\141’ 合法的,前导的0不能写
  • 十六进制转义字符
    • ‘\x6d’ 合法的,前导0不能写,并且x是小写

10.数据输入输出

10.1printf输出

  • printf可以只有一个参数,也可以有两个参数
  • printf(“xxx”, xxx);把第二部分的变量、表达式、常量以第一部分的形式展现出来

10.1.1输出格式表格

格式说明 表示内容 格式说明 表示内容
%d 整型 int %c 字符 char
%ld 长整型 long int %s 字符串
%f 浮点型 float %o 八进制
%lf double %#o 带前导的八进制
%% 输出一个百分号 %x 十六进制
%5d %#x 带前导的十六进制
  • printf(“%2d”,123 ); 第二部分有三位,大于指定的两位,原样输出123

    printf(“%5d”,123 ); 第二部分有三位,小于指定的五位,左边补两个空格xx123 (x表空格)

    printf(“%10f”,1.25 ); 小数要求补足6位的,没有六位的补0,。结果为xx1.250000 (x表空格)

    printf(“%5.3f”,125 ); 小数三位,整个五位,结果为1.250(小数点算一位)

    printf(“%3.1f”,1.25 );小数一位,整个三位,结果为1.3(要进行四舍五入)

10.2scanf输入

  • scanf(“a=%d, b=%d”, &a, &b);

    • 以第一部分的格式在终端输入数据
    • 只有输入 a=12,b=32 才能正确赋值
  • scanf(“%d, %d”, x,y);❌
  • scanf(“%d, %d”, &x, &y); ✔️
    • scanf的第二部分一定是要地址

eg:

scanf(“%d”,x) 错误 ; scanf(“%d”,p)正确

scanf(“%d”,&p) 错误 ; scanf(“%d”,*p)错误

10.2.1指定输入的长度

  • scanf(“%2d%4d%d”, &x, &y, &z); x为12,y为3456,z为7;
  • scanf(“%2d%4d%d”,&x,&y,&z);x为1,y为2345,z为67

10.2.2输入 字符和整数的区别

  • scanf(“%d”, &x);输入1,表示整数1
  • scanf(“%c”, &x);输入1,表示是字符‘1’对应ASCII码表的数值为整数48

10.2.3实现保留三位小数,第四位四舍五入的程序

  • y=(int)(x*100+0.5)/100.0 这个保留两位,对第三位四舍五入
  • y=(int)(x\1000+0.5)/1000.0 这个保留三位,对第四位四舍五入
  • y=(int)(x*10000+0.5)/10000.0 这个保留四位,对第五位四舍五入
  • -_- => x = (int)x 这样是把小数部分去掉

11.表达式

C语言是用非0表示逻辑真的,用0表示逻辑假的
C语言有构造类型,没有逻辑类型

11.1关系表达式

  1. 表达式的数值只能为1(表示真),或0(表示假)
  2. eg: int x= 1,y=0,z=2;则:x<y<z是对的 1<0返回数值0 => 0<2 返回1

11.2逻辑表达式

  1. && || ! 三种逻辑运算符号
  2. 优先级别: ! > && > ||

11.3if语句

if语句没有大括号 只包括if后的第一条语句

11.4三元表达式

eg: int x=5,y=1; x > y ? ‘结果为真的返回值’ : ‘结果为假的返回值’

11.5 swtich

  • switch只可以和break一起用,不可用和continue用
  • case中break;表示退出switch循环
  • ⭐case中没有break时,只要有一个case匹配了,剩下的case都需要执行
  • switch的条件表达式可以为整型,字符型,枚举和bool(布尔)
  • case后:只能为常量或常量表达式

12.函数

  1. 函数:是具有一定功能的一个程序块,是C语言的基本组成单位

  2. 不能嵌套调用,但可嵌套使用

  3. 函数名缺省返回值类型,默认为int

  4. 判断质数

    void isPrime(int n){for(int i = 2;i< n;i++){if(n % i == 0){printf("不是质数");break;}else {printf("是质数");break;}}
    }int main(){int x;printf("输入一个正整数: ");scanf("%d",&x);isPrime(x);
    }
    
  5. 求阶层

    1. int jiecen(int n){int result = 1;for(int i = 1;i<=n;i++){result *= i;}return result;
      }
      int main(){int x;scanf("%d", x);printf("%d", jiecen(x));
      }
      
  6. 参数传递

    1. 数值,形参的变化不会改变实参的变化
    2. 地址,形参的变化有可能改变实参的变化

13.指针

指针变量的本质是用来存放地址,而一般的变量是存放数值的

不同类型的指针变量不能赋值,不同类型的指针变量不能赋值

13.1 *p 和 p差别

  • *p是数值,p是地址
  • *p可以作为变量使用,✳的作用是取后面地址p里的数值
  • p是当作地址来使用。可以用在scanf函数中:scanf(“%d”, p);

13.2**p++ 和(* *p)++的差别

  • *p++是地址会变化。 取当前值,然后再移动地址

  • (*p)++ 是数值会变化。取当前值,然后再是数值增加1

  • 例题:int *p,a[]={1,3,5,7,9};p=a;请问*p++和(*p)++的数值分别为多少?*p++:  这个本身的数值为1。由于是地址会增加一,所以指针指向数值3了。
    (*p)++ 这个本身的数值为1。由于有个++表示数值会增加,指针不移动,但数值1由于自加了一次变成了2。   

13.3二级指针

  • *p:一级指针:存放变量地址

  • **q:二级指针:存放一级指针的地址

  •  int x=7;int*p=&x,**q=p;问你:*p为多少?*q为多少?**q为多少?7           p         7再问你:**q=&x的写法可以吗?   不可以,因为二级指针只能存放一级指针的地址。

13.4移动指针

  • char *s="meikanshu";
    while(*s){printf("%c",*s);s++;
    }
    //这个s首先会指向第一个字母m然后通过循环会一次打印出一个字符,s++是地址移动,打印了一个字母后,就会移动到下一个字母
    

13.5指针变量初始化

  1. int a = 2; *p = &a;(定义的同时初始化)
  2. int a = 2,*p; p = &a;(定义之后初始化)

13.6传数值和传地址

//传数值                                    传地址
void fun(int a,int b)                     void fun(int *a,int *b)
{ int t ;                                       { int t ;t=a;a=b;b=t;                                  t=*a;*a=*b;*b=t;
}                                                }
main()                                     main()
{ int x=1,y=3,                             { int x=1,y=3,fun(x,y);                                 fun(&x,&y)printf(“%d,%d”,x,y);                    printf(“%d,%d”,x,y);
}                                             }
这个题目答案是1和3。                         这个题目的答案就是3和1。
传数值,fun是用变量接受,所以fun中             传地址,fun用指针接受!这个时候fun
的交换不会影响到main中的x和y 。             中的交换,就会影响到main中的x和y。
传数值,形参的变化不会影响实参。              传地址形参的变化绝大多数会影响到实参! 

13.7函数返回值是地址

int *fun(int *a,int *b)   //可以发现函数前面有个*,这个就说明函数运算结果是地址
{ if(*a>*b)return a;     //return a 可以知道返回的是a地址。else return b;
}
main()
{ int x=7,y=8,*max;max = fun(&x,&y);     //由于fun(&x,&y)的运算结果是地址,所以用max来接收。print("%d", max);
}

13.8三名主义

  1. 数组名:表示第一个元素的地址。(数组名不可用自加,它是地址常量名)
  2. 函数名:表示该函数的入口地址
  3. 字符串常量名:表示第一个字符的地址

指针变量是存放地址的。并且指向哪个就等价哪个,所有出现*p的地方都可以用它等价的代替

13.9 指针和指针变量

  1. 概念不同:指针是概念,指针变量是具体实现
  2. 存放地址不同:
    1. 指针存储一个变量的内存地址,指针就是地址,地址就是指针
    2. 指针变量是存放内存地址的变量

TIP:

指针变量是存放地址的。并且指向哪个就等价于哪个,所有出现*p 的地方都可以用它等价的代替

  • eg:

    • int a = 2, *p = &a;
      *p = *p + 2;
      //由于*p指向变量a,所以指向哪个就等价哪个,这里的*p等价于a,相当于是 a = a + 2
      

14.数组

数组:存放的类型是一致的。多个数组元素的地址是连续的;

14.1初始化

int a[5]={1,2,3,4,5};  合法
int a[5]={1,2,3, };    合法
int a[]={1,2,3,4,5};   合法,常考,后面决定前面的大小!
int a[5]={1,2,3,4,5,6}; 不合法,赋值的个数多余数组的个数了

14.2定义

int a[5];注意这个地方有一个重要考点,定义时数组的个数不是变量一定是常量。
int a[5]                  合法,最正常的数组
int a[1+1]                合法,个数是常量2,是个算术表达式
int a[1/2+4]              合法,同样是算术表达式
int x=5,int a[x];           不合法,因为个数是x,是个变量,非法的,
define P 5   int a[P]       合法,define 后的的P是符号常量,只是长得像变量

14.3二维数组初始化

int a[2][3]={1,2,3,4,5,6};               合法,很标准的二维的赋值。
int a[2][3]={1,2,3,4,5, };                合法,后面一个默认为0。
int a[2][3]={{1,2,3,} {4,5,6}};           合法,每行三个。
int a[2][3]={{1,2,}{3,4,5}};             合法,第一行最后一个默认为0。
int a[2][3]={1,2,3,4,5,6,7};              不合法,赋值的个数多余数组的个数了。
int a[][3]={1,2,3,4,5,6};                合法,可以缺省行的个数。
int a[2][]={1,2,3,4,5,6};                不合法,不可以缺省列的个数。
行可省 列不可省:https://blog.csdn.net/LivingMu/article/details/111030270

14.4补充

  1. 一维数组的重要概念

    1. 对a[10]这个数组的讨论

      1. a表示数组名,是第一个元素的地址,也就是元素a[0]的地址(等价于&a)
      2. a是地址常量,所以只要出现a++,或者是a=a+2赋值都是❌的
      3. a是一维数组名,它是列指针,也就是a+1是跳一列
    2. 对a[3] [3]的讨论
      1. a是数组名,第一个元素的地址,也就是a[0] [0]的地址
      2. a是地址常量,所以只要出现a++,或者是a=a+2赋值都是❌的
      3. a是二维数组行,它是行指针,也就是a+1是跳一行
      4. a[0]、a[1]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,+1后 都是跳一列
      5. 注意a和a[1]、a[0]是不同的,它们的 基类型是不同的。前者是一行元素,后者是一列元素
  2. 二维数组做题技巧

    1. 如果有a[3][3]={1,2,3,4,5,6,7,8,9}这样的题目。
      步骤一:把他们写成:      第一列 第二列 第三列  
      a[0]->  1     2     3   ->第一行
      a[1]->   4     5     6  —>第二行
      a[2]->   7     8     9  ->第三行
      步骤二:这样作题目间很简单:    
      *(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以是1。
      *(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。
      一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。
      
  3. 数组初始化

    1. int a[]={1,2} 合法。   int a[][4]={2,3,4}合法。   但int a[4][]={2,3,4}非法。
      
  4. 二维数组中的行指针

    1. int a[1][2];
      //其中a现在就是一个行指针,a+1跳一行数组元素搭配(*)p[2]指针//a[0],a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用
      
  5. 脱衣服法则

    1. a[2] 变成 *(a+2) a[2][3]变成 *(a+2)[3]再可以变成 *(*(a+2)+3)

15.C语言的特点

  1. 语言简洁,紧凑使用方便 灵活(37个关键词,9种控制语句)
  2. 运算符丰富(34种运算符)
  3. 数据类型丰富
  4. 具有结构化的控制语句
  5. 语法限制不太严格,程序设计自由度大
  6. 允许直接访问物理地址、能进行位操作,可以直接对硬件进行操作
  7. 可移植性好
  8. 生成目标代码质量高,程序执行效率高

16.C语言程序的结构特点

  1. 一个程序由一个或多个源程序文件组成
  2. 函数是C程序的主要组成部分
  3. 一个函数包括两个部分(函数首部,函数体(声明、执行部分))
  4. 程序总是从main 函数开始执行
  5. C程序对计算机的操作由 C 语句完成
  6. 数据声明和语句最后必须要有分号 ;
  7. C语言本身不提供输入输出语句(由C标准函数库中的函数来实现的)
  8. 程序应当包含注释,增强可读性

17.算法–程序的灵魂

17.1一个程序主要包括两部分

  1. 对数据的描述

    1. 再程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,这就是 数据结构
  2. 对操作的描述
    1. 要求计算机进行操作的步骤,也就是 算法

数据是操作的对象,操作的目的是对数据进行加工处理,得到期望的结果

算法 + 数据结构 = 程序

17.2.算法是什么

  • 数值运算算法 (目的是求数值解)
  • 非数值运算算法 (包括面十分广泛,常用于事务管理领域)

17.3算法的特性

  1. 有穷性。有限的操作步骤
  2. 确定性。每一个步骤都是确定的
  3. 有零个或多个输入。执行算法时需要从外界取得必要的信息
  4. 有一个或多个输出。算法的目的是为了求解,没有输出算法没有意义
  5. 有效性。算法中的每一个步骤都能有效地执行

17.4三种基本结构和改进的流程图

  1. 顺序结构
  2. 选择结构
  3. 循环结构
  4. 当型循环结构
  5. 直到型循环结构
  6. 三种基本结构和改进的流程图_weixin_30678349的博客-CSDN博客

17.5结构化程序设计方法

  1. 自顶向下
  2. 逐步细化
  3. 模块化设计
  4. 结构化编码

17.6结构化设计的三种基本结构

  1. 顺序结构
  2. 分支结构
  3. 循环结构

18.简单的C程序设计

19.数据类型

1.类型强转

2.字符数据的输入输出

20.选择结构程序设计

1.关系运算符优先次序

  • 关系、算术、赋值运算符的优先级:算数运算符 > 关系运算符 > 赋值运算符

2.逻辑运算符优先次序

  • 逻辑运算符的优先次序: ! → && → || (! 为三者中最高)
  • 与其他运算符的优先次序:赋值运算符 < &&和|| < 关系运算符 < 算数运算符 < !

21.do–whille语句特点

  • 先无条件地执行循环体,然后判断循环条件是否成立

22.break 和 continue的区别

  • continue 只是结束本次循环,而不是终止整个循环的执行
  • break 结束整个循环过程,不再判断执行循环的条件是否成立

23.C函数库专门处理字符串的函数

24.函数调用形式

1.函数调用时的数据传递

  • 形式参数(形参),定义函数时函数名后面的变量名
  • 实际参数(实参),主函数调用函数时,函数名后面的参数

25.被调用函数的声明

一个函数中调用另一个函数需要具备:

  1. 被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)
  2. 如果使用库函数,应该再本文箭头加对应的 #include 指令
  3. 如果使用自己定义的函数,而该函数的位置再调用它的函数后面,应该声明

26.函数原型

两中形式:

  1. float add(float x, float y);
  2. float add(float, float);
    1. 原型说明可以放在文件的开头,这时所有函数都可以使用此函数

27.动态、静态存储方式

28.格式转换说明符

转换说明 输 出
%a 浮点数、十六进制数字和p-记数法 (C99)
%A 浮点数、十六进制数字和P-记数法 (C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数,十进制记数法
%g 根据数值不同自动选择%f或者%e。%e格式在指数小于-4或者大于等于精度时使用
%G 根据数值不同自动选择%f或者%E。%E格式在指数小于-4或者大于等于精度时使用
%i 有符号十进制整数 (与%d相同)
%o 无符号八进制整数
%p 指针(就是指地址)
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f 的无符号十六进制整数
%X 使用十六进制数字0F的无符号十六进制整数
%% 打印一个百分号

29.%ns输出

printf("\n*s1=%15s*", "chinabeijing");
printf("\n*s2=%-5s*", "chi");
//输出结果
*s1=   chinabeijing*
*s2=chi  *n为正数(右对齐):1.长度等于字符长度输出完整字符数组2.长度大于字符数组长度,输出:(n - len)个空格 + 字符串数组
n为负数(左对齐):1.长度等于字符长度输出完整字符数组2.长度大于字符数组长度,输出:字符串数组 + (n - len)个空格

30.文件

文件一般包括三要素:文件路径、文件名、后缀

C语言不仅支持对当前目录和根目录文件的操作,也支持对多级目录文件的操作

文件路径

在 C 语言中 ’ \ ’ 一般是转义字符的起始标志,故在路径中需要用两个 ’ \ ’ 表示路径中目录层次的间隔,也可以使用 ‘/’ 作为路径中的分隔符

eg:D:\ \C_WorkSpace\ \Chapter_10\ \file_1.txt

D:/C_WorkSpace/Chapter_10/file_1.txt

分类

  1. 逻辑结构

    1. 记录文件

      1. 顺序文件
      2. 索引文件
      3. 索引顺序文件
      4. 散列文件
    2. 流式文件

      1. 以字节为单位,对流式文件的访问一般采用穷举搜索的方式,效率不高

        但管理简单

流的概念及分类

把抽线出来的“标准逻辑设备”或“标准文件”称作‘流’

按方向分为:输入流和输出流

按数据形式分为:文本流(ASCII码字符序列/字符序列)和二进制流(字节序列)

文本文件与二进制文件

根据文件中数据的组织形式的不同分类

  • 文本文件(字符序列文件):把存储的数据当初一系列字符组成,把每个字符的ASCII码值存入文件中
  • 二进制文件(字节序列文件):把数据对应的二进制形式存储到文件中

缓冲和非缓存文件系统

缓冲文件系统(标准文件系统)

非缓冲文件系统

ANSI C标准中只采用缓冲文件系统

  • 缓冲文件系统:系统自动为每个打开的文件在内存开辟一块缓冲区,缓冲区的大小一半由系统决定
  • 非缓冲区系统:系统不自动为打开的文件开辟内存缓冲区,由程序设计者自行设置缓冲区及大小

文件的打开与关闭

调用标准库stdio.h中的fopen和fclose函数实现

fopen:

FILE* fopen(char *filename, char *mode);
参数说明:
  1. filename:文件名,包括路径,如果不显示含有路径,则表示当前路径

  2. mode:文件打开模式

    1. 模式 含 义 说 明
      r 只读 文件必须存在,否则打开失败
      w 只写 若文件存在,则清除原文件内容后写入;否则,新建文件后写入
      a 追加只写 若文件存在,则位置指针移到文件末尾,在文件尾部追加写人,故该方式不 删除原文件数据;若文件不存在,则打开失败
      r+ 读写 文件必须存在。在只读 r 的基础上加 ‘+’ 表示增加可写的功能。下同
      w+ 读写 新建一个文件,先向该文件中写人数据,然后可从该文件中读取数据
      a+ 读写 在” a”模式的基础上,增加可读功能
      rb 二进制读 功能同模式”r”,区别:b表示以二进制模式打开。下同
      wb 二进制写 功能同模式“w”。二进制模式
      ab 二进制追加 功能同模式”a”。二进制模式
      rb+ 二进制读写 功能同模式"r+”。二进制模式
      wb+ 二进制读写 功能同模式”w+”。二进制模式
      ab+ 二进制读写 功能同模式”a+”。二进制模式

读写函数:

  1. 字符读写函数 :fgetc和fputc
  2. 字符串读写函数:fgets和fputs
  3. 数据块读写函数:freed和fwrite
  4. 格式化读写函数:fscanf和fprinf

31.逗号表达式

优先级别最低。表达式的数值逗号最右边的那个表达式的数值

z = (2,3,4) (整个是赋值表达式) z的值为4
z = 2,3,4  (整个是逗号表达式) z的值为2

32.布尔位运算符

运算符 意义 示例 对于每个位位置的结果(1=设定,0=清除)
& 位 AND x&y 如果 x 和 y 都为 1,则得到 1;如果 x 或 y 任何一个为 0,或都为0,则得到 0
| 位 OR x|y 如果 x 或 y 为 1,或都为 1,则得到 1;如果 x 和 y 都为 0,则得到 0
^ 位 XOR x^y 如果 x 或 y 的值不同,则得到 1;如果两个值相同,则得到 0
~ 位 NOT(I的补码) ~x 如果 x 为 0,则得到 1,如果 x 是 1,则得到 0
  • 位运算符的操作数必须是整数类型,并且遵循寻常算术转换(usualarithmetic conversion)。转换后获得的操作数通用类型就是整个计算结果的类型

33.赋值运算符

34.移位运算符

运算符 意义 示例 结果
<< 向左移位 x<<y x 的每个位向左移动 y 个位 相当与x乘以y次2
>> 向右移位 x>>y x 的每个位向右移动 y 个位 相当与x除以y次2
  • 移位运算符的操作数必须是整数
  • 移位运算结果的类型等于左操作数在整数提升后的类型
  • 移位运算符的优先级比算术运算符的优先级更低,但相对于比较运算符以及其他的位操作运算符,具有更高的优先级

35.strlen与sizeof

strlen:是一个函数,用来计算指定字符串str的长度,但不包括结束字符(即null字符)

sizeof:是一个单目运算符,而不是一个函数.(参数可以是数组、指针、类型、对象、函数等)

36.二元组

数据结构的二元组形式为:DS=(D,S)

D是数据元素的集合;S是D中数据元素之间的关系集合(使用序偶来表示)

序偶:

序偶是由两个元素x和y按一定顺序排列而成的二元组,记作<x,y>,x是第一个元素,y是第二个元素

分类情况:

37.各排序需要的辅助空间总结

  1. 选择排序

    1. 简单选择排序:1个
    2. 堆排序: 1个
  2. 交换排序
    1. 冒泡排序:1个
    2. 快速排序:最好:log2n 最坏:n 平均log2n
  3. 插入排序
    1. 直接插入:1个
    2. 折半插入:1个
    3. 希尔排序:1个
  4. 归并排序: n个
  5. 基数排序: r ( r个人队列:r个头指针和r个队尾指针)

38.各排序稳定性总结

  • 稳定排序

    1. 直接插入排序
      2. 冒泡排序
      3. 归并排序
      4. 基数排序
  • 不稳定排序
    1. 希尔排序
    2. 直接选择排序
    3. 堆排序
    4. 快速排序

39.堆与二叉排序树的区别

  • 以小根堆为例,堆的特点是双亲结点的关键字必然小于等于孩子节点的关键字,而两个孩子节点的关键字没有次序规定
  • 二叉排序树中,每个双亲结点的关键字均大于左子树结点的关键字,每个双亲结点的关键字均小于右子树结点的关键字,每个双亲结点的左右孩子的关键字是有次序关系

40.全局变量

全局变量全部存放在静态存储区,程序开始执行时给全局变量分配存储区,在程序结束时释放

  1. 在所有函数外部定义的变量称为全局变量
  2. 它的作用域默认是从定义变量的位置到本源文件结束都有效
  3. 最好直接定义到文件的最顶部
int pointnum; // 全局变量 (最好定义与文件头)extern int pointnum; //调用是需加关键字extern

41.邻接矩阵

  1. 横向出度
  2. 纵向入度

42.C语言函数的存储类别

  1. auto:只能用于局部变量
  2. extern:允许被其他文件调用
  3. static:只能被本源程序文件调用
  4. 函数默认的隐含存储类型是extern

43.文件指针定义

FILE *指针名;
定义了一个指针为fp,这个指针以后只能指向文件,之后要把文件的首地址赋值给该指针
FILE *fp;

44.用8位无符号二进制数能表示的最大十进制数为

8位无符号二进制数就是从00000000到11111111

转换成10进制就是0到255

所以最大的就是255

45.复合语句

  • C语言中,复合语句简称语句块 用括号{}括起来组成的一个语句称复合语句
  • 所以在一个函数内复合语句中定义的变量只在其复合语句范围内有效

46.C语句

  1. 表达式语句

    1. 表达式;
    2. eg:c=a+a;
  2. 函数调用语句
    1. 函数名(实际参数表);
    2. eg:printf(“HELLO WORLD!”);
  3. 控制语句
    1. 条件判断语句:if、switch
    2. 循环执行语句:do while,while,for
    3. 转向语句:break,goto,continue,return
  4. 复合语句
    1. {} 内的语句
    2. int fun(){int a = 2;printf(“%d”, a);}
  5. 空语句
    1. 只有分号“;”组成的语句称为空语句
    2. eg:while( getchar()!=‘\n’ );

47.二维数组存储地址计算

设二维数组Arr [x] [y],初始地址Arr[0] [0]为1000,每个元素占q个字节,求Arr[n] [m]的存储地址

  • 1000 + (y * n + m)*q
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-orTLx637-1649837219944)(images\1648038582907.png)]
  • 1000 + (4 * 3 + 3) * 2 = 1030

48.int类型大小

  • int类型只占用两个字节的存储空间,数的大小在:-32768-32767之间

49.⭐关于一趟排序后,未必有一个元素在放在最终位置上:

  1. 堆排序每趟总能选出一个最大值或最小值位于根结点,属于选择排序
  2. 冒泡排序会将最大/最小值置于数组最后/最前
  3. 快速排序中基准是可以放在最终的位置的,属于交换排序
  4. 简单选择排序 能够选出无序序列中最大/最小的与相应位置互换
  5. 希尔排序属于插入排序,插入排序是不能保证在第一次排序后放在最终位置的
  • 只有 简单选择、快速、冒泡、堆排序一定有元素在它的最终位置上

50.森林的两种遍历方法

  • 先序遍历森林和中序遍历森林

51.二叉判定树

【折半查找二叉判定树】_CD4356的博客-CSDN博客_二叉判定树

52.循环队列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-auX2JBL4-1649837219945)(images\1648475891074.png)]

  • n为数组长度
  • 队满时:(rear + 1)%n == front
  • 队空时:rear == front
  • 每删除一个元素,队首指针:front=(front + 1)%n
  • 每插入一个元素,队尾指针:rear = (rear + 1)%n
  • 循环队列元素个数:(rear-front+n)% n
  • 3,0

53.线性表操作平均移动次数

  • 删除:(n-1)/2
  • 插入:n/2

54.查找算法的时间复杂度

  • 顺序查找O(n)
  • 分块查找O(log2n)到O(n)之间
  • 二分查找O(log2n)
  • 哈希查找O(1)

55.⭐散列表查找 平均查找长度

  • 画出对应的散列表
散列地址 0 1 2 3 4 5 6 7 8 9 10
元素 11 22 47 92 16 3 7 29 8
比较次数 1 2 1 1 1 4 1 2 2
  • 计算ASL=(全部元素比较次数) / 元素个数
  • ASL = (1+2+1+1+1+4+1+2+2) / 9 = 5/3

56.拓扑排序,拓扑序列,关键路径

  1. 拓扑排序:将 AOV 网中所有活动排成一个序列,使得每个活动的前驱活动都排在该活动的前面。
  2. 拓扑序列:经过拓扑排序后得到的活动序列(一个 AOV 网的拓扑序列不是唯一的)。
  3. 关键路径:AOV 网中从源点到汇点的最长路径的长度(一个 AOV 网中的拓扑排序不是唯一的)

57.类型默认转化规则

char --> short --> int —> unsigned --> long --> unsigned long --> float --> double

58.数据的物理结构

  1. 顺序存储结构
  2. 链式存储结构

59.链式队列

  • 链式队列,队列篇(链式队列的出队入队操作)_IC00的博客-CSDN博客_链队列出队操作

60.已知树的序列能否确定二叉树

  • 已知前序遍历和中序遍历,可以唯一确定一颗二叉树
  • 已知后序遍历和中序遍历,可以唯一确定一颗二叉树
  • ⭐没有中序遍历的情况下无法确定一颗二叉树

61.数据结构

计算机存储、组织数据的方式,相互之间存在一种或多种特定关系的数据元素的集合

62.递归和迭代

递归(recursion):递归常被用来描述以自相似方法重复事物的过程,在数学和计算机科学中,指的是在函数定义中使用函数自身的方法。(A调用A)

迭代(iteration):重复反馈过程的活动,每一次迭代的结果会作为下一次迭代的初始值。(A重复调用B)

63.折半查找二叉判定树

选取序列中间结点作为根结点,分为左右部分并重复选取序列中间结点作为根结点

二叉判定树,具有以下性质:

  1. 若左子树不为空,则左子树上各个节点的值 均小于 其根节点的值

  2. 若右子树不为空,则右子树上各个节点的值 均大于或等于 其根节点的值

  3. 左、右子树也分别具有上面两个特点

  4. 【折半查找二叉判定树】_CD4356的博客-CSDN博客_二叉判定树

TIP:

1.int *p

p = (int *)malloc(4);
p = (int *)malloc(sizeof(int));
//两个式子等价
//malloc的返回类型是void

2.函数指针的用法

 int add(int x, int y)
{....}main()
{ int  (*f)();f=add;}
赋值之后:合法的调用形式为1、add(2,3);
2、f(2,3);
3、(*f)(2,3)

3.scanf 和 gets

//传入字符串 good  good  study!
scanf("%s", a); //只会接收 good;不可用接受空格
gets(a); //接收good  good  study!;可以接收空格

4.指针

#include <stdio.h>int main(){char ch[] = "iamhandsome";char *p = ch;printf("%d \n", *p);printf("%d \n", p);printf("%d \n", p + 2);printf("%d \n", *(p + 2));printf("%d \n", *p + 2);
}
//对应ASCII码表
105  i
6422028
6422030
109  m
107  k

5.字符串的赋值

C语言中没有字符串变量,所以用数组和指针存放字符串:1、char   ch[10]={“abcdefgh”};                       对2、char   ch[10]=“abcdefgh”;                         对3、char   ch[10]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’};           对4、char   *p=“abcdefgh”;                            对5、char   *p;                                      对p=“abcdefgh”;6、char   ch[10];                    错了!数组名不可以赋值!ch=“abcdefgh”;7、char   *p={“abcdefgh”};           错了!不能够出现大括号!

6.字符串赋值的函数

//把s指针中的字符串复制到t指针中的方法
1、while( (*t=*s)!=null ){s++;t++;}  完整版本
2、while( *t=*s ){s++;t++;}           简单版本
3、while( *t++=*s++);                   高级版本

7.typedef

  • 取别名,不会产生新的类型,也是关键词
  • typedef int qq 那么 int x 就可以写成 qq x
  • typedef int *qq 那么 int *x就可以写成 qq x

8.malloc

用来动态地分配内存空间

void* malloc (size_t size); size为需要分配的内存空间大小,以字节(Byte)计。

int  *p;
p = (int *)malloc(4);
p = (int *)malloc(sizeof(int));//以上两个等价
//malloc的返回类型是 void *

9.static

static int x; //默认值为0
int x;       //默认值为不定值

练习知识点:

  1. 若用数组名作为函数调用的实参,传递给形参的是:数组的首地址

  2. 递归算法必须包括:终止条件递归部分

  3. 一个链表最常用的操作是再末尾插入结点和删除尾节点,选用: 带头结点的双循环链表 最节省时间

  4. ⭐二叉树的 叶子结点 个数: n = n2 + 1;

    1. n为叶子结点个数, n2:度为2的结点数
  5. 判别有向图中是否存在回路,可使用: 拓扑排序算法

  6. 无向图的邻接矩阵是一个: 对称矩阵

  7. 循环队列存储在数组A[m]中,则入队时的操作为: rear = (rear + 1) % (m + 1);

  8. 快速排序在 被排序数据完全无序的情况下最易发挥其长处

  9. 10000个数组元素中取几个元素,采用 简单选择排序算法 最节省时间

  10. 线性表的链式存储结构,要求内存中可用存储单元的地址:连续或不连续都可以

  11. ⭐树的存储形式:

  • 双亲表示法
  • 孩子链表表示法
  • 孩子兄弟表示法
  1. 连通图:若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的
    顶点

  2. 浮点型变量分别为:单精度,双精度

  3. 符号 ‘&’ 是 取地址运算符,&a是指:a在内存中的地址

  4. 在C程序中,指针变量能够赋 地址值NULL(或ˊ\0ˊ,或 0,或空值)值

  5. C语言中一个字母占一个字节。但 字符串后必须跟一个结束字符’\0’,因此总共占了2个字节

  • eg: “abc” 占4个字节
  1.   int x;float y;scanf("%3d%f", &x, &y);printf("%d,%f", x,y);//输入 12345 789//输出 123,45.000000
    
  2. C语言中,紧跟在关键字if后的一对圆括号里的表达式:可以是任意表达式

  3. C语言中,运算对象必须是整型的运算符:%

  4. C语言函数是由 函数头函数体两部分组成其中,函数头包括:函数说明,函数名,圆括号中的形式参数

  5. 结构中可设定若干个不同类型的成员

  6. 结构中成员的数据类型可以是另一个已定义的结构

  7. 说明一个结构体变量(struct)时,系统分配给他的内存是:各成员所需内存量的总和

  8. 说明一个共用体变量(union)时,系统分配给他的内存是:成员中占内存里最大者所需的容量

  9. 一个共用体变量不能同时存放其所有成员

  10. C语言共用体类型变量在程序运行期间:只有一个成员驻留在内存中

  11. C语言中,简单变量作为实参时,它和对应形参之间的数据传递方式是:单向值传递

  12. 广义表表示法 不是树的存储形式

  13. 若采用 折半查找方法,数据文件应为 有序表,且限于顺序存储结构

  14. 串是一种特殊的线性表,体现在:数据元素是一个字符

  15. 哈夫曼树

  • 定义:

    • 当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,
      如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,
      有时也叫“赫夫曼树”或者“哈夫曼树”

  • 相关名词:

  • 构建原则:权重越大的结点离树根越近

  1. 二叉树的性质:
  1. 数据的逻辑结构与数据元素本身的内容和形式无关
  2. 中序序列和后序序列相同的二叉树为:空树和缺右子树的单支树
  3. 对于两颗具有相同关键字集合而形状不同的二叉排序树,中序遍历后得到的关键字排列顺序相同
  4. C语言的数据类型中,构造类型包括:数组、结构体、共用体、和枚举类型
  5. 若一全局变量只允许本程序文件中的函数使用,则该变量需要使用的存储类别是:static
  6. 计算机基础与程序设计相关推荐

    1. 计算机对下列几种存储器访问速度,2005年7月自考02275计算机基础与程序设计真题及答案...

      以下是湖南自考生网为考生们整理的"2005年7月自考02275计算机基础与程序设计真题及答案",考生可通过自考历年真题练习更有把握的面对考试,对题型更加熟悉,从而取得更佳的成绩.供 ...

    2. 简答题c语言文件操作顺序,计算机基础与程序设计2012年4月真题试题(02275)

      计算机基础与程序设计2012年4月真题试题与答案解析(02275) 计算机基础与程序设计2012年4月真题试题与答案解析(02275),本试卷总共100分. 一.单项选择题 (本大题共20小题.每小题 ...

    3. 计算机基础知识与程序设计二,计算机基础与程序设计.doc

      计算机基础与程序设计.doc (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 <计算机基础与稈序设计>是高等教冇H学考 ...

    4. 计算机基础与程序设计(基于C语言)学习笔记

      计算机基础与程序设计(基于C语言)学习笔记 前言 这是一个学习笔记 课程导入 在线学习工具:https://c.runoob.com/compile/11 为什么要学习程序设计 (1)存储程序和程序控 ...

    5. 计算机分栏过程,计算机基础与程序设计-要点分栏.docx

      计算机基础与程序设计-要点分栏 1-1-操作系统包括:1单用户操作系统,DOS;2批处理操作系统:3分时操作系统,UNIX,VMS;4实时操作系统时操作系统,VsWorks;5网络操作系统,netwa ...

    6. c语言namel标识符,2012年7月计算机基础与程序设计自考试题

      全国2012年7月计算机基础与程序设计自考试题 一.单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内.错选.多选或 ...

    7. 计算机基础与程序设计真题及答案,02275计算机基础与程序设计201504历年真题及答案...

      02275计算机基础与程序设计201504历年真题及答案 2015年4月高等教育自学考试全国统一命题考试 计算机基础与程序设计试卷 (课程代码02275) 本试卷共8页,满分l00分,考试时间l50分 ...

    8. C语言已知一数码字符串s,计算机基础与程序设计2005年4月真题试题(02275)

      计算机基础与程序设计2005年4月真题试题与答案解析(02275) 计算机基础与程序设计2005年4月真题试题与答案解析(02275),本试卷总共100分. 一.单项选择题 (本大题共20小题.每小题 ...

    9. 计算机基础之程序设计基本方法

      计算机与程序设计 计算机是根据指令操作数据的设备 功能性:对数据的操作,表现为数据计算.输入输出处理和结果存储等 可编程性:根据一系列指令自动地.可预测地.准确地完成操作者的意图 计算机的发展参照摩尔 ...

    10. 计算机程序设计基础试题与答案,2018年4月自考计算机基础与程序设计02275试题及答案.doc...

      页 PAGE \* MERGEFORMAT9 第二部分非选择题 二.填空题:本大题共l0小题,每小题l分,共10分. 21.在计算机中,处理器一次运算能处理的二进制数的位数称为_______. 22. ...

    最新文章

    1. Unity3D 材料
    2. javascript基础语法——表达式
    3. 循环语句——7月23日
    4. SQL SERVER定时备份数据库
    5. 向碳基芯片更进一步:台积电、斯坦福等联手开发碳纳米管晶体管新工艺,性能逼近硅元件...
    6. 云原生架构沙龙(成都站)圆满结束(附胶片下载)
    7. android 底部去除list渐变,layer-list渐变色的处理
    8. 巧设IP路由 实现不同网段互通
    9. Redis管理及监控工具treeNMS
    10. 让Office 2003与Office 2010完美共存
    11. vue 按钮控制鼠标滚轮放大缩小
    12. 我的程序员之路(13)——2017年度总结
    13. iPhone 屏幕尺寸
    14. Word 悬挂缩进文本如何对齐
    15. MySQL 主从同步延迟的原因及解决办法
    16. Python入门学习笔记——12.文件操作
    17. 为什么我们要掌握Linux系统编程?
    18. 不放心的dblink--手工关闭dblink
    19. Python入门之——pexpect模块
    20. vue 在线生成二维码 二维码生成背景下载

    热门文章

    1. 暗黑破坏神2 符文自动合成--按键精灵源码
    2. 产品读书《定位:有史以来对美国营销影响最大的观念》
    3. java毕业设计老鹳窝旅游网源码+lw文档+mybatis+系统+mysql数据库+调试
    4. 1、曾经风光无限的jsp,为什么现在很少有人使用了?
    5. Labview双通道虚拟示波器完整程序
    6. 神经网络与机器学习笔记
    7. 苹果计算机格式化磁盘,苹果电脑怎么格式化
    8. 春运12306购票指南
    9. matlab2017b安装之后点桌面图标黑框闪退
    10. 日本盗版漫画网站的罪与罚