##1.C语言的基本介绍
·一个程序由一个或多个源程序组成,一个源程序文件中有且只有一个main函数。包括预处理指令`#include`,全局声明,函数定义。
·函数是C的重要组成部分,包括函数首部和函数体。
·最重要的一点,也是我学习C++后搞混的,程序总是从main函数开始执行,没有main函数是会报错的。
·同时一个良好的编程习惯应该包含注释部分。
##2.程序灵魂——算法介绍
###2.1什么是算法
·首先程序是由算法加数据结构这两大类组成的,当然还有一些细节,声明啊,注释等。
·算法分两大类,一类是数值运算,一类是非数值运算算法,而不管是什么算法,都是为了在一件事情中找到一定规律去做,按计划好的去实现避免出
###2.2算法特性
·有穷性,一个算法应该包含有限的操作步骤。
·确定性。算法中每一个步骤都应该是确定的。
·有零个或多个输入。
·有一个或多个输出。
·有效性,算法每一个步骤都应该有效执行。
###2.3算法基本结构
·顺序结构
·循环结构
·选择结构
##3.顺序结构及一些C的基础要点
###3.1数据表现形式
·常量
常量分为整型,实型,字符型,字符串和符号常量。而字符常量中有一种转义字符,以'\'开头,最常见的是'\n',表示换行。符号常量例子`#define PI 3.14`
·变量
变量必须先定义后使用。
·常变量
'const int a = 1;'
`标识符
C语言规定标识符只能由数字,字母或下划线组成,数字不能开头。
###3.2整型数据
·分类
|类型|字节数|取值|
| --- | --- | --- |
|int|4|-2^31~(2^31-1)|
|unsigned int|4|0~(2^32-1)|
|short|2|-2^15~(2^15-1)|
|unsigned short|2|0~2^16-1|
|long|4|-2^31~(2^31-1)|
|unsigned long|4|0~(2^32-1)|
###3.3字符型数据
没啥就一样
###3.4浮点型数据
·float,double,long double
##4.选择结构程序设计
这里也没啥就是if和switch,然后需要搞一下运算优先级。
·关系运算符优先级
<,>,<=,>=,==,!=,这里前四种的运算优先级相同且高于后两种的运算优先级。
·逻辑运算符优先级
!高于&&高于||。
且非的运算优先级是最高的,然后是算数运算符,到关系运算符,到&&和||,最后是赋值运算符。
·条件运算符
条件运算符有一个条件表达式,由两个符号?和:组成,必须一起使用,及`表达式1?表达式2:表达式3`
```
max=(a>b)?a:b
//等价于
if (a>b) max=a;
else max=b;
//同样也可以写成
a>b?printf("%d",a):printf("%d",b)
```
##5.循环结构程序笔记
处理一些需要重复的问题,可以选择循环结构。
###5.1 while语句
·while语句就是只要当循环条件表达式为真,就执行循环体语句。
```
#include<stdio.h>
int main()
{
int i=1,m=0
while(i<100)
{
m=m+i;
i++;
}
printf("m=%d",m);
return 0;
}
```
###5.2 do...while语句
·特点就是先无条件执行一遍循环体,然后判断循环条件是否成立。
###5.3 for语句
·for语句是用到最多的循环语句,一般形式是for(表达式1;表达式2;表达式3)下面接语句
表达式1:设置初始条件,只执行一次
表达式2:循环条件表达式,判断是否循环
表达式3:循环调整语句
###5.4 循环的终止结束
·break语句提前终止循环,也可以跳出switch语句。
·continue语句提前结束本次循环,不继续走下面的程序,而不结束整个循环。
##6.利用数组处理批量数据
·数组是一组有序数据的集合,数组中每一个元素都属于同一个数据类型,用一个数组名和下标来唯一的确定数组中的元素。
###6.1 一维数组初始化
·在定义是赋初始值。
`int a[10]={0,1,2,3,4,5,6,7,8,9};`
·可以只给一部分赋值
·也可以赋值0,`int a[10]={0,1,2,3,4,5,6,7,8,9};`或者`int a[10]={0}`
·也可以不指定数组长度
###6.2 冒泡法
```
#include <stdio.h>
int main()
{
int a[10];
int i,j,t;
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++)
{
for(i=0;i<9-j;i++)
{
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
}
printf("the sorted number:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}
```
###6.3字符数组
·如果花括号内提供初值个数大于数组长度,则报错。如果初值个数小于数组长度,则置赋值前面哪些元素,后面空的填\0,即空字符。
·C语言规定字符串结束标志,以字符\0作为结束标志。如果字符数组中存在字符,前九个都不是空字符,而第十个是\0,认为数组中有一个字符串,有效字符九个。
·在向内存中存储时,系统会自动在最后加一个'\0',那么就有了下面这个
```
char c[]="i am happy";
//等价于
char c[]={"i am happy"};
//等价于
char c[]={'i','','a','m','','h','a','p','p','y','\0'};
//而不与下面这个等价
char c[]={'i','','a','m','','h','a','p','p','y'};
//前三者长度为11,最后一个为10
```
·字符数组输出不包括'\0','printf("%s",c)'。
###6.4 一些字符串相关函数
·puts——输出字符串,其作用是将一个字符串(以\0结束)输出到终端。'puts(str);'
`gets——输入字符串,从终端输入一个字符串,得到一个函数值。
·strcat——字符串拼接,'strcat(str1,str2)',将str2拼接到str1后面,str1必须足够大。
·strcpy和strncpy——字符串复制,'strcpy(str1,str2)',将str2复制到str1中,从起始位开始,str1也需要足够大。'strncpy(str1,str2,2)',将str2中前2个复制到str1中。取代str1中前两个字符。
strcmp——字符串比较函数。'strcmp(str1,str2)',将两个字符串从左至右比,若全部相同则字符串相等,出现不同,以第一个不同为准。结果由函数值带回,相同0,str1>str2,返回一个正整数,str1
·strlen——测字符串长度,不包括\0。
·strlwr——转换小写
·strupr——转换大写
##7.指针
###7.1 什么是指针
·vc中为int分配4个字节,float四个字节,char一个字节,内存区每一个字节有一个编号,这就是地址,地址指向的是该变量单元,地址称为指针。
·'i_pointer = &i;'表示将i的地址存放到i_pointer中,i的地址是2000,那i_pointer的值就是2000,这个2000是i的地址。这时i=3,那么*i_pointer=3;*i_pointer表示i_pointer所指对象。此时,*i_pointer是指针,指向一个地址,i_pointer是指针变量,存放地址的变量。
###7.2 指针变量定义和初始化
·类型名 * 指针变量名
'int * p;'
·**初始化(这是定义加初始化,不是指针变量的赋值过程,区分!!)**
'int * p = &a;'//定义指针变量p,指向a。
**定义时 指针变量前面的'*'表示该变量为指针型变量,指针变量名是p,不是'*p'。**
·一个变量的指针包含两个方面,以是以存储单元编号表示的纯地址,一是指向的存储单元的数据类型。
###7.3 字符串指针
```
·char *string = "hello world";
等价于
char *string;
string = "hello world";
//把字符串第一个元素地址赋值给指针变量string,输出的时候会自动加1。
```
##8.自建数据类型
###8.1结构体
·声明
struct 结构体名
{成员列表};
//成员声明需要有类型声明,***类型名 成员名***
·在声明同时定义变量
struct 结构体名
{成员列表
}变量名列表;
·定义结构体数组
struct 结构体名
{成员列表}数组名[数组长度];
·结构体指针
p指向一个结构体变量stu。下面三种用法等价
- stu.num(stu.成员名)
- (*p).成员名
- p->num
·枚举
声明
enum [枚举名]{枚举元素列表};
//枚举元素不能赋值
enum Weekday{a,b,c};
定义变量
enum Weekday workday;
// 枚举类型 枚举变量
workday = a;
##9。对文件的输入输出
·一个文件要有一个唯一的文件标识,文件标识包括三部分:
- 文件路径
- 文件名主干
- 文件后缀
'C:\temp\file.dat'
·映像文件-在内存中以二进制形式存储的,不加转换的输出到外存,就是二进制文件,可以认为它就是存储在内存的数据的映像。
·文本文件-要求在外存上以ASCII代码形式存储,则需要在存储前进行转换。
·fopeen(文件名,使用文件方式);
|文件使用方式| 含 义 |指定文件不存在|
|--|--|--|
|r(只读)|打开一个已存在的文件输入数据|出错 |
|w(只写)|打开一个文本文件写入数据|建立新文件|
|a(追加)|向文本文件尾添加数据|出错|
|r+(读写)|打开一个文本文件读写|出错 |
|w+(读写)|打开一个新的文本文件读写|建立新文件|
如果不能打开文件,fopen函数将带回一个出错信息,返回一个空指针NULL。
'if((fp=fopen("file","r"))==NULL)'
·关闭文件 fclose(文件指针);
·读写一个字符
fgetc(fp)从fp指向的文件读入一个字符
fputc(ch,fp)将字符ch写到文件指针变量fp所指文件。
·读写一个字符串
fgets(str,n,fp)n是要求得到的个数,但实际只从fp所指文件中读入n-1个字符,最后加一个'\0',这样得到字符串共有n个字符,放到字符数组str中。读完前遇到'\n'或文件结束符EOF,读入结束,但遇到的'\n'也将作为字符读入,函数出错返回NULL。
·格式化方法读写文本文件
fprintf(文件指针,格式字符串,输出列表);
fscanf(文件指针,格式字符串,输出列表);