C++实现树的基本操作,界面友好,操作方便,运行流畅,运用模板

复制代码
 Ⅰ.说明:1.采用左孩子右兄弟的方式,转化为二叉树来实现。2.树的后根遍历与二叉树的中根遍历即有联系又有区别,请读者注意分析体会。Ⅱ.功能:1.创建树并写入数据2.先根遍历树3.计算树高4.后根遍历树5.层次遍历树6.搜索数据域为某值的结点7.删除数据域为某值的结点及其子树8.销毁树Ⅲ.代码://.h文件#ifndef TREE_H
#define TREE_H#include<iostream>
#include<iomanip>
using namespace std;template<typename T>       //树结点
struct Node            
{T data;Node<T> *left, *right;Node(const T& item);
};template<typename T>        //树结点初始化
Node<T>::Node(const T& item)  
{data = item;left = NULL;right = NULL;
}template<typename T>      //辅助队列,计算树高 Quefh:queue for high    
struct Quefh
{Node<T>* nodrs;       //node's adressint leve;             //levelQuefh<T>* hnext;Quefh(Node<T>* nds, int lel, Quefh<T>* hnxt);
};template<typename T>        //Quefh构造函数
Quefh<T>::Quefh(Node<T>* nds, int lel, Quefh<T>* hnxt)
{nodrs = nds;leve = lel;hnext = hnxt;
}template<typename T>        //辅助队列,查找结点 Quefs:queue for search
struct Quefs                //此队列同时用于层次遍历   
{Node<T>* snodrs;        //Quefs::node's adressQuefs<T>* snext;Quefs(Node<T>* snds, Quefs<T>* snxt);
};template<typename T>          //Quefs构造函数
Quefs<T>::Quefs(Node<T>* snds, Quefs<T>* snxt)
{snodrs = snds;snext = snxt;
}template<typename T>           //辅助队列,删除结点 Quefd:queue for delete
struct Quefd                   //此队列同时在后根遍历中做临时堆栈
{T ddata;Quefd<T>* dnext;Quefd(const T& ddt, Quefd<T>* dnxt);
};template<typename T>           //Quefd构造函数
Quefd<T>::Quefd(const T& ddt, Quefd<T>* dnxt)
{ddata = ddt;dnext = dnxt;
}template<typename T>           //树类
class Tree
{
private:Node<T>* root;Quefh<T> *hhead, *htail;Quefs<T> *shead, *stail;Quefd<T> *dhead, *dtail,*top;int size;int hsize;int ssize;int dsize;
public:Tree();~Tree();void Operate();
private:Node<T>* Creat(Node<T>* &rt);void Destory(Node <T>* t);void Addqh(Node<T>* pn, int levl);void Addqs(Node<T>* spn);  void Addqd(const T& dedata);void Outqh(Node<T>* &pn, int &levl);Node<T>* Outqs();void Delqh();void Delqs();void Delqd();int Couhg(Node<T>* t);Node<T>* GetFather(Node<T>* t, Node<T>* p);void Search(Node<T>* t, const T& item, bool& sign);void Del(Node<T>* t);void D_ShowAll(Quefd<T>* dheader);void FiRoTra(Node<T>* rt, int& ct);void MiRoTra(Node<T>* rt, int& ct);void LeveTra(Node<T>* t);void ShowAll(Quefs<T>* header);Node<T>* Push(Node<T>* t);void PopAll(int& ct);
};template<typename T>           //类构造函数
Tree<T>::Tree()
{root = NULL;hhead = NULL;htail = NULL;shead = NULL;stail = NULL;dhead = NULL;dtail = NULL;top = NULL;size = 0;hsize = 0;ssize = 0;dsize = 0;
}template<typename T>          //类析构函数
Tree<T>::~Tree()
{Destory(root);
}template<typename T>             //Quefh入队一个结点
void Tree<T>::Addqh(Node<T>* pn, int levl)
{if (!hhead){ hhead = htail = new Quefh<T>(pn, levl, NULL); hsize = 1; }else{htail->hnext = new Quefh<T>(pn, levl, NULL);htail = htail->hnext;hsize++;}
}template<typename T>             //Quefh出队一个结点
void Tree<T>::Outqh(Node<T>* &pn, int &levl)
{pn = hhead->nodrs;              levl = hhead->leve;Quefh<T>* itemph;itemph = hhead;hhead = hhead->hnext;delete itemph;hsize--;
}template<typename T>           //清空队列Quefh
void Tree<T>::Delqh()
{while (hhead){Quefh<T>* itemphd;itemphd = hhead; hhead = hhead->hnext; delete itemphd;}
}template<typename T>             //Quefs入队一个结点
void Tree<T>::Addqs(Node<T>* spn)
{if (!shead){ shead = stail = new Quefs<T>(spn, NULL); ssize = 1; }else{stail->snext = new Quefs<T>(spn, NULL);stail = stail->snext;ssize++;}
}template<typename T>             //Quefs出队一个结点
Node<T>* Tree<T>::Outqs()
{Node<T>* pn;pn = shead->snodrs;Quefs<T>* itemps;itemps = shead;shead = shead->snext;delete itemps;ssize--;return pn;
}template<typename T>               //输出队列Quefs内全部元素
void Tree<T>::ShowAll(Quefs<T>* header)
{Quefs<T>* p = header;for (int i = 1; i <= ssize; i++){cout << p->snodrs << "  ";if (i % 5 == 0)cout << endl;p = p->snext;}cout << endl;
}template<typename T>           //清空队列Quefs
void Tree<T>::Delqs()
{Quefs<T>* itempsd;while(shead){ itempsd = shead; shead = shead->snext; delete itempsd; }
}template<typename T>             //Quefd入队一个结点
void Tree<T>::Addqd(const T& dedata)
{if (!dhead){ dhead = dtail = new Quefd<T>(dedata, NULL); dsize = 1; }else{dtail->dnext = new Quefd<T>(dedata, NULL);dtail = dtail->dnext;dsize++;}
}template<typename T>               //输出队列Quefd内全部元素
void Tree<T>::D_ShowAll(Quefd<T>* dheader)
{Quefd<T>* dp = dheader;for (int i = 1; i <= dsize; i++){cout << setiosflags(ios::left);cout << setw(10) << dp->ddata;if (i % 5 == 0)cout << endl;dp = dp->dnext;}cout << endl;
}template<typename T>           //利用结构体Quefd构造的临时堆栈的入队操作
Node<T>* Tree<T>::Push(Node<T>* t)
{while (!t->right){top = new Quefd<T>(t->data, top);t = t->left;}return t;
}template<typename T>            //一次性弹出队列中所有元素
void Tree<T>::PopAll(int& ct)
{while (top){cout << setiosflags(ios::left);cout << setw(10) << top->ddata;ct++;if (ct % 5 == 0)cout << endl;Quefd<T>* itemp4;itemp4 = top; top = top->dnext; delete itemp4;}
}
template<typename T>           //清空队列Quefs
void Tree<T>::Delqd()
{Quefd<T>* itempdd;while (dhead){ itempdd = dhead; dhead = dhead->dnext; delete itempdd; }
}template<typename T>          //创建树
Node<T>* Tree<T>::Creat(Node<T>* &rt)   
{int choice; bool flag;if (size > 0){cout << "是否继续创建子树?是请按1,否请按0:" << endl;cin >> choice;flag = true;}if (size == 0){cout << "请输入根结点数据;" << endl;T data; cin >> data;rt = new Node<T>(data);if (!rt){ cout << "根结点创建失败!" << endl; return NULL; }size++;flag = false;cout << "根结点创建成功!" << endl;cout << "目前树中共有结点" << size << "个。" << endl;}if (flag){if (choice == 0)return 0;else{cout << "请输入子结点数据;" << endl;T data; cin >> data;rt = new Node<T>(data);if (!rt){ cout << "子结点创建失败!" << endl; return NULL; }size++;cout << "子结点创建成功!" << endl;cout << "目前树中共有结点" << size << "个。" << endl;}}Creat(rt->left);Creat(rt->right);return root;
}template<typename T>              //先根递归遍历 FiRoTra是first root traversal的缩写
void Tree<T>::FiRoTra(Node<T>* rt, int& ct)
{if (rt){cout << setiosflags(ios::left);cout << setw(10) << rt->data;ct++;if (ct % 5 == 0)cout << endl;FiRoTra(rt->left, ct);FiRoTra(rt->right, ct);}
}template<typename T>              //中根递归遍历 MiRoTra是middle root traversal的缩写 这里用来进行树的后根遍历
void Tree<T>::MiRoTra(Node<T>* rt, int& ct)
{if (rt){MiRoTra(rt->left, ct);cout << setiosflags(ios::left);cout << setw(10) << rt->data;ct++;if (ct % 5 == 0)cout << endl;MiRoTra(rt->right, ct);}
}template<typename T>               //层次遍历 LeveTra是level traversal的缩写
void Tree<T>::LeveTra(Node<T>* t)
{int count=0;Node<T>* pt;Addqs(t);while (ssize>0){pt = Outqs();count++;cout << setiosflags(ios::left);cout << setw(10) << pt->data;if (count % 5 == 0)cout << endl;pt = pt->left;while (pt){Addqs(pt);pt = pt->right;}}
}
template<typename T>          //计算树高
int Tree<T>::Couhg(Node<T>* t)
{int level = 0, lev, max = 0;Node<T>* pt;Addqh(t, level);while (hsize>0){Outqh(pt, lev);level = lev + 1;if (max < lev)max = lev;while (pt){if (pt->left)Addqh(pt->left, level);pt = pt->right;}}hhead = htail = NULL;return max;
}template<typename T>            //搜索数据域为某值的结点
void Tree<T>::Search(Node<T>* t, const T& item, bool& sign)
{if (t){Search(t->left, item, sign);Search(t->right, item, sign);if (t->data == item){ sign = true; Addqs(t); }}
}template<typename T>                         //得到某结点(以地址为关键值)的父结点的地址
Node<T>* Tree<T>::GetFather(Node<T>* t, Node<T>* p)
{Node<T>* q;if (t == NULL)return NULL;if (t->left == p || t->right == p)return t;q = GetFather(t->left, p);if (q != NULL)return q;else return GetFather(t->right, p);
}template<typename T>             //在树中删除以某结点为根的树
void Tree<T>::Del(Node<T>* t)
{if (t != NULL){Del(t->left);Del(t->right);Addqd(t->data);delete t;size--;}
}template<typename T>           //销毁树
void Tree<T>::Destory(Node<T>* t)
{if (t != NULL){Destory(t->left);Destory(t->right);delete t;size--;}
}template <typename T>
void Tree<T>::Operate()
{bool flager = true;while (flager){cout << "请您选择操作(输入操作前的数字进行选择):" << endl;cout << "1.创建树并写入数据" << endl;cout << "2.先根遍历树" << endl;cout << "3.计算树高" << endl;cout << "4.后根遍历树" << endl;cout << "5.层次遍历树" << endl;cout << "6.搜索数据域为某值的结点" << endl;cout << "7.删除数据域为某值的结点及其子树" << endl;cout << "8.销毁树" << endl;int choice;cin >> choice;switch (choice){//由用户创建树case 1:{if (root){ cout << "树已经创建,无需再建!若想新建,请您先销毁旧树!" << endl; break; }Creat(root);cout << "树创建完成!" << endl;cout << "此树中共有结点" << size << "个!" << endl;break;}//先根遍历树case 2:{if (!root){ cout << "树还未创建或已被销毁,无法执行遍历操作,请您先创建树!" << endl; break; }int counter2 = 0;FiRoTra(root, counter2);cout << endl;break;}//计算树高    case 3:{if (!root){ cout << "树还未创建或已被销毁,无法计算树高,请您先创建树!" << endl; break; }int high;high= Couhg(root);     cout << "树的高度为:" <<high<< endl;break;}//后根遍历树case 4:{if (!root){ cout << "树还未创建或已被销毁,无法执行遍历操作,请您先创建树!" << endl; break; }Node<T>* pt4 = Push(root);int counter4 = 0;MiRoTra(pt4, counter4);PopAll(counter4);cout << endl;break;}//层次遍历树case 5:{if (!root){ cout << "树还未创建或已被销毁,无法执行遍历操作,请您先创建树!" << endl; break; }              LeveTra(root);cout << endl;shead = stail = NULL;break;}//搜索数据域为某值的结点    case 6:{if (!root){ cout << "树还未创建或已被销毁,无法执行搜索操作,请您先创建树!" << endl; break; }cout << "请您输入数据域的值;" << endl;T indata;  cin >> indata;bool flag = false;Search(root, indata, flag);if (!flag){ cout << "该树中没有数据域为" << indata << "的结点!" << endl; break; }else cout << "该树中数据域为" << indata << "的结点共有" << ssize << "个。" << endl;cout << "是否输出这些结点的地址?是请按1,否则按0:" << endl;int choice6; cin >> choice6;if (choice6 == 1)    ShowAll(shead);Delqs(); shead = stail = NULL; ssize = 0;break;}//删除数据域为某值的结点及其子树case 7:{if (!root){ cout << "树还未创建或已被销毁,无法执行删除操作,请您先创建树!" << endl; break; }T data7; bool flag7 = false; bool sign7 = true; int choice7;cout << "请您输入结点数据的值:" << endl;cin >> data7;Search(root, data7, flag7);if (!flag7){ cout << "目前树中无数据域为" << data7 << "的结点!" << endl;  break; }while (sign7){Node<T> *p7, *fp7;Quefs<T> *item7;p7 = shead->snodrs;item7 = shead; shead = shead->snext; delete item7; ssize--;if (p7 == root){cout << "数据域为" << data7 << "的结点为根结点,若执行删除操作将会销毁整棵树!" << endl;cout << "是否确定执行删除操作?确定请按1,取消请按0:" << endl;cin >> choice7;if (choice7 == 0){ Delqs(); shead = stail = NULL; ssize = 0; goto mark7; }else{Destory(p7); root = NULL; size = 0;cout << "删除成功!同时整棵树也被销毁!" << endl;Delqs(); shead = stail = NULL; ssize = 0;goto mark7;}}fp7 = GetFather(root, p7);if (p7->right)               //其实这两个if可以合成一个,但考虑到程序的可读性,分开来写{if (fp7->left == p7)fp7->left = p7->right;if (fp7->right == p7) fp7->right = p7->right;p7->right = NULL;}if (!p7->right){if (fp7->left == p7)fp7->left = NULL;if (fp7->right == p7)fp7->right = NULL;}Del(p7);cout << "删除成功!" << endl;if (ssize == 0){ cout << "此时树中已无数据域为" << data7 << "的结点及其子树!" << endl; sign7 = false; }if (ssize > 0){ cout << "但此时树中数据域为" << data7 << "的结点还有" << ssize << "个!" << endl; }cout << "此次共删除结点" << dsize << "个," << "目前树中还有结点" << size << "个。" << endl;cout << "是否显示被删除的各结点的值?是请按1,否则请按0:" << endl;cin >> choice7;if (choice7 == 1)D_ShowAll(dhead);Delqd(); dhead = dtail = NULL; dsize = 0;if (ssize > 0){cout << "是否继续删除数据域为" << data7 << "的结点及其子树?是请按1,否则按0:" << endl;cin >> choice7;if (choice7 == 0)sign7 = false;}}Delqs(); shead = stail = NULL; ssize = 0;mark7:break;}//销毁树case 8:{if (!root){ cout << "树还未创建或已被销毁!" << endl; break; }cout << "您确定销毁该树吗?确定请按1,取消请按0:" << endl;int choice8; cin >> choice8;if (choice8 == 0)break;else Destory(root);root = NULL;size = 0;cout << "树已销毁!" << endl;break;}//处理用户的错误输入    default:{cout << "您的输入有误,无法进行操作!" << endl;break;}}//switch结束//控制循环cout << "是否继续?继续请按1,退出请按0:" << endl;int ifgoon;cin >> ifgoon;if (ifgoon == 0)flager = false;}//while结束
}#endif//.cpp文件#include"Tree.h"
#include<iostream>
using namespace std;
int main()
{//是否进入程序int uscho;   bool flag = true;//uscho:user choice的缩写cout << "敬告;请您务必按提示要求操作,如果您进行了规定以外的操作,由此造成的一切后果,将全部由您个人承担,程序开发者概不负责!" << endl;cout << "是否进入程序?进入请按1,否则按0;" << endl;cin >> uscho;if (uscho == 0) return 0;//用户选择类型while (flag){cout << "请选择您所要创建树的数据类型,输入类型前的数字进行选择;" << endl;cout << "1.整型  2.浮点  3.字符" << endl;cin >> uscho;if (uscho != 1 && uscho != 2 && uscho != 3){cout << "您的输入有误!重新输入请按1,退出请按0:" << endl;cin >> uscho;if (uscho == 0)return 0;else  flag = false;}if (flag) flag = false;else flag = true;}switch (uscho){case 1:{Tree<int> tree_int;tree_int.Operate();break;}case 2:{Tree<float> tree_float;tree_float.Operate();break;}case 3:{Tree<char> tree_char;tree_char.Operate();break;}default:cout << "您的输入有误!" << endl;break;}return 0;
}Ⅳ.结语:代码已经过测试,在VS2013上成功运行!发此文有两大目的:1.和大家交流经验,供需要的人参考。2.在下菜鸟,代码中难免有不妥之处,恳求大神批评指正。您的批评就是在下提高的起点,对于您的批评,在下将不胜感激! 
复制代码

转载于:https://www.cnblogs.com/zhangyuhang3/p/6872680.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

罗敏敏组建立新型脑-脑接口实现“阿凡达”式的跨鼠遥控

来源&#xff1a;中国科学杂志社人或动物个体之间的交流主要依靠感觉系统&#xff0c;比如视觉、听觉、嗅觉和触觉。2009年的科幻电影《阿凡达》展示了地球上的人可以通过脑对脑的直接信息传递&#xff0c;远程控制潘多拉星上经过基因改造的纳威人身体。近几年有研究展示可以从…

linux下的gpio转串口驱动,X-026-KERNEL-Linux gpio driver的移植之gpio range

X-026-KERNEL-Linux gpio driver的移植之gpio range作者&#xff1a;wowo 发布于&#xff1a;2017-9-27 22:27分类&#xff1a;X Project1. 前言我们在[1][2]中提到过&#xff0c;鉴于gpio的特殊性&#xff0c;pinctrl subsystem特意留了一个后门(gpio range)&#xff0c;gpio …

长文综述:从大数据中寻找复杂系统的核心变量

文章来源&#xff1a;【集智俱乐部】原文链接&#xff1a;https://mp.weixin.qq.com/s/IIliI5plz2UBUMAzVpxClw导语尽管大数据的收集越来越容易&#xff0c;但随着从微观到宏观的尺度&#xff08;scale&#xff09;变化&#xff0c;系统行为会发生非线性的变化&#xff0c;这让…

android设置主题背景为壁纸_ppt模板防早恋安全教育主题班会课件ppt,两个青春期的孩子画面为背景...

ppt模板--防早恋安全教育主题班会课件ppt这是一套防早恋安全教育主题班会课件ppt&#xff0c;共26页。PPT封面以简约的白色背景&#xff0c;五彩斑斓的地面象征孩子们丰富多彩的学生生活&#xff0c;两个青春期的孩子画面为背景&#xff0c;蓝色正体字突出主题&#xff1a;防早…

Linux下启动程序常见问题,linux系统启动流程及常见故障解决方式

Linux系统中启动的流程:1.加载bios的硬件信息以及进行自我检测 并根据设置取得第一个启动的设备2.若以硬盘方式引导 读取并执行引导扇区 MBR3.加载grub(引导程序)启动菜单(/\)4.加载内核(以只读方式进行挂载)5.挂载根目录系统 启动init进程(所有进程的鼻祖)6.读取/etc/initt…

vscode红色波浪不见了_vscode c++ 编译可以通过 但是有红色波浪线的问题

作者&#xff1a;送外卖转行计算机来源&#xff1a;SegmentFault 思否1.command p, 然后输入 >C/C选择 编辑配置(JSON)然后在工作区会出现一个.vscode文件夹, 其中会有一个.json文件的配置2.打开命令行 输入gcc -v -E -x c -会有以下的信息 ignoring nonexistent director…

云计算军事运用有啥特点

来源&#xff1a;军语研究院云计算技术被视为继大型计算机、个人计算机、互联网之后的第四次信息技术产业革命。云计算是一种围绕分布式共享计算资源的创新应用模式&#xff0c;资源提供者可以方便而快速地提供计算资源&#xff0c;而无处不在的资源需求者可以便利地使用共享的…

基于STM32的DS1302实时时钟模块应用

DS1302是一款低功耗的实时时钟芯片&#xff0c;被广泛应用于各种电子产品中。它具有准确计时、多种时间格式表示、定时报警等功能&#xff0c;适用于记录时间、日期和闹钟。在本文中&#xff0c;我们将介绍如何在基于STM32的开发环境中使用DS1302实时时钟模块&#xff0c;并给出…

在Windows 7上安装Team Foundation Server(TFS)的代理服务器(Agent)

自2009年微软发布Windows 7以来&#xff0c;经过8年的市场验证&#xff0c;Windows 7已经成为史上应用最为广泛的操作系统。但是面对技术变化的日新月异&#xff0c;2015年微软正式停止了对Windows 7的主流支持&#xff0c;并将于2020年正式结束对Windows 7的所有技术支持。这一…

王喜文:图解新基建,细说新机遇(100图)

来源&#xff1a;智造智库去年8月22日&#xff0c;华为创始人任正非签发总裁办邮件&#xff0c;大力推荐技术大神王喜文博士的5G科普PPT《认识5G&#xff0c;发展5G》&#xff0c;并报送董事会成员、监事会成员&#xff0c;主送全体员工&#xff0c;要求华为全员学习。任正非的…

基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时&#xff0c;捕获其信息并将信息传送到需要信息的对象处理。为此&#xff0c;需要一个可以分派信息的对象&#xff0c;这个对象能够正确的把信息交到正确的对象。 实现思路&#xff1a; 要实现以上的功能&…

重新定义Wi-Fi功能,Wi-Fi 6为什么要分两步?

来源&#xff1a;传感器技术Wi-Fi 6重新定义Wi-Fi&#xff0c;先是双频并发&#xff0c;然后才是6GHz下的160MHz。Wi-Fi是什么&#xff1f;它是一个基于IEEE 802.11标准的无线局域网技术。如今&#xff0c;Wi-Fi已经覆盖了绝大部分的室内场景&#xff0c;你的手机、电脑、智能音…

《科学》:中德解析新冠主要蛋白酶晶体结构,有助抑制剂研发

来源&#xff1a;澎湃新闻自新型冠状病毒引起的疫情暴发以来&#xff0c;科学家们一直在努力寻找有效的病毒抑制剂。当地时间3月20日&#xff0c;顶级学术期刊《科学》在线发表了一篇题为“Crystal structure of SARS-CoV-2 main protease provides a basis for design of impr…

render_notebook()结果没有图_来自百度的良心产品!百度iOS截长图App

我们知道百度是国内最大的搜索引擎&#xff0c;但你知道它也会出品一些和搜索无关的精品工具&#xff1f;例如在最近&#xff0c;百度就推出了一款iOS平台上的滚动截长图App&#xff0c;要知道iOS系统一直以来就不支持系统级别的截长图&#xff0c;百度这工具可谓是非常实用了&…

2020年度国家科学技术奖提名项目公示丨附全名单

来源&#xff1a;科学技术部3月24日&#xff0c;科学技术部发布了《国家科学技术奖励工作办公室公告第95号》文件。该文件称&#xff0c;2020年度国家科学技术奖提名工作已结束&#xff0c;并对2020年度国家自然科学奖、国家技术发明奖通用项目、国家科学技术进步奖通用项目受理…

linux实验试题 cp,cp命令实验,cp命令

cp命令实验&#xff0c;cp命令创建条件[rootlocalhost ~]#mkdir /source[rootlocalhost~]#mkdir /target[rootlocalhost~]#cp /etc/l*.conf /source[rootlocalhost~]#ll /sourcetotal20-rw-r--r--. 1 root root 28 Aug 10 09:24 ld.so.conf-rw-r-----. 1 root root 191 Aug 10 …

机载雷达发展简史:从蝙蝠到机载相控阵

来源&#xff1a;军事高科技在线 从地基起步蝙蝠&#xff0c;虽然像人一样拥有双眼&#xff0c;但它看起东西来&#xff0c;用到的却不是眼睛。蝙蝠从鼻子里发出的超声波在传输过程中遇到物体后会立刻反弹&#xff0c;根据声波发射和回波接收之间的…

苹果手机时区改不了怎么办_天价手机摔了怎么办?苹果:你尽管摔,坏了算我输。...

智能手机比起过去的功能机&#xff0c;好处多到数不过来&#xff0c;但有一点智能手机怎么都比不上功能机&#xff0c;那就是不抗摔。当年的很多功能机那都是可以用来砸核桃的&#xff0c;抗摔性一流&#xff0c;基本不存在摔坏的说法&#xff0c;但智能手机就不一样了&#xf…

2020 最新自动驾驶技术报告出炉:Waymo、特斯拉、沃尔沃技术方案大起底

来源&#xff1a;《2020 自动驾驶技术报告》进入 2020 年&#xff0c;自动驾驶技术的跨越式路线与渐进式路线之间的阵营划分已经十分明显。但最终自动驾驶要完全实现无人化&#xff0c;其技术还需要进行不断的迭代和发展。对于自动驾驶的技术进展&#xff0c;WEVOLVER 发布的《…

PC_excel完毕一列英文小写变大写

原创作品&#xff0c;出自 “深蓝的blog” 博客。欢迎转载&#xff0c;转载时请务必注明出处。否则追究版权法律责任。深蓝的blog&#xff1a;http://blog.csdn.net/huangyanlong/article/details/44493869 使用excel中的UPPER函数就可以实现这个目标。介绍例如以下&#xff1a…