与企业网站做接口,第三方网站下载素材是怎么做,杭州家装设计公司排名榜,杭州网站开发与设计C入门到进阶#xff08;图文详解#xff0c;持续更新中#xff09;
详解C入门知识到进阶#xff0c;配合图观看易于理解记录 文章目录 目录 C入门到进阶#xff08;图文详解#xff0c;持续更新中#xff09; 文章目录 前言 一、数据 #xff08;一#xff09;数据类…C入门到进阶图文详解持续更新中
详解C入门知识到进阶配合图观看易于理解记录 文章目录 目录 C入门到进阶图文详解持续更新中 文章目录 前言 一、数据 一数据类型 1.基本数据类型/内置数据类型 2.自定数据类型/复合数据类型 1数组 2结构体 3指针 二C常用运算符 赋值运算符 关系运算符 逻辑运算符 杂项运算符 三数据的本地化存储 1.准备工作 2.写流即向本地文件中写入数据该如何实现 1创建写流的对象或创建写流的变量 2打开文件执行准备执行写数据称为开流 3对本地写数据 4关闭流 3.读流即从本地文件中读取数据 1创建读流对象 2打开文件准备读取数据称为开流 3开始从本地读取数据 4关闭流 5存储案例展示存储数据到UserInfo的txt文本中读取数据新增数据查找相关姓名、年龄、地址 二、函数 一函数的声明和定义 1.函数声明的作用 2.函数的定义 二函数传值 1.传出数据即返回值 2.传入数据即传参 1什么是传参 2作用 3类型 3.关于形参在函数声明和函数定义中注意点 4.默参 5.函数重载 6.传参方式 三、内联函数 一其它名称 二怎么写一个内联函数 三内联函数有什么用 四内联函数的注意事项 五内联的优缺点 四、宏 一作用 二语法 三分类 1.简单宏 2.带参数宏 四卸载宏 面向对象 前言
C 是一门高级语言是一种编译型的语言需要先把源代码先编译成机器语言的可执行程序然后再执行可执行程序。这里就对C知识进行探究 一、数据
一数据类型
1.基本数据类型/内置数据类型
整型有符号与无符号
int
unsignedf int
long
unsigned long int
short int
ushort
byte
sbyte
long int
unsigned long int
浮点型/实型
float
double
long double
字符型
char
布尔型
bool
2.自定数据类型/复合数据类型
1数组
存放一组同质类型的元素同种类型
2结构体
3指针
指向一个内存空间的地址
指针
数组指针
指针数组
函数指针 二C常用运算符
赋值运算符
基本赋值运算符
复合赋值运算符加赋值、-减赋值、*乘赋值、/除赋值、求余赋值、 左移赋值、右移赋值、按位与赋值、|按位或赋值、*A按位异或赋值
关系运算符 !
逻辑运算符 ||
杂项运算符
sizeof和三目运算符 三数据的本地化存储
1.准备工作
实现本地化存储需要
头文件为iostreamofstream
引入头文件 #includeiostream #includeofstream 命名空间为std
引入命名空间 using namespace std; 2.写流即向本地文件中写入数据该如何实现
使用ofstream的方法操作步骤为
1创建写流的对象或创建写流的变量 ofstream ofs; 2打开文件执行准备执行写数据称为开流 ofs.open(abc.txt, ios::out); 3对本地写数据 string name; getline(cin, name,q); ofs name endl; 4关闭流 ofs.close(); 3.读流即从本地文件中读取数据
1创建读流对象 ifstream ifs; 2打开文件准备读取数据称为开流 ifs.open(abc.txt, ios::in); 3开始从本地读取数据 方法1 char ValueArrays[1024]{}; while (ifs ValueArrays)//非零即为真 { cout ValueArrays endl;//这是字符串的打印 } 方法2 string str ; while (ifs str) { cout str endl; } 4关闭流 ifs.close(); 5存储案例展示存储数据到UserInfo的txt文本中读取数据新增数据查找相关姓名、年龄、地址
#include iostream
#includefstream
#includestring
#includeUser.h
/*
预处理
#include中的 和的使用
:代表的导入C库文件
“ ”先检索是否有没有自己写的头文件如果检索不到自己写的头文件会自动查找C库找不到就报错
*/using namespace std;
void Save()
{using namespace std;ofstream ofs;ofs.open(abc.txt, ios::out);string name;getline(cin, name,q);ofs name endl;ofs.close();}
int name_index 0;
void Add(string nameArrays[])//name是一个形参需要一个string 类型数组的地址
{string name ;cin name;nameArrays[name_index] name;name_index;ofstream ofs;ofs.open(abc.txt, ios::out);for (int i 0; i name_index; i){ofs nameArrays[i] endl;}ofs.close();
}void GetValue()
{using namespace std;//1. 创建对象ifstream ifs;//2. 开流ifs.open(abc.txt, ios::in);//3.读取数据方法1//3.1数据本地读取出来了需要找到一个容器去存放读取出来的数据char ValueArrays[1024]{};//3.2开始取出数据并将本地数据在数据中while (ifs ValueArrays)//非零即为真{cout ValueArrays endl;//这是字符串的打印}ifs.close();cout --------- endl;//3.读取数据方法2//3.1数据本地读取出来了需要找到一个容器去存放读取出来的数据//读取不走回头路ifs.open(abc.txt, ios::in);string str ;while (ifs str){cout str endl;}ifs.close();cout -------- endl;//3.读取数据方法3 借助一个ifstream里的一个函数getlineifs.open(abc.txt, ios::in);char buf[1024]{};while (ifs.getline(buf, sizeof(buf)))//getline是ifstream下的一个函数用于获取到一行数据函数的第一个参数是用于接收一行数据的字符数组//第二个参数是用于接收数据的容器的大小{cout buf endl;}ifs.close();cout -------- endl;//3.读取数据方法4 借助一个string里的一个函数getlineifs.open(abc.txt, ios::in);string str_buf {};while (getline(ifs, str_buf)){cout str_buf endl;}ifs.close();cout -------- endl;//3.读取数据方法5 借助一个ifstream里的一个函数eofifs.open(abc.txt, ios::in);char eof_buf[1024]{};while (!ifs.eof()){ifs eof_buf;cout eof_buf endl;}ifs.close();
}void SetValue()
{string name ;string age ;string address ;cout 请输入姓名 endl;cin name;cout 请输入年龄 endl;cin age;cout 请输入地址 endl;cin address;ofstream ofs;ofs.open(Value.txt, ios::out);ofs name ;ofs age ;ofs address endl;ofs.close();
}void SelValue()
{string r_name ;string r_age ;string r_address ;ifstream ifs;ifs.open(Value.txt, ios::in);while (ifs r_name ifs r_age ifs r_address){cout 姓名 r_name ,年龄 r_age ,地址 r_address endl;}ifs.close();
}//增加用户
User uArray[6] {};
int uSize 0;
void AddUser()
{string name;int age;string address;cout 输入姓名 endl;cin name;cout 输入年龄: endl;cin age;cout 输入地址 endl;cin address;User uInstance;uInstance.name name;uInstance.age age;uInstance.address address;uArray[uSize] uInstance;uSize;ofstream ofs;ofs.open(UserInfo.txt, ios::out);for (int i 0; i uSize; i){ofs uArray[i].name ;ofs uArray[i].age ;ofs uArray[i].address endl;}ofs.close();
}int Find(string name)
{for (int i 0; i uSize; i){if (uArray[i].name name){return i;}}return -1;
}//查询所有人的所有信息
void SelAllUser()
{ifstream ifs;ifs.open(UserInfo.txt, ios::in);//is_open判断上一行代码中打开的文件是否存在//存在返回真不存在返回假/*if (ifs.is_open()){cout 文件存在 endl;}elsecout 文件不存在 endl;*/if (!ifs.is_open()){cout 文件不存在 endl;return;//文件不存在下方逻辑不用执行}char buf[1024];ifs buf;if (ifs.eof()){cout 文件存在但没数据 endl;return;//下方逻辑无需进行}ifs.close();ifs.open(UserInfo.txt, ios::in);int i 1;string name;int age;string address;while (ifs name ifs age ifs address){cout 第 i 人的姓名是 name 年龄是 age 地址是 address endl;}}
//查询某个人的所有信息
void SelUser()
{cout 输入名字 endl;string sel_name ;cin sel_name;int index Find(sel_name);//Find()会返回一个int类型的值if (index ! -1) {}//ifstream ifs;ifs.open(UserInfo.txt, ios::in);string name ;int age 0;string address ;while (ifs name ifs age ifs address){if (name sel_name){cout 用户名为 name ,年龄是 age 地址是 address endl;}}
}
//初始化
int Init()
{ifstream ifs;ifs.open(UserInfo.txt, ios::in);if (!ifs.is_open()){cout 文件不存在 endl;return -1;//文件不存在下方逻辑不用执行}char buf[1024];ifs buf;if (ifs.eof()){cout 文件存在但没数据 endl;return -1;//下方逻辑无需进行}ifs.close();ifs.open(UserInfo.txt, ios::in);int i 0;string name;int age;string address;while (ifs name ifs age ifs address){uArray[i].name name;uArray[i].age age;uArray[i].address address;i;}return i;
}
int main()
{ //string str {};//getline(cin, str, q);//控制台输入数据赋值到str中按q键再按回车键结束//getline(cin, str, \t);//控制台输入数据赋值到str中按Tab键然后再按回车结束//cout str endl;//Save();//GetValue();//SetValue();// SelValue();int addIndex Init();while (true) {cout 添加1查询2退出0 endl;int selecter;cin selecter;switch (selecter){case 0:exit;break;case 1:AddUser();break;case 2:SelAllUser();break;}}system(pause);
}二、函数
一函数的声明和定义
1.函数声明的作用
代表的是函数的出生位置占位置的如果在文件最上方的位置声明了函数不用担心函数和函数之间互相调用编译不通过的问题
2.函数的定义
为函数声明写函数体写逻辑
注 可能出现的bug函数只有声明没有定义这个函数却被调用了被编译时期的异常error
二函数传值
1.传出数据即返回值
1作用在函数内传数据出函数
2样式
返回类型 函数名称参数
{ return 对应返回类型的值; //此处的return有双重作用 1.跳转语句跳出函数 2.返回值
}
3可以返回的值
1.对应返回类型的值
2.对应返回类型的变量
3.带同种返回类型返回值的函数调用——先执行函数调用再返回值 2.传入数据即传参
1什么是传参
传参就是实参传入形参
2作用
在函数外部传入数据到函数内部
3类型
形参在函数声明和定义的时候写的是行参
实参在函数调用的时候 传递的值是实参
实参的种类
对应形参类型的值
对应形参类型的变量
带同种返回类型返回值的函数调用即先执行函数调用再传参数实参传参数
3.关于形参在函数声明和函数定义中注意点 声明的形参参数名称和定义的形参参数名称 可以不一样声明的时候可以省略参数名称 如果存在函数的默参默认是必须写在函数声明位置的不可以在声明和定义中都写一遍默参
4.默参
作用函数可以在声明或者定义的时候给出默认的逻辑执行 关于默参的放置位置说明 如果只有一个默参 放在参数结尾处最右侧 如果有多个默参 从右到左依次给出默参中间不可以隔开使用 错误演示void Function(int i10,int a,bool bfalse) 正确演示:void Function(int i10,int a10,bool bfalse)
5.函数重载 函数名相同但是函数参数参数类型不同通过传入不同的实参调用不同的函数执行不同的功能 注意 函数返回值不参与函数重载的过程 如果被重载的函数中出现了默参 建议不要写成重载函数 如果不接受建议就需要保证默参的几个参数类型与其他被重载的函数的参数不一致
6.传参方式
1值传递值传递只能影响本函数值的修改不会影响其他的功能也不会影响到实参
2地址传递
3引用传递
三、内联函数
一其它名称
1.内联函数
2.在线函数
3.编译时期展开函数
二怎么写一个内联函数
inline声明和定义都需要添加在类中当一个函数的声明和定义放在一起的时候默认这个函数是内联函数
三内联函数有什么用
简单的逻辑写在内联函数中可以有效提高程序的执行速度
四内联函数的注意事项
switch for while do while这种较为复杂的逻辑不要放在内联函数中
代码尽量不要超过10行
五内联的优缺点
用空间换时间
实现的是在编译时期逻辑的复制粘贴而不是函数跳转
四、宏
一作用
实现文本替换可以一定程度上减少记忆负担
二语法
简单宏
#define 宏名 文本内容
例#define MINNUMBER 0.01
带参
#define 宏名 (参数列表 文本内容
例#define function(x) x*x
三分类
1.简单宏
添加宏#define 宏名 文本内容
2.带参数宏
添加宏#define 宏名参数列表 文本内容
在使用宏的时候将实参数或者变量 传给形参
四卸载宏
#undef 被卸载宏名
五、别名
数据类别名
typedef 为数据类型取别名将复杂的数据类型修改为简单易读的名称
六、作用域
一全局域
1.函数
全局函数
2.变量
全局变量可以不初始化系统会帮助初始化但在实际项目开发中建议程序员手动初始化
3.如果存在命名冲突怎么解决
添加命名空间namespace全局变量
二成员域
1.函数
成员函数如果成员函数的声明和定义放在了一起这个成员函数将被处理为内联函数
2.变量
成员变量成员属性可以不初始化系统会帮助初始化但在实际项目开发中建议程序员手动初始化
三局部域
变量局部变量必须初始化
四语句域
if...else while for do...while 循环中创建的变量
{ }
七、随机数
1.导入头文件
2.添加随机种子
3.使用随机数
参考源码
面向对象
待更新.....