前言
博主在几年前的C语言后中,结合自身学习情况和学习感悟在当时的一个寒假做了两份C语言学习的经验总结,分别为 《C语言学习基本框架》 和 《C语言学习基础程序》,
现在把它们分享出来,供大家交流学习,如果能给初学C语言的小伙伴们提供一些帮助也是不错的,想当初我也是从C语言的折磨中走出来的,吼吼吼!
一、C语言模式
(1). C程序的基本构成:
1.主函数 int main()
2.变量定义和初始化 int n=345
3.函数的调用和文件包含命令 #include
4.基本输入输出语句 如:scanf(…), printf(…)
5.结束语句 return 0(void类型不需要)
(2). C程序的简单算法:
for循环语句、
while-do循环语句、do-while循环语句、
if-else控制语句、
switch-case控制语句…
(3). C语言基本数据类型:
内置类型:
1.整形: int
2.实型(浮点型): float
3.字符型: char
4.空类型: void
自定义类型:
枚举型: enum
(4). 运算符及表达式:
特有表达式:自增++、自减–
复合表达式:+=、-=、*=、/=、%=
条件表达式:表达式1? 表达式2:表达式3
逗号表达式:表达式1,表达式2,表达式3…
关系运算符:< <= > >= == !=
逻辑运算符:&& || !
(5). 类型转换:
(类型标识符)转换对象 例:a=(int)3.14
二、函数
(1).函数的自定义与调用:
定义:返回值类型标识符 函数名(形参列表)
{
一组语句;
};
形参格式:(类型标识符1 变量1,类型标识符2 变量2… )
调用:被调函数名(实参列表)
实参格式:(表达式1,表达式2…)
(2). 函数的声明与定义:
函数声明:返回值类型标识符 函数名(形参列表)例:int total(int n)
函数定义:要求编译器生成代码并为之分配储存空间.
注:(只有当函数被调用时,函数才分配储存空间,才有了定义.)
(3). 函数与变量的储存类别:
自动局部变量auto:自动局部变量也称“自变量”,其生命周期是一次函数的调用时间.
静态局部变量static.:其生命周期是从初始化开始,到整个程序结束.与自变量有共同的作用域.
外部变量:在函数外部定义的变量称为外部变量,它的生命周期从编译阶段开始,直到程序结束. 它的作用域是其定义后的所有函数.
(4). 模块化程序设计:
所谓模块化程序设计,就是按类划分和管理函数,每一类包含在一个源文件(.c文件)中,每一个源文件,称为一个模板,可以独立编译,其中一个模块包含主函数(main函数),称为主控模块,每一个模块可以独立编译,但不能运行;编译之后,再进行模块之间的链接,形成一个可运行的程序.
三、一维数组和指针
(1). 指针和指针传递:
指针;一个对象的(地址,类型)称为该对象的指针.
指针传递:把一个对象的指针作为参数传递给形参指针传递.
指针的定义:类型标识符 *指针变量名 ,例: int *p
指针的初始化:int *p=&x;(&为指针提取符)
(2). 一维数组:
定义:一维数组是一个类型相同、空间相邻、个数有限的对象序列,每一个对象称为数组元素,数组元素的 个数称为数组长度和数组容量.
格式:类型标识符 数组名[数组长度] 例: int a[5]
初始化格式:int a[5]={5,10,15,20,25} (初始化数据不足,系统用0来填充)
(3). 一维数组和指针:
两者关系: 如果用数组名表示数组首元素的指针,对一个对象,其指针加1的结果是其后续的指针,减1的结果是其前驱的指针,而一个对象的前驱和后续分别表示与该对象前后相邻类型相同的对象.
例:int a[5]={5,10,15,20,25,}
数组名a表示数组首元素a[0]指针,a+1表示a[1]的指针…,如果指针前加上间接访问符* ,则可直接表示相应元素a=a[0],(a+1)=a[1]…
(4). 动态数组:
动态分配函数malloc: void*malloc(unsigned size)
计算类型长度函数sizeof: sizeof(类型说明符,数组名或表达式);
常见使用: int p=(int )malloc(5sizeof(int));
四、C字符串
(1). 字符常量和字符串变量:
常量:“China"
变量:char a[]
赋值:char a[]="China"
(2). 字符串标准输入输出函数:
字符串标准输入函数:
int gets(char c)
字符串标准输出函数:
int puts(char c)
(3). 字符串基本操作函数:
字符串基本操作函数包含在标准头文件中.
求字符串长:
int strlen(const char c)
字符串复制:
char strcpy(char c,const char c1)
字符串连接:
char strcat(char c,const char c1)
字符串比较:
int strcmp(char c,const char c1)
改变字符串的大写:
char strupr(const c)
改变字符串的小写:
char strlwr(const c)
(4). 字符串函数补充:
取子串:
char Substr(const c,int id,int num,char c1)
字串插入:
char Strinsert(char c,int id,const char c1)
字串删除:
char Strerase(char c,int id,int num)
字符查找:
int Chfind(const char c,char ch,int id)
五、结构体,联合体和枚举
(1). 结构体定义:
struct 结构体名 { 成员声明列表 };
(2).typedef修改名字:
typedef的应用格式:typedef 已有的类型名 类型别名;
typedef struct
{
int yr,mo,day;
)Date;
(3). 结构体变量/数组:
结构体变量初始化:
Date dt=(,1,1)
结构体成员的表达格式:
结构体变量名.结构体成员名: dt.yr
结构体指针->结构体成员名: p->yr
(*结构体指针).结构体成员名:(*p).yr
结构体数组初始化:
Student a[3]={{1001,"Marry",80},{1002,"Tom",89},{1003,"Mike",90}};
数组元素中结构体成员的表达格式:
结构体数组[下标].结构体成员: a[1].num
(*(结构体数组+下标)).结构体成员: ((*a+1)).num
(结构体数组+下标)->结构体成员: (a+1)->num
(4). 联合体:
定义: union 联合体名 { 成员列表 };
特征:
联合体变量可以初始化,但只能初始化第一个成员.联合体变量在初始化之后每次只能访问一个成员.
(5). 枚举:
定义:enum 枚举类型名(枚举常量1,枚举常量2,…枚举常量n);
特征:
每一个枚举常量都表示一个整数,默认情况下,它们的值依次为0,1,…n-1.
有时也可以改变默认值。例如;enum colors(red=1,green,blue);
六、顺序表
(1). 顺序表的定义:
typedef struct {
Type *date;//Type表示待定的数据类型,指针date指向动态数组
int size; //数组date的数据个数
int max; //数组date的容量
}Seqlist;
(2). 顺序表的声明:
//准构造函数和准析构函数
void IniList(Seqlist *l,int n);//生成空表
void FreeList(Seqlist *l);//释放动态数组空间
//用于修改的基本操作函数
void InsertRear(Seqlist *l.Type item);//尾插入
void Insert(Seqlist *l,int id,Type item);//定点插入
void Erase(Seqlist *l,int id);//定点删除
void Clear(Seqlist *l);//清表
//用于读取的基本操作函数
Type Getdate(const Seqlist*l,int id);//取值
int Size(const Seqlist *l);//取数据个数
int Empty(const Seqlist *l);//判空
int Full(const Seqlist *l);//判满
七、链表
(1). 链表的定义:
typedef struct
{
Node *head;
Node *tail;
int size;
}List;
typedef struct
{
Type date;
struct Node *prev;
struct Node *next;
}Node;
(2). 链表的声明:
void Init(List *L);//建空表
Node *Begin(List *L);//取链表左边界
Node *End(List *L);//取链表右边界
Node *Insert(List *L,Node *current,Type item);//定点插入
Node *Erase(List *L,Node *current);//定点删除
Type *Front_pointer(List *L);//取首节点中date的指针
Type Front_date(List *L);//取首节点中date的值
Type *Back_pointer(List *L);//取尾节点中date的指针
Type Back_date(List *L);//取尾节点中date的值
void Push_front(List *L,Type item);//前插
void Push_back(List *L,Type item);//后插
void Pop_front(List *L);//前删
void Pop_back(List *L);//后删
int Empty(List *L);//判空
void Clear(List *L);//清表
void Free(List *L);//释放空间
八、C的流与文件
(1). 文件打开与关闭:
打开:
FILE *fopen(char *filename,char *mode);
//filename表示磁盘文件,mode代表文件使用方
关闭:
int fclose(FILE *fp);
(2). 文件的读写:
字符的读写:
int fputc(int c,FILE *fp);
int fgetc(FILE *fp);
字符串的读写:
int fpurs(char *s,FILE *fp);
char *fgets(char *s,int n,FILE *fp);
无格式读写:
int fwrite(void *buffer,int size,int n,FILE *fp);
int fread(void *buffer,int size,int n,FILE *fp);
格式化读写:
int fscanf(FILE *fp,const char *format,地址1,地址2...);
int fprintf(FILE *fp,const char *format,输出参数1,输出参数2...);
(3). 文件操作函数:
int rewind(FILE *fp);//定位文件指针
int fseek(FILE *fp,long offset,int form);//移动文件指针
int feod(FILE *fp);//测试文件指针是否到文件尾
int ferror(FILE *fp);//测试最近一次操作是否出错
int clearer(FILE *fp);//清除出错标志和文件结束标志
结语
《C语言学习基本框架》仅为博主在学习C语言时自己的记录与积累,加上后期的整理所成。可能对于C语言入门的理解与初步掌握有一定的帮助。
当然,介于当时的水平有限,文章本身可能还存在内容上的纰漏或者错误,如果读者在阅读中发现错误,也请不吝指出,谢谢!
注:《C语言学习基本框架》会放在附件中,感兴趣的小伙伴欢迎下载嗷~
下载链接: C语言学习基本框架——Mr.鹏