c++学习 文件操作,模板
文件操作
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
//文本操作
//程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放
//通过文件可以数据持久化
//c++中对文件操作包含头文件<fstream>
//文件类型分为两种:
//1.文本文件 -文件以文本的ASCLL码形式存储在计算机中
//2.二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们
//操作文件的三大类
//1.ofstream:写操作
//2.ifstream:读操作
//3.fstream: 读写操作
//写文件
//1.包含头文件
//#include<fstream>
//2.创建流对象
//ofstream ofs;
//3.打开文件
//ofs.open("文件路径",打开方式);
//文件打开方式:
//ios::in 读文件方式打开
//ios::out 写文件方式打开
//ios::ate 初始位置:文件尾
//ios::app 追加文件方式打开
//ios::trunc 如果文件存在先删除,再创建
//ios::binary 二进制方式
//文件打开方式可以配合使用,利用|操作符
//4.写数据
//ofs<<"写入的数据";
//5.关闭文件
//ofs.close();
void test(){//1.包含头文件//2.创建流对象 ofstream ofs;//3.指定打开方式ofs.open("text.txt",ios::out);//4.写内容ofs<<"姓名:张三"<<endl;ofs<<"性别:男"<<endl;ofs<<"年龄:25"<<endl; //5.关闭文件 ofs.close();
}
//读文件
//1.包含头文件
//#include<fstream>
//2.创建流对象
//ifstream ifs;
//3.打开文件并判断文件是否打开
//ifs.open("文件路径",打开方式);
//4.读数据
//四种方式读取
//5.关闭文件
//ifs.close()
void test1(){//1、包含头文件//2、创建流对象ifstream ifs; //3、打开文件并判断文件是否打开ifs.open("text.txt",ios::in);if(!ifs.is_open()){cout<<"文件打开失败"<<endl;return;}//4、读数据//第一种 char buf[1023] = {0};while(ifs >> buf) {cout<<buf<<endl;}
// //第二种
// char buf[1024] = {0};
// while(ifs.getline(buf,sizeof(buf))) {
// cout<<buf<<endl;
// }
// //第三种
// string buf;
// while(getline(ifs,buf)){
// cout<<buf<<endl;
// } //第四种
// char c;
// while((c = ifs.get()) != EOF){ //EOF end of file
// cout<<c;
// } //5、关闭文件 ifs.close();
}
//二进制文件
//以二进制的方式对文件进行读写操作
//打开方式要指定为ios::binary
//二进制文件写文件
//二进制方式写文件主要利用流对象调用成员函数write
//函数原型:ostream&write(const char *buffer,int len);
//参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数
class Person{public:char m_Name[64];int m_Age;
};
void test2(){//1.包含头文件//2.创建流对象ofstream ofs; //3.打开文件ofs.open("person.txt",ios::out|ios::binary);//创建流对象和打开文件一起
// ofstream ofs("person.txt",ios::out|ios::binary);//4.写文件Person p = {"张三",18} ;ofs.write((const char *)&p, sizeof(p));//5.关闭文件 ofs.close();}
//二进制文件读文件
//函数原型:istream&read(char *buffer,int len);
class Person1{
public: char m_Name[64];int m_Age;
};
void test3(){//1.包含头文件//2.创建流对象ifstream ifs; //3.打开文件 判断文件是否打开成功 ifs.open("person.txt",ios::in|ios::binary);if(! ifs.is_open()){cout<<"文件打开失败"<<endl; return;}//创建流对象和打开文件一起
// ifstream ofs("person.txt",ios::out|ios::binary);//4.读文件Person1 p;ifs.read((char *)&p, sizeof(Person1));cout<<"姓名:"<<p.m_Name<<" 年龄:"<<p.m_Age<<endl; //5.关闭文件 ifs.close();
}
int main(){//文本文件写 test();//文本文件读 test1();//二进制文件写 test2();//二进制文件读test3();
}
模板:
#include<iostream>
#include<string>
using namespace std;//1.2函数模板语句
//c++另一种编程思想称为泛型编程,主要利用的技术就是模板
//c++提供两种模板机制:函数模板和类模板
//1.2.1函数模板作用:
//建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
//语法: template<typename T>
// 函数声明或定义
//template --- 声明创建模板
//typename --- 表明其后面的符号是一种数据类型,可以用class代替
//T --- 通用的数据类型,名称可以替换,通常为大写字母 //函数模板
template<typename T> void mySwap(T &a,T &b)
{T temp = a;a = b;b = temp;
}
两个整型交换函数
//void swapInt(int &a,int &b)
//{
// int temp = a;
// a = b;
// b = temp;
//}
交换两个浮点型函数
//void swapDouble(double &a,double &b)
//{
// double temp = a;
// a = b;
// b = temp;
// } void test01(){cout<<"************test01**********"<<endl<<"***********函数模板*********"<<endl; int a = 10;int b = 20;
// swapInt(a,b);
// cout<<"a = "<<a<<" b = "<<b<<endl;
//
// double c = 1.1;
// double d = 2.2;
// swapDouble(c,d);
// cout<<"c = "<<c<<" d = "<<d<<endl;//函数模板两种使用方法 //1、自动类型推导mySwap(a,b);cout<<"a = "<<a<<" b = "<<b<<endl;//2、显示指定类型mySwap<int>(a,b); cout<<"a = "<<a<<" b = "<<b<<endl;}//1.2.2 函数模板注意事项//注意事项://1、自动类型推导,必须导出一致的数据类型T,才可以使用//2、模板必须要确定出T的数据类型,才可以使用//template <class T>//void func()
// {
// cout<<"func 调用"<<endl;
// }
//调用func()是错误的,必须明确func的数据类型 //1.2.3 函数模板案例
//案例描述:
//利用函数模板封装一个排序的函数。可以对不同类型数组进行排序
//排序规则从大到小,排序算法为选择排序
//分别利用char数组和int数组进行测试 //排序算法
template <typename T>
void mySort(T arr[], int len)
{for(int i = 0;i < len;i++){int max = i;for(int j = i+1; j<len; j++){if(arr[max]<arr[j]) // 此处是max 不是 i,需要实时更新max的值 {max = j;}}if(max!=i){mySwap(arr[i],arr[max]);}}} // 6,432,432,32,32
// i = 0; max = 0 j = 1 32
// i = 1; max = 1 j = 2 432
// i = 2; max = 2 j = 3 432
// i = 3; max = 3 j = 4 max = 4 2
// i = 4; max = 4 j = 5 max = 4 1//打印 template <typename T>void show(T arr[],int len){for(int i = 0; i < len;i++){cout<<arr[i]<<" "; }cout<<endl; }void test02()
{cout<<"************test02**********"<<endl<<"********函数模板测试排序*******"<<endl;char charArr[] = "fdacbeg";int intArr[] = {6,432,432,32,32};int len = sizeof(charArr)/sizeof(charArr[0]);int size = sizeof(intArr)/sizeof(intArr[0]);show(charArr,len);mySort(charArr,len); show(charArr,len); show(intArr,size);mySort(intArr,size); show(intArr,size);
}
//1.2.4 普通函数与函数模板的区别
//普通函数与函数模板区别
//普通函数调用时可以发生自动类型转换(隐式类型转换)
//函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
//int myAadd(int a, int b)
//{
// return a + b;
// }
// myAadd(10,"c");//不会报错,隐式类型转换,转为ACI码相加
//template<typename T>
//T myAdd02(T a, T b)
//{
// return a + b;
//}
// myAadd02(10,"c");//会报错,隐式类型不能转换
//1.2.5普通函数与函数模板的调用规则
//调用规则如下:
//1.如果函数模板和普通函数都可以实现,优先调用普通函数
//2.可通过空模板参数列表来强调调用函数模板
//3.函数模板也可以发生重载
//4.如果函数模板可以产生更好的匹配,优先调用函数模板 //void myPrint(int a,int b)
//{
// cout<<"调用的模板"<<endl;
// }
//
//template<class T>
//void myPrint(T a,T b)
//{
// cout<<"调用的模板"<<endl;
//}
//template<class T>
//void myPrint(T a,T b , T c)
//{
// cout<<"调用的重载的模板"<<endl;
//
//void test01()
//{
// int a = 10;
// int b = 20;
//
// myPrint(a,b);//优先调用普通函数
//通过空模板参数列表,强制调用函数模板
// myprint<>(a,b);
// myprint(a,b,c); 函数模板也可以发生重载 //如果函数模板产生更好的匹配,优先调用函数模板
// char c1 = "a";
// char c2 = "b";
// myprint(c1,c2); // 调用的是模板
//}
//1.2.6模板的局限性
//模板的通用并不是万能的
//例如
//如果传入的 a 和 b 是一个数组,就无法实现了
//template<class T>
//void f(T a,T b)
//{
// a = b;
//}
//再例如:
//template<class T>
//void f(T a, T b)
//{
// if(a > b){
//
// }
//}
//在上述代码中,如果T的数据类型传入的是像Person这样的自定义数据类型,也无法正常运行
class person{
public:person(string name,int age){this->myname = name;this->myage = age;}string myname;int myage;
};
template<class T>
bool equals (T &a,T &b)
{if(a == b){return true ;}else{return false;}
}
//利用具体化person的版本实现代码,具体化优先调用
template<>bool equals(person &p1,person &p2){if(p1.myname == p2.myname && p1.myage == p2.myage){return true;}else{return false;}
} void test03()
{cout<<"************test03**********"<<endl<<"********模板的局限性*******"<<endl;int a = 10;int b = 10;int ret = equals (a,b);if(ret){cout<<"a等于b"<<endl; }else{cout<<"a不等于b"<<endl;}
}void test04()
{cout<<"************test04**********"<<endl<<"********模板的局限性*******"<<endl;person p1("tom",10);person p2("tom",10);bool ret = equals(p1,p2);if(ret){cout<<"p1 等于 p2"<<endl; }else{cout<<"p1 不等于 p2"<<endl; }
}
//1.3类模板
//1.3.1类模板语法
//类模板作用:
//建立一个通用类,类中成员 数据类型可以不具体制定,用一个虚拟的类型来代表
//语法:
template<class NameType,class AgeType>
//类
class Person1{public:Person1(NameType name,AgeType age){this->m_Name = name;this->m_age = age;}void showPerson(){cout<<"name:"<<this->m_Name<<" age: "<<this->m_age<<endl;} NameType m_Name;AgeType m_age;
}; void test05()
{cout<<"************test05**********"<<endl<<"************类模板************"<<endl;Person1<string, int>p1("孙悟空",999);p1.showPerson();}
//1.3.2类模板与函数模板区别
//类模板与函数模板主要有两点
//1.类模板没有自动类型推导的使用方式
//Person1 p1("孙悟空",999);//错误无法自动类型推导
//2.类模板在模板参数列表中可以有默认参数
//template<class NameType,class AgeType = int>
//Person1<string>p1("孙悟空",999); // 不会报错,有默认参数
//1.3.3类模板中成员函数创建时机
//类模板中成员函数和普通类中成员函数创建时机是有区别的:
//类模板中的成员函数在调用时才创建
class Person2
{public:void showPerson2(){cout<<"person2 show"<<endl; }}; class Person3
{public:void showPerson3(){cout<<"person3 show"<<endl;}
};template<class T>
class Myclass
{public:T obj;void fun1(){obj.showPerson2();}void fun2(){obj.showPerson3();}
};
void test06()
{cout<<"************test06**********"<<endl<<"********类模板的创建时机*******"<<endl;Myclass<Person2> m;m.fun1();//m.fun2(); fun2 报错 ,Person2类只能使用fun1函数 }
//1.3.4类模板对象做函数参数
//三种传入方式:
//1.指定传入的类型 --- 直接显示对象的数据类型
template<class T1,class T2>
class Person4
{public:Person4(T1 name, T2 age){this->m_name = name;this->m_age = age;} void showPerson(){cout<<"姓名:"<<m_name<<" 年龄:"<<m_age<<endl; }T1 m_name;T2 m_age;
}; void printPerson4_0(Person4<string, int>&p) //指定传入的类型
{p.showPerson();
}
//2.参数模板化 ---将对象中的参数变为模板进行传递
template<class T1,class T2>
void printPerson4_1(Person4<T1, T2>&p)
{p.showPerson();
// cout<<"T1的类型为:"<<typeid(T1).name()<<endl; // 查看T1的数据类型
}
//3.整个类模板化 ---将这个对象类型模板化进行传递
template<class T>
void printPerson4_2(T &p)
{p.showPerson();
// cout<<"T1的类型为:"<<typeid(T1).name()<<endl; // 查看T1的数据类型
}
void test07()
{cout<<"************test07**********"<<endl<<"********类模板对象做函数参数*******"<<endl;Person4<string, int>p("天蓬元帅",1999);printPerson4_0(p);printPerson4_1(p);printPerson4_2(p);
}
//1.3.5类模板与继承
//当子类继承的父类是一个类模板时,子类在声明的时候,要指出父类中T的类型
//如果不指定,编译器无法给子类分配内存
//如果想灵活指定出父类中T的类型,子类也需变为类模板
//
//template<class T>
//class Base
//{
// T m;
//};
class Son:public Base //错误,必须要知道父类中的T类型,才能继承给子类
//
//class Son:public Base<int>
//{
//
//};
//
//template<class T1,class T2>
//class Son1:public Base<T2>
//{
// T1 obj;
//};
//Son1<int,char> s; // 调用
//1.3.6 类模板成员函数类外实现
template<class T1,class T2>
class Person5
{public:Person5(T1 name, T2 age);
// {
// this->m_name = name;
// this->m_age = age;
// } void showPerson();
// {
// cout<<"姓名:"<<m_name<<" 年龄:"<<m_age<<endl;
// }T1 m_name;T2 m_age;
};//构造函数内外实现
template<class T1,class T2>
Person5<T1,T2>::Person5(T1 name, T2 age)
{this->m_name = name;this->m_age = age;
}
//成员函数类外实现
template<class T1,class T2>
void Person5<T1,T2>::showPerson()
{cout<<"姓名:"<<m_name<<" 年龄:"<<m_age<<endl;
}
void test08()
{cout<<"************test08**********"<<endl<<"********类模板成员函数类外实现*******"<<endl;Person5<string, int>p("白骨精",999);p.showPerson();
}
//1.3.7类模板分文件编写
//问题:
//类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
//解决:
//解决1.直接包含.cpp源文件
//解决2.将声明和实现写到同一个文件中,并更改后缀名.hpp..hpp是约定的名称,不是特定
//1.3.8类模板与友元
//全局函数类内实现-直接在类内声明友元即可
//全局函数类外实现-需要提前让编译器知道全局函数的存在//类外实现
template<class T1,class T2>
class Person6;template<class T1,class T2>
void printPerson2(Person6<T1,T2>p)
{cout<<"类外实现--姓名:"<<p.m_name<<" 类外实现--年龄:"<<p.m_age<<endl;
} template<class T1,class T2>
class Person6
{//全局函数,类内实现friend void printPerson(Person6<T1,T2>p){cout<<"类内实现--姓名:"<<p.m_name<<" 类内实现--年龄:"<<p.m_age<<endl;;} //全局函数 类外实现//加空模板参数列表//如果全局函数是类外实现,需要让编译器提前知道这个函数的存在 friend void printPerson2<>(Person6<T1, T2> p);
public:Person6(T1 name,T2 age){this->m_name = name;this->m_age = age;}
private:T1 m_name;T2 m_age; }; void test09(){cout<<"************test09**********"<<endl<<"********全局函数类内实现*******"<<endl;Person6<string, int>p("张飞",456);printPerson(p);Person6<string, int>p1("曹操",736);printPerson2<>(p1); }int main(){test01();cout<<endl;test02(); cout<<endl;test03();cout<<endl;test04();cout<<endl;test05();cout<<endl;test06();cout<<endl;test07();cout<<endl;test08();cout<<endl;test09();cout<<endl;system("pause");return 0;}
相关文章:
c++学习 文件操作,模板
文件操作 #include<iostream> #include<string> #include<fstream> using namespace std; //文本操作 //程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 //通过文件可以数据持久化 //c中对文件操作包含头文件<fstream> /…...

开源与在线 M3U8 Downloader 项目介绍及使用指南
M3U8 是一种用于播放列表格式的文件类型,广泛应用于流媒体服务中,特别是 HLS(HTTP Live Streaming)协议。它包含了一系列的 TS(Transport Stream)视频片段地址,使得视频能够分段加载,…...

正则表达式与文本处理器
正则表达式 基础正大表达式 查看特定字符 grep grep-n the test.txt grep-in the test.txt-n 显示行号 -i 不区分大小写 -v 反转查找 [] :中括号里可以写元素,内容符合任意元素,就会过滤出来 ^ :写在中括号里,代表取反。以^开头&…...
RedisTemplate方法一览表
数据类型RedisTemplate 方法Redis命令解释应用场景stringopsForValue().set(key, value)SET设置存储在指定 key 下的值存储简单数据,如用户的设置、配置项opsForValue().get(key)GET获取存储在指定 key 下的值读取存储的数据,如用户信息、配置参数opsFor…...
个人对devops的一点见解
DevOps 是一种将开发(Development)和运维(Operations)相结合的理念和实践方法。 它强调打破开发团队和运维团队之间的传统壁垒,促进两个团队之间更紧密的协作和沟通,以实现更高效、更快速、更可靠的软件交付…...
HarmonyOS鸿蒙应用开发基础知识
参考 HarmonyOS鸿蒙应用开发 (二、应用程序包结构理解及Ability的跳转,与Android的对比)_hap(harmonyos ability package)包的开发-CSDN博客 HarmonyOS NEXT下一代编程语言仓颉介绍及入门-CSDN博客...

Halcon 根据霍夫变换在图像中寻找直线
一 霍夫变换 1 定义 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一.几何形状包括圆,椭圆,直线等等. 2 直线方程 直线的方程可以用yk*xb 来表示,其中k和b是参数,分别是斜率和截距; 3 霍夫变换原理: 设…...

基于Openmv的追小球的云台
介绍 在这篇文章,我会先介绍需要用到且需要注意的函数,之后再给出整体代码 在追小球的云台中,比较重要的部分就是云台(实质上就是舵机)的控制以及对识别的色块位置进行处理得到相应信息后控制云台进行运动 1、舵机模…...
关于scrapy模块中setting.py文件的介绍
作用 在Scrapy框架中,settings.py 文件起着非常重要的作用,它用于配置和控制整个Scrapy爬虫项目的行为、性能和功能。 setting.py文件的介绍 # Scrapy settings for haodaifu project # # For simplicity, this file contains only settings consider…...
laravel Blade 指令的趣味性
首先,我们通过几个要点来解释 Blade 引擎的工作原理。 您选择一个 Blade 模板进行渲染。引擎使用一系列正则表达式来解析和编译模板。该引擎生成一个普通的 PHP 文件并将其写入磁盘(以便将其缓存以供将来渲染)。包含 PHP 文件并使用输出缓冲…...

【面试题】等保(等级保护)的工作流程
等保(等级保护)的工作流程主要包括以下几个步骤,以下将详细分点介绍: 系统定级: 确定定级对象:根据《信息系统等级保护管理办法》和《信息系统等级保护定级指南》的要求,确定需要进行等级保护的…...
python调用麦克风和扬声器,并调用阿里云实时语音转文字
import time import queue import sounddevice as sd import numpy as np import nls import sys# 阿里云配置信息 URL "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1" TOKEN "XXXX" # 参考https://help.aliyun.com/document_detail/450255.html获…...
描述在React中集成第三方库(如Redux或React Router)的常见模式。
在React中集成第三方库,如状态管理库Redux或路由库React Router,通常遵循一些常见的模式和最佳实践。下面是一些集成这些库的步骤和模式: 集成Redux 安装Redux及相关包: 安装Redux及其中间件(如redux-thunk或redux-saga…...
JavaScript语法特性篇-空值合并运算符(??)
1、基本使用 空值合并运算符(??)英文名称为 Nullish coalescing operator,是一个逻辑运算符。 特性:当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。 const foo nul…...

rancher快照备份至S3
巧用rancher的S3快照备份功能,快速实现集群复制、集群转移、完全崩溃后的极限修复 1.进入集群管理,在对应的集群菜单后,点击编辑配置 2.选择ETCD,启用,Backup Snapshots to S3选项 并填入你的minio 3 配置成功后 手…...

ChatGPT API教程在线对接OpenAI APIKey技术教程
一、OpenAI基本库介绍 您可以通过 HTTP 请求与 API 进行交互,这可以通过任何编程语言实现。我们提供官方的 Python 绑定、官方的 Node.js 库,以及由社区维护的库。 要安装官方的 Python 绑定,请运行以下命令: pip install open…...
随心而遇,跟着感觉走
分数限制下,选好专业还是选好学校? 24年高考结束,很多学生犹豫选择专业还是好学校,我的建议是,选择好学校。 本人体验来说,电子,工地,计科,数学,工科相关的…...
LeetCode题练习与总结:只出现一次的数字--136
一、题目描述 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : …...
常见的中间件都在解决什么问题?
常见的中间件都在解决什么问题 RocketMQ RocketMQ 是一款功能强大的分布式消息系统。 RocketMQ 源码地址:https://github.com/apache/rocketmq(opens new window) RocketMQ 官方网站:https://rocketmq.apache.org 什么场景下用 RocketMQ?…...
微信小程序-scroll-view实现上拉加载和下拉刷新
一.scroll-view实现上拉加载 scroll-view组件通过自身一些属性实现上拉加载的功能。 lower-threshold“100"属性表示距离底部多少px就会实现触发下拉加载的事件。 类似于在.json文件里面配置"onReachBottomDistance”: 100 bindscrolltolower"getMore"属…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...