w:
y
增量或减量运算符,则相当于执行加4或减1操作,若用在复合语句中就
有区别。
m=n++;m=+4-n;printf(“%d”,++n);printf(“%d”,n++);
9.类型转换。
不会自动进行四舍五入;将取值范围小的类型转为范围大的类型是安全的。
反之是不安全的。
注意表达式赋值后的类型转换
例如:
intxl=1,x2=2,x3=3;
简的C程序谟
1.表达式和表达式语句的区别。
2.字符输入/输出。
字符输出函数putchar(ch):
向终端显示屏幕输出一个字符ch。
字符输入函数getchar(),使用格式:
变量=getchar()
功能:
从键盘输入一个字符,按回车表示输入结束,函数值为从输入搂收的字符。
3.格式输入/输出。
scant:
不要忘紀符号;多个变量输入值之间的符号;特别要注意类型
的匹配;忽略修饰符等。
(具体见书
printf:
注意类型匹配;域宽、精度等。
(具体见箱)
4.要能够判断程序的锵(如变量、常量的声明、输入输出格式等问题)。
程序的控制结构
1.什么是算法?
什么是程序?
算法的五个特性是什么?
程序:
是为解决某一问题而用特定的计算机语言编写的,用以指择算
机完成预定功能的一系列计算机指令
算法是程序处理问题的步骤和滋;
算法的特性:
有穷性、确定性、有效性、没有输入或多个输入、有一个或多个输出。
(要清楚各个特性的含义)
2.程序的三种基本结构。
3.逻辑运算符和关系运算符的使用。
4.选择结构。
if形式、if■•-else…形式、if…else••-嵌套形式、switch多路开关
(特别注意括号的使用、else与if配对问题、关系判断使用==、浮点数不能进行==比较)
使用条件语句应注意以闹题:
是否需要包含相等的情况。
表达相当的关系使用的是==,不要把
if(a==b)写成if(a二b)。
例如:
intx=2,y=3,z=4;
if(x=y)
printf(%d\n”,z);
else
printf(%d\n”,y);
对于float变量,由于存在精度问题,所以要避免使用“==”或
“!
=”进行数字比较。
可以设法转换成“>=”或“v=”形式。
语句嵌套结构中if与else的配对!
if和else配对原则:
缺省{}时,else总是和它上面离它最近的未
配对的if配对。
实现if~else正确配对方法:
力口{}0
switch多路开关:
switch(表达式)
{
case常量1:
}
表达式需为整型、字符型或枚举型。
各常量表达式的值必须互不相同;
需用break跳出;
case后可包含多个可执行语句,且不必加{};
switch可嵌套,多个case可共用一组执行语句;
default可以省略,但建议使用。
例如:
i=0;
while(i<3)
{
switch(i)
{
case0:
printf(%d”,i);
case2:
printf(%d”,i);
default:
printf(%d”,i);
}
4.循环结构。
循环的三种形式以及语法。
循环的要素:
循环入口、重复执行的内容、循环测试、终止条件、循环
退出。
注意:
在for和while语句之后一般没有分号,do-while的while后必须有
分号。
循环体有多条语句必须用{}括起来。
有分号表示循环体就是分号之前的内容(空循环体)
while(i<100);
i++;
for(i=0;i<100;i++);for(i=1;i<5;i+=2)
printf(”%d",i);printf(”%d",i);
选择循环的一般原则
如果循环次数已知,用for;
如果循环次数未知,用while;
如果循环体至少要执行一次,用do-whileo
循环的嵌套:
外层、內层循环的次数。
例如:
main()
{
inti,x=0;
for(i=2;i<5;i++)
{
do
{
if(i%3)
continue;
x++;
}while(!
i);
x++;
printf(x=%d\n,,,x);
}
流程的转移控制:
break语句:
可以用在switch结构中,终止当前case;可以用在循环结构中,退出当前所在的循环。
continue语句:
用于循环结构中,中断此次循环体的执行,也就是停止continue语句后面的内容,开始下一次。
第三章函数
1.熟悉一些简单的数学库函数。
2.函数的定义。
函数定义的语法。
“函数名”是函数的唯一标识,其命名规则与命名雷同。
函数不能嵌套定义,可以嵌套调用。
函数头和函数体之间不能有分号。
3.函数原型,也叫函数声明。
函数原型就是不带函数体的函数声明;
函数原型就是函数头加分号;
函数原型必须放在调用者之前,通常放在main函数之前;
函数原型和函数定义中的函数返回类型、函数名和形参数表(形参的个数、类型、位置)必须完全一致,否则,编译器会报告有编译错误。
4.函数参数。
形参:
子函数(被调函数)内部准备接受数据的参数叫形参。
形参必须指定类型。
形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放。
实参:
调用者提供的参数叫实参,实参是实际参与运算的数据。
实参必须有确定的值。
5.函数调用。
调用函数将实参的值传给(赋值)被调函数的形参,此时实参和形参就有各自的存储空间,所以形参值的变化不会影响实参。
函数调用时,调用者提供的参数个数、类型、顺序应与子函数声明、定
义时相同。
有返回值调用。
放到一个数值表达式中,女口c=max(a,b);
作为另一个函数调用的参数,如Ic=max(max(a,b),c);
printf(”%d\n",max(a,b));
例如:
intfun(intn)
{
return(n/3);
}
main()
{
intx,y;
scanf(%d”,&x);
y=fun(fun(fun(x)));
printf(%d\n”,y);〃结果:
45}
无返回值函数的调用
函数调用表达式,单独一行使用,如display(a,b);
函数的递归调用。
例如:
intfun(intn)
{
intm;
if(n二二0||n二二1)
return1;
m=n・fun(n-2);
returnm;
}
main()
{
printf("%d\n",fun(5));
}
6.函数的返回值。
函数返回值的类型最终取决于函数定义时函数首部所说明的函数类型
返回值只有一个,可以是除了数组之外的任何类型,也可以是void类型;
有返回值函数必须有return语句,无返回值函数不要求有return语句。
7.变量的作用域。
作用域是指在源程序中定义变量的位置及其能被读写访问的范围。
变量作用域规则:
每个变量仅在定义它的语句块(包含下级语句块)内有效,并且拥有自己的内存空间。
同一个语句块内不能定义同名变量。
(不同的函数中可以使用相同名字的变量)
8.局部变量
在语句块内定义的变量
形参也是局部变量
定义时不会自动初始化,除非程序员指定初值。
进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效。
(函数退出后失效,再次进入函数,变量值重新初始化。
)并列语句块各自定义的同名变量互不干扰
9.全局变量
在所有函数之外定义的变量。
在程序中定义它的位置以后都有效;
从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存;
使函数之间的数据交换更容易,也更高效。
因为谁都可以改写全局变量,所以很难确定是谁改写了它。
10.静态变量
在变量类型前面用static修饰;
变量的值可以保存到下次进入函数,使函数具有记忆功能。
静态变量和全局变量都是静态存储类型
若没有被初始化,则自动被初始化为0;
从静态存储区分配,生存期为整个程序运行期间。
数组
1.数组的定义和初始化
数组的概念:
由若干类型相同的相关数据按顺序存储在一起形成的一组同
类型有序数据的集合,称为数组。
什么是数组元素?
什么是下标?
下标的取值是多少(下界、上界)?
什么
是维数?
定义数组的大小必须使用整型常量或者整型常量表达式,不允许使用变
量。
数组大小最好用宏来定义,以适应未来可能的变化。
C语言的数组在内存中是按行存放的。
二维数组的数组元素的存放顺序是
也是按行存放。
数组占用的内存空间如何计算?
数组定义后的初值仍是随机数,一般需我们来初始化。
inta[5]={12,34,56,78,9};
inta[5]={0};
inta[5]={1,2};是怎样赋值的?
inta[]={11,22,33,44,55};
inta[][4]={0,0};
inta[3][4];//第5个元素是谁?
行下标范围?
列下标范围?
inta[3][4]={{1,2},{0},{4,5,8.10}}//a[2][3]的值?
2.向函数传递一维数组。
用数组名作参数,就是将数组的首地址传递给函数。
实参数组与形参数组占用同一段内存。
若在被调函数中改变形参数组元素的值,则实参数组元素的值也会随之发生改变,这是由于形参和实参两数组在内存中因指向统一地址而共享这一段内存造成的。
对形参数组进行说明时,在方括号内可以给出数组的长度说明,即说明为
固定长度数组,也可以不给出数组的长度说明,即说明为可变长度数组,一般此时用另一个整型参数来给定数组长度。
3.字符串
一串以‘0’结尾的字符在C语言中被看作字符串。
用双引号括起的一串字符是字符串常量,C语言自动为其添加0'终结符。
C语言并没有为字符串提供任何专门的表示法,完全使用字符数组(一维数组)和字符指针来处理。
要区分字符和字符串的概念。
不要用错了单引号和双引号。
4.字符数组
每个元素都是字符类型的数组。
初始化:
可以采用逐个字符进行初始化(若没有’0',仅仅是字符数组,
不能把它当作字符串来处理);也可以采用字符串常量赋值。
一个字符型的一维数组并不一定是一个字符串,只有当字符型一维数组中的最后一个元为’\0',它才构成字符串。
用字符型数据对数组进行初始化
charstr[6]={'C'/h'/i'/n'/a'/XO'};
用字符串常量直接对数组初始化
charstr[6]={"China"};
charstr⑹="China";
Charstr[]=“china”;
charstr[5]=“China”;
charweekday[7][10]={“Sunda”y'Mpnday””Tuesday”,”Wednesdaf,”Thursday”,”Friday”,”;Saturday”}
charweekday[][1O]={“Sunday”,”Mo”ncte晞dqy””VVednesdat”,
”ThursdayMMfridaySaturday}
字符数组的输入和输出:
按c格式一个字符一个字符地单独输入/输出:
%c(需要用到循环结构)
按S格式符将字符串作为一个整体输入/输出:
%s
charstr[1O];scanf(“%s”,str);printf(“%s”,str);
字符数组名本身代表该数组存放的字符串的首地址,故用scanf的%$格式
输入字符串时,字符数组名的前面不能再加取地址运算符,其后也不需要用方括号指明下标。
输入字符串时应确保输入的字符串长度不超过数组所能容纳的空间大小。
空格、回车或跳格符(Tab)作为按%s格式输入
字符串的分隔符,因而不能被读入,输入遇到这些字符时,系统认为字符串输入结束。
用字符串处理函数gets()或puts()输入/输出一个字符串。
字符串处理函数。
vstring.h>
字符串复制strcpy(字符数组1,字符串2);
例如:
charstr1[3],str2[]=芒hina”;
str1=str2;〃编译错误,
printf(%s\n,,,str1);
求字符串长度strlen(字符串);
字符串连接strcat(字符数组1,字符串2);
字符长比较strcmp(字符串1,字符串2);
例如:
判断字符串S1是否大于字符串S2:
指针
1.指针:
专门用来存放其他变量地址的一种特殊变量。
2.什么是内存地址?
什么是变量地址?
什么是变量内容?
3.什么是直接寻址?
什么是间接寻址?
4.指针的定义、初始化。
声明为指针类型的变量,专门存放地址数据的变量定义指针变量
例如:
int*pp是变量,int*是类型。
指针的指向
5.&和*的意义
例如:
main()
{
intx=10;
int*px=&x;//*表示指针&表示取地址
printf(%d\n,,,*px);//*表示取内容
}
6.指针运算。
一般只进行指针和整数的加减运算,同类型指针之间的减法运算关系运算
赋值运算
7.指针变量作为函数的参数
属于赋地址调用,将实参指针(地址)传给形参,形参也是一指针。
在函数调用时,实参指针将其地址值传给形参指针。
8.字符指针
指向字符类型的指针char*p;字符指针是变量,而数组名是地址常量。
例如:
chars[]=ABCD\*p;
for(p=s;p
printf(%s”,p);//ABCDBCDCDD
9.一维数组的地址和指针的关系。
数组名就是一个指针
只是不能修改这个指针的指向,可以定义函数的参数为数组。
指针也可当作数组名使用
int*p,a[10];p=a;
doublex[10],*p=&x[3],则p[3]表示的数组元素是a[4]
指针也可当作数组名使用