【C++】C++应用案例-dolphin海豚记账本
目录
一、整体介绍
1.1、需求和目标
1.2、整体功能描述
二、页面及功能描述
2.1 主菜单
2.2 记账菜单
2.3 查询菜单
2.4 退出功能
三、流程设计
3.1 主流程
3.2 记账操作流程
3.3 查询操作流程
四、代码设计
4.1 核心思路
4.2 项目文件分类设计
4.2.1 头文件
4.2.2 源文件
4.2.3 代码实现步骤
4.3 代码具体实现
4.3.1 定义头文件
4.3.2 实现主体流程
4.3.3 绘制菜单
4.3.4 读取键盘输入
4.3.5 实现具体操作功能
一、整体介绍
1.1、需求和目标
项目的需求,实现一个叫做“海豚记账簿”的基于命令行界面的家庭记账软件。
我们的目标,是通过项目练习,初步掌握编写软件的方法和技巧。
1.2、整体功能描述
这个软件相对简单,只需要基于命令行做纯文本的交互,不涉及图形化界面。作为一个记账软件,主要有两大功能:记账和查询。也就是说,软件需要能够记录家庭中的每一笔收入、支出的账目,并提供查询收支明细的功能。而且为了让软件有真正的实用价值,需要对数据做持久保存:我们这里只需要存放在一个指定的文本文件中。
项目采用分级菜单方式,每一级菜单应该有“返回主菜单”功能;主菜单有“退出”选项。
二、页面及功能描述
2.1 主菜单
运行软件后首先应该显示主菜单。主菜单提供三个选项:“记账”、“查询”和“退出”,并在下方提示用户输入1-3的数字,选择不同的功能。
主菜单界面如下:
2.2 记账菜单
在主菜单页面选择“1”,可以进入记账菜单(二级菜单)。记账菜单提供三个选项:“收入”、“支出”和“返回主菜单”;并在下方提示用户按对应的数字进行功能选择。
记账菜单界面如下:
在记账菜单页面选择“1”,可以记录一笔收入账目。账目信息包括:类型(收入/支出)、金额、备注。这里需要提示用户输入账目的金额和备注信息,然后显示完成记账。
类似地,在记账菜单页面选择“2”,可以记录一笔支出账目。提示用户输入账目的金额和备注信息,然后显示完成记账。
2.3 查询菜单
在主菜单页面选择“2”,可以进入查询菜单。查询菜单提供四个选项:“统计所有账目”、“统计收入”、“统计支出”和“返回主菜单”;并在下方提示用户按对应的数字进行功能选择。
查询菜单界面如下:
在查询菜单页面,选择“1”可以查询所有账目;选择“2”可以查询所有收入;选择“3”可以查询所有支出。用户选择之后,除了应该显示对应的账目明细外,还应该对所有账目进行统计汇总。
对应地,选择“1”之后列出所有账目,统计的是总收支;选择“2”之后列出所有收入,统计总收入;选择“3”之后列出所有支出,统计总支出。
2.4 退出功能
在主菜单页面,选择“3”可以退出软件。页面将做确认退出的对话提醒:如果用户输入“Y”则退出,输入“N”则返回主菜单页面。
三、流程设计
3.1 主流程
3.2 记账操作流程
3.3 查询操作流程
四、代码设计
4.1 核心思路
记账软件处理的数据,就是收入或者支出的“账目”。每一条账目数据,都应该包含收支类型、金额、备注三部分,这可以构建一个结构体类型 AccountItem 来表示。
而程序运行的开始,应该读取保存在文件中的数据,读取之后应该是一个 AccountItem 类型的数组。
在流程控制方面,如果用户不选择退出,程序就不会结束,所以应该用一个while循环来处理整个流程;当用户确认退出时,更改一个标志位,用来退出循环。
每一级菜单做键盘选择后,可以用 switch 分支语句来处理;不同的功能模块,可以包装成函数。
4.2 项目文件分类设计
4.2.1 头文件
对于一个C++项目来说,构建整体架构很重要的一步就是定义头文件。一般我们会把全局变量、函数声明、以及结构体的定义都放在头文件中。
本项目可以设计两个头文件,来管理不同的内容:
- 结构体 AccountItem 的定义,以及涉及到账目操作的函数声明,都可以放在一个头文件 account_item.h 中;
- 其它一些通用的设置和功能性函数,可以放在另一个头文件common.h 中
4.2.2 源文件
真正的代码实现都放在源文件中。根据不同的用途,项目中可以用四个源文件来实现对应的功能
- 主体代码可以放在一个源文件 dolphin_acount.cpp 中
- 绘制菜单的函数都放在menus.cpp中
- 通用函数(比如读取键盘输入)放在read_input.cpp中
- 针对账目的所有操作函数(比如记账、查询)全部放在operations.cpp中
4.2.3 代码实现步骤
1、实现整体框架和主题流程
- 在头文件account_item.h中定义好结构体;在common.h 中定义通用配置
- 在源文件dolphin_acount.cpp的主函数中,参照主流程图实现主体流程
2、填充具体功能
- 在menus.cpp中定义绘制各级菜单的函数;函数声明放在common.h里
- 在read_input.cpp中定义读取键盘输入的函数,包括读取菜单选择、读取输入的金额数、读取确认退出信息;这些函数都需要对输入做合法性校验,并返回正确的值;函数声明放在common.h里
- 在operations.cpp中定义从文件加载数据、记账、查询对应的函数。
3、各功能的细分
1)记账功能
- 首先需要读取键盘输入的金额和备注信息;
- 然后将其保存在一个AccounItem对象中,并添加到vector,同时写入文件
2)查询功能
- 需要用for循环遍历整个vector
- 通过条件筛选需要的账目打印输出,并统计总和
3)退出功能
- 提示用户确认退出
- 用户确认后,更改循环标志位,退出循环
4.3 代码具体实现
4.3.1 定义头文件
首先可以在common.h中,引入相应的库,定义出需要的全局变量,以及声明绘制菜单和读取键盘输入的通用函数。通用设置,通用功能性函数声明。
#pragma once
//通用设置,通用功能性函数声明
#include<iostream> //输入输出
#include<string> //字符串操作
#include<fstream> //文件操作
#include<vector>
using namespace std;#define INCOME "收入"
#define EXPAND "支出"
#define FILENAME "AccountBook.txt"//通用功能性函数声明
//绘制菜单的函数
void showMainMenu();
void showAccountingMenu();
void showQueryMenu();//读取键盘输入进行合法性校验的函数
char readMenuSelection(int options);
char readQuitConfirm();
int readAmount();
然后在account_item.h定义核心数据结构:结构体 AccountItem ,并声明涉及到账目操作的函数。结构体定义,涉及账目操作的函数声明。
#pragma once
//结构体定义,涉及账目操作的函数声明
#include "common.h"//定义结构体类型
struct AccountItem {string itemType;int amount; //金额string detail; //备注信息
};//针对账目数据进行操作的函数声明//加载账目数据
void loadDataFromFile(vector<AccountItem>& items);// 记账
void accounting(vector<AccountItem>& items);
void insertIntoFile(const AccountItem& item);
void expand(vector<AccountItem>& items);
void income(vector<AccountItem>& items);// 查询
void query(const vector<AccountItem>& items);
void queryItems(const vector<AccountItem>& items);
void queryItems(const vector<AccountItem>& items, const string itemType);
void printItem(const AccountItem& item);
4.3.2 实现主体流程
在源文件 dolphin_acount.cpp 的主函数中,参照主流程图实现主体流程。
代码如下:
//主体代码
#include "account_item.h"
#include "common.h"int main() {//1、加载文件中的账目数据vector<AccountItem> items;loadDataFromFile(items);bool quit = false;while (!quit) { //2、显示主菜单showMainMenu();//3、读取主菜单键盘选择,并做合法性校验char key = readMenuSelection(3);switch (key) {case '1': //1、记账showAccountingMenu(); //记账显示菜单accounting(items); //记账功能函数break;case '2': //2、查询showQueryMenu(); //查询显示菜单 query(items); //查询功能函数break;case '3': //3、退出cout << "\n确认退出? (Y/N):";if (readQuitConfirm() == 'Y')quit = true;break;default:break;}}}
4.3.3 绘制菜单
在 menus.cpp 中定义绘制各级菜单的函数;对应的函数声明放在 common.h里。
代码如下:
//菜单函数
#include "common.h"//绘制主菜单
void showMainMenu() {system("cls"); //清屏cout << "-------------------------------------------------------" << endl;cout << "|================ 欢迎使用海豚记账簿 =================|" << endl;cout << "| |" << endl;cout << "|*************** 1 记 账 ********************|" << endl;cout << "|*************** 2 查 询 ********************|" << endl;cout << "|*************** 3 退 出 ********************|" << endl;cout << "|_____________________________________________________|" << endl;cout << "\n请选择(1 - 3):";
}//绘制记账菜单
void showAccountingMenu() {cout << "-------------------------------------------------------" << endl;cout << "|=============== 选择记账种类 ====================|" << endl;cout << "| |" << endl;cout << "|*************** 1 收 入 ********************|" << endl;cout << "|*************** 2 支 出 ********************|" << endl;cout << "|*************** 3 返回主菜单 ********************|" << endl;cout << "|_____________________________________________________|" << endl;cout << "\n请选择(1 - 3):";}//绘制查询菜单
void showQueryMenu(){cout << "-------------------------------------------------------" << endl;cout << "|=============== 选择查询条件 ====================|" << endl;cout << "| |" << endl;cout << "|*************** 1 统计所有账目 ********************|" << endl;cout << "|*************** 2 统 计 收 入 ********************|" << endl;cout << "|*************** 3 统 计 支 出 ********************|" << endl;cout << "|*************** 4 返回主菜单 ********************|" << endl;cout << "|_____________________________________________________|" << endl;cout << "\n请选择(1 - 4):";}
4.3.4 读取键盘输入
在 read_input.cpp 中定义读取键盘输入的函数,包括读取菜单选择、读取输入的金额数、读取确认退出信息;这些函数都需要对输入做合法性校验,并返回正确的值。
代码如下:
//读取输入函数
#include "account_item.h"
#include "common.h"//读取键盘输入的菜单选项,进行合法性校验
char readMenuSelection(int options) {string str;while (true){getline(cin, str);//进行合法化校验if (str.size() == !1 || str[0] - '0' <= 0 || str[0] - '0' > options)cout << "输入错误,请重新选择:";elsebreak;}//输入合法return str[0];}//读取确认退出信息,并进行合法性校验
char readQuitConfirm() {string str;while (true){getline(cin, str);//进行合法性校验if (str.size() != 1 || toupper(str[0]) != 'Y' && toupper(str[0]) != 'N') cout << "输入错误,请重新选择:";elsebreak;}//输入合法return toupper(str[0]);
}//读取键盘输入的金额数,并做合法性校验
int readAmount() {int amount;string str;while (true){getline(cin, str);//进行合法性校验try{amount = stoi(str);break;}catch (invalid_argument e){cout << "输入错误,请正确输入数字:";}}//输入合法return amount;
}
4.3.5 实现具体操作功能
在 operations.cpp 中,定义从文件加载数据、记账、查询等操作对应的函数。
- (1)从文件加载数据
loadDataFromFile():逐行读取文件中数据,按空格将每个词赋值给AccountItem中的每个成员,得到一个AccountItem对象,并把它保存到数组中。
由于数组长度是固定的,这里应该用可变长的容器对象vector<AccountItem>来保存;为了能够在函数中修改vector,应该把它的引用作为函数参数传入。
- (2)记账功能
首先需要读取键盘输入的金额和备注信息;然后将其保存在一个AccountItem 对象中,并添加到数组,同时写入文件。
accounting():记账主体函数
income():记录一笔收入,将数据添加到vector中,并调用insertIntoFile()函数,写入文件做持久化保存
expand():记录一笔支出,将数据添加到vector中,并调用insertIntoFile()函数,写入文件做持久化保存
insertIntoFile():将一条账目写入文件中。
- (3)查询功能
需要用for循环遍历整个数组,通过条件筛选需要的账目打印输出,并统计总和。
query():查询主体函数
queryItems():查询账目功能函数,遍历所有账目,统计总收支。
具体代码如下:
//涉及账目操作的函数
#include "account_item.h"
#include "common.h"//读取文件中的账目数据
void loadDataFromFile(vector<AccountItem>& items) {ifstream input(FILENAME);//逐行读取每一条数据,包装成AccountItem对象AccountItem item;string line;while (input>>item.itemType>>item.amount>>item.detail) {items.push_back(item);}input.close();
}//--------------------------------1、记账----------------------------------------------------------
//记账操作
void accounting(vector<AccountItem>& items) {//读取键盘选择,并做合法化校验char key = readMenuSelection(3);switch (key){case '1': //1、收入income(items);break;case '2': //2、支出expand(items);break;case '3': //3、返回主菜单break;default:break;}
}//记录一笔收入
void income(vector<AccountItem>& items) {//新构建一个AccountItem对象AccountItem item;//类型已经确定,就是收入item.itemType = INCOME;//与用户交互,键盘输入金额和备注信息cout << "\n本次收入金额:";item.amount = readAmount();cout << "\n备注:";getline(cin, item.detail);//添加到vector中items.push_back(item);//写入文件做持久化保存insertIntoFile(item);//显示成功信息cout << "\n------------------记账 成功!------------------\n";cout << "\n请按回车键返回主菜单......" << endl;string str;getline(cin, str);
}
//记录一笔支出
void expand(vector<AccountItem>& items) {//新构建一个AccountItem对象AccountItem item;//类型已经确定,就是收入item.itemType = EXPAND;//与用户交互,键盘输入金额和备注信息cout << "\n本次支出金额:";item.amount = -readAmount();cout << "\n备注:";getline(cin, item.detail);//添加到vector中items.push_back(item);//写入文件做持久化保存insertIntoFile(item);//显示成功信息cout << "\n------------------记账 成功!------------------\n";cout << "\n请按回车键返回主菜单......" << endl;string line;getline(cin, line);
}
//将一条账目写入文件中
void insertIntoFile(const AccountItem& item) {//创建一个ofstream对象,第二个参数表示以追加的方式进行写入ofstream output(FILENAME, ios::out | ios::app);output << item.itemType << "\t" << item.amount << "\t" << item.detail << endl;output.close();
}//---------------------------------2、查询---------------------------------------------------
//查询操作
void query(const vector<AccountItem>& items) {//读取键盘选择,并做合法性校验char key = readMenuSelection(4);switch (key){case '1': //1、查询所有账目,并统计总收支queryItems(items);break;case '2': //2、查询所有账目,并统计总收入queryItems(items,INCOME);break;case '3': //3、查询所有账目,并统计总支出queryItems(items, EXPAND);break;default:break;}
}//查询账目功能函数
void queryItems(const vector<AccountItem>& items) {cout << "--------------------查询结果-------------------------" << endl;cout << "\n类型\t\t金额\t\t备注\n" << endl;//遍历所有账目,统计总收支int total = 0;for (auto item : items) {printItem(item);total += item.amount;}//输出信息cout << "==============================================" << endl;cout << "总收支:" << total << endl;cout << "\n请按回车键返回主菜单......" << endl;string line;getline(cin, line);
}//函数重载,查询账目功能函数
void queryItems(const vector<AccountItem>& items,const string itemType) {cout << "--------------------查询结果-------------------------" << endl;cout << "\n类型\t\t金额\t\t备注\n" << endl;//遍历所有账目,统计总收入或总支出int total = 0;for (auto item : items) {if (item.itemType != itemType) {continue;}printItem(item);total += item.amount;}//输出信息cout << "==============================================" << endl;cout << ((itemType == INCOME) ? "总收入:" : "总收入:" )<< total << endl;cout << "\n请按回车键返回主菜单......" << endl;string line;getline(cin, line);
}//打印输出一条账目信息
void printItem(const AccountItem& item) {cout << item.itemType << "\t\t" << item.amount << "\t\t" << item.detail << endl;
}
至此,我们就完成了对海豚记账簿的设计与实现啦,你也快去试一下吧~
相关文章:
【C++】C++应用案例-dolphin海豚记账本
目录 一、整体介绍 1.1、需求和目标 1.2、整体功能描述 二、页面及功能描述 2.1 主菜单 2.2 记账菜单 2.3 查询菜单 2.4 退出功能 三、流程设计 3.1 主流程 3.2 记账操作流程 3.3 查询操作流程 四、代码设计 4.1 核心思路 4.2 项目文件分类设计 4.2.1 头文件 …...
Matlab数据处理学习笔记
1 :数据清洗 注:数据读取 (1)读取工作表 % 指定要读取的工作表 filename sales_data.xlsx; sheetName Sheet2; % 或者使用工作表编号,例如:sheetNumber 2;% 读取指定工作表的数据 data readtable(fi…...
浏览器中的同源策略、CORS 以及相关的 Fetch API 使用
前言 笔者对前端 Web 技术的认真学习,其实开始于与 Fetch API 的邂逅。当时觉得 fetch() 的设计很不错,也很希望能够请求其它网站下的数据并作处理和展示。学习过程中 HTML 和 CSS 都还好说,由于几乎没有 Web 技术的基础,学习 Fe…...
爬虫 APP 逆向 ---> 粉笔考研
环境: 粉笔考研 v6.3.15:https://www.wandoujia.com/apps/1220941/history_v6031500雷电9 模拟器:https://www.ldmnq.com/安装 magisk:https://blog.csdn.net/Ruaki/article/details/135580772安装 Dia 插件 (作用:禁…...
2024河南萌新联赛第(三)场 河南大学
B. 正则表达式 题目: https://ac.nowcoder.com/acm/contest/87865/B 给出n个地址,每个地址的形式为x.x.x.x,找四个x都满足x>0&&x<255的个数 思路: 首先定义四个数组和一个字符,然后按题目所给的形式…...
回溯法---分割回文串
题目:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。 思路: 第一步:确定参数与返回值。参数为字符串s,分割起始下标startIndex,无返回值 第二…...
DDR等长,到底长度差多少叫等长?
DDR4看这一篇就够了 - 知乎 (zhihu.com) 【全网首发】DDR4 PCB设计规范&设计要点PCB资源PCB联盟网 - Powered by Discuz! (pcbbar.com) 终于看到较为权威的DDR4等长要求了: !!!! 依据这个要求,H616项目的等长线不合格:...
程序员面试题------N皇后问题算法实现
N皇后问题是一个著名的计算机科学问题,它要求在NN的棋盘上放置N个皇后,使得它们之间不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题可以看作是一个回溯算法问题,通过逐步尝试不同的放置位置…...
【C++学习】6、继承
1、什么是继承? 继承描述的是类与类之间的关系,A类继承B类,A类就拥有B类的数据和方法。 继承的方式: 公有继承(public) 保护继承(protected) 私有继承(private&…...
从零开始的MicroPython(三) 按键与外部中断
上一篇:从零开始的MicroPython(二) GPIO及点灯代码 文章目录 前言硬件原理软件原理注意代码编写轮询外部中断其他 前言 点灯是嵌入式GPIO输出的典型,按键则是输入的典型。 硬件原理 按键对角接通。 软件原理 如果是一端接高电平,一端接单…...
Windows下编译安装Kratos
Kratos是一款开源跨平台的多物理场有限元框架。本文记录在Windows下编译Kratos的流程。 Ref. from Kratos KRATOS Multiphysics ("Kratos") is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, a…...
汽车-腾讯2023笔试(codefun2000)
题目链接 汽车-腾讯2023笔试(codefun2000) 题目内容 现在塔子哥有 n 个汽车,所有的汽车都在数轴上,每个汽车有1.位置 pos 2.速度 v ,它们都以在数轴上以向右为正方向作匀速直线运动。 塔子哥可以进行任意次以下操作:选择两个汽车…...
软测面试二十问(最新面试)
1.软件测试的流程是什么 参加需求评审会,解决需求疑问---写测试用例---对测试用例进行评审---评审后开始执行测试---提交bug---追踪bug---关闭bug---回归测试---交叉测试---编写测试报告---冒烟测试 2.什么是黑盒测试和白盒测试?它们有何区别 黑盒测试…...
风吸杀虫灯采用新型技术 无公害诱虫捕虫
TH-FD2S】风吸杀虫灯利用害虫的趋光性和对特定波长的光源(如紫外光、蓝光)的敏感性,通过光波引诱害虫成虫扑灯。同时,内置的风扇产生强烈的气流,形成负压区,将害虫迅速吸入到收集器中。害虫在收集器内被风干…...
随手记录第十二话 -- JDK8-21版本的新增特性记录(Lambda,var,switch,instanceof,record,virtual虚拟线程等)
本文主要用于记录jdk8以来的新增特性及使用方法! 1.Java8 Lambda表达式(8) 1.1 方法引用 List<String> list List.of("1", "2", "3");list.forEach(i -> System.out.println(i));//方法引用list.forEach(System.out::println);1.2 接…...
SpringCloud网关 SpringBoot服务 HTTP/HTTPS路由/监听双支持
背景 一般来说SpringCloud Gateway到后面服务的路由属于内网交互,因此路由方式是否是Https就显得不是那么重要了。事实上也确实如此,大多数的应用开发时基本都是直接Http就过去了,不会一开始就是直接上Https。然而随着时间的推移,…...
JavaScript做网页是否过期的处理
通过路由上的参数生成唯一md5和路由上token做验证_md5 token-CSDN博客 前言:基于这篇文章我们做网页是否超时,网页是否过期的处理。打开一个网页允许他在一定时间内可以访问,过了这个时间就不可以访问了,encrypt是h5加密方法&…...
python coding时遇到的问题
Q:只有cpu的时候加载模型 A:checkpoint torch.load(model_path, map_locationtorch.device(‘cpu’)) Q:vscode的文件路径和spyder的不一样 A:在vscode中,右键要用的文件,选择“文件相对路径”...
攻防演练号角吹响,聚铭铭察高级威胁检测系统助您零失分打赢重保攻坚战
在数字化浪潮中,攻防演练成为了衡量网络安全防御力的核心标尺,其重要性与日俱增。这项由政府、行业监管或企业内部主导的安全活动,随着互联网普及而兴起,现已发展成为全球公认的检验网络安全体系效能的标准。它不仅关乎技术实力的…...
个人量化交易兴起!有什么好用的量化软件推荐?迅投QMT量化平台简介!
QMT是专门为机构、活跃投资者、高净值客户等专业投资者研发的智能量化交易终端,拥有高速行情、极速交易、策略交易、多维度风控等专业功能,满足专业投资者的特殊交易需求。覆盖业务范围广:沪深A股、港股通、两融、期权、期货。 适合用QMT的投资者&#x…...
SQL labs-SQL注入(七,sqlmap对于post传参方式的注入,2)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。参考:SQL注入之Header注入_sqlmap header注入-CSDN博客 序言: 本文主要讲解基于SQL labs靶场,sqlmap工具进行的post传参方式的SQL注入,…...
SAM 2: Segment Anything in Images and Videos
Introduction 提出的目的: 1.现有的应用像自动驾驶,AR等来说都是需要temporal localization beyond image-level segmentation(时序定位而不仅是图片分割) 2. 一个好的分割模型不应该仅仅局限于图片领域,而是图视频两…...
软件测试面试,如何自我介绍?
又是一年金九银十,相信不少小伙伴都在准备跳槽面试,而面试中一个必不可少的环节就是自我介绍,所以,今天我们就来聊一聊软件测试面试中如何自我介绍。 为什么要自我介绍 在讨论如何自我介绍之前,我们先来讨论一下为…...
力扣第四十七题——全排列II
内容介绍 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] 输出:[[1,2,3],…...
Springer旗下中科院2区TOP,国人优势大!
关注GZH【欧亚科睿学术】,第一时间了解期刊最新动态! 1 通信网络类 【期刊简介】IF:4.0-5.0,JCR1区,中科院3区 【出版社】ELSEVIER出版社 【检索情况】SCIE&EI双检,CCF-C类 【征稿领域】通信网络的…...
【C++】C++入门知识详解(下)
大家好~我们接着【C】C入门知识详解(上)-CSDN博客来介绍另一些C入门基础知识。 1.缺省值和缺省参数 缺省参数就是声明或定义函数时为函数的参数指定一个缺省参数。在调用该函数时,如果没有指定实参,则采用该形参的缺省值…...
分压电阻方式的ADC电压校准
无人机有个流程是电池电压校准。具体做法是:让你用万用表测量一下电池两端的电压,然后输入到文本框中,电机计算能重新计算出电压分压器的值,从而获得电池电压值。 这种方法实现的原理是这样的: 电阻分压检测电压原理,以上图为例: 当电路确定时,R2/(R1+R2)是一个定值R,…...
使用Postman测试API短轮询机制:深入指南
短轮询是一种Web开发中常用的技术,用于在客户端和服务器之间定期检查更新。与长轮询或WebSockets等技术相比,短轮询简单易实现,但可能带来较多的HTTP请求,从而增加服务器负担。Postman作为一个强大的API测试工具,可以用…...
明清进士人数数据
明清进士人数数据 指标:省份名称、城市名称、区县名称、明清各省进士人数、明清各城市进士人数、明清各县区进士人数 指标说明: Province[省份名称]-统计数据所属省份 City[城市名称]-统计数据所属地级市 Region[区县名称]-统计数据所属区县 MQpro…...
C# 串口通信(通过serialPort控件发送及接收数据)
连接串口 界面设计打开串口发送数据通过文件发送发送数据 接收数据 首先可以在 工具箱中搜索serialport,将控件拖到你的Winfrom窗口。 界面设计 打开串口 private void Connect_Click(object sender, EventArgs e){serialPort1.PortName comboBox2.Text;//端口名s…...
南阳网站建设公司/在线域名查询网站
一、背景:还是不得不提及iPhone的伟大创造性工作,用手势识别来操作手机,特别是对于滚动条,想想之前是何等的痛苦,拿着触摸板,在那个只有几个像素的滚动条上又是拉又是点的。在WM6.5没有出来之前,…...
北京海淀建设支行有哪些/网站优化技术
<style media"print">page {size: auto;margin: 0mm;} </style>转载于:https://www.cnblogs.com/rockyan/p/8393917.html...
paypal可做网站/5188关键词平台
前一阵子团队组织了敏捷和TDD的培训,这里记录一下。 1.敏捷开发 1)敏捷宣言 我们一直在实践中探寻更好的软件开发方法,身体力行的同时也帮助他人,由此我们建立了如下价值观:个体和互动 高于 流程和工具 工作的软件 …...
做网站要用什么服务器/2024年最新时事新闻
第2章基本程序设计 作者:wwj 复习题 2.2~2.7节 2.1.下列哪些标识符是合法的?哪些是java关键字? applet ,Applet , a , --a , 4#R , $4 , #44 , apps , class , public , int ,x ,y ,radius 解:合法:…...
自己电脑做服务器上传网站 需要备案吗/seo如何进行优化
转自:http://www.cnblogs.com/wrmfw/archive/2012/01/21/2328534.html 你发现快要过年了,于是想给你的女朋友买一件毛衣,你打开了www.taobao.com。这时你的浏览器首先查询DNS服务器,将 www.taobao.com转换成ip地址。不过首先你会发…...
2010年最具人气的平面设计师必备网站/百度店铺怎么开通
此题为某年微软面试题。转载于:https://www.cnblogs.com/SCUTMSTechClub/archive/2010/10/18/1855212.html...