第二章
1整型
用于存储整数类型
整形包括短整型、整形和长整形。
短整型
Short int 或者 short
16位机上的范围:-32768 — +32767
整型
Int
16位上的范围:-32768 — +32767
32位上的范围: -2147483648~2147483648
长整型
Long int 或者 long
32位上的范围: -2147483648~2147483648
C语言规定short <= int <=long int
关键字 unsigned 无符号 unsigned int 表示无符号整型,只能表示正整数
2浮点型
用于存储带小数位数的数据
单精度浮点型和双精度浮点型
单精度浮点型
Float 型
占4个字节(32位)
双精度浮点型
Double 型
占8个字节(64位)
3标识符命名规则
字母、数字和下划线组成的名称
字母或者下划线开头
区分大小写
关键字不能作为标识符
4 数据类型关键字(12个)(1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 (4) float:声明浮点型变量或函数 (5) int: 声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 (10) union:声明共用体(联合)数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
控制语句关键字(12个): (1) for:一种循环语句(可意会不可言传) (2) do :循环语句的循环体 (3) while :循环语句的循环条件 (4) break:跳出当前循环 (5) continue:结束当前循环,开始下一轮循环 (1)if: 条件语句 (2)else :条件语句否定分支(与 if 连用) (3)goto:无条件跳转语句 (1)switch :用于开关语句 (2)case:开关语句分支 (3)default:开关语句中的“其他”分支(4) return :子程序返回语句(可以带参数,也看不带参3 存储类型关键字(4个)
(1)auto :声明自动变量 一般不使用 (2)extern:声明变量是在其他文件正声明(3)register:声明积存器变量 (4)static :声明静态变量 4 其它关键字(4个): (1)const :声明只读变量 (2)sizeof:计算数据类型长度 (3)typedef:用以给数据类型取别名(当然还有其他作用 (4)volatile:说明变量在程序执行中可被隐含地改变
第三章
1警报(响铃)符: \a
回退符:\b
换行符:\n
水平制表符:\t
算法
1一个程序应包括两个方面的内容:
对数据的描述:数据结构(data structure)
对操作的描述:算法(algorithm)
2数据结构 + 算法 = 程序
完整的程序设计应该是:
数据结构+算法+程序设计方法+语言工具
3计算机算法可分为两大类别:
数值运算算法:求数值解,例如求方程的根、求函数的定积分等。
非数值运算:包括的面十分广泛,最常见的是用于事务管理领域,例如图书检索、人事管理、行车调度管理等。
4有50个学生,要求将他们之中成绩在80分以上者打印出来。设n表示学号, n1代表第一个学生学号, ni代表第i个学生学号。用G代表学生成绩 , gi代表第i个学生成绩,算法表示如下:
S1:1=i
S2:如果gi≥80,则打印和,否则不打印。
S3:i+1=i
S4:如果i≤50,返回S2,继续执行。否则算法结束
5 判定2000~2500年中的每一年是否闰年,将结果输出
S1:2000=year
S2:若y不能被4整除,则输出y “不是闰年”。然后转到S6。
S3:若y能被4整除,不能被100整除,则输出y “是闰年”。然后转到S6。
S4:若y能被100整除,又能被400整除,输出y“是闰年”,否则输出“不是闰年”。 然后转到S6。
S5: 输出y “不是闰年”。
S6:y+1y
S7:当y≤2500时,转S2继续执行,如y>2500,算法停止。
6 1-1/2+1/3...................
S1:sign=1
S2:sum=1
S3:deno=2
S4:sign=(-1)×sign
S5:term=sign×(1/deno)
S6:sum=sum+term
S7:deno=deno+1
S8:若deno≤100返回S4,否则算法结束。
7 对一个大于或等于3的正整数,判断它是不是一个素数
S1:输入n的值
S2:i=2 (i作为除数)
S3:n被i除,得余数r
S4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束。否则执行S5
S5:i+1=i
S6:如果i≤n-1,返回S3。否则打印 n “是素数”。然后结束。
8算法的特性
有穷性:包含有限的操作步骤
确定性:算法中的每一个步骤都应当是确定的
有零个或多个输入:输入是指在执行算法时需要从外界取得必要的信息
有一个或多个输出:算法的目的是为了求解,“解” 就是输出
有效性:算法中的每一个步骤都应当能有效地执行,并得到确定的结果
9算法的表示
可以用不同的方法表示算法,常用的有:
自然语言,传统流程图,结构化流程图,伪代码,PAD图
10一个流程图包括以下几部分 :
(1)表示相应操作的框;
(2)带箭头的流程线;
(3)框内外必要的文字说明。
11三种基本结构
Bohra和Jacopini提出了以下三种基本结构:
顺序结构、选择结构、循环结构
用这三种基本结构作为表示一个良好算法的基本单元。
12三种基本结构的共同特点:
(1)只有一个入口;
(2)只有一个出口;(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)
(3)结构内的每一部分都有机会被执行到;
(4)结构内不存在“死循环”(无终止的循环)
13N--S图表示算法的优点
比文字描述直观、形象、 易于理解
比传统流程图紧凑易画。尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,N--S流程图中的上下顺序就是执行时的顺序。
用N--S图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行
14用伪代码表示算法
概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。
特点:它如同一篇文章一样 ,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便 、格式紧凑,也比较好懂,也便于向计算机语言算法(即程序)过渡。
用处:适用于设计过程中需要反复修改时的流程描述。
15 结构化程序设计方法
自顶向下;逐步细化;模块化设计;结构化编码。
第4章 表达式
1一元运算符: 强调某数值常量是正的还是负的
关于算术运算符,我们需要注意:
% 求余运算符只能是整型,除此之外,整型、浮点型都可以。
/ 如果两个操作数都是整数时,结果会截取出整数出来。
% 和 / 的右操作数为零时,会导致未定义的行为出现。
2优先级
算术运算符的优先级规则:
最高优先级: * / % + - (二元运算符)
最低优先级: + - (一元运算符)
3结合性:相同优先级下的运算符:
二元运算符采用左结合的形式
一元运算符采用右结合的形式
4 i++ 与 ++i 的区别:
i++ 先执行i 再执行加1操作
++i 先执行加1操作,再执行i的操作
第五章
1关系运算符
关系运算符的优先级低于算术运算符,关系运算符是左结合< ,> ,<=, >=
检测j在i和k中间用-i
2判等运算符
判等运算符的优先级低于关系运算符,左结合
等于 ==
不等于 != i
3逻辑运算符
OR 或 ||, 二元运算符 左结合
AND与 && 二元运算符 左结合
NOT 非 ! 一元运算符 右结合
4 !的优先级与一元+—号相同
&& || <判等<关系<运算
5 if语句
6 条件表达式
语句1?语句2:语句3
意思是若1成立则计算2,结果就是2的输出结果;否则计算3,输出3的结果
条件运算符的优先级只比赋值运算符高,比其他都低
7 switch语句
Switch(表达式)
{case常数表达式1:语句1;
case常数表达式2:语句2;
................................
case常数表达式n:语句n;
Default:语句n+1
}
表达式要求是整型,case后边就是常数不含变量
第六章
1 。 While语句
While(表达式)语句
2 do语句
Do语句while(表达式)
3 for语句
For(表达式1;表达式2;表达式3)语句 循环嵌套1-2-3不成立语句
第七章
1.C语言的基本(内置的)类型:
整型(int),包括长整型、短整型和无符号整型
浮点型,包括浮点型 (float), 双精度浮点型(double)和长双精度浮点型(long double)
字符型(char)
布尔型(Bool (C99) )
2.整型又分为两类:有符号的和无符号的。
在有符号数中,如果数为正数或零,那么最左边的位(符号位)为0,如果是负数,符号位为1。
最大的16位整数的二进制表示形式是0111111111111111, 对应的值是32,767 (215 – 1)。
最大的32位整数是01111111111111111111111111111111,数值为2,147,483,647 (231 – 1)。
不带符号位的整数(最左边的位是数值的一部分)称为无符号整数。
最大的16位无符号整数65,535 (216 – 1)。
最大的32位无符号整数是4,294,967,295 (232 – 1)。
3.为了告诉编译器变量没有符号位,需要把它声明成unsigned类型。
无符号数主要用于系统编程和低级的、与机器相关的应用
4.int型通常有32位,但在一些老的CPU上可能是16位的。
长整型比一般int型具有更多的位,短整型则具有更少的位。
5.关键字(说明符)long、short以及signed、unsigned可以与int组合起来构造int类型.关键字的顺序没有要求,单词int也可以省略(long int可以缩写为long)
6.short int ,unsigned short int,int,unsigned int,long int ,unsigned long int 6种整型的取值范围顺机器的不同而不同。 然而,C标准要求short int、int和long int中的每一种类型都要覆盖一个确定的最小取值范围。其次,int类型不能比short int类型短,而long int不能比int类型短。
7. 常量是在程序中以文本形式出现的数。
C语言允许用十进制、八进制和十六进制形式书写整型常量。
8.八进制数是用0~7的数字编写的。
每一位表示一个8次幂。
八进制数237表示成十进制数为:2 × 82 + 3 × 81 + 7 × 80 = 128 + 24 + 7 = 159。
9.十六进制数是用0~9的数字加上A~F的字母编写的,其中字母A~F分别10~15的数。
十六进制数1AF 的十进制数值是 1 × 162 + 10 × 161 + 15 × 160 = 256 + 160 + 15 = 431。
10.十进制常量包含数字0~9,但是一定不能以零开头: 15 255 32767
八进制常量只包含数字0~7,而且必须要以零开头: 017 0377 077777
十六进制常量包含数字0~9和字母a~f,而且是以0x开头: 0xf 0xff 0x7fff
十六进制常量中的字母即可以使大写字母也可以是小写字母
11.十进制常量的类型通常是int。对于八进制或十六进制常量,规则存在轻微的不同:
编译器将遍历int, unsigned int, long int和 unsigned long int 类型,直到找到适合的表示常量的类型。
12.为了强制内置编译器把常量作为长整型数来处理,只需在后边加上一个字母L(或l):
15L 0377L 0x7fffL
为了指明是无符号常量,可以在常量后边加上字母U(或u): 15U 0377U 0x7fffU
为了表示常量是长且无符号的可以组合使用字母L和U:0xffffffffUL
字母L和U的顺序和大小写都没有关系。
13.有符号整数运算发生的溢出,程序的行为是没有定义的(不确定的)。
无符号整数运算发生溢出时,运算的结果是有定义(确定的),即为正确结果模除 2n的结果,其中n是存储运算结果的位数。
14.读和写无符号/短和长整型整数需要一些新的转换说明符。当读写无符号整数时,使用字母u、o或x代替转换说明中的d。当读写短整型数时,在d、o、u或x前面加上字母h:short s;当读写长整型数时,在d、o、u或x前面加上字母l。当读写长长整型数时,在d、o、u或x前面加上字母ll
15.float适合精度要求不严格的浮点数。 double类型为大部分的程序提供了足够的精度。Long double 很少用到
16.字符 ‘a’ 的值为97, ‘A‘的值为65, ’0’ 的值为 48, and ‘ ’的值为32。
17.八进制转义序列由字符\和跟随其后的一个最多含有三位数字的八进制数组成,如 \33 或 \033.十六进制转义序列由\x和跟随其后的一个十六进制数组成,如\x1b 或\x1B.其中x必须小写
18.它们命名通常会是: #define ESC '\33'
19.调用C语言的toupper库函数是快捷、更易于移植的把小写字母转换成大写字母的方法:
20. ch = toupper(ch);toupper函数返回参数的大写形式.程序调用toupper函数需要在顶部放置下面这条#include指令:#include
21.对单个字符的输入和输出,可以使用gechar函数和putchar函数来代替调用scanf函数和printf函数。putchar函数写单独一个字符:putchar(ch);每次调用gechar函数将读并返回一个字符:ch = getchar();getchar函数返回一个整数值而不是字符值
22.getchar函数在用于循环中搜寻字符时和跳过字符一样有效。利用getchar函数跳过无限数量的空格字符: while ((ch = getchar()) == ' ') ;当循环终止时,变量ch将包含getchar函数遇到的第一个非空字符。
23.消息的长度包括空格和标点符号,但是不包含消息结尾处的换行符
24.当发生下列情况时会进行隐式转换:
25.当算术表达式或逻辑表达式中操作数的类型不相同时。(C语言执行所谓的常用算术转换)当赋值运算符右侧表达式的类型和左侧变量的类型不匹配时。当函数调用中使用的参数类型于其对应的参数的类型不匹配时。当return语句中表达式的类型和函数返回值的类型不匹配时。当把有符号操作数和无符号操作数整合时,会通过把符号位看成数的位的方法,将有符号数被转换成无符号数。
第八章
1.C语言中有两种聚合类型:数组和结构。
2.数组运算符的运算
运算符sizeof可以确定数组的大小(字节数)。如果数组a有10个整数,那么sizeof(a)可以代表40(假设每个整数用4字节存储)。还可以用sizeof来计算数组元素的大小,比如a[0]。用数组的大小除以数组元素的大小可以得到数组的长度: sizeof(a) / sizeof(a[0])
3.数组a的清零操作可以写成:for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) a[i] = 0;
第九章
1.函数定义的一般格式:
返回类型 函数名 ( 形式参数 )
{
声明
语句
}
2.函数调用由函数名和跟随其后的实际参数列表组成,其中实际参数列表用圆括号括起来:average(x, y)
print_count(i)
print_pun()
如果丢失圆括号,那么将无法进行函数调用.
3.非void型的函数调用产生的值可存储在变量中,还可以进行测试、显示或者其他用途
void型的函数调用是语句,所以调用后边始终跟着分号
4.函数声明的一般形式: 返回类型 函数名 ( 形式参数 ) ;
第十章
1.在函数体内声明的变量称为该函数的局部变量
2.局部变量的缺省性质:自动存储期限。局部变量的存储单位是在包含该变量的函数被调用时“自动”分配的,函数返回时收回分配。块作用域。局部变量的作用域是从变量声明的点开始一直到所在函数体的末尾。
3.在局部变量声明中放置单词 static可以使变量具有静态存储期限 。因为具有静态存储期限的变量拥有永久的存储单位,所以在整个程序执行期间都会保留变量的值。
4.全局变量:外部变量是声明在任何函数体外的。外部变量的性质:静态存储期限,文件作用域,变量拥有文件作用域是指:变量的可见范围从变量被声明的点开始一直到所在文件的末尾。
5.对“栈”的操作是存在限制的:压栈(Push): 在栈顶加入一个数据项出栈(Pop): 从栈顶删除一个数据项,禁止测试或修改不在栈顶的数据项。压栈操作:将数据项存储在contents数组中由top指定的位置上,然后自增top。出栈操作:首先自减top,然后用其作为contents数组的索引取出相应的数据项。
第十一章
1.C语言支持三种类型的指针算术运算(且仅有这三种类型)
指针加上整数
指针减去整数
两个指针相减
2.指针p加上整数j产生一个新的指针,指向p 当前所指的元素位置之后j个元素的位置。如果 p指向数组元素 a[i],则 p + j 指向数组元素 a[i+j]。如果p 指向 a[i],则p - j 指向 a[i-j]
3.*p++ or *(p++) 自增前表达式的值为 *p,然后自增p;
(*p)++ 自增前表达式的值为 *p,然后自增*p;
*++p or *(++p) 先自增 p,自增后表达式的值为 *p;
++*p or ++(*p) 先自增 *p,自增后表达式的值为 *p;
4.*p-- or *(p--) 自减前表达式的值为 *p,然后自减p;
(*p)--自减前表达式的值为 *p,然后自减*p;
*--p or *(--p) 先自减 p,自减后表达式的值为 *p;
--*p or --(*p) 先自减 *p,自减后表达式的值为 *p;
5.输出数组中的全部元素
#include
void main()
{ int a[10];
int i;
for(i=0;i<10;i++)
scanf(″%d″,&a[i]);
printf(″\n″);
for(i=0;i<10;i++)
printf(″%d″,a[i]);
}
6. #include
void main()
{ int a[10];
int i;
for(i=0;i<10;i++ )
scanf(″%d″,&a[i]);
printf(″\n″);
for(i=0;i<10;i++)
printf(″%d″,*(a+i));
}
7.#include
void main()
{ int a[10];
int *p,i;
for(i=0;i<10;i++)
scanf(″%d″,&a[i]);
printf(″\n″);
for(p=a;p<(a+10);p++)
printf(″%d ″,*p);
}
8.归纳起来,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下4种情况:形参和实参都用数组名;实参用数组名,形参用指针变量。
实参形参都用指针变量;实参为指针变量,形参为数组名
9.当编译器遇到一个长度为n的字符串字面量时,给该字符串分配n+1个字节的内存空间;n+1空字符是一个所有比特全为0的字节,用转义序列 \0表示,用于标志字符串的结束
10.把0到15转换为等价16进制数字的函数:
char digit_to_hex_char(int digit)
{
return "0123456789ABCDEF"[digit];
}
11.如果字符串变量需要存放80个字符,对应的字符数组必须声明为80+1个:额外增加的1用于给字符串结束符留出空间
12.如果初始化器太短而不能填满整个字符串变量,编译器会在后面增加额外的空字符
13.声明字符数组: char date[] = "June 14"; 声明 date为一个数组
14.声明字符指针: char *date = "June 14";声明 date为一个指针
15.%ms 转换说明符将显示字符串在m个字符宽度的域.
16.如果字符串少于m个字符,字符串将在域内右对齐.在m的前面放置一个-号,可以强制字符串左对齐.
17.m 和 p 可以组合使用.转换说明符%m.ps 在宽度为m的域中显示字符串的前p个字符.
18.Scanf函数用%s 转换说明符读字符到一个字符数组: scanf("%s", str);
19.str 在这里是一个指针,因此不必在str前面放置 & 运算符.
20.当调用 scanf时,该函数跳过空白,然后读入字符并存入str指向的空间,直至遇到一个空白字符.
21.scanf 函数会存放一个空字符在字符串的后面
22.read_line 通过循环调用 getchar来实现:
23. int read_line(char str[], int n)
24.逐字符读入字符串
{
int ch, i = 0;
while ((ch = getchar()) != '\n')
if (i < n)
str[i++] = ch;
str[i] = '\0'; /* terminates string */
return i; /* number of characters stored */
}
25.复制字符串
char *strcat(char *s1, const char *s2)
{
char *p = s1;
while (*p != '\0')
p++;
while (*s2 != '\0') {
*p = *s2;
p++;
s2++;
}
*p = '\0';
return s1;
}
strcat的精简版:
char *strcat(char *s1, const char *s2)
{
char *p = s1;
while (*p)
p++;
while (*p++ = *s2++)
;
return s1;
}
25.宏定义。#define指令定义一个宏, #undef指令删除一个宏定义。
文件包含。 #include指令导致一个指定文件的内容被包含到程序中。
条件编译。 #if、#ifdef、#ifndef、#elif、#else和#endif指令可以根据测试的条件来将一段文本块包含到程序中或排除在程序之外。
在指令的符号之间可以插入任意数量的空格或横向制表符
26. 声明一个结构体类型的一般形式为:
struct 结构体名 {成员表列}
27.可以采取以下3种方法定义结构体类型变量
a先声明结构体类型再定义变量名
b在声明类型的同时定义变量
struct 结构体名
{
成员表列
}变量名表列;
c直接定义结构体类型变量
其一般形式为:
struct
{
成员表列
}变量名表列;
即不出现结构体名。
¥29.8
¥9.9
¥59.8