程序员实用算法
⑴ C++算法求精,看看谁的算法最优
(1)分别使用二分插入排序和堆排序两种算法实现
(2)统计每种算法所需时间
(3)前n个节点的信息及时间统计结果写入到文件中
(
⑵ 求类似计算器的算法- - 比如 (2+7)*2 或者 (4-1)/3 解这些字符串 然后算出结果
这是我以前做的额,运行在tc上运行可以,因为atoi()(字符转数值)是tc的库函数,在c++6.0上会报错,其实很简单,自己都可以编一个。刚开始运行没有提示,忘记了,输入表达式回车就行了。基本思想是将中缀表达式利用栈转成后缀表达式,再求值。
#include<stdio.h>
#define max 100
typedef long datatype;
typedef char chartype;
typedef struct
{
datatype data[max];
int top;
}numstack;/*对象栈用于存储运算对象*/
typedef struct
{
chartype data[max];
int top,y[max];/*y中存储对应运算符的优先级*/
}stack;/*运算符栈用于存储运算符*/
int fenli(numstack *S,char string[max],int i)
/*将运算对象从表达式中取出转换为数值并存储在对象栈中*/
{
int j=0;
char st[100];/*st用于暂时存储字符类型的运算对象*/
do
{
st[j]=string[i];i++;j++;
}while(string[i]>='0'&&string[i]<='9');/*将运算对象从表达式中取出存储在st中*/
st[j]='\0';
S->top++;
S->data[S->top]=atoi(st);/*atoi的作用是将字符串转换为对应的数值,将转换后的数值存储在对象栈中*/
j=0;
return(i);/*将当前字符的位置返回*/
}
int pipei(char string[max])
/*验证括号是否匹配*/
{
stack *S;
int i=0;
S->top=0;/*初始化运算符栈*/
while(string[i]!='\0')
{
if(string[i]=='(')/*遇到'('将'('入栈*/
{
S->top++;
S->data[S->top]=string[i];
}
if(string[i]==')')/*遇到')',判断栈顶是否'(',如果是则将栈顶出栈,否则括号不匹配返回0*/
if(S->data[S->top]=='(')
S->top--;
else return(0);
i++;
}
if(S->top>0) return(0);/*判断运算符栈是否为空,不为空则括号不匹配返回0,为空则括号匹配返回1*/
else return(1);
}
void yunsuan(char string[max])
{
numstack *S;
int i=0;
S->top=0;/*初始化对象栈*/
while(string[i]!='\0')/*如果是结束符,结束循环*/
{
if(string[i]>='0'&&string[i]<='9')/*如果当前字符是运算对象,调用fenli函数将运算对象分离出来,并转换为对应数值*/
i=fenli(S,string,i);
else
{/*如果是运算符,则将对象栈中栈顶俩个运算对象做对应的运算,将结果压入对象栈*/
switch(string[i])
{
case ' ':{break;}
case '+':{S->data[S->top-1]+=S->data[S->top];S->top--;break;}
case '-':{S->data[S->top-1]-=S->data[S->top];S->top--;break;}
case '*':{S->data[S->top-1]*=S->data[S->top];S->top--;break;}
case '/':{S->data[S->top-1]/=S->data[S->top];S->top--;break;}
}
i++;/*扫描下一字符*/
}
}
printf("表达式运算结果为: %ld \n",S->data[S->top]);
}
int zhuanghuan(char s[max],char string[max])
/*将中缀表达式转换为后缀表达式*/
{
stack *S;
int i=0,j=0;
S->top=-1;
S->y[0]=0;/*初始化运算符栈*/
while(s[i]!='\0')/*遇到结束符结束循环*/
{
if(s[i]>='0'&&s[i]<='9')/*遇到运算对象*/
{
string[j]=s[i];/*将运算对象存入转换后的字符串中*/
j++;
}
else switch(s[i])
{
case '(':{/*遇到'(',直接入运算符栈*/
S->top++;
S->data[S->top]='(';
S->y[S->top]=0;/*'('在括号内运算优先级最低,在括号外最高*/
break;
}
case ')':/*遇到')',将运算符栈的运算符出栈,直到遇到'('为止,将'('直接出栈*/
{
while(S->data[S->top]!='(')
{
string[j]=S->data[S->top];
S->top--;j++;
}
S->top--;break;
}
case '+':
case '-':{
string[j]=' ';/*将运算对像用间隔开*/
if(S->y[S->top]>=1)/*如果栈顶元素的优先级大于+-的优先级1,则将栈顶元素出栈*/
{
string[j]=S->data[S->top];
S->top--;
}
S->top++;
S->data[S->top]=s[i];/*将当前运算符+或-入栈*/
S->y[S->top]=1;/*+-的优先级定义为1*/
j++;break;
}
case '*':
case '/':{ if(s[i]=='/'&&s[i+1]=='0') {printf("除数不能为0\n");return(0);}
string[j]=' ';
if(S->y[S->top]>=2)/*如果栈顶元素的优先级大于等于*或/的优先级,则将栈顶元素出栈*/
{
string[j]=S->data[S->top];
S->top--;
}
S->top++;
S->data[S->top]=s[i];/*将当前运算符*或/入栈*/
S->y[S->top]=2;/*优先级定义为2*/
j++;break;
}
}
i++;
}
while(S->top!=-1)/*若栈不为空,出栈直到栈空*/
{
string[j]=S->data[S->top];S->top--;j++;
}
string[j]='\0';
printf("后缀表达式为:%s\n",string);
return(1);
}
int main()
{
char string[max],s[max],flag='1';
while(flag!='0')
{
printf("");
gets(s);
if(pipei(s))
{
if(zhuanghuan(s,string))
yunsuan(string);
}
else printf("bupipei");
printf("结束输入0,输入任意字符继续");
scanf("%c",&flag);
}
}
⑶ 大学计算机专业java课程学的都有什么
1、 java语法。
通过任何一本Java入门书籍,都可以学会Java的基本语法。千万不要认为,你把书上的例子程序都能写出来就算学会了Java语法。要想真正掌握,还需要做大量的测试题。对语法不准确的理解,会使你写的代码出现逻辑错误。而这些错误会使你在真正的项目开发中吃尽苦头:你认为正确才会写上去。而在几十万行代码中找出几行有逻辑错误的代码,非常困难。因为你几乎不会怀疑你认为正确的代码存在错误。
2、 常用类。
永远不要写别人已经实现的代码。有很多功能,用JDK中现有的类就可以完成。你需要熟悉JDK.可以通过研究JDK帮助文档和JDK源代码的方式,逐渐了解,你需要的类都在什么地方。一方面,要熟悉有哪些可以直接使用的资源,另一方面,学习一下,SUN公司的工程师怎样写代码。
3、 IDE 集成开发环境。
现在企业最常用的是IBM公司的eclipse ,类似的还有JBuilder 、Idea,NetBeans等等。毕竟,只有5%的顶尖高手在使用简单的文本编辑器在写Java代码。多数程序员都是在使用这些东西。
4、 数据库。
MySql,Oracle,DB2.小项目多数使用MySql这样的免费数据库。大一些的项目会考虑使用Oracle或者DB2. Java项目很少使用SqlServer。因此,你还需要学习数据库方面的一些知识。可以从SQL语言开始。这些数据库都支持标准SQL.学会基本的SQL,参考具体的数据库手册,就可以完成一般的项目开发了。当然,要想使你的程序运行的效率更高,需要更深入的学习。大部分的程序优化,都是从这部分开始的。
5、 JDBC Java数据库连接。
使用Java程序操作数据库。这部分非常重要。几乎所有的企业项目都会用到。
6、 HTML CSS Javascript。
HTML-- 超文本标记语言。
CSS --层叠样式表。
JavaScript--是一种由Netscape的LiveScript发展而来的脚本语言。
准确的说,这些东西和Java语言本身关系不大。但是,现在的企业项目,以B/S结构的居多。因此,我们的Java程序,会有大量的机会和它们打交道。需要提前准备一下。
7、你需要学习如何使用及管理WEB服务器,例如tomcat,并且知道如何在其基础上扩展和维护WEB程序,如何使用它的附加服务,如连接池。
8、 JSP Servlet。
这两个是初级Java程序员必须掌握的基本技能,是所有B/S结构框架的基础。相应的,还需要学习EL以及JSTL(StandardTagLibraries)和可以选择的第三方TagLibraries,以提高表示层的处理能力。
9、企业流行框架 Struts,Spring,Hibernate等。
10、Java设计模式。
有一些特殊的功能,只有按照特定的设计模式才能实现。如果你有了5万行以上的代码经验,可以开始研究一下设计模式。
11、你还要跟上技术发展的步伐,了解在Java项目中使用的新技术。如Ajax等。
还有很多要学习的内容。先介绍这么多吧,自己学习这些内容,估计需要2年左右。如果有个好的指导老师,在培训学校进行系统学习,则需要4-5个月。
如果选择培训,一定要选择拥有多年JAVA项目开发经验、测试经验、及项目管理经验,采用“教”“练”结合,用真实项目案例进行训练的教学方式。让学员掌握实用的技能,在毕业后就有着实战项目开发经验,立刻上岗,成为诸多企业抢手的人才。
⑷ 计算机相关专业想学习算法,需要看哪些书
《算法与数据结构》,《计算机组成原理,汇编语言》,《数字逻辑》,《编译原理》,《计算机网络》,《面向对象的程序设计等》。
⑸ 新手如何学习编程
熟悉以下关键东西,可以边学边做,定期训练,经常思考,长期积累:
1、语法。
2、基础理论(数学、数据结构、算法等)。
3、设计方法(编程原则、设计模式、框架设计等)。
4、库(核心、基础、UI、扩展、游戏引擎等)。
5、计算机相关(操作系统、网络、图形学等)。
6、领域知识(游戏设计、网站设计等)。
7、开发工具(编辑器、IDE、自动部署等)。
8、项目管理(进度管理、分工协作、Bug管理、版本控制等)。
最普遍也是最重要的能力:创造力。努力分析并理解好做什么以及怎么做。要知道上面那些东西一开始都是不存在的。
具体方法包括:
1、快速阅读入门教程和书籍,适合学习语言和基础库。比如我学Java读的《Java编程思想》,练习题做过一点,然后学ActionScript就没读过书,只读过Adobe官方文档《ActionScript 3.0编程》。
2、阅读库的文档、实例、源码。比如Flash、Flex开发,熟悉官方API很重要,很多细节要具体使用时才注意到,这时候最好做个笔记,虽然我从没看过我的笔记。
3、做一个自己感兴趣或熟悉的小项目,比如我就以黑白棋游戏作为多个语言的试水项目,一样的逻辑,便于把关注点放在语言特点上。
4、自己动手丰衣足食。厨师有菜谱,程序员可没菜谱。比如我做游戏,最关键的游戏编程知识全部是动手学出来的,很少有专门针对某个业务领域(如游戏)的编程书籍,要么是入门书,要么是模式书(如算法)、理论书(图形学),很少有书籍教你如何开发一个45度角地图系统加编辑器的,全靠自己思考,以及看前人的代码,需要时找些网络资料。关键是,可以培养最重要的创造力。
对于算法和设计模式,可以研读下,但是关键还是靠平时如何使用了。新手勉强不来的。
项目管理方面的,就得靠工作经验了,多思考多提意见不要只走流程。
⑹ 有哪些it程序员的必备神器
URL Decoder/Encoder:https://meyerweb.com/eric/tools/dencoder/ 特别实用的一个用来处理URL编码和解码的小工具,你甚至可以直接将这个页面的源代码保存下来,这样不需要连接上网也可以离线使用。附送的一个隐藏功能就是当你从任何地方拷贝信息过来的时候,它会自动去除拷贝过来的格式化信息,小编自己基本上每天都会使用这个小工具复制粘贴各种信息。
iTerm2是一款完全免费的开源软件,可以完全替代MacOS的终端。iTerms功能强大,使用方便,可以让你轻松且高效地管理和定制化你的工作流程。iTerm2的一些特色功能包括:标签变色,智能选中,自动补齐,全屏展示所有的 tab并支持搜索(Exposé Tabs),丰富的快捷操作等。
Textpad这款工具具有无限制的撤销/重做功能,并且能够编辑超大文件,文件上限是系统虚拟内存大小。
Octotree:https://www.octotree.io/Github是目前使用最广泛的版本控制工具,然而通过浏览器访问Github的体验并不是那么友好,特别是当我们需要不断地访问不同文件夹里面的文件的时候。Octotree正是这样一款浏览器插件,它提供了类似IDE的便于访问的代码目录树,能够提高我们在Github上工作效率。
Wireshark:这个工具可以用来监控机器上的TCP、HTTP等各层级的网络通信。作为后端开发,如果想看前端发来的请求到底都包含了哪些信息,又没有前端的调试环境的话,使用Wireshark监控HTTP请求是很好的解决方案。自己在程序中发HTTP请求时,也可以使用它来检查发出的HTTP请求是否符合自己的预期。
Mermaid:这个工具可以使用脚本语言直接渲染出流程图、时序图、甘特图,写文档简单快捷。免拖拽,免排版,格式控制统一。脚本也便于存放修改,样式可以复用。还可以使用插件集成如Markdown编辑器,进行实时预览。
spectacle:Mac free source 窗口控制工具,拖拽窗口到屏幕边缘resize,也可以自定义快捷键。用起来跟Windows上面一样。相比较于Moom,SizeUp,Divvy,spectacle支持鼠标拖拽到边缘resize,非常便利。
Tmux:一个虚拟终端可以管理多个会话,窗口和面板。执行 tmux 命令时就开启了一个服务并创建了一个会话,窗口和面板。支持分屏,同时处理多个操作。不受断网影响,避免丢失重要工作进度。方便演示与协作,支持结对编程。
Caniuse:https://caniuse.com/#home 通过这个网站,用户能够查询主流浏览器特定版本对HTML,CSS和JS的支持情况。并且最重要的是它“免费”!
Visual Studio Code:这是微软出品的IDE工具,跨平台(Linux,Mac,Windows)。轻量级内存占用,品质稳定且免费。同时内置Git版本控制功能。值得一提的是插件生态丰富,安装插件简单,通过插件可以增加更丰富的语言支持、主题定制、文本自动格式化等能力。