C头文件:
#include<stdio.h>//常用getchar()、putchar()、scanf()、printf()、gets()、puts()等函数
#include<math.h>//常用sqrt(变量)[计算变量的平方根];
pow(变量1,变量2)[得到变量1的变量2次方];
fabs(变量)[浮点数绝对值]。
ceil(实型变量)[得到不小于变量的最小整数];
floor(变量)[得到不大于变量的最大整数]。
#include<stdlib.h>//常用malloc(),free()函数
#include<string.h>//用于字符串函数
6.3.2.2字符串函数
- gets(arr):从输入端读取一个字符串存到字符数组中。
- puts(arr):输出一个字符串。
- strcat(字符数组1, 字符数组2):将2字符数组连接到1字符数组的尾部。
- strcpy(字符数组1, 字符串2):将2字符串复制到1字符数组中。
- strcmp(字符串1,字符串2):比较两个字符串的“大小”。
比较规则:将两个字符串自左向右逐个字符进行比较(按ASCII),直到出现不同的字符或’\0’。
结果:如果字符串1与字符串2相同,则返回0;
如果字符串1 > 字符串2,返回一个正整数;
如果字符串1 < 字符串2,返回一个负整数。
- strlen(字符数组):直接测量字符串长量的长度(不包括’\0’)。
(
- strlwr(字符串):将字符串中的大写字母转换成小写字母。
- strupr(字符串):将字符串中的小写字母转换程大写字母。
)
字符与字符代码‘...’:ASCII码表,包含127个字符。
‘A’:65
‘Z’:90——24个英文字母
‘a’:97——大写与小写字母的顺序值差32
‘0’:48
‘1’:49
‘ ’:32
‘%’:37
运算符的优先级:!> 算数运算符 > 关系运算符 > &&和|| > 赋值运算符
(++、+=、/) (低!=、==、高>=) =
三目运算符:x > y ? x:y ;//如果x大于y则返回x,否则返回y
小四红色加粗 -> 小四加粗 -> 小四加粗 -> 小四 -> 五号
三、顺序程序设计
3.2数据的表现形式及其运算
3.2.1常量和变量
1、常量
- 整型常量:如1000,0,-146等
- 实型常量:1.十进制小数形式,如12.1,0.0等2.指数形式,如12.34e3//12.34乘10的3次方
- 字符常量:1.普通字符,如‘2’,‘?’,‘A’,‘#’等2.转义字符,如\n,\\,\’,\”等
- 字符串常量:如“boy”,“123”等
- 符号常量(用#define指令,指定某符号代表一个常量):如 #define PI 3.1416等
//仅仅是字符替换
- 变量(遵循先定义,后使用的原则)
- 常变量(变量生存期内值不能改变)
在定义变量时,前面加上const,如const int a=3;
//占用储存单元
- 标识符
变量名、符号常量名、函数名等
标识符命名规则:由字母或下划线开头,后面可以接字母、数字、下划线。
3.2.2数据类型
- 整型
- 基本整型int:占4字节;范围31-1
- 短整型short:占2字节;范围15-1
- 长整型long:占4字节;范围31-1
- 双长整型long long:占8字节。范围63-1
(一个字节8位)
注:·对无符号整型unsigned XX,取范围在有符号基础上幂指数+1;
·对于无符号整型,输出格式用%u;
·以上类型的变量值在储存单元中都是以补码的形式存储的,存储单元中第一个二进制代 表符号:0为正,1为负。
- 字符型数据
- 字符与字符代码‘...’:ASCII码表,包含127个字符。
重要的:‘A’:65
‘Z’:90——24个英文字母
‘a’:97——大写与小写字母的顺序值差32
‘0’:48
‘1’:49
‘ ’:32
‘%’:37
- 字符变量char:占1字节;
- 浮点型数据
- 单精度float:占4字节;六位有效数字
(运算时,float自动转为double)
- 双精度double:占8字节;十五位有效数字
3.3运算符和表达式
3.3.5不同类型数据间的混合运算
规则:int、float、char和double一起算数运算时,先换成double类型,再进行运算。
3.3.6强制类型转换运算符
格式:(目标类型)(运算式)
例:(double)( 5 % 3 );
(int)( x + y );
注:对于a=(int)x:只是将目标类型的一个中间值赋给a, x的类型和数值不变。
3.5数据的输入输出
一、使用scanf()和printf()
输入:scanf(“变量的输入格式” , &变量);
注:·输入的格式必须和scanf内所写保持一致,如果紧贴默认输入中间有空格;
·取值符号不能丢;
·用%c输入时,空格也算作字符
输出:printf(“变量的输出格式” , 变量);
整型 int用%d(十进制) %ld、%lld
单精度浮点型 float用%f
双精度浮点型 double用%lf
字符型 char用%c:%m.nf:宽度为m,小数占n位的单精度浮点型。
字符串型 string用%s
(%o:八进制整型;%x:十六进制整型;)
- 使用getchar()和putchar()
输入一个字符:getchar()
getchar()没有参数,单纯地从输入端获取一个字符。
例子:char a,b; a=getchar();b=getchar();此时需要输入GO后按回车才会完成赋值
输出一个字符:putchar()
例子:char a=‘G’,b=‘O’; putchar(a);putchar(b);
四、选择结构程序设计(可嵌套)
4.3关系运算符和关系表达式
>、<、<=、>= ==、!=
优先级相同高 优先级相同低
4.4逻辑运算符和逻辑表达式
&&、||、!
与 或 非
4.2if语句(可嵌套)
格式:if(){}
else if(){}
...
else if(){}
else{}
注:C语言中1代表真,0代表假。
4.5用switch实现多分支选择结构
格式:switch(变量)
{
case ’变量值1’: {执行语句1}
break;
...
case ’变量值n’: {执行语句n}
break;
default: {执行语句n+1;}
}
switch的特殊(解决区间性问题时应用):
case 1:
case 2:
case 3: d = 5;
break;
当输入为1/2/3时,d的值被赋为5,退出进入下一个case。
- 循环结构程序设计(可嵌套)
5.2while语句
格式:while(条件判断语句)
{执行语句}
注:在while中,对于条件判断语句:非0为真,0为假。
(从1加到100用i++;不用++i)
5.3do...while语句
格式:do{执行语句}
while(条件判断语句);
与while的区别:while是先判断再执行;do...while是先执行再判断。
(从1加到100用i++;不用++i)
5.4for循环语句
格式:for(循环变量;循环判断条件;循环变量变化)
{执行语句}
执行顺序:表达式1->表达式2->循环语句->表达式3
5.7改变循环执行的状态
5.7.1用break提前终止循环
作用:使用break后,程序跳出当前循环,继续向下进行。
5.7.2用continue提前结束本次循环
作用:结束本次循环,跳过下面未执行的语句,继续向下进行。
技巧:P125输出矩阵五个一换行:if(n%5==0) printf(“\n”);
六、利用数组批量处理数据
6.1怎样定义和使用一维数组
定义一维数组:数组类型 数组名[];
数组的引用:数组名[下标]
一维数组的初始化:不初始化则元素随意赋值;有一个初始化,其他未初始化元素默认为0。
(1)全部初始化:int a[3] = {1,2,3};
(2)部分初始化:int a[10] = {1,2,3};
特殊:(3)int a[3] = {0}; <=> int a[3] = {0,0,0};
(4)int a[3] = {1,2,3}; <=> int a[] = {1,2,3};
数组的赋值和输出:可以使用循环。
6.2怎样定义和使用一维数组定义二维数组:数组类型 数组名[行数][列数];//二维数组行优先
数组的引用:数组名[行下标][列下标]
二维数组的初始化:如果确定行数(所有元素都初始化,或者int[][3] = {{1,0,3},{},{10,0}}这样) 的话,行数可以省略。
(1)分行赋值(推荐):int b[2][3] = {{1,2,3},{4,5,6}};
(2)对部分元素赋值:int b[2][3] = {{1},{5}};
1 0 0
5 0 0
6.3.1字符数组
定义字符数组:char c[3] = {‘a’, ’b’, ‘c’}; (赋值所有元素,3可以省略)
6.3.2.1字符串
·C语言将一个字符串当做一个字符数组进行处理。
·C语言规定了一个字符串的结束标志——’\0’;
·系统在储存字符串时会自动加上’\0’,字符串所占的字符数也自行+1。
定义一个字符串:char d[] = “I love C.”;
注:char e[] = {‘C’, ’h’, ’i’, n’, ’a’};
char e[] = {‘C’, ’h’, ’i’, ’n’, ’a’, ‘\0’};
两者是不等价的。
使用字符数组时最好在结尾加上’\0’。
6.3.2.2字符串函数(头文件包含<string.h>)
- gets(arr):从输入端读去一个字符串到字符数组中。
- puts(arr):输出一个字符串。
- strcat(字符数组1, 字符数组2):将2字符数组连接到1字符数组的尾部。
- strcpy(字符数组1, 字符串2):将2字符串复制到1字符数组中。
- strcmp(字符串1,字符串2):比较两个字符串的“大小”。
比较规则:将两个字符串自左向右逐个字符进行比较(按ASCII),直到出现不同的字符或’\0’。
结果:如果字符串1与字符串2相同,则返回0;
如果字符串1 > 字符串2,返回一个正整数;
如果字符串1 < 字符串2,返回一个负整数。
- strlen(字符数组):直接测量字符串长量的长度(不包括’\0’)。
(
- strlwr(字符串):将字符串中的大写字母转换成小写字母。
- strupr(字符串):将字符串中的小写字母转换程大写字母。
)
七、用函数实现模块化程序设计
7.5函数的嵌套调用:为了满足顶层函数的需求,一个嵌套一个
7.6函数的递归调用:
简单实现函数的递归:
1计算年龄
int age(int n)
{
int c;
if(n==1)
c=10;
else
e=age(n-1) + 2;//自身函数加条件
return c;
}
2求n!
int fac(int n)
{
int f;
if(n<0)
printf(“数据错误”);
else if(n==0 || n==1)
f = 1;
else
f = f(n-1) * n; //自身函数加条件
}
7.7数组与函数
7.7.1一维数组元素作函数参数
数组元素:可以作函数的实参,不能作函数的形参。
7.7.2一维数组名作函数参数
数组名:既可以作函数的实参,也可以作函数的形参。
示例:求平均值
double average(double array[10])//传的是首元素地址, 10可以省略
{
double sum=0,aver=0;
for(int i=0;i<10;i++)
{
sum+=array[i];
}
aver=sum/10;
return aver;
}
7.7.3二维数组名作函数参数
示例:找出3x4矩阵中所有元素的最大值
int max(int arr[][4])
{
int i,j,max;
max=arr[0][0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(arr[i][j]>max)
max=arr[i][j];
}
}
return max;
}
(7.8局部变量和全局变量)
全局变量:在函数外定义的变量。
特点:程序运行过程中值可修改。
(7.9变量的储存方式和生存期)
静态局部变量:
格式:static int a = 1;
特点:在函数内定义,经过主函数调用,保留值,再次调用时已有值。
- 善于利用指针
8.2指针变量
取址运算符:&; 取值运算符:*
定义指针变量:int *a = &b;
经典:使用指针,通过改变形参值改变实参
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
8.3通过指针指引数组
指引一维数组
数组名就是首元素的地址
指引数组时指针的运算:p+1(p++):指向p指向的下一个元素。
p-1(p--):指向p指向的前一个元素。
通过指针指引数组元素:(1)下标法:int *p=arr; p[i];
(2)指针法:int *p=arr; *(p+i);
int a[10]; int *p; for(p=a;p<(a+10);p++){}
例:通过指针变量输出有10个元素的整型数组
#include<stdio.h>
int main()
{
int a[10], i, *p;
p=a;
for(i=0;i<10;i++)
{
scanf(“%d”,p++);
}
p=a;
for(i=0;i<10;i++,p++)
{
printf(“%d”,*p);
}
}
注:使用数组名作函数参数实际上就是将数组首元素的地址传递过去。
指引二维数组
表示形式 | 含义 | 值 |
a | 指向第0行的起始地址 | 2000 |
a[0],*(a+0),*a | a[0][0]的地址 | 2000 |
a+1,&a[1] | 指向第1行的起始地址 | 2016 |
a[1],*(a+1) | a[1][0]的地址 | 2016 |
a[1]+2,*(a+1)+2,&a[1][2] | a[1][2]的地址 | 2024 |
注:·a[0]+1中的”1”代表一个元素所占的字节数;
·a+1中的”1”代表一行中全部元素所占的字节数。
输出二维数组任意行,任意列元素的值:
int a[3][4]; int (*p)[4]; p=a; —— 第i行i列元素的值:*(*(p+i)+j);
p指向包含4个元素的一维数组
区别于二维数组:int a[4]; int(*p)[4]; p=&a;
例:输出3x4的表格中所有元素
#include<stdio.h>
int main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p;
for(p=a[0];p<a[0]+12;p++)
{
if(p-a[0]%4==0)
printf(“\n”);
printf(“%d”,*p);
}
printf(“\n”);
}
8.4通过指针引用字符串
两种指引字符串的方法:
1.char *string1=”I love China.”;
2.char string2[]=”I love China.”;
printf(“%s”,string1)
printf(“%s”,string2);//输出完整字符串
printf(“%c”,string2[7]);//输出一个字符
8.5动态内存分配与指向它的指针变量(包含头文件<stdlib.h>)
malloc函数:只开辟空间,不进行类型检查,只在使用时强转。
int n=10;
int *p=(int*)malloc(sizeof(int)*n);
free(p);
注:使用malloc开辟的空间使用结束后一定要使用free释放。
九、用户自己建立数据类型
9.1结构体变量
定义一个结构体类型:
struct Student
{
char name[20];//字符串
int age;
int number;
}s1,s2;//定义结构体时定义结构体变量
注:结构体成员可以属于另一个结构体:
struct Date
{
int year;
int mouth;
int day;
};
struct Student
{
int num;
char name[20];
int age;
struct Date birthday;
};
定义一个结构体变量:
struct Student s3,s4;//单独定义
结构体变量的初始化和引用:
初始化:
1.定义时初始化:
struct Student
{...}a={“张三”, 19, 222021321062071};
- 对某个元素初始化:
struct Student a={.name=”张三”};
- 也可以使用字符串函数strcpy对数组元素进行赋值:
strcpy(student1.name,”张三”);
引用:
格式:student1.num = 200;
注:·只能对结构体变量中的各个成员分别进行输入和输出;
·在程序中可以对变量的成员进行赋值;
·如果成员本身又属于另一个结构体,则要用多个成员运算符:
student1.birthday.mouth = 12;
·对结构体变量的成员可以像普通变量一样进行各种运算(根据类型而定);
赋值;加法;自增......
·同类型的结构体变量可以相互赋值;
student1 = student2;
9.2结构体数组
结构体数组的定义方式:
- struct 结构体名
{成员列表}数组名[数组长度]={初值列表};
2.(已经声明过结构体类型)
结构体类型 数组名[数组长度]={初值列表};
9.3结构体指针
指向结构体变量的指针:
结构体指针既可以指向结构体变量,也可以指向结构体数组中的元素。(基类型必须相同)
struct Student student1;
struct Student *p = &student1;
从此*p代表student1。
而且,student1.num等价于(*p).num等价于p->num;
指向结构体数组的指针:
struct Student
{...}stu[3]={{1,”Li”,10},{2,”Liu”,11},{3,”Gou”,12}};
int main()
{
struct Student *p;
for(p=stu;p<stu+3;p++)
{
printf(“%d%s%d”,p->num;p->name;p->age);
}
}