中间代码生成

一.实验题目
DO-WHILE循环语句的中间代码生成
二.实验目的
通过设计、编制、调试一个 do-while 循环语句的语法及语义分析程序,加深对
法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

三. 实验内容及结果

  1. 根据给出的样例程序,补充填写部分并运行;
    (1)程序清单,填写部分用红色标注
#include<string>
#include<iostream>
#include <fstream>
#include<cctype>
using namespace std;
int const ACC = 1 << 31 - 1;
string filename; //用来输入文件名用
string symbol[200];
string blankCharacter = " ";
int num = 0;
//int start; //用在输出输入串时确定开始的位置
//------------------------------------------------------
struct stateStack //定义状态栈
{int top;int m[100];
};
void InitStateStack(stateStack& s)//建立状态栈
{s.top = 0;
}
int PushState(stateStack& s, int i)//把元素压入栈
{if (s.top == 100) return -1;else{s.m[s.top] = i;s.top++;}return 0;
}
int GetStateTop(stateStack& s) //取栈顶符号
{int i;if (s.top == 0) return -1;else{i = s.m[s.top - 1];}return i;
}
void PopStateTop(stateStack& s)//删除栈顶元素
{if (s.top == 0) cout << "wrong!";else--s.top;
}
//-----------------------------------------------------------------
//定义一个用于四元式输出的栈
struct quaternionStack
{int top;string s[5];
};
//-----------------------------------------------------------------
//
struct symbolStack//定义符号栈
{int top;string st[100];
};
void InitSymbolStack(symbolStack& s)//建立符号栈
{s.top = 0;
}
int PushSymbol(symbolStack& s, string str)//把元素压入栈
{if (s.top == 100) return -1;else{s.st[s.top] = str;s.top++;}return 0;
}
string GetSymbolTop(symbolStack& s) //取栈顶符号
{string str;if (s.top == 0) cout << "wrong!";else{str = s.st[s.top - 1];}return str;
}
void PopSymbolTop(symbolStack& s)//删除栈顶元素
{if (s.top == 0) cout << "wrong!";else--s.top;
}
//----------------------------------------------------------
//词法分析部分
const string keyWord[] = //定义关键字表
{
"int","double","float","void","long","for","if","else","while","include",
"return","break","continue","do","true","false","case","switch"
};
void showLex(string& s)
{symbol[num] = s;++num;ofstream fout("词法分析.txt", ios::out | ios::app);if (isdigit(s[0])){fout << "< " << s << ",常数 >" << endl;s = "";}elsefor (int i = 0; i < 18; ++i){if (s == keyWord[i]){fout << "< " << s << ",关键字 | 指向 " << s << " 的关键字表项的指针" << endl;break;}if (i == 17){if (ispunct(s[0]) && s[0] != '_'){fout << "< " << s << ",运算符 | 指向 " << s << " 的运算符表项的指针 " << endl;}else{fout << "< id,标识符 | 指向 " << s << " 的符号表项的指针 >" <<endl;}}}s = "";
}
bool isDelimiters(char ch) //判断是否为界限符
{bool tag = 0;string s = "{[()]},;\'\"";for (int i = 0; i < s.size(); i++){if (ch == s[i]){tag = 1;break;}}return tag;
}
bool isBlank(char ch) //判断是否为空
{bool tag = 0;if (ch == ' ')tag = 1;return tag;
}
bool isDecimalPoint(char ch) //判断是否为小数点
{bool tag = 0;if (ch == '.')tag = 1;return tag;
}
void lexAnalysis(string s)
{string yunsf, biaosf;for (int i = 0; i < s.size(); i++){if (isBlank(s[i])) //判断是否为空{if (biaosf != "")showLex(biaosf);}else if (ispunct(s[i])){//C 库函数 int isgraph(int c) 检查所传的字符是否有图形表示法。带有图形表//	示法的字符是除了空白字符(比如 ' ')以外的所有可打印的字符。if (isDelimiters(s[i])){if (yunsf != "")showLex(yunsf);if (biaosf != "")showLex(biaosf);ofstream fout("词法分析.txt", ios::out | ios::app);fout << "< " << s[i] << ",界限符 | 指向 " << s[i] << " 的界限符的指针" << endl;symbol[num] = s[i];num++;}else if (isDecimalPoint(s[i]) || s[i] == '_'){biaosf += s[i];
}else{if (biaosf != "")showLex(biaosf);yunsf += s[i];}}//end ispunct( )else{if (yunsf != "")showLex(yunsf);biaosf += s[i];}}symbol[num] = "#";
}//词法分析结束
//12
//-------------------------------------------------------------------
//语法分析部分
//推导式部分
string production[18] = {
"S'-->S",
"S-->doAwhileB",
"A-->{F}",
"F-->M" ,
"F-->FM",
"M-->i=E;",
"E-->E+i",
"E-->E-i",
"E-->E*i",
"E-->E/i",
"E-->i",
"E-->(E)",
"B-->(iOi)",
"O--><",
"O--><=",
"O-->>",
"O-->>=",
"O-->!=",
};
//-----------------------------------------------------------------
//GOTO控制部分
void GOTO(int i, char b, stateStack& state_stack, symbolStack& symbol_stack)
{// cout<<"GOTOzhong fterminals wei: "<<b<<endl;if (i == 0 && b == 'S'){PushState(state_stack, 1);}else if (i == 2 && b == 'A'){PushState(state_stack, 3);}else if (i == 4 && b == 'B'){PushState(state_stack, 29);}else if (i == 5 && b == 'F'){PushState(state_stack, 6);}else if (i == 5 && b == 'M'){PushState(state_stack, 9);}else if (i == 6 && b == 'M'){PushState(state_stack, 8);}else if (i == 11 && b == 'E'){PushState(state_stack, 13);}else if (i == 24 && b == 'O'){PushState(state_stack, 26);}else if (i == 34 && b == 'E'){PushState(state_stack, 35);}string B = "";B = B + b;PushSymbol(symbol_stack, B);
}
//--------------------------------------------------------------------
//Action控制表
//n大于0表示移进
//n小于0则达标要进行规约,-n就代表用哪个推导式进行规约
//ACC代表规约成功 0表示出错
const int Action[38][19] = {
{2}, //状态0 入栈do
{0,0,0,0,0,0,0,0,0,0,0,0,0,ACC}, //状态1 # ACC
{0,0,0,0,0,0,0,0,0,5}, //状态2 入栈{
{0,4}, //状态3 入栈while
{0,0,0,0,0,0,0,0,0,0,0,23 }, //状态4 入栈 (
{0,0,10}, //状态5 入栈i
{0,0,10,0,0,0,0,0,0,0,7,0}, //状态6 入栈i }
{0,-2}, //状态7 规约 2. A→{F} //while
{0,0,-4,0,0,0,0,0,0,0,-4}, //状态8 规约4. F→FM //i }
{0,0,-3,0,0,0,0,0,0,0,-3}, //状态9 规约3. F→M //i }
{0,0,0,11}, //状态10 入栈=
{0,0,12,0,0,0,0,0,0,0,0,34},//状态11 入栈 i (
{0,0,0,-10,-10,-10,-10,-10,-10,0,0,0,-10},
//状态12规约10.E→i= + - * / ;
{0,0,0,0,15,16,17,18,14}, //状态13 入栈 + - * / ;
{0,0,-5,0,0,0,0,0,0,0,-5}, //状态14 //规约 5. M→i=E;//i }
{0,0,19}, //状态15 入栈i
{0,0,20}, //状态16 入栈i
{0,0,21}, //状态17 入栈i
{0,0,22}, //状态18 入栈i
{0,0,0,0,-6,-6,-6,-6,-6,0,0,0,-6},
//状态19 规约 6.E→E+i // + - * / ;
{0,0,0,0,-7,-7,-7,-7,-7,0,0,0,-7},
//状态20规约 7. E→E-i // + - * / ;
{0,0,0,0,-8,-8,-8,-8,-8,0,0,0,-8},
//状态21规约 8. E→E*i // + - * / ;
{0,0,0,0,-9,-9,-9,-9,-9,0,0,0,-9},
//状态22 规约 9.E→E/i // + - * / ;
{0,0,24}, //状态23 入栈i
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,30,31,32,33},//入栈 < <= > >= !=
{0,0,-13}, //状态25 规约 13. O→< 
{0,0,27}, //状态26 入栈 i 
{0,0,0,0,0,0,0,0,0,0,0,0,28}, //状态27 入栈 )
{0,0,0,0,0,0,0,0,-12,0,0,0,0,0},//状态28 规约12. B→(iOi) //;
{0,0,0,0,0,0,0,0,37}, //状态29 入栈 ;
{0,0,-14}, //状态30 规约14. O→<= //i
{0,0,-15}, //状态31 规约15. O→> //i
{0,0,-16}, //状态32 规约16. O→>= //i
{0,0,-17}, //状态33 规约17. O→!= //i
{0,0,12,0,0,0,0,0,0,0,0,34}, //状态34 入栈 i (
{0,0,0,0,15,16,17,18,0,0,0,0,36},//状态35 入栈 + - * / )
{0,0,0,0,-11,-11,-11,-11,-11,0,0,0,-11},//状态36 规约
//11.E→(E)//+ - * / ;
{0,0,0,0,0,0,0,0,0,0,0,0,0,-1}//状态37 规约 1.S→doAwhileB; //#
};
//--------------------------------------------------------------
//终结符表
string terminals[19] =
{ "do","while","i","=","+","-","*","/",";","{","}","(",")","#","<","<=","> "," >= "," != " };
//--------------------------------------------------------------------
//输出每步的分析过程 存储在文件“语法分析.txt”中
void showResult(stateStack& state_stack, symbolStack& symbol_stack, int start)
{//每次归约完毕后查看当前符号栈栈顶状态cout << GetSymbolTop(symbol_stack) << " " << GetStateTop(state_stack) << endl;ofstream yffout("语法分析.txt", ios::out | ios::app);for (int i = 0; i < state_stack.top; i++){if (state_stack.m[i] >= 10){yffout << "(" << state_stack.m[i] << ")";}elseyffout << state_stack.m[i];}yffout << " ";for (int j = 0; j < symbol_stack.top; j++)yffout << symbol_stack.st[j];yffout << " ";for (int k = start; k <= num + 1; k++)yffout << symbol[k];yffout << endl;
}
//-----------------------------------
//表达式规约部分
void Reduce()
{ofstream syfout("四元式.txt", ios::out | ios::app);int start = 0, now = 0;quaternionStack quaternion_stack;quaternion_stack.top = 0;int order = 0;int m = 0, n, j;stateStack state_stack; //建状态栈InitStateStack(state_stack);PushState(state_stack, m);symbolStack symbol_stack;//建符号栈InitSymbolStack(symbol_stack);PushSymbol(symbol_stack, "#");//对栈进行初始化for (int i = 0; i <= num; i++){showResult(state_stack, symbol_stack, i); //i+1代表已归约现在可查看新的状态string temp = symbol[i];j = 0;while (terminals[j] != temp) //查找终结符对应的下标{++j;if (j >= 19){j = 2; //如果是变量或者常量,令:j = 2,即对应终结符 ibreak;}}m = GetStateTop(state_stack); //查看当前状态栈的栈顶n = Action[m][j];int rightLength;while (n < 0)
{n = -n;if (n == 14 || n == 16 || n == 17)rightLength = production[n].size() - 5;else if (n == 1)rightLength = production[n].size() - 8;elserightLength = production[n].size() - 4;//cout<<"表达式"<<(n-40)<<"的右部长度为"<<rightLength<<endl;//----------------------------------------------------------//四元式输出控制部分string ss0, ss1, ss2;string t[] = { "t0","t1","t2","t3","t4","t5","t6","t7","t8","t9","t10" };if (n == 10) //当用 10.E→i 式归约时,开始建立栈{quaternion_stack.s[quaternion_stack.top] = symbol[i - 1];++quaternion_stack.top;}else if (n >= 6 && n <= 9)//6. E→E+i 7.E→E-i 8.E→E*I 9.E→E/i{--quaternion_stack.top;ss0 = quaternion_stack.s[quaternion_stack.top];--quaternion_stack.top;ss1 = quaternion_stack.s[quaternion_stack.top];--quaternion_stack.top;ss2 = quaternion_stack.s[quaternion_stack.top];syfout << now << " (" << ss1 << "," << ss2 << "," << ss0 << "," << t[order] << ")" << endl;//运算的四元式++now;quaternion_stack.s[quaternion_stack.top] = t[order];++quaternion_stack.top;++order;}else if (n == 5) //赋值语句的四元式;5. M→i=E;{int l = symbol_stack.top - 4;quaternion_stack.top = 0;syfout << now << " (=:," << quaternion_stack.s[quaternion_stack.top]<< ",-," << symbol_stack.st[l] << ")" << endl;++now;}else if (n == 13 || n == 14 || n == 15 || n == 16)//判断语句的四元式syfout << now << " if " << symbol[i - 2] << symbol[i - 1] << symbol[i]<< " goto " << start << endl;//------------------------------------------------------for (int k = 1; k <= rightLength; k++){PopSymbolTop(symbol_stack);PopStateTop(state_stack);}// showLex(state_stack,symbol_stack,i); GOTO(GetStateTop(state_stack), production[n][0], state_stack,symbol_stack);//此处用到了状态栈和符号的引用showResult(state_stack, symbol_stack, i);m = GetStateTop(state_stack); //while xunhuanblankCharacterzhibufen n = Action[m][j];}if (n == 0)
{cout << "归约出错";break;}if (n == ACC)cout << "规约成功" << endl;else{PushState(state_stack, n);// cout<<n<<endl;PushSymbol(symbol_stack, temp);//每次移进后都重新输出状态栈,符号栈和符号串if (quaternion_stack.top > 0){quaternion_stack.s[quaternion_stack.top] = temp;// cout<<quaternion_stack.s[quaternion_stack.top];++quaternion_stack.top;}}}
}
//------------------------------------------------------------------
//主函数
int main()
{
//	cout << "输入需要进行分析的程序的名称:\n";
//	cin >> filename;filename = "test.cpp";ifstream fin(filename.c_str()); //待添加当文件不存在 的处理string line, s;fin >> line; //直接读取到空格,并且省略回车,最后至少要有空格或省略号while (!fin.eof()){s = s + line + blankCharacter;fin >> line;}fin.close();ofstream fout("词法分析.txt");fout << "";cout << s << "--------" << endl; //在字符界面查看需要分析的字符串,可以删除lexAnalysis(s); //词法分析for (int i = 0; i <= num; i++)cout << i << ": " << symbol[i] << endl;ofstream yffout("语法分析.txt");yffout << "状态栈" << "\t\t符号栈" << "\t\t\t\t输入串" << endl;ofstream syfout("四元式.txt");syfout << "";Reduce(); //语法分析,进行规约return 0;
}2)程序测试用例int a = 1, b = 2, c = 3;
do
{a = a * b + b - c;i=i+100;
} while ( i < i ) ; #

(3)词法分析生成文件内容截图
在这里插入图片描述
(4)语法分析生成文件内容截图

在这里插入图片描述
(5)中间代码生成文件内容截图

在这里插入图片描述

2.根据所设计的分析程序和所给定的测试用例,自行构造识别活前缀的DFA、ACTION表和GOTO表,上机测试并通过所设计的分析程序。
(1)自行构造的识别活前缀的DFA图:

在这里插入图片描述

(2)自行设计的ACTION表和ACTION表所对应的C语言源代码:

在这里插入图片描述

//Action控制表
//n大于0表示移进
//n小于0则达标要进行规约,-n就代表用哪个推导式进行规约
//ACC代表规约成功 0表示出错
const int Action[38][19] = {
{2}, //状态0 入栈do
{0,0,0,0,0,0,0,0,0,0,0,0,0,ACC}, //状态1 # ACC
{0,0,0,0,0,0,0,0,0,5}, //状态2 入栈{
{0,4}, //状态3 入栈while
{0,0,0,0,0,0,0,0,0,0,0,23 }, //状态4 入栈 (
{0,0,10}, //状态5 入栈i
{0,0,10,0,0,0,0,0,0,0,7,0}, //状态6 入栈i }
{0,-2}, //状态7 规约 2. A→{F} //while
{0,0,-4,0,0,0,0,0,0,0,-4}, //状态8 规约4. F→FM //i }
{0,0,-3,0,0,0,0,0,0,0,-3}, //状态9 规约3. F→M //i }
{0,0,0,11}, //状态10 入栈=
{0,0,12,0,0,0,0,0,0,0,0,34},//状态11 入栈 i (
{0,0,0,-10,-10,-10,-10,-10,-10,0,0,0,-10},
//状态12规约10.E→i= + - * / ;
{0,0,0,0,15,16,17,18,14}, //状态13 入栈 + - * / ;
{0,0,-5,0,0,0,0,0,0,0,-5}, //状态14 //规约 5. M→i=E;//i }
{0,0,19}, //状态15 入栈i
{0,0,20}, //状态16 入栈i
{0,0,21}, //状态17 入栈i
{0,0,22}, //状态18 入栈i
{0,0,0,0,-6,-6,-6,-6,-6,0,0,0,-6},
//状态19 规约 6.E→E+i // + - * / ;
{0,0,0,0,-7,-7,-7,-7,-7,0,0,0,-7},
//状态20规约 7. E→E-i // + - * / ;
{0,0,0,0,-8,-8,-8,-8,-8,0,0,0,-8},
//状态21规约 8. E→E*i // + - * / ;
{0,0,0,0,-9,-9,-9,-9,-9,0,0,0,-9},
//状态22 规约 9.E→E/i // + - * / ;
{0,0,24}, //状态23 入栈i
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,30,31,32,33},//入栈 < <= > >= !=
{0,0,-13}, //状态25 规约 13. O→< 
{0,0,27}, //状态26 入栈 i 
{0,0,0,0,0,0,0,0,0,0,0,0,28}, //状态27 入栈 )
{0,0,0,0,0,0,0,0,-12,0,0,0,0,0},//状态28 规约12. B→(iOi) //;
{0,0,0,0,0,0,0,0,37}, //状态29 入栈 ;
{0,0,-14}, //状态30 规约14. O→<= //i
{0,0,-15}, //状态31 规约15. O→> //i
{0,0,-16}, //状态32 规约16. O→>= //i
{0,0,-17}, //状态33 规约17. O→!= //i
{0,0,12,0,0,0,0,0,0,0,0,34}, //状态34 入栈 i (
{0,0,0,0,15,16,17,18,0,0,0,0,36},//状态35 入栈 + - * / )
{0,0,0,0,-11,-11,-11,-11,-11,0,0,0,-11},//状态36 规约
//11.E→(E)//+ - * / ;
{0,0,0,0,0,0,0,0,0,0,0,0,0,-1}//状态37 规约 1.S→doAwhileB; //#
};
//--------------------------------------------------------------(3)自行设计的GOTO表和GOTO表所对应的C语言源代码:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/975fcc31c00c4b439eae8992f725ae58.png)//GOTO控制部分
void GOTO(int i, char b, stateStack& state_stack, symbolStack& symbol_stack)
{// cout<<"GOTOzhong fterminals wei: "<<b<<endl;if (i == 0 && b == 'S'){PushState(state_stack, 1);}else if (i == 2 && b == 'A'){PushState(state_stack, 3);}else if (i == 4 && b == 'B'){PushState(state_stack, 29);}else if (i == 5 && b == 'F'){PushState(state_stack, 6);}else if (i == 5 && b == 'M'){PushState(state_stack, 9);}else if (i == 6 && b == 'M'){PushState(state_stack, 8);}else if (i == 11 && b == 'E'){PushState(state_stack, 13);}else if (i == 24 && b == 'O'){PushState(state_stack, 26);}else if (i == 34 && b == 'E'){PushState(state_stack, 35);}string B = "";B = B + b;PushSymbol(symbol_stack, B);
}

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

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

相关文章

学习串口屏需要了解哪些方面的知识

学习串口屏需要掌握的知识主要包括以下几个方面&#xff1a; 串口通信原理&#xff1a;串口屏是基于串口通信的显示控制模组&#xff0c;因此了解串口通信的基本原理和通信协议是必要的。你需要了解串口通信的基本概念、数据格式、波特率、校验位等参数&#xff0c;以及串口通…

基于SpringBoot+Vue旅游民宿信息管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

轻松搞定阿里云域名DNS解析

本文将会讲解如何设置阿里云域名DNS解析。在进行解析设置之前&#xff0c;你需要提前准备好需要设置的云服务器IP地址、域名以及CNAME记录。 如果你还没有云服务器和域名&#xff0c;可以参考下面的方法注册一个。 申请域名&#xff1a;《Namesilo域名注册》注册云服务器&…

算法导论实战(三)(算法导论习题第二十五、二十六章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 第二十五章 25.1-10 25.2-5 25…

vue2中如何使用函数式组件

vue2 中如何使用函数式组件 用 render 定义函数式组件如何处理 props如何在函数式组件中触发自定义事件&#xff1f;injection如何使用 computed 和 methods定义一个函数式组件的 MyButton函数式组件有何优势哪种场景适合使用函数式组件函数式组件的问题参考 函数式组件&#x…

FineReport使用小记(不断更新中…………)

FineReport使用小记 1. 单元格相关设置1.1. 单元格值样式 2. 报表块设置2.1. 给报表块加单位 1. 单元格相关设置 1.1. 单元格值样式 1. 百分比样式 选中单元格&#xff0c;单元格属性——>文本——>格式——>百分比 下面可以选择保留几位小数&#xff0c;图中为保留…

【MySQL】常见可执行程序

本文使用的版本是MySQL8&#xff0c;5.7可能会有所不同。 MySQL提供了一些重要的程序用来管理和操作数据库。这里会介绍一些常用的程序及其使用。对于MySQL程序的使用&#xff0c;可以查看官方帮助手册来学习。 MySQL :: MySQL 8.0 Reference Manual :: 6 MySQL Programs 程序…

找了半天,还不如自己写一个图片转ico格式的程序

关于jpg、png等图片转ICO格式 最近突然急需一张ico格式的文件&#xff0c;就拿着处理好的png图片出网上找在线转换器&#xff0c;找了一个小时&#xff0c;绝了&#xff0c;不是需要注册充钱就是下载不下来&#xff0c;好不容易下载下来还是个文件错误。想着找个PS插件直接导出…

烧写uboot、linux镜像、根文件系统到开发板

烧写uboot、linux镜像、根文件系统到开发板 环境介绍 本博客使用x6818开发板。 公司&#xff1a;三星 ARM架构 Cortex-A53核 型号&#xff1a;S5P6818 特性&#xff1a;8核&#xff0c;最高主频2GHz 烧写uboot 使用网络烧写 网络烧写上位机是Ubuntu虚拟机。 先利用上…

基于STM32智能小车

一、前置准备 前置知识&#xff1a;需要学习stm32&#xff0c;建议去b站看江科大的视频&#xff0c;讲的很详细&#xff0c;学完串口那一块就可以制作了&#xff0c;软件用的是Keil5&#xff0c;开发语言C语言&#xff0c;手机连接蓝牙模块软件是蓝牙调试器。 需要准备的器件…

数学+思维,CF1056B - Divide Candies

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1056B - Codeforces 二、解题报告 1、思路分析 考虑i^2 j^2 | m 而m的余数有限&#xff0c;且m很小 我们枚举两重循环&#xff0c;都枚举m的余数&#xff0c;分别记为x&#xff0c;y 如果x ^ …

Linux☞进程控制

在终端执行命令时&#xff0c;Linux会建立进程&#xff0c;程序执行完&#xff0c;进程会被终止&#xff1b;Linux是一个多任务的OS,允许多个进程并发运行&#xff1b; Linxu中启动进程的两种途径&#xff1a; ①手动启动(前台进程(命令gedit)...后台进程(命令‘&’)) ②…

数据库安全加固与API防护策略

在数字化时代&#xff0c;数据库作为企业核心资产的安全性至关重要。然而&#xff0c;随着网络攻击手段的不断演进&#xff0c;数据库和API接口成为了黑客的主要攻击目标。本文将探讨数据库被攻击、API接口被滥用的情况&#xff0c;并提供一系列实用的防护措施&#xff0c;旨在…

【玩转C语言】第三讲---> scanf 和 printf 函数详解(非常重要)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 引言&#xff1a; 大家好&#xff0c;我是坊钰&#xff0c;为了让大家深入了解C语言&#xff0c;我开创了【玩转C语言系列】&#xff0c;将为大家介绍C语言相关知识…

C++ ─── STL 以及string

前言&#xff1a;什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 STL的六大组件 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符…

Ambari集成Apache Kyuubi实践

目前还有很多公司基于HDP来构建自己的大数据平台&#xff0c;随着Apache Kyuubi的持续热度&#xff0c;如何基于原有的HDP产品来集成Apache Kyuubi&#xff0c;很多人都迫切的需求。集成Apache Kyuubi到HDP中&#xff0c;主要涉及Ambari的二次开发。本文详细叙述了集成Apache K…

分享一个用python的本地WIFI密码查看器

本章教程&#xff0c;主要分享一个本地wifi密码查看器&#xff0c;用python实现的&#xff0c;感兴趣的可以试一试。 具体代码 import subprocess # 导入 subprocess 模块&#xff0c;用于执行系统命令 import tkinter as tk # 导入 tkinter 模块&#xff0c;用于创建图形用…

实现Ingress-Nginx Controller高可用方案

文章目录 前提准备1.修改Ingress-Controller 运行模式为hostNetwork并生效2.给部署ingress-controller的节点打标签3.查看ingress-controller的部署情况 方式一&#xff1a;LVSKeepalivedNginxIngress一、部署ipvsadm和keepalived二、配置keepalived1.配置lvs01(keepalived mas…

Java Web学习笔记27——对话框、表单组件

常见组件对话框&#xff1a; Dialog对话框&#xff1a;在保留当前页面状态下&#xff0c;告知用户并承载相关操作。 dialogTableVisible: false 默认是不可见的。 在按钮属性中设置为true的意思&#xff0c;点击按钮的时候&#xff0c;才会true&#xff0c;对话框才会显示。 …

python Tk 获取输入框内容,分割内容

创建输入框、一个按钮和一个标签的GUI。 用户可以在输入框中输入文本&#xff0c;点击按钮后&#xff0c;程序将在控制台打印输入的文本&#xff08;已经分割为列表&#xff09;&#xff0c;并在GUI中的标签上显示一些静态文本。 import tkinter as tk# 创建主窗口 root tk.…