C语言笔记(谭浩强)

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字符串函数

  1. gets(arr):从输入端读取一个字符串存到字符数组中。
  2. puts(arr):输出一个字符串。

  1. strcat(字符数组1, 字符数组2):将2字符数组连接到1字符数组的尾部。
  2. strcpy(字符数组1, 字符串2):将2字符串复制到1字符数组中。
  3. strcmp(字符串1,字符串2):比较两个字符串的“大小”。

比较规则将两个字符串自左向右逐个字符进行比较(按ASCII),直到出现不同的字符或\0

结果:如果字符串1与字符串2相同,则返回0

  如果字符串1 > 字符串2,返回一个正整数

如果字符串1 < 字符串2,返回一个负整数

  1. strlen(字符数组):直接测量字符串长量的长度(不包括’\0’)。

  1. strlwr(字符串):将字符串中的写字母转换成写字母。
  2. 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、常量

  1. 整型常量:如1000,0,-146等
  2. 实型常量1.十进制小数形式,如12.1,0.0等2.指数形式,如12.34e3//12.34乘10的3次方
  3. 字符常量1.普通字符,如‘2’,‘?’,‘A’,‘#’等2.转义字符,如\n,\\,\’,\”等
  4. 字符串常量:如“boy”,“123”等
  5. 符号常量(用#define指令,指定某符号代表一个常量):如 #define PI 3.1416等

//仅仅是字符替换

  1. 变量(遵循先定义,后使用的原则)
  2. 常变量(变量生存期内值不能改变)

在定义变量时,前面加上const,如const int a=3;

//占用储存单元

  1. 标识符

变量名、符号常量名、函数名等

标识符命名规则:由字母或下划线开头,后面可以接字母、数字、下划线。

3.2.2数据类型

  1. 整型
  1. 基本整型int:占4字节;范围31-1
  2. 短整型short:占2字节;范围15-1
  3. 长整型long:占4字节;范围31-1
  4. 双长整型long long:占8字节。范围63-1

(一个字节8位)

注:·对无符号整型unsigned XX,取范围在有符号基础上幂指数+1;

·对于无符号整型,输出格式用%u

·以上类型的变量值在储存单元中都是以补码的形式存储的,存储单元中第一个二进制代 表符号:0为正,1为负。

  1. 字符型数据
  1. 字符与字符代码...ASCII码表,包含127个字符。

重要的:‘A’:65

‘Z’:90——24个英文字母

‘a’:97——大写与小写字母的顺序值差32

‘0’:48

‘1’:49

‘  ’:32

‘%’:37

  1. 字符变量char:占1字节;
  1. 浮点型数据
  1. 单精度float:占4字节;六位有效数字

(运算时,float自动转为double)

  1. 双精度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>)

  1. gets(arr):从输入端读去一个字符串到字符数组中。
  2. puts(arr):输出一个字符串。

  1. strcat(字符数组1, 字符数组2):将2字符数组连接到1字符数组的尾部。
  2. strcpy(字符数组1, 字符串2):将2字符串复制到1字符数组中。
  3. strcmp(字符串1,字符串2):比较两个字符串的“大小”。

比较规则将两个字符串自左向右逐个字符进行比较(按ASCII),直到出现不同的字符或\0

结果:如果字符串1与字符串2相同,则返回0

  如果字符串1 > 字符串2,返回一个正整数

如果字符串1 < 字符串2,返回一个负整数

  1. strlen(字符数组):直接测量字符串长量的长度(不包括’\0’)。

  1. strlwr(字符串):将字符串中的写字母转换成写字母。
  2. 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};

  1. 对某个元素初始化:

struct Student a={.name=”张三”};

  1. 也可以使用字符串函数strcpy对数组元素进行赋值:

strcpy(student1.name,”张三”);

引用

格式:student1.num = 200;

注:·只能对结构体变量中的各个成员分别进行输入和输出;

·在程序中可以对变量的成员进行赋值;

·如果成员本身又属于另一个结构体,则要用多个成员运算符:

student1.birthday.mouth = 12;

·对结构体变量的成员可以像普通变量一样进行各种运算(根据类型而定);

赋值;加法;自增......

·同类型的结构体变量可以相互赋值;

student1 = student2;

9.2结构体数组

结构体数组的定义方式:

  1. 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);

}

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值