自考C语言知识点--00342 高级语言程序设计(一)
2024-10-21 17:57:14 2 举报
AI智能生成
自考C语言知识点--00342 高级语言程序设计(一)
作者其他创作
大纲/内容
进制
进制转换
1、十进制转换为二进制
方法
先将十进制分解为2的不同整数次幂的和,然后把这些数分别转化为二进制数,最后将这些二进制相加就得到结果
2、二进制转换为十进制
方法
采用乘幂相加法
3、二进制转换为八进制
方法
将二进制右向左每三位分为一组,最左端不够三位补零,最后将每小组转换为一位八进制
4、八进制转换为二进制
方法
从右向左每位八进制数转换为三位二进制数,然后去掉最左端的零
5、二进制转换为十六进制
方法
将二进制右向左每四位分为一组,最左端不够四位补零,最后将每小组转换为一位十六进制数
6、十六进制转换为二进制
方法
从右向左每位十六进制数转换为四位二进制数,然后去掉最左端的零
数值表示
二进制位与字节
1byte = 8 bit
原码表示
将最高位作为符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值
反码表示
正数的反码与原码相同,负数的反码的符号位为1,其余各位为该数绝对值的原码按位取反
补码表示
正数的补码与原码相同,负数的补码的符号位为1,其余取反码,并在末尾加1
原补转换
已知补码求原码
方法
1、符号位为0,表示是个正数,补码就是原码
2、符号位为1,表示是个负数,操作可以是符号位不变,其余各位取反,然后在末位加1
说明
计算机的整数型都用补码表示,减法可做加法
若两补码相加,最高位(符号位)有进位,则舍弃
经典程序方法
判断实数a等于0的方法,不能用a==0
<font color="#c41230">if (fabs(a)<=1e-6)</font>
判断是否为英文字母
<font color="#c41230">char x; if ((a>='a' && a <='z') && (a>='A' && a<='z'))</font><br>
int k,a,b;<br>k = (a=1,b=3);
这样写没毛病,k的值为3
对字符串每个字符进行处理
正确:while((c=getchar())!='\n')
循环读取字符
错误:scanf("%s",c)
c为一位数组,对于没输入的下标位置给随机值,从而影响结果
易错点
1、<font color="#c41230">C 语言的分隔符包括逗号和空格两种</font>。逗号主要用在类型说明和函数参数表中,分隔各 个变量;空格多用于语句各单词之间,作为间隔符。<br>
2、错误写法: int a=b=1
1、定义同一类型的多个变量必须用逗号分隔
2、若b已经定义,则是正确的
int b;int a=b=1;
3、%f不设定宽度,会保留6位小数
4、scanf函数
scanf中取地址符号,一般不能省略
char s[5];scanf("%s",s)
<font color="#c41230">这样是正确的,因为s是数组名,本身就是取地址符号</font>
double 输入 lf<br>short 输入 hd
可以指定宽度,但不能指定精度
末尾不能加\n
没有语法错误,但不能正常退出,只能再输入字符,按回车退出
输入字符时,每个字符之前不需要分隔符,因为将分隔符被纳入
5、循环中改变变量的值
for (i=0;i<10;i++)<br>i = 5;
那么,在下次循环中i=6
6、二维数组中行长度可省略,列长度不可
7、数字和数字字符不同,关键在于其类型不同
8、switch后面必须是整型或字符型,或枚举型
9、!x等价于x==0
x为0是,!x为1;x不为0时,!x为0;所以等价于x==0
10. int a; a%6.2
C语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错
余数可以是正数也可以是负数,由 % 左边的整数决定
11. abs 和fabs
12、局部变量与全局变量同名时,会屏蔽全局变量
13、(*pionter).a
括号不能省略,因为 . 的优先级高于 *
14.printf函数中自增自减
int i=8;<br><br> printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);<br>
8<br><br>8<br><br>7<br><br>8<br><br>-7<br><br>-8
15 *p++和++*p
* 号和 ++ 符号属于同级运算,且优先运算顺序是从右到左。
16.实数常量的指数形式
字幕e或E之前必须有数字,且e后面的数字必须为整数
17. * 和 ++组合的优先级问题
只需记住一点,他两的结合性都是自右向左,从而,尽可能多的向右先看
例:*p++等价于*(p++)
18. NULL的值是0,含义是空地址<br>
函数使用注意点
1. pow (double x,double y)
返回值:【ret】 x为底的y次方
注意
如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error 错误。<br>如果底数 x 和指数 y 都是 0,可能会导致 domain error 错误,也可能没有;这跟库的实现有关。<br>如果底数 x 是 0,指数 y 是负数,可能会导致 domain error 或 pole error 错误,也可能没有;这跟库的实现有关。<br>如果返回值 ret 太大或者太小,将会导致 range error 错误。<br>
2、sizeof
long——4<br>指针——4<br>double——8
int arr[]={1,2,3};<br><br>for(int i=0;i<sizeof(arr);i++){<br><br> printf("%d,",arr[i]);<br><br>}<br><br>除了会输出1,2,3以外,还会输出杂乱无章的数字,但一共是输出12个。<br><br>因为数组的内存是动态分配的,到了元素3以后的元素都是新分配的,并不一定是空。<br><br>因为数组是一片连续的空间,有可能元素3的空间是有数据的,那么C语言会将其读取出来,<br><br>当然是一些没有实际意义的杂乱无章的数字,但你不要想着去操作,否则可能导致数据错乱<br><br>所以有可能你运行好几次,后面的值都不会有变化。<br><br><br>不过改成如下代码,就很精辟了。<br><br><br>int arr[]={1,2,3};<br><br>for(int i=0;i<(sizeof(arr)/sizeof(int));i++){<br><br> printf("%d,",arr[i]);<br><br>}<br>
内存对齐不是C语言的特性,它属于计算机的运行原理,C++、Java、Python等其他编程语言同样也会有内存对齐的问题
3、strcpy
char *strcpy (char *, const char *)<br>
第一个为目标,第二个为const
4、double sin(double x)
5.字符串的输入函数scanf和gets的区别
scanf()函数:回车换行符或空格符都看成输入字符串的结束
gets()函数:只有回车换行符才看成输入字符串的结束
第一章 概述
1、计算机发展
四个时代:1.电子管计算机时代 2.晶体管计算机时代 3.集成电路计算机时代 4.大规模集成电路时代
2、计算机语言
机器语言是用二进制代码表示的能被计算机识别和执行的指令集合<br><br><br><br>机器语言和汇编语言都是面向机器的语言,也称为"低级语言"<br><br><br><br>源程序是指高级语言编写的程序,它必须翻译成二进制程序才能够执行<br><br><br><br><span style="font-size: inherit;">源程序全部翻译成二进制程序之后再运行,则完成该翻译工作的工作程序称为<font color="#c41230">编译程序</font>,编译得到的</span><br><br><br><br>二进制程序称为<font color="#c41230">目标程序</font><br><br><br><br>在翻译过程中,翻译程序翻译一句执行一句,该翻译程序称为解释程序
3、算法及其描述方法
解决问题的步骤序列就是算法
4、程序和程序设计方法
计算机程序就是指根据算法描述,用计算机语言表示的能被计算机识别和执行的指令集合
第二章 C语言基础知识<br>
1、语言发展和特点<br>
发展<br>
源于ALGOL60语言,于20世纪60年代初提出<br>
特点
(1)<font color="#c41230">结构化语言</font>(2)运算能力强大(3)数据类型丰富(4)具有预处理能力(5)可移植性好(6) 程序执行效率高(7)程序设计自由度<font color="#c41230">大</font><br>
2. 基本词类<br>
字符集
字符是组成语言最基本的元素。C语言的字符集由字母、数字、空格、标点和特殊字符组成。
关键字
所 有的关键 字均由小 写字母组 成。
标识符
大小写英文字母、数字和下画线组成,且第一个字符不能是数字。<br><br>用户自定义的标识符既不能是C语言的关键字,也不能与用户已编写的函数或C语言的库函数重名
见名知意,不易混淆
注释符
/* */<br>
多行
//
单行
常量
一般用大写字母
格式
#define 符号常量 常量<br>
见名知意,一改全改
3. 基本语句类
数据定义语句、赋值语句、函数调用语句、表 达式语句、流程控制语句、复合语句和空语句等等,都以分号“;”结束。
4、 基本组成
有且仅有一个主函数
基本组成单位:函数
首部
函数体
以;结束语句,但函数首部,预处理命令,右花括号不加;
本身没有输入输出命令
格式灵活
一行可多条代码
随意使用空格,回车
主函数开始,主函数结束
预处理命令放在最前
5、开发环境
C程序的运行步骤:1.编辑 建立源程序文件扩展名为"c"或"cpp" 2.编译 编译程序将源程序转换为 二进制形式的目标程序,扩展名为"obj" 3.链接 生成可执行文件,扩展名为"exe" 4.运行<br>
6、书写格式
使用tab缩进
{}对齐
有足够的注释
有合适的空行
第三章 数据类型 运算符和表达式<br>
数据类型<br>
基本类型(整型、实型(又称浮点型)、字符型和枚举型)、构造类型、指针类型 和空类型
决定
数据占内存字节数
数据取值范围
可进行的操作
常量
整形常量
三种书写形式
八进制整型常量(必须以0开头,0-7组成)、十进制整型常量(通常 的整数)、十六进制整型常量(以0X或0x开头,0-9、a-f或A-F组成)
长整形常量
末尾L,4个字节,取值范围是-2^31~(2^31 - 1)
16位计算机中占用2个字节,数值范围为-2^15---2^15,即-32768~32767
实型常量
形式
十进制形式:必须有小数点
eg.: <font color="#c41230">.132 -.132</font>
指数形式:e或E之前必须有数字,指数必须为整数(正负都行)
注意
1、4字节,范围 -10^38~10^38
2、有效数字为7位
3、100,000位非法数值,“,”不可以
字符常量
字符常量
普通字符常量
用单引号括住
转义字符
以反斜杠开头
\ddd: 1-3位8进制数ddd对应的符号
\xhh:<font color="#c41230">1~2位</font>16进制hh对应的符号
说明
空字符
":用\0表示,其值为0
' ':可显示字符,其ASCII的值为32<br>
字符串常量
字符串常量
使用一对双引号括起来
空字符串
“”
与空格串不同
字符串的长度
<font color="#c41230">"\101\n\x43ab"的长度为5</font>
每个转义字符的长度为1
编译时,自动在<font color="#000000">末</font>尾加<font color="#c41230">\0,即长度为n的字符串占用n+1个字节</font><br>
符号常量
定义
符合常量定义格式为 #define 符号常量 常量
说明
1、建议大写
2、在程序开头,因为不是语句,其后不跟分号
3、独占一行
优势
提高可读性
便于修改
变量
变量
格式
数据类型 变量名
先定义后使用
变量初始化
变量名实为一个符号地址
整型变量<br>
字符型变量和整型变量能够转换
原因
因为一个char的大小是一个byte即8个bit,一共可以表示2的8次方即256个数字0-255<br><br>但是char分为signed和unsigned两种形式,即是否有正负之分<br><br>如果是signed就是有正负号的,在机器码中8位二进制bit就需要占用一个作为区别正负号的标记,分别用1或0表示,那么剩下的7个bit能够表示0-127的数字,由于2的8次方一共是256个数字,可以得到负数范围内有128个数字,即一个signed char能表示从-128-127的数字<br><br>与之相对的,unsigned char即表示从0-255的值,由于ASCII码没有负值,而且一般的ASCII码只需要使用0-127就足够了,所以剩下的那128个字符就组成了extended ASCII,当然,一般是没有什么作用的,也可以看到这个范围的符号一般都是些稀奇古怪的,但是你将它赋值到这个范围就引起了这个问题<br><br>虽然定义一个char变量生成的究竟是unsigned char还是signed char和你具体使用的环境有关,但一般的INTEL计算机都是生成signed char,如果你不能确定可以使用limits.h中提供的常量来确定,当然int long 等等也能够用相同方式查看,如果是float的话用float.h查看,具体的可以查询library的说明,程序如下,自己运行看看吧
1、基本整型,类型关键字为int。2、短整型,类型关键字为short[int]。3、长整型,类型关键<br><br>字为long[int]。4、无符号整型,又称为无符号基本整型(unsigned [int])、无符号短整型<br><br>(unsigned short)和无符号长整型(unsigned long)三种。
在16位编译器中,一般一个int 型变量占用2字节,且long型(4字节)≥int型(2字节)≥short型(2字节);而在32位编译器 中,一个int型变量占用4字节,long型变量占用4字节,short型变量占用2字节
实型变量
1、单精度实型,类型关键字为float,一般占用内存4字节,保留6~7位有效数字。 <br>
2、双精度实型,类型关键字为double,一般占用内存8字节,保留15~16位有效数字。<br>
字符变量
关键字是char,存放的是字符的ASCⅡ码值(无符号整数),占用内存1字节。
注意:
字符串只能是常量,c语言中没有字符串变量,而是用<font color="#662c90">字符数组存放字符串变量</font><br>
有名常量
格式:<br>
const 数据类型符 变量名 1=初值 1[,变量名 2=初值 2,...];
不希望程序中改变其值
运算符和表达式
算术运算符
+、-、*、/、+(取正)、-(取负),自增运算符++、自减运算符--
说明
1、除法运算的结果和运算对象的数据类型有关,若两个整数相除,则运算 称为整除,其商为整数,小数部分被舍弃。<br>
2、模运算,要求两侧的运算对象必须为整型,否则出错。运算结果的符号与被除数的符号相同
3、一个或两个运算对象是实例,则运算结果为实例(double)
自增自减的说明
适用于整型,字符型,和指针,不能用于常量和表达式。 <br>
例如:5++,--(a+2), ----i, ++i++等都是非法的
自增和自减运算符优先于双目算术运算符;
自增、自减运算符和单目算术运算符+、-的优先级相同,结合性是从 右至左。 <br>
当出现若干个+或-组成运算串时,C语言规定自左向右取尽可能多的符号组成运算符
例如:i+++j 应理解成(i++)+j
经典算术表达式
优先级
- 优先于 / * % 优先于 + -
关系运算符
关系运算符包括>、>=、<、<=、==、!=,逻辑结果值为真(1)或假(0)<br>
优先级
1、算术运算符优先于关系运算符。<br><br>2、<font color="#16884a">>、>=、<、<=优先于==、!=</font><font color="#662c90">。</font><br><br>3、>、>=、<、<=的优先级相同,结合性是从左至右。<br><br>4、==、!=的优先级相同,结合性是从左至右。 <br>
例:4<3<5,即(4<3)<5,即为1
由于条件,赋值,逗号运算符的优先级低于关系运算符,所以注意加圆括号
逻辑运算符
&&(and 与)<br>||(or 或)<br>!(not 非)
优先级
(1)!优先于双目算术运算符优先于关系运算符优先于&&优先于||。<br><br>(2)单目逻辑运算符!和单目算术运算符的优先级相同,结合性均从右至 左。<br><br>(3)双目逻辑运算符“&&”和“||”的结合性是从左至右。
注意:(4)一旦“&&”和“||”能够确定表达式的值,则不再继续运算,即并不 是所有的表达式都被运算。 <br>
赋值运算符
优先级
算术运算符优先于关系运算符优先于双目逻辑运算符优先于赋值运算符;
结合性
从右至左<br>
逗号运算符
优先级
任何运算符优先于逗号运算符,即逗号运算符的优先级最低。
结合性
从左至右
条件运算符
一般使用形式: 表达式 1?表达式 2:表达式 3 <br>
优先级
其他运算符优先于条件运算符优先于赋值和复合赋值运算符优先于逗号<br><br>运算符。 <br>
结合性
从右向左
例题
位运算符
位逻辑运算符
&与运算:对应两个二进位均为1时,结果位才为1,否则为0。(有假为假==0)
|或运算:对应的两个二进位有一个为1时,结果位就为1,否则为0。(有真为真==1) <br>
^ 异或运算(位加):对应的二进位不同时为1,否则为0。(不同为真==1,相同为假==0)
~ 取反运算:对整数的各二进位进行取反,包括符号位(0变1,1变0,真假互换)
位移运算符
<< 左移:把整数的各二进位全部左移n位,高位丢弃(包括符号位),低位补0。 <br>左移n位其实就是乘以2的n次方(但移动后符号位变化除外,符号位改变则正负改变)
>> 右移:把整数的各二进位全部右移n位,符号位不变。高位的空缺是正数补0; <br><ul><li>是<font color="#c41230">负数高位是补0或是补1 取决于编译系统的规定</font>;右移n位其实就是除以2的n次方</li></ul>
优先级
~、<<、>>、&、^、|、&=、^=、|=、<<=、>>=
、~与单目逻辑运算符、自增、自减、单目算术运算符、长度运算符的优<br>先级相同,结合性是从右至左。 <br>
~优先于双目算术运算符 优先于 关系运算符优先于&优先于^优先于|优先于双目逻辑运算符
说明
1、运算对象只能是整型或字符型数据。 <br>
2、&的主要作用是提取(或保留)一个数的某(些)位,其余各位置0
例如,将二进制00010010高四位不变,低四位置0
方法:00010010&<font color="#c41230">11110000</font>
3、^的主要作用是使一个数的某(些)位翻转,其余各位不变
4、~的主要作用是间接地构造一个数,以增强程序的可移植性
长度运算符
sizeof(数据类型符)或sizeof(变量)
优先级
与单目算术运算符、单目逻辑运算符、自增和自减运算符的优先级相同。 <br>
结合性
从右向左
结合性
除单目运算符,赋值运算符,条件运算符之外是从右至左,其余都是从左至右<br>
口诀
括号成员第一;<br>全体单目第二;<br>移位五,关系六;<br>等于不等排第七;<br>位与异或和位或;<br>三分天下八九十;<br>逻辑或跟与;<br>十二和十一;<br>条件高于赋值;<br>逗号运算级最低。
类型转换
自动类型转换<br>
参与运算的各个数据都转换成数据较长的数据类型,然后计算,结果的类型 就是数据长度较长的数据类型。本质上是较低类型的转换,即“<b><font color="#c41230">就高不就低”或 “就长不就短</font></b>”的原则。 <br>
转换规则
char或short 必须转换为 int
float 必须转换为double
除此,不同类型一起运算时转换
赋值类型转换
先将运算结果的数据类型自动转换为左边变量的数据类型,然后再赋予该变 量。本质上是“<font color="#c41230">就左不就右</font>”的转换原则
强制类型转换
一般格式:(数据类型符)(表达式)
若表达式仅仅是单个常量或变量时,外面的一对圆括 号可以省略;若是含有运算符的表达式,则必须用一对圆括号括起来。 <br>
第四章 结构化程序设计<br>
设计原则
1、自顶向下,逐步 求精2、模块化设计3、结构化编码:经模块化设计后进入编码阶段,任何程序都由顺序、选择和 循环三种基本结构组成。 <br>
三种基本结构
顺序结构
库函数分类存放在扩展名为"h"的文件中,称为头函数或头文件,若需要在C源程序中使用某个或 某些库函数,则必须在源程序的开头包含:#include<头文件名.h> <br>
基本函数
字符输出putchar
格式:putchar(参数)
参数:不能是字符串
说明
单个字符,一次只能输出一个
#include <stdio.h>
字符输入getchar
格式:getchar()
无参数
说明
单个字符,多个只去第一个
#include <stdio.h>
格式输出printf
printf(格式控制字符串,输出项表)
格式控制字符的格式
%[flags][width][.prec][F|N|h|I][type]
说明
flags为可选择的标志字符
- ——左对齐输出,默认为右对齐输出;<br><br>+ ——正数输出加号(+),负数输出减号(-);<br><br>空格 ——正数输出空格代替加号(+),负数输出减号(-)。 <br>
width为可选择的宽度指示符
[.prec]为可选的精度指示符 <br>
用“小数点”加“十进制正整数”表示,对“整数”、“实数”和“字符串”的输出有如下功能:对“整数”,表示至少要输出的数字个数,不足补数字0,多则原样输出;对“实数”,表示小数点后至多输出的数字个数,不足则补数字0,多则做舍入处理;对“字符串”,表示最多输出的字符个数,不足补空格,多则丢弃
[F|N|h|I]为可选的输出长度修饰符
F ——输出远指针存放的地址;<br><br>N——输出近指针存放的地址;<br><br>h——输出短整型数据的值;<br><br>l——输出长整型或双精度型数据的值
type为可选的格式字符
格式控制字符串
格式字符
d格式<br>
%d:实际长度,取值范围:-32768-32767<br>
%md:<br>
%ld:
o格式
%mo
%lo
x格式
%mx
%lx
f格式
%f:整数全部,小数6位<br>
单精度
双精度
%m.nf格式:占m列,其中n位小数,左补空格。
% -m.nf格式:右补空格
e格式
%e格式:不指定m和n,小数6位,指数部分共5位,其中e和指数符号各1位,指数值3位。<br>
注意:指数为必须是整数
例:0e+0.0是错的
%m.ne和% -m.ne格式:m、n、-的含义同前面。没有n时,自动=6
g格式
⚫可以自动根据数值大小选择 f 或 e 格式(选列少的)<br>
⚫不输出无意义的零
%u
%c
%s
格式输入scanf
格式: scanf(格式控制,地址表列 ) ;
⚫地址表列:变量地址或字符串地址,地址间“,”分隔。<br>
格式控制符
选择结构
单分支选择结构<br>
【格式】if(表达式)语句; <br>
双分支结构
说明
程序段中的else是和前面最近的没有配对的if配对。
复合语句中if-else独立处理
嵌套
⚫格式:if (表达式1) 语句1<br><br>else if (表达式2) 语句2<br><br>else if (表达式3) 语句3<br><br>……<br><br>else if (表达式m) 语句m<br><br>else 语句n
多分支结构
格式<br>
switch(表达式)<br><br>{<br><br>case 常量表达式1:语句组1;break; case 常量表达式2:语句组2;break;<br><br>…<br><br>case 常量表达式n:语句组n;break; [default:语句组n+1;[break;]]<br><br>}
说明
switch 后面的表达式常用的是字符型或整形表达式
case 后面的“常量表达式”仅起到语句标号的作用,并不进行条件判断。
常量表达式必须互不相同
多个 case 子句,可共用同一个语句(组)。 <br>
break:若省略,则连续执行其后的所有语句组
default及其语句组可以省略
循环结构
当型while
循环表达式语句可以是任何类型
格式:while ()
while没有分号
先判断后执行循环体。即表达式不成立时,循环体最少执行 0 次。 <br>
直到型do while
while有分号
【格式】do 语句;<br><br>while(表达式); /*本行的分号不能省略*/ <br>
说明
while成立执行while下面的代码,不成立则执行do的代码
for语句
格式
for(表达式 1;表达式 2;表达式 3)<br><br>语句; <br>
说明
1、“表达式 1”的作用是对循环控制变量赋初值;“表达式 2”的作用是 控制循环的条件;“表达式 3”的作用是循环后修正变量,使循环趋于结束。
2、“表达式 1”可以是任何类型,其后有一个分号,“表达式 1”可以省略。 <br>
3、“表达式 3”可以是任何类型,其后没有分号,“表达式 3”可以省略。 <br>
4、“表达式 1”“表达式 2”和“表达式 3”均可以省略,甚至三者全部省 略,但它们之间的分号不能省略。 <br>
5、当“表达式 1”和“表达式 3”省略时,相当于 while 循环,即先判断 后执行循环体,循环体至少执行 0 次;当“表达式 3”省略时,则循环体内应有 改变“表达式 2”的语句;当“表达式 2”省略时,无终止条件,则循环体内应 有跳出该循环的语句,如 break、goto、exit()或 return 等。 <br>
第五章 数组<br>
定义<br>
概述
具有相同数据类型的一组有序数据的集合
数组作为一个整体,不能参与数据运算,只能对单个元素进行运算<br>
在二维数组中,行长度是第一维,列长度是第二维
数组元素
也称为下标变量,本质是一个变量
❖表示形式: 数组名[下标]
数据类型符<br>
基本数据类型/构造数据类型
数组运算符
只能是常量表达式
数组名
与变量名一样,必须遵循标识符的命名规则,表示内存首地址,是地址常量
长度/下标
即数组长度,表示元素个数
同一数组中的所有元素,按其下标的顺序占用若干连续的存储单元
不可越界
一维数组
一般格式
数据类型符 数组名1[长度1],数组名2[长度2],…;
引用
❖数组必须先定义,后使用<br><br>❖<font color="#fdb813">只能逐个引用数组元素,不能一次引用整个数组。</font><br>
初始化
格式
数据类型符 数组名[长度]={初值表},…;
说明
对数组的全部元素赋初值,定义时数组长度可以省略(系统根据初值个数自动确定);如果被定义数组的长度,与初值个数不同,则数组长度不能省略。
若只对数组的前若干个元素赋初值,对于数值型数组默认的初值为0;对于字符型数组,默认的初值为空字符“‘\0’”(ASCII码值为0)
分情况
全部
对所有元素赋初值为0
int a[5]={0};
<font color="#c41230">所有元素均为0</font>
int a[5];
<font color="#c41230">数组元素的值是随机的</font>
部分
不初始化
static<br>
默认值为 \0或0
字符串
a[5] = {"lang"}
a[5] = "lang"
a[] = {'l'.'a','n','g','\0'}
冒泡排序
选择排序
二维数组
格式
数据类型符 数组名[行长度][列长度],…;
说明
行长度和列长度都是一个“整型常量表达式”,表达式中不能出现变量
排列顺序是“按行存放”
初始化
子主题
只对每行前若干个元素赋初值<br>
对于整型二维数组是0,对于实型二维数组是0.0,对于字符型二维数组是‘\0’
分行给所有行的前若干个元素赋初值,行长度可以省略<br>
所有元素赋初值,行长度可以省略
注意
允许给出的初值不是行长度的整数倍
此时,行长度 = 初值个数除以行长度的整数倍 + 1<br>
字符串数组
一维字符数组的输入
scanf("%c",&数组元素)
scanf("%s",s)
gets(s)
整个字符数组
一维字符数组的输出
printf("%c",数组元素)<br>
逐个输出
pintf("%s",s)
注意
遇到'\0'结束
puts(s)
二维
输入
for ---; scanf("%s",s)
for ---; gets(s)
输出
for ---; printf("%s",s)
for ---; printf("%c",s[][])
for ---; puts(s)
字符串<br>
定义
若干有效字符的序列
输入输出
scanf :自动在末尾加'\0',遇到空格或回车结束
printf:遇到'\0',后面的不输出
库函数
gets(字符数组名)<br>
参数
已定义的组名
功能
仅以回车符结束
空格看着字符串的一部分
返回
首地址
puts(字符数组名)
参数
已存放字符串的组名<br>
功能
输出,将'\0'换成回车输出
strcmp(str1,str2)
规则
对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止。
返回值:返回int型整数。其值是ASCII码的差值<br><br>a. 若字符串1< 字符串2, 返回负整数<br><br>b. 若字符串1> 字符串2, 返回正整数<br><br>c. 若字符串1= = 字符串2, 返回零
strcpy(字符数组名,字符串<font color="#c41230">[,整型表达式]</font>)
参数
“字符数组名”是已经定义的字符数组名。<br><br>“字符串”可以是字符串常量,也可以是已经存放字符串的字符数组名。<br><br>“整型表达式”可以是任何整型表达式,这一参数可以省略。
功能
将“字符串”的前“整型表达式”个字符组成新的字符串复制到“字符数组”中,若省略“整型表达式”,则将“字符串”完整地复制到“字符数组中”,字符数组的原有内容被覆盖。
返回值
字符数组的首地址
说明
字符数组足够大
不能“=”复制
strcat(字符数组名,字符串)<br>
参数
“字符数组名”是已经定义的存放字符串的字符数组名。“字符串”可以是字符串常量,也可以是已经存放字符串的字符数组名。<br>
功能
把“字符串”连接到“字符数组”中字符串的尾端(最后一个有效字符的后面),组成新的字符串并存储到“字符数组”。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改
返回值
首地址
说明
字符数组够大
strlen(字符串)
功能
长度不包括'\0'
strlwr(字符串)
参数
字符串常量/以存放字符串的字符数组
功能
所有大写字母转换小写,非字母不转换
strupr(字符串)
与strlwr用法一致,作用相反
第六章 函数
若希望函数调用结束后,局部变量的值保留,则指<br><br>定该变量为静态局部变量,用static对变量加以声明。 <br>
函数的嵌套调用<br>
不允许嵌套定义,函数间的关系是平行的、独立的。<br>
允许嵌套调用,即在调用某函数过程中又调用另一函数
函数的递归调用
常用的库函数
E:\学习\高级程序语言设计\常用函数.xlsx<br>
第七章 指针
概念
一种数据类型。指针是存放数据的内存单元地址
定义
格式
数据类型符 *指针变量名[=初始地址值],…;
功能
定义指向“数据类型符”的变量或数组的指针变量,同时为其赋初值
说明
“初始地址值”通常是“&变量名”“&数组元素”或“一维数组名”<br>,这里的变量或数组必须是已定义的
可以是NULL(空指针)
指针变量初始化时,指针变量的“数据类型符”必须与其“初始地址值”中<br>保存的数据的类型相同
初始化
[存储类型] 数据类型 *指针名=初始地址值;
一般使用
指针变量=地址型表达式
虽然地址是一个整数,但是C语言中不允许把整数看成“地址常<br>量”,所以此处的“地址型表达式”不能是整数
直接使用指针变量
需要使用地址时,可以直接引用指针变量名
通过指针变量引用所指向的变量
*指针变量名
这种引用方式要求指针变量必须已经定义且有值
运算
&取地址符
可以是已定义的变量或数组,不能是数组名,返回值为地址值
*指针运算符<br>
可以是指针变量,已定义的变量或数组的地址,不能是整数或非指针变量,返回值为具体的值
指针和数组
指向一维数组
在数据定义语句中用赋初值的方式,即*指针变量=&数组名[下标]。<br>
在程序中用赋值的方式,即指针变量=&数组名[下标];。
引用
引用下标为0的数组元素 *(指针变量+0)或 *指针变量 或 指针变量[0]
下标为i的数组元素
1、<br><br>*(指针变量+i)<br><br>2、<br><br>*(数组名+i)<br><br>3、指针变量[i]<br><br>4、数组名[i]
说明
不能把一个整数p,也不能把p的值整型变量<br>
指针算术运算
指针变量+/-整数
指针变量 自增/自减
指针变量1 - 指针变量2
说明
结果为两个指针之间的数据个数
两指针变量不能相加
关系运算
先小后大
必须指向同一数组,否则无意义
指针和字符串
指向字符串
在数据定义语句中用赋初值的方式 *指针变量=字符串
在程序中用赋值的方式 指针变量=字符串;<br>
字符串的表示形式
可赋给字符型的数组或指针变量,<br><br>可通过字符型数组名或字符型指针变量输出
指针数组
概念
定义
数组中的元素均为指针变量
格式
数据类型符 *指针数组名[数组长度];
功能
定义指针数组,有“长度”个数组元素
赋值
将数组名赋予指针数组各元素
将字符串直接赋予指针数组元素
运算
算术运算和关系运算一般只用于指针数组元素指向同一个指针数组
指向指针的指针
定义<br>
一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号
例: int **var;
访问
当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符
** var
第八章 结构体类型和自定义类型<br>
结构体类型的定义
形式
struct 结构体类型名 /*struct是结构体类型的关键字*/<br><br>{<br><br>数据类型符 成员名1;<br><br>数据类型符 成员名2;<br><br>…<br><br>数据类型符 成员名n;<br><br>};
结构体类型名,数据类型列表,结构变量名三者至少留二<br>
省略不同名,即使数据类型列表一致,也被编译器认为是两种类型
说明
结构体类型仅是一种数据类型,系统不会为其成员分配内存
用结构体定义变量,必须用struct声明
注意:标红了,此处为错误示范
若是typedef定义的新类型,则不必
定义结构体类型变量的三种方法:
先定义结构体类型、后定义结构体类型的变量(间接定义法)<br>
在定义结构体类型的同时,定义结构体类型变量(直接定义法)
省略结构体类型名,直接定义结构体类型变量
说明
只有在定义了结构<br>体变量后系统才为<br>其分配内存。
❖结构体成员名与程序中变量名可相同,两者不代<br>表同一个对象。
结构体变量不能整体引用,只能引用变量成员
成员运算符
双目运算符<br>
优先级最高,与圆括号运算符()、下标运算符[]的优先级相同,结合性是从左至右
结构体类型的引用
变量成员地址的引用方法
&结构体类型变量名.成员名
/*成员是变量形式的变量地址*/
结构体类型变量名.成员名
/*成员是数组形式的数组首地址*/
&结构体类型变量名.成员数组[下标]
/*成员是数组,其数组元素的地址*/
说明
存放结构体类型变量成员地址的指针变量的数据类型必须与该成<br><br>员的数据类型相同
变量地址的引用方法<br>
&结构体类型变量名
结构体类型数组
定义
引用
数组元素成员
结构体类型数组名[下标].成员名
数组元素成员地址
&结构体类型数组名[下标].成员名
结构体类型指针
如果指针变量pointer已指向结构体类型变量var,则以下三种形式等价:<br><br>方式一:var.成员<br><br>方式二:pointer->成员<br><br>方式三:<b><i><font color="#c41230">(*pointer).成员</font></i></b> /*“*pointer”外面的一对圆括号不能省略*/
“*指针变量”必须用圆括号括起来,因为运算符<br><br>“*”的优先级低于运算符“.”<br><br>,若没有圆括号则优先处理运算符“.”<br><br>,将出现“指针变量.<br><br>成员名”会造成语法错误
指向型运算符 ->
优先级: 1<br><br>结合方向:从左向右
左侧的运算对象必须是结构体类型变量(或数组元素)的地址,也可以是已指向结构体类<br>型变量(或数组元素)的指针变量,否则会出错;
右侧的运算对象必须是该结构体类型的成<br>员名
指针变量指向结构体类型数组元素
(*指针变量).成员名
指针变量->成员名
指针变量指向结构体类型数组
(*(指针变量+i)).成员名
(指针变量+i)->成员名
传递
全局变量
返回值
只能返回一个结构体类型数据,定义时函数<br>的类型必须是已定义的结构体类型,利用语句return(表达式);返回的表达式值也<br>必须是同一结构体类型的数据。调用函数后的返回值必须用同一结构体类型变量<br>或数组元素接收
形参实参结合
地址传递
值传递
自定义类型
typedef定义类型别名
格式
typedef 原类型符 新类型符;
参数
“原类型符”可以是基本类型符,也可以是用户自定义的无名结构体类型。<br>“新类型符”是用户自定义的一个标识符,通常采用大写字母
功能
将“原类型符”定义为用户自定义的“新类型符”<br>,以后可以使用“新类型符”定<br>义相应数据类型的变量、数组、指针变量、结构体类型和函数
说明
typedef只能定义类型名,不能定义变量名,即定义类型名的别名,并不能创造一个新的<br><br>类型
typedef与宏定义#define具有相似之处,但二者是不同的。前者是在编译时完成的;后<br>者是在编译预处理时完成的,且只能进行简单的字符串替换
定义<br>
基本类型
typedef 基本数据类型符 用户类型符;
数组类型
typedef 基本数据类型符 用户类型符[数组长度];
结构体类型
typedef struct<br><br>{<br><br>数据类型符 成员名1;<br><br>数据类型符 成员名2;<br><br>…<br><br>数据类型符 成员名n;<br><br>}用户类型符;
功能
以后可以使用“用户类型符”定义含有n个成员的结构体类型变量、数<br><br>组和指针变量等
指针型
基本类型
typedef 基本数据类型符 *用户类型符;
例
typedef int *P_I
typedef char *P_C
第九章 预编译命令
宏定义
概念
宏定义用于定义程序中的符号常量、类型别名、运算式代换和语句代换等
无参宏定义
格式
#define 宏名 字符序列
说明
大写;空格;不加分号
预处理程序仅按宏定义简单地替换宏名,而不做任何检查
不可自作多情,简单替换,计算时注意优先级
为防止歧义,可用括号
对于双引号括起来的字符串内的字符,即使与宏名重名,也不进行宏展开
有参宏定义
格式
#define 宏名(形参表) 带参数的字符序列
功能
进行字符串替换,并进行参数替换
形参用实参换,其它字符保留
宏体及各形参外一般应加括号()
与有参函数的区别
⚫函数调用时,先求实参表达式的值,再带入形参。<br><br>宏只进行简单字符替换,不求值
函数调用在程序运行时处理和分配临时内存单元。<br><br>宏展开在编译时进行,不分配内存单元,无值传递和返值
函数要定义形实参且类型一致,宏无类型,其参数无类型
函数只有一个返回值,宏可以设法得到几个结果
#define PI 3.1415926<br><br>#define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R
宏展开使源程序变长,函数调用源程序不变长
宏替换不占运行时间,只占编译时间。<br><br>函数调用占运行时间
提前终止
#undef 标识符 <br>
文件包含命令
概念
一个源文件可以将另一个源文件的全部内容包含进来
格式
#include“文件名”
“”先在当前目录搜素,再在标准目录<br>
#include <文件名>
直接到系统指定的“包含文件目录”去查找
说明
编译预处理时,预处理程序将查找指定的被包含文件,并将其复制到#include命令出现<br><br>的位置上。
文件头部的被包含文件称为“标题文件”或“头部文件”<br>,常以“h”(head)作为扩展名,简称头文件
一条文件包含命令,只能指定一个被包含文件
建议使用格式二
允许嵌套
被包含文件的内容发生变化,则应该对包含此文件的所有源文件重新进行编译
处理过程
预编译时,用被包含文件的内容取代该预处理命令,<br><br>再将“包含”后的文件作为一个源文件单位进行编译,得目标<br><br>文件.obj
条件编译命令
形式
形式一
#ifdef 标识符<br>程序段1<br>[#else<br>程序段2]<br>#endif
功能
当“标识符”已经被#define命令定义,则编译程序段1;否则编译程序段2。其中[ ]中的内容,即#else部分可以省略,即:<br>#ifdef 标识符<br>程序段1<br>#endif
形式二
#ifndef 标识符<br>程序段1<br>[#else<br>程序段2]<br>#endif
功能
当“标识符”没有被#define命令定义,则编译程序段1;否则编译程序段2。其中[ ]中的内容,即#else部分可以省略,即:<br>#ifndef 标识符<br>程序段1<br>#endif
形式三
#if 表达式<br>程序段1<br>[#else<br>程序段2]<br>#endif
功能
当表达式为“真”(非0)时,则编译程序段1;否则编译程序段2。其中,[ ]中的<br>内容,即#else部分可以省略
说明
其中的“表达式”是在编译阶段计算值的,所以此处的“表达式”不能是变<br>量,必须是常量或用宏定义命令#define定义的标识符
第十章 文件
文件的概述
概念
盘符:路径\文件主名[.扩展名]
扩展名
c:C源程序文件<br><br>obj:C源程序经过编译后生成的目标文件。<br><br>exe:目标文件经过链接后生成的可执行文件。<br><br>一般地,数据文件的扩展名常用dat,文本文件的扩展名常用txt
分类
文件的内容划分
源文件、目标文件和可执行文件
组织形式划分
顺序存取文件
随机存取文件简称为“随机文件”,每个数据在磁盘中所占用的长度都相同
存储形式划分
文本文件和二进制文件
存储介质划分
普通文件即存储介质文件(磁盘、磁带等)和设备文件即非存储介质(键盘、显示器和打印机等)文件
存取方式
顺序存取
保存数据时,将数据附加到文件的尾部。顺序存取方式常用于文本文件,被存取的文件则称为顺序文件。
随机存取
以一个完整的单位进行数据的读取和写入。随机存取方式常用于二进制文件,被存取的文件则称为随机文件
文件系统
缓冲文件系统(标准I\O)
非缓冲文件系统(系统I\O)
用户在程序中为每个文件设定缓冲区
打开和关闭文件的函数
打开
原型
FILE *fopen(char *filename,char *mode)
FILE 为系统定义文件型结构体数据类型,在头文件 <stdio.h>
调用方式
fopen("文件名","使用文件方式")
参数
filename 字符型指针,所指向的字符串是要打开的“文件名”
mode 字符型指针,所指向的字符串是对打开文件规定的“使用方式”
读写
r+
从文件头开始写,保留原文件中没有被覆盖的内容
w+
写的时候如果文件存在,会被清空,从头开始写
a+
文件开始
功能
按mode指定的“使用方式”打开filename指定的“文件名”对应的文件,同时自动地为该文件分配一个内存缓冲区
返回值
若打开文件正确,则返回一个“文件型”指针,程序通过该指针获得文<br>件信息,访问文件并进行各种操作。若打开文件出错,则返回值为NULL,其中<br>NULL是在头文件stdio.h中定义的符号常量,其值为0,含义是“空”
标准写法
库函数exit
格式
void exit([程序状态值])
功能
关闭已经打开的所有文件,结束程序运行返回操作系统,并将“程序状态<br>值”返回给操作系统。当“程序状态值”为0时,表示程序正常退出;当它为非0时,<br>表示程序出错退出
关闭
原型
int fclose(FILE *fp)
调用方式
fclose(fp);
作用
使文件指针变量与文件“脱钩”,释放文件结构体和文件指针<br>
参数
fp 文件型指针,通过函数fopen()获得,且指向一个已经打开的文件
功能
关闭fp所指向的文件,同时自动释放分配给该文件的内存缓冲区
返回值
用于表示文件是否被正确地关闭,如果文件顺利关闭,该值<br><br>为0,否则为-1(EOF)
返回值可以用ferror函数测试
EOF是一个符号常量,其值在头文件stdio.h中被定义<br><br>为-1,含义是“文件尾”
标准设备文件的打开和关闭
stdin指向标准输入(通常为键盘)。如果程序指定要从stdin所指向的文件输入数<br><br>据,即从键盘输入数据
stdout指向标准输出(通常为显示器)。如果程序指定要向stdout所指向的文件<br><br>输出数据,即向显示器输出数据
stderr指向标准错误输出(通常为显示器)
说明
三种标准设备文件使用后,不必关闭。因为系统退出时将自动关闭
文件读写函数
文件尾测试函数
原型
int feof(FILE *fp)
功能
判断fp所指向的文件是否到达文件尾
返回值
若遇到文件尾,则返回值是非0;否则,返回值是0
说明
同时适用于文本文件和二进制文件。对二进制文件执行读操作时,必须使<br>用feof()函数来判断是否到达文件尾;对文本文件执行读操作时,如果遇到文件尾,<br>则返回一个文件结束标志EOF
写字符函数fputc( )
首部
int fputc(char ch,FILE *fp)
参数
ch写到文件中的字符,既可以是字符常量,也可以是字符变量或字符表达式。<br><br>fp 文件型指针,通过函数fopen()获得,且指向一个已经打开的文件
功能
将ch中的字符写到fp所指向文件的当前位置,同时将读/写位置指针后移1字节,即指向下一个读/写位置
返回值
若正确写入字符,则返回刚写入到文件的字符;否则,返回EOF
对于文本文件,写入的是单个字符。对于二进制文件,写入的是1字节数据
读字符函数fgetc( )
首部
int fgetc(FILE *fp)
功能
从fp所指向文件的当前位置读取一个字符,同时将读/写位置指针后移1字节,即指向下一个读/写位置
返回值
若正确读取字符,则返回读取的单个字符;否则,返回EOF
写字符串 fputs()
首部
int fputs(char *str,FILE *fp)
功能
把str所指向的一个字符串,舍去字符串结束标志符‘\0’后写入fp所指向文<br><br>件的当前位置。同时将读/写位置指针向后移动strlen(字符串长度)字节。
返回值
若正确写入字符串,则返回写入文件的实际字符数;否则,返回EOF
读字符串函数fgets( )
首部
char *fgets(char *str,int length,FILE *fp)
功能
从fp所指向文件的当前位置读入一个字符串,即读取length-1个字符,并在<br><br>尾部自动补充一个字符串结束标志符‘\0’,组成字符串后存入str所指定的内存区;<br><br>同时,将读/写位置指针后移实际读出的字符个数字节。如果在读取前n-1个字符中遇<br><br>到文件尾EOF或回车,则读取结束,并在读取的字符后面补充一个字符串结束标志符<br><br>‘\0’组成字符串
返回值
若正确读取字符串,则返回str对应的地址;否则,返回NULL
写数据块函数fwrite( )
首部
int fwrite(void *buffer,int size,int count,FILE *fp)
参数
buffer 字符型指针,存放写入文件数据类型的起始地址,可以是存放数据的变量<br>地址或数组首地址,也可以是指向某个变量或数组的指针变量
size 无符号整数,可以是整型常量、变量或表达式,表示从文件写入文件的每个数<br>据所占用的字节数,通常使用表达式sizeof(数据类型符)
count 无符号整数,可以是整型常量、变量或表达式,表示要写入文件的数据的个数
fp 文件型指针
功能
将从buffer开始的count个数据(每个数据占用size字节)一次性写入fp所指向的文件。同时,将读/写位置指针后移size*count字节
返回值
若正确写入数据块,则返回值是count;否则,返回值是0‘’
读数据块函数fread( )
原型
int fread(void *bug,int size,int count,FILE *fp);
功能
从fp所指文件读count个字段,字段长size个字符
将读取结构送到buf所指区域中
将读写位置向前移动size*count个字段
返回值
操作成功,为实际读取字段个数
操作错误或文件结束,为EOF
格式化写函数fprintf( )
首部
int fprintf(FILE *fp,char *format[,argument…])
参数
fp 文件型指针
format 格式字符串。<br><br>argument 输出列表
功能
将argument的值以format指定的格式写入fp所指向的文件
返回值
若正确写入数据,则返回实际输出字符的个数;否则,返回值是负数
格式化读函数fscanf( )
首部
int fscanf(FILE *fp,char *format[,argument…])
参数
同fprintf()
功能
根据format指定的格式从fp所指向文件中读取数据保存至argument所指向的内存单元
返回值
若正确读入数据,则返回值是已读入的数据个数;否则,返回值是EOF
文件定位函数
文件指针复位函数
首部
int rewind(FILE *fp)
功能
把文件的位置指针重新定位到fp所指向文件的起始位置
返回值
无
文件随机定位函数
首部
int fseek(FILE *fp,long offset,int origin)
参数
fp 文件指针类型
offset 长整型数据,表示位移量,是从origin为起始位置,向后(当位移量>0时)或向前(当位移量<0时)移动的字节数
origin 表示起始位置
整数
0
1
2
符号常量
SEEK_SET
SEEK_CUR
SEEK_END
对应位置
文件头
当前位置
文件尾
功能
将fp所指向文件的位置指针从origin指定的起始位置移动offset所指定<br><br>的字节数,改变文件位置指针的位置,即指向新的位置
返回值
若定位成功,则返回值是0;否则,返回值是非0
文件确定位置函数
原型
long int ftell(FILE *fp)
功能
给出fp所指文件的读写位置指针当前所处位置
返回值
操作成功,为读写指针的位置
操作错误或失败,为EOF
判定位置函数
原型
int feof(FILE *fp)
功能
fp的读写位置指针是否指向文件末尾,即文件是否结束
返回值
到达尾部,为EOF
否则,为0
子主题
0 条评论
下一页