c++AI
2025-08-05 13:24:33
发布于:江苏
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <sstream>
#include <limits>
#include <ctime>
using namespace std;
// 清屏函数,跨平台支持
void clearScreen() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
// 显示标题界面
void showTitle() {
clearScreen();
cout << "" << endl;
cout << " 智能助手 - 小C " << endl;
cout << "" << endl;
cout << " 输入问题获取答案,输入'退出'结束对话 " << endl;
cout << " 输入'帮助'查看使用说明 " << endl;
cout << "==============================================" << endl << endl;
}
// 显示帮助信息
void showHelp() {
cout << "\n===== 使用帮助 =" << endl;
cout << "1. 直接输入问题即可获取答案" << endl;
cout << "2. 系统会自动识别关键词并尝试联想相关答案" << endl;
cout << "3. 无法回答的问题将自动使用Bing搜索" << endl;
cout << "4. 输入'退出'结束程序" << endl;
cout << "5. 输入'清除'清空屏幕" << endl;
cout << "6. 输入'帮助'显示此帮助信息" << endl;
cout << "7. 输入'主题'切换显示主题" << endl;
cout << "================\n" << endl;
}
// 转换字符串为小写
string toLower(const string& str) {
string result = str;
transform(result.begin(), result.end(), result.begin(), ::tolower);
return result;
}
// 移除字符串中的标点符号
string removePunctuation(const string& str) {
string result;
for (char c : str) {
if (ispunct(static_cast<unsigned char>(c)) == 0) {
result += c;
}
}
return result;
}
// 分割字符串为单词
vector<string> splitIntoWords(const string& str) {
vector<string> words;
stringstream ss(str);
string word;
while (ss >> word) {
words.push_back(word);
}
return words;
}
// 处理用户输入,标准化
string processInput(const string& input) {
string processed = toLower(input);
processed = removePunctuation(processed);
return processed;
}
// 计算两个字符串的相似度(基于Jaccard系数)
double calculateSimilarity(const unordered_set<string>& words1, const unordered_set<string>& words2) {
if (words1.empty() || words2.empty()) return 0.0;
int intersection = 0;
for (const string& word : words1) {
if (words2.find(word) != words2.end()) {
intersection++;
}
}
int unionSize = words1.size() + words2.size() - intersection;
return static_cast<double>(intersection) / unionSize;
}
// 关键词联想 - 返回最相关的答案,优化版
vector<pair<string, double>> findRelatedAnswers(const string& input,
const unordered_map<string, string>& knowledgeBase) {
vector<pair<string, double>> related;
vector<string> inputWords = splitIntoWords(input);
unordered_set<string> uniqueInputWords(inputWords.begin(), inputWords.end());
// 为每个问题计算匹配度和相似度
for (const pair<string, string>& entry : knowledgeBase) {
vector<string> questionWords = splitIntoWords(entry.first);
unordered_set<string> uniqueQuestionWords(questionWords.begin(), questionWords.end());
// 计算相似度
double similarity = calculateSimilarity(uniqueInputWords, uniqueQuestionWords);
// 计算关键词匹配数
int matchCount = 0;
for (const string& word : questionWords) {
if (uniqueInputWords.find(word) != uniqueInputWords.end()) {
matchCount++;
}
}
// 综合评分:相似度(70%) + 匹配词数加权(30%)
double score = similarity * 0.7 +
(static_cast<double>(matchCount) / max(questionWords.size(), 1)) * 0.3;
if (score > 0.1) { // 设定最低阈值
related.emplace_back(entry.first, score);
}
}
// 按分数排序
sort(related.begin(), related.end(),
[](const pair<string, double>& a, const pair<string, double>& b) {
return a.second > b.second;
});
return related;
}
// 打开网页进行搜索 - 使用Bing搜索引擎
void openWebSearch(const string& query) {
string encodedQuery;
// 简单的URL编码
for (char c : query) {
if (c == ' ') {
encodedQuery += "+";
} else if (isalnum(static_cast<unsigned char>(c)) || c == '-' || c == '_' || c == '.' || c == '=' || c == '&') {
encodedQuery += c;
}
}
// 使用Bing搜索引擎
string url = "https://www.bing.com/search?q=" + encodedQuery;
// 根据不同操作系统使用不同的命令打开浏览器
#ifdef _WIN32
string command = "start " + url;
#elif __APPLE__
string command = "open " + url;
#else // Linux等
string command = "xdg-open " + url;
#endif
system(command.c_str());
cout << "已为您打开Bing搜索相关内容..." << endl;
}
// 获取当前时间
string getCurrentTime() {
time_t now = time(0);
struct tm tstruct;
char buf[80];
#ifdef _WIN32
localtime_s(&tstruct, &now);
#else
localtime_r(&now, &tstruct);
#endif
strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
return buf;
}
// 获取当前日期是星期几
string getWeekday() {
time_t now = time(0);
struct tm tstruct;
#ifdef _WIN32
localtime_s(&tstruct, &now);
#else
localtime_r(&now, &tstruct);
#endif
vector<string> weekdays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
return weekdays[tstruct.tm_wday];
}
int main() {
// 预设的问答库 - 大幅扩展
unordered_map<string, string> knowledgeBase = {
// 问候与基本信息
{"你好", "你好!我是你的智能助手小C,有什么可以帮助你的吗?"},
{"再见", "再见!祝你有愉快的一天!"},
{"早上好", "早上好!新的一天开始了,祝你一切顺利!"},
{"晚上好", "晚上好!今天过得怎么样?"},
{"你叫什么名字", "我是一个控制台智能助手,你可以叫我小C。"},
{"现在时间", "当前时间是: " + getCurrentTime()},
{"今天星期几", "今天是" + getWeekday()},
{"你能做什么", "我可以回答各类常见问题,包括常识、科技、生活等方面。如果我无法回答,会帮你打开Bing搜索。"},
{"你是谁开发的", "我是由一位程序员用C++开发的智能助手。"},
{"你有什么功能", "我可以回答问题、提供信息、进行关键词联想,并在需要时帮你搜索网络。"},
{"你会学习吗", "目前我还不能主动学习,但开发者可以通过更新我的知识库来扩展我的能力。"},
{"很高兴认识你", "我也很高兴认识你!有什么我可以帮助你的吗?"},
{"谢谢你", "不客气!能帮到你我很开心。"},
// 科技与编程
{"什么是c++", "C++是一种通用编程语言,支持多种编程范式,包括过程化、面向对象和泛型编程,广泛用于系统开发、游戏引擎等领域。"},
{"什么是python", "Python是一种高级编程语言,以简洁易读的语法著称,广泛应用于数据分析、人工智能、Web开发等领域。"},
{"什么是java", "Java是一种跨平台的编程语言,以'一次编写,到处运行'为特点,常用于企业级应用、Android开发等。"},
{"什么是编程", "编程是使用编程语言向计算机发出指令,让计算机按照指令完成特定任务的过程。"},
{"什么是算法", "算法是解决特定问题的步骤和方法,是计算机程序的核心。"},
{"什么是数据库", "数据库是按照数据结构来组织、存储和管理数据的仓库,常见的有MySQL、Oracle、SQL Server等。"},
{"什么是互联网", "互联网是全球范围内由计算机网络相互连接而成的网络系统,能实现全球信息共享。"},
{"什么是人工智能", "人工智能是计算机科学的一个分支,致力于开发能够模拟人类智能的系统,包括机器学习、自然语言处理等技术。"},
{"什么是区块链", "区块链是一种分布式账本技术,通过加密和分布式存储确保数据的安全性和不可篡改性,是比特币等加密货币的底层技术。"},
{"什么是5g", "5G是第五代移动通信技术,相比4G具有更高的速度、更低的延迟和更大的连接容量,能支持更多新兴应用。"},
{"什么是云计算", "云计算是通过互联网提供计算资源(包括服务器、存储、数据库等)的服务模式,用户可以按需使用这些资源。"},
// 科学与自然
{"为什么天空是蓝色的", "天空呈现蓝色是因为太阳光中的蓝色光波长较短,更容易被地球大气层中的气体分子散射,使得我们看到的天空主要呈现蓝色。"},
{"为什么月亮会跟着人走", "这是一种视觉错觉,因为月亮距离我们非常遥远,当我们移动时,月亮在我们视野中的位置变化很小,看起来就像跟着我们走一样。"},
{"为什么会下雨", "下雨是由于大气中的水蒸气冷却凝结成水滴,当水滴足够大且重时,就会从云层落下形成雨。"},
{"什么是彩虹", "彩虹是阳光通过空气中的水滴发生折射、反射和色散形成的光学现象,呈现出红、橙、黄、绿、蓝、靛、紫七种颜色。"},
{"地球是圆的吗", "是的,地球是一个两极稍扁、赤道略鼓的不规则球体。"},
{"为什么会有四季", "四季的形成是由于地球绕太阳公转时,地轴与公转轨道面存在约66.5度的倾角,导致太阳直射点在南北回归线之间移动,从而产生了四季变化。"},
{"什么是黑洞", "黑洞是一种引力极强的天体,其引力强大到连光也无法逃脱,因此我们无法直接看到黑洞,只能通过其对周围物质的影响来探测。"},
{"光速是多少", "真空中的光速约为30万公里/秒(精确值为299,792,458米/秒),是宇宙中已知的最快速度。"},
// 地理与常识
{"世界上最高的山峰", "世界上最高的山峰是珠穆朗玛峰,位于喜马拉雅山脉,海拔约8848.86米。"},
{"世界上最大的海洋", "世界上最大的海洋是太平洋,覆盖了地球约30%的表面,面积约1.8亿平方公里。"},
{"世界上最大的国家", "世界上面积最大的国家是俄罗斯,总面积约1709.82万平方公里。"},
{"中国的首都是哪里", "中国的首都是北京,它是中国的政治、文化和国际交往中心。"},
{"美国的首都是哪里", "美国的首都是华盛顿哥伦比亚特区(Washington D.C.)。"},
{"世界上有多少个国家", "目前世界上大约有195个主权国家,其中193个是联合国会员国。"},
{"最长的河流是什么", "世界上最长的河流是尼罗河,全长约6650公里,流经非洲多个国家。"},
{"最大的沙漠是什么", "世界上最大的沙漠是撒哈拉沙漠,位于非洲北部,面积约932万平方公里。"},
// 生活常识
{"怎样保持健康", "保持健康的方法包括:均衡饮食,多吃蔬菜水果;适量运动,每周至少进行150分钟中等强度有氧运动;保证充足睡眠,成年人一般需要7-9小时;减少压力,保持良好心态;定期进行健康体检。"},
{"如何提高记忆力", "提高记忆力的方法包括:规律作息,保证充足睡眠;健康饮食,多吃富含蛋白质、维生素和矿物质的食物;经常锻炼,促进脑部血液循环;不断学习新事物,锻炼大脑;采用记忆技巧,如联想记忆法、重复记忆法等。"},
{"什么食物富含维生素c", "富含维生素C的食物包括:柑橘类水果(橙子、柠檬、柚子等)、草莓、猕猴桃、青椒、西兰花、菠菜等。维生素C对增强免疫力、促进胶原蛋白合成有重要作用。"},
{"如何缓解压力", "缓解压力的方法包括:进行适度的运动,如散步、跑步、瑜伽等;与家人朋友交流沟通;培养兴趣爱好;保证充足的睡眠;学习放松技巧,如深呼吸、冥想等。"},
{"失眠怎么办", "改善失眠的方法包括:保持规律的作息时间;创造安静舒适的睡眠环境;睡前避免喝咖啡、浓茶等刺激性饮料;睡前不要使用电子产品;可以尝试睡前泡脚、听轻音乐等放松方式。"},
// 数学与单位换算
{"一年有多少天", "平年有365天,闰年有366天。闰年通常每4年出现一次,能被4整除但不能被100整除的年份是闰年,能被400整除的年份也是闰年。"},
{"一天有多少小时", "一天有24小时,1小时等于60分钟,1分钟等于60秒。"},
{"一公斤等于多少克", "一公斤等于1000克,等于2市斤。"},
{"一英里等于多少公里", "1英里约等于1.60934公里。"},
{"一升等于多少毫升", "1升等于1000毫升。"},
// 英文问答
{"hello", "Hello! How can I help you today?"},
{"what is your name", "I'm a console AI assistant, you can call me C-Bot."},
{"how are you", "I'm just a program, but thanks for asking! How can I assist you today?"},
{"what time is it", "The current time is: " + getCurrentTime()},
{"what is programming", "Programming is the process of creating instructions for computers using programming languages to perform specific tasks."},
{"thank you", "You're welcome! Feel free to ask me anything else."}
};
showTitle();
string input;
while (true) {
cout << "你: ";
getline(cin, input);
// 处理特殊命令
if (input == "退出") {
cout << "助手: 再见!祝你生活愉快!" << endl;
break;
} else if (input == "清除") {
showTitle();
continue;
} else if (input == "帮助") {
showHelp();
continue;
} else if (input == "主题") {
cout << "助手: 目前支持默认主题。未来将添加更多主题选择。" << endl << endl;
continue;
}
string processedInput = processInput(input);
if (processedInput.empty()) {
cout << "助手: 请输入有效的问题。" << endl;
continue;
}
// 尝试精确匹配
auto it = knowledgeBase.find(processedInput);
if (it != knowledgeBase.end()) {
cout << "助手: " << it->second << endl << endl;
continue;
}
// 关键词联想 - 优化版
vector<pair<string, double>> related = findRelatedAnswers(processedInput, knowledgeBase);
if (!related.empty()) {
// 显示最相关的答案
cout << "助手: 我没有找到完全匹配的答案,但可能相关:" << endl;
cout << " " << knowledgeBase[related[0].first] << endl << endl;
// 如果有多个相关答案,询问是否需要更多
if (related.size() > 1) {
cout << "助手: 需要查看更多相关信息吗?(是/否) ";
string response;
getline(cin, response);
if (toLower(response) == "是" || toLower(response) == "yes") {
size_t limit = min(static_cast<size_t>(3), related.size());
for (size_t i = 1; i < limit; ++i) {
cout << " " << i+1 << ". " << knowledgeBase[related[i].first] << endl << endl;
}
}
}
} else {
// 无法回答,进行搜索
cout << "助手: 抱歉,我无法回答这个问题。" << endl;
cout << "助手: 是否需要使用Bing搜索相关内容?(是/否) ";
string response;
getline(cin, response);
if (toLower(response) == "是" || toLower(response) == "yes") {
openWebSearch(input);
}
}
}
return 0;
}
全部评论 1
d=====( ̄▽ ̄*)b
5天前 来自 江苏
0
有帮助,赞一个