- 瑞瑞爱吃桃
-
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!
java0基础视频百度网盘资源免费下载
链接:https://pan.b***.com/s/1Z3hElReOAvDKe2w6X98P2w
提取码:riftjava0基础视频|java4视频|[Java4Android]53.mp4|[Java4Android]52_综合练习(三) 定义输入输出格式.mp4|[Java4Android]51_综合练习(二).mp4|[Java4Android]50_综合练习(一).mp4|[Java4Android]49_开发工具之Eclipse(四).mp4|[Java4Android]48_开发工具之Eclipse(三).mp4|[Java4Android]47_开发工具之Eclipse(二).mp4|[Java4Android]46_开发工具之Eclipse(一).mp4|[Java4Android]45_hashCode()与toString().mp4|[Java4Android]44_equals函数的作用.mp4|[Java4Android]43_类集框架(三).mp4|[Java4Android]42_类集框架(二).mp4|[Java4Android]41_类集框架(一).mp4
- LocCloud
-
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!
java视频免费下载
链接:https://pan.b***.com/s/117W9HdLwut_LoHQsSAX04Q
提取码:73qcjava视频|53.mp4|52_定义输入输出格式.mp4|51_综合练习(二).mp4|50_综合练习(一).mp4|49_开发工具之Eclipse(四).mp4|48_开发工具之Eclipse(三).mp4|47_开发工具之Eclipse(二).mp4|46_开发工具之Eclipse(一).mp4|45_hashCode()与toString().mp4|44_equals函数的作用.mp4|43_类集框架(三).mp4|42_类集框架(二).mp4|41_类集框架(一).mp4|40_Java当中的数组.mp4
- 再也不做稀饭了
-
java视频教程的话,你可以在网上找一下,现在的视频教程有很多。就看你喜欢那套视频教程了,现在能看视频的地方有很多啊,像B站,蛙课网,慕课网等等等,都是可以看Java视频教程的。而且蛙课网的视频教程都是全套的。
蛙课网上视频教程的质量都是很不错的,如果你喜欢的可以去看看。从Java的基础到java的项目都有。
如果你想看java基础的视频教程的话,你可以在B站上看一下老杜的159集的视频教程,在B站上播放量是130多万,这个视频教程的质量你就可想而知了,所以如果你要想学java的话可以去看这套视频教程。
- snjk
-
可以网上找老罗的视频资料看,讲得比较全面,也很好,百度就能找到。学习java,安卓还是不错的选择,移动时代还是非常火的。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
发展历程:20世纪90年代,硬件领域出现了单片式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(如电视机顶盒、面包烤箱、移动电话等)的智能化程度。
Sun公司为了抢占市场先机,在1991年成立了一个称为Green的项目小组,帕特里克、詹姆斯·高斯林、麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用。
- 苏萦
-
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!
关于Java教学视频,这里留一个视频资源地址,有众多入门学习免费资源。学习入口限时开放,速速领取!
还是更建议进行系统学习。推荐粤嵌IT培训,有全日制学习班和业余学习班,包含线上或线下学习,可以满足学习工作两不误的需求!同时,线上学习的课程也是和线下面授课程一样,严格按照课研中心要求制作的,质量非常高!粤嵌具有丰富的育人与研发经验,17年教育与技术沉淀,科学的学习管理模式,最大化提升学习效率。
- 小菜G
-
java视频教程的话,你可以在网上找一下,现在的视频教程有很多。就看你喜欢那套视频教程了,现在能看视频的地方有很多啊,像B站,蛙课网,慕课网等等等,都是可以看Java视频教程的。而且蛙课网的视频教程都是全套的。
蛙课网上视频教程的质量都是很不错的,如果你喜欢的可以去看看。从Java的基础到java的项目都有。
如果你想看java基础的视频教程的话,你可以在B站上看一下老杜的159集的视频教程,在B站上播放量是130多万,这个视频教程的质量你就可想而知了,所以如果你要想学java的话可以去看这套视频教程。
视频教程好不好,一个人一份体验不是吗?而且老的视频教程既然经过了那么多人的认同,那你说这套视频好不好呢?
- 小教板
-
现在网络这么发达,很多质量好而且免费的Java视频可以下载,例如:腾讯课堂、百度传课等平台搜动力节点,会有很多质量不错的java视频。
- 豆豆staR
-
首推 李兴华 或者 马士兵
因为马士兵视频是老的而已。知识不老,自己选吧。
去电驴搜索这两人的名字,我这两个人都看过都不错。
- ardim
-
我是经常看动力节点的视频的,以前腾讯课堂,后来去他们校网上面下了再跟着学。现在他们推出了蛙课网后,就一直在蛙课上面看了,每周都有更新的新技术。
- CarieVinne
-
很多的培训机构都会录制比较完整的入门级视频教程提供下载的,单是想要入门的话下载看这些就够了兄弟连Java战狼班,如果要深入的学习可以参考他们列出来的教学提纲去网络搜索
- 余辉
-
上21互联网看看
- 苏州马小云
-
推荐了解下我们尚学堂的“java300集”,目前在行业里口碑还是很好的!
可在B站搜索我们官方账号免费学习哦!
另附上我们的学习路线供你参考!
希望能帮到你,望采纳!!
在计算机程序领域,递归 和 递推 对应的英文分别是什么?
递归 recursion 递推 recurrence2023-08-01 17:51:171
c语言中,什么是函数的递归,能举个例子么
int rev(int i){ if(i<5) rev(i++); else return i;}2023-08-01 17:51:284
英语Watch directories recursively怎么翻译?
“Watch directories recursively”这一英语句子中,用中文表达,可以表达成“递归观察目录”,仅供参考。2023-08-01 17:51:565
c语言中的递归
递归具体用法其实就是让你把一个问题分解成很多个类似的情况,虽然你要解决这个问题非常难,莫名其妙,要你想几年,但是把他一直递归分解,就变成很好理解的单种情况,而你整个问题又是跟这个单种情况类似,把整个问题通过递归调用一层一层分解到最低级简单的那种情况,就是你所需要理解的了。一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。(引自谭浩强的C语言书里)用递归法计算n!可用下述公式表示: n!=1 (n=0,1) n×(n-1)! (n>1)具体如下long ff(int n){ long f; if(n<0) printf("n<0,input error"); else if(n==0||n==1) f=1; else f=ff(n-1)*n; return(f);}main(){ int n; long y; printf(" input a inteager number: "); scanf("%d",&n); y=ff(n); printf("%d!=%ld",n,y);}较难题:一块板上有三根针,A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。如图5.4所示。要把这64个圆盘从A针移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。具体如下move(int n,int x,int y,int z){ if(n==1) printf("%c-->%c ",x,z); else { move(n-1,x,z,y); printf("%c-->%c ",x,z); move(n-1,y,x,z); }}main(){ int h; printf(" input number: "); scanf("%d",&h); printf("the step to moving %2d diskes: ",h); move(h,"a","b","c");} 从程序中可以看出,move函数是一个递归函数,它有四个形参n,x,y,z。n表示圆盘数,x,y,z分别表示三根针。move 函数的功能是把x上的n个圆盘移动到z上。当n==1时,直接把x上的圆盘移至z上,输出x→z。如n!=1则分为三步:递归调用move函数,把n-1个圆盘从x移到y;输出x→z;递归调用move函数,把n-1个圆盘从y移到z。在递归调用过程中n=n-1,故n的值逐次递减,最后n=1时,终止递归,逐层返回。当n=4 时程序运行的结果为:2023-08-01 17:52:242
求卡西欧fx-5800计算器中键MODE里的各项是各是什么意思?谢谢、、(说明不见了,英文不好)
mode 可以调计算模式和屏幕亮度,要与shift健结合2023-08-01 17:52:331
英语primary name怎么翻译?
英语primary name可以翻译成,主的名字Primary表示是耶稣,主的意思。2023-08-01 17:52:477
计算机里面什么是递归?
怎么能这样我掌中通了你斟酌斟酌一下你一言我一语我也不行木木您2023-08-01 17:53:2411
c语言采用递归调用方法倒序输出26个英文大写字母,各位大侠帮忙,急求...
ZYXWVUTSRQPONMLKJIHGFEDCBA#include <stdio.h>fun(char c){ printf("%c",c); while (c<"A"); fun(--c);}main(){ char ch="Z"; fun(ch);}2023-08-01 17:54:112
急!!!c++ 递归生成字符串首字母缩写
#include <stdio.h>#include <ctype.h>#include <string.h>char *getAcronym(char *src, char *dest){ char arr[4]; char *p = src, *temp; char *q = dest; if (!*p) return NULL; if (isupper(*p)) { temp = p; switch (*p) { case "A" : // 排除 a an and if (*++temp == " " || (*temp == "n" && *++temp == " ") || (*temp == "d" && *++temp == " ")) { getAcronym(++p, q); } else { sprintf(q, "%c", *p); getAcronym(++p, ++q); } break; case "O" : // 排除 of if (*++temp == "f" && *++temp == " ") { getAcronym(++p, q); } else { sprintf(q, "%c", *p); getAcronym(++p, ++q); } break; case "F" : // 排除 for if (*++temp == "o" && *++temp == "r" && *++temp == " ") { getAcronym(++p, q); } else { sprintf(q, "%c", *p); getAcronym(++p, ++q); } break; case "T" : // 排除 the if (*++temp == "h" && *++temp == "e" && *++temp == " ") { getAcronym(++p, q); } else { sprintf(q, "%c", *p); getAcronym(++p, ++q); } break; default : sprintf(q, "%c", *p); getAcronym(++p, ++q); break; } } else { getAcronym(++p, q); } return NULL;}int main(){ char s[] = {"The Asia-Pacific A Hw Of Lkd An Psad For Pds And Economic Cooperation"}; char d[20]; memset(d, 0, 10); getAcronym(s, d); printf("%s ", d); return 0;}2023-08-01 17:54:192
c++编程用递归函数将英文字符逆序输出
#include<stdio.h>#include<string.h>void strrev2(char* str,int len){if(len<2)return ;else{str[len-1]=*str+str[len-1];*str=str[len-1]-*str;str[len-1]=str[len-1]-*str;strrev2(str+1,len-2);}}int main(){char s[100];scanf("%s",s);strrev2(s,strlen(s));printf("%s ",s);return 0;}2023-08-01 17:54:291
英文翻译
在C : > bindiff.exe / ? bindiff 1.1版研制的史蒂夫米勒页版权所有( C )微软1998-1999 。保留所有权利。 用法: bindiff [ / ? ] [ /炭] [ / [ # ] [ /秒] [音频/视频] leftspec rightspec /吗?显示此帮助屏幕。 /炭展示不同的字节计数和汇总信息。 / [编号]展示字节区别不同的档案。你可以可选择指定数目的非不同的字节,以显示对每个一边的不同地区中的档案。默认是8个字节。使用0只显示了不同的字节,或-1倾倒既整个档案。 /秒的过程子目录( leftspec和rightspec必须目录) 。 音频/视频排除所有版本信息,在可执行文件中,除了时间邮票领域的时候,表演了比较。 左,右规格可代表文件或目录。如果这两个文件是指定的,那么,文件会被比较,对对方的经验。如果两个目录指定,则所有的档案目录都将递归相比,对对方的经验。 bindiff使用一种比较特殊的例行为Win32的可执行文件说,口罩各项建设时间戳领域,在这两个文件的时候,表演了比较。 这使得两个可执行文件能够被标明为"近乎一致的: "当档案是真正相同的,除了时间,他们建成。 在C : >2023-08-01 17:54:381
阶乘的英文
阶乘的英文是factorial。1、定义与符号阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于1808年发明的运算符号,是数学术语。阶乘是一种数学运算方法,表示一个正整数的所有小于等于它的正整数的积。通常用感叹号(!)来表示,例如3的阶乘写作3!,表示3×2×1=6。2、常规算法计算阶乘的常见方法是使用递归和迭代。递归方法基于n!=n×(n-1)!的定义,因此可以通过递归调用函数来计算阶乘。迭代方法在循环中计算阶乘,从1乘到n,并将每个值乘积。3、应用场景阶乘在组合数学和概率论等领域被广泛应用。在组合数学中,阶乘用于计算排列和组合数(即不同的排列或组合数量)。而在概率论中,它可以用来计算排列和组合的可能性。此外,在计算机科学中,阶乘被用于优化程序的性能,例如计算矩阵的行列式或计算卷积。4、高精度计算在计算大数的阶乘时,会遇到精度不足的问题。这时可以使用高精度计算方法进行处理,如Java中的BigDecimal类或Python中的gmpy2模块。5、欧拉常数欧拉常数是自然对数的一个特殊值,也可以用阶乘的无穷级数来定义。即Hn=1+1/2+1/3+…+1/n-ln(n),其中ln表示自然对数。该无穷级数在数学中具有重要意义,并被广泛应用于数论、复杂分析和物理学等领域。总结:阶乘是一个简单而重要的数学运算方法,在组合数学和概率论等领域被广泛应用。它可以通过递归或迭代方法进行计算,并需注意精度问题。2023-08-01 17:55:011
网络用语np是什么意思呢?
np的全称是NP完全问题。NP完全问题(NP-C问题),是世界七大数学难题之一。NP的英文全称是Non-deterministicPolynomial的问题,即多项式复杂程度的非确定性问题。简单的写法是NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。NP中的某些问题的复杂性与整个类的复杂性相关联.这些问题中任何一个如果存在多项式时间的算法,那么所有NP问题都是多项式时间可解的.这些问题被称为NP-完全问题(NPC问题)。扩展资料:P=NP问题可以用逻辑命题的特定类的可表达性的术语来重新表述。所有P中的语言可以用一阶逻辑加上最小不动点操作(实际上,这允许了递归函数的定义)来表达。类似地,NP是可以用存在性二阶逻辑来表达—也就是,在关系、函数、和子集上排除了全域量词的二阶逻辑。多项式等级,PH中的语言对应与所有的二阶逻辑。康奈尔大学的Hubert Chen博士提供了这个玩笑式的P不等于NP的证明:“反证法。设P = NP。令y为一个P = NP的证明。证明y可以用一个合格的计算机科学家在多项式时间内验证,我们认定这样的科学家的存在性为真。但是,因为P = NP,该证明y可以在多项式时间内由这样的科学家发现。参考资料:百度百科—NP完全问题2023-08-01 17:55:472
C++中如何表示从2到10?
综合自网络C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块“难啃的硬骨头”几乎是公认级别的。指针公认最难理解的概念,也是让很多初学者选择放弃的直接原因。指针之所以难理解,因为指针本身就是一个变量,是一个非常特殊的变量,专门存放地址的变量,这个地址需要给申请空间才能装东西,而且因为是个变量可以中间赋值,这么一倒腾很多人就开始犯晕了,绕不开弯了。C语言之所以被很多高手所喜欢,就是指针的魅力,中间可以灵活的切换,执行效率超高,这点也是让小白晕菜的地方。指针是学习绕不过去的知识点,而且学完C语言,下一步紧接着切换到数据结构和算法,指针是切换的重点,指针搞不定下一步进行起来就很难,会让很多人放弃继续学习的勇气。指针直接对接内存结构,常见的C语言里面的指针乱指,数组越界根本原因就是内存问题。在指针这个点有无穷无尽的发挥空间。很多编程的技巧都在此集结。指针还涉及如何申请释放内存,如果释放不及时就会出现内存泄露的情况,指针是高效好用,但不彻底搞明白对于有些人来说简直就是噩梦。在概念方面问题可以参见此前推文《对于C语言指针最详尽的讲解》,那么在指针方面可以参见一下大神的经验:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型。所以先介绍一下如何完全理解一个复杂类型。要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样。所以笔者总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析。下面让我们先从简单的类型开始慢慢分析吧。int p;这是一个普通的整型变量int p;首先从P处开始,先与结合,所以说明P是一个指针。然后再与int结合,说明指针所指向的内容的类型为int型,所以P是一个返回整型数据的指针int p[3];首先从P处开始,先与[]结合,说明P是一个数组。然后与int结合,说明数组里的元素是整型的,所以P是一个由整型数据组成的数组。int *p[3];首先从P处开始,先与[]结合,因为其优先级比高,所以P是一个数组。然后再与结合,说明数组里的元素是指针类型。之后再与int结合,说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据的指针所组成的数组。int (*p)[3];首先从P处开始,先与结合,说明P是一个指针。然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组。之后再与int结合,说明数组里的元素是整型的。所以P是一个指向由整型数据组成3个整数的指针。int **p;首先从P开始,先与结合,说明P是一个指针。然后再与结合,说明指针所指向的元素是指针。之后再与int结合,说明该指针所指向的元素是整型数据。由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针。int p(int);从P处起,先与()结合,说明P是一个函数。然后进入()里分析,说明该函数有一个整型变量的参数,之后再与外面的int结合,说明函数的返回值是一个整型数据。int (*p)(int);从P处开始,先与指针结合,说明P是一个指针。然后与()结合,说明指针指向的是一个函数。之后再与()里的int结合,说明函数有一个int型的参数,再与最外层的int结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针。int (p(int))[3];可以先跳过,不看这个类型,过于复杂。从P开始,先与()结合,说明P是一个函数。然后进入()里面,与int结合,说明函数有一个整型变量参数。然后再与外面的结合,说明函数返回的是一个指针。之后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组。接着再与结合,说明数组里的元素是指针,最后再与int结合,说明指针指向的内容是整型数据。所以P是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。说到这里也就差不多了。理解了这几个类型,其它的类型对我们来说也是小菜了。不过一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用。这上面的几种类型已经足够我们用了。细说指针指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。先声明几个指针放着做例子:(1)int*ptr;(2)char*ptr;(3)int**ptr;(4)int(*ptr)[3];(5)int*(*ptr)[4];指针的类型从语法的角度看,小伙伴们只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看上述例子中各个指针的类型:(1)intptr;//指针的类型是int(2)charptr;//指针的类型是char(3)intptr;//指针的类型是int(4)int(ptr)[3];//指针的类型是int()[3](5)int*(ptr)[4];//指针的类型是int(*)[4]怎么样?找出指针的类型的方法是不是很简单?指针所指向的类型当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,小伙伴们只需把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。上述例子中各个指针所指向的类型:(1)intptr; //指针所指向的类型是int(2)char*ptr; //指针所指向的的类型是char*(3)int*ptr; //指针所指向的的类型是int*(4)int(*ptr)[3]; //指针所指向的的类型是int(*)[3](5)int*(*ptr)[4]; //指针所指向的的类型是int*(*)[4]在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当小伙伴们对C 越来越熟悉时,就会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。笔者看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。指针的值即指针所指向的内存区或地址。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?指针本身所占据的内存区指针本身占了多大的内存?只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。0x02 函数面向过程对象模块的基本单位,以及对应各种组合,函数指针,指针函数一个函数就是一个业务逻辑块,是面向过程,单元模块的最小单元,而且在函数的执行过程中,形参,实参如何交换数据,如何将数据传递出去,如何设计一个合理的函数,不单单是解决一个功能,还要看是不是能够复用,避免重复造轮子。函数指针和指针函数,表面是两个字面意思的互换实际上含义截然不同,指针函数比较好理解,就是返回指针的一个函数,函数指针这个主要用在回调函数,很多人觉得函数都没还搞明白,回调函数更晕菜了。其实可以通俗的理解指向函数的指针,本身是一个指针变量,只不过在初始化的时候指向了函数,这又回到了指针层面。没搞明白指针再次深入的向前走特别难。C语言的开发者们为后来的开发者做了一些省力气的事情,他们编写了大量代码,将常见的基本功能都完成了,可以让别人直接拿来使用。但是那么多代码,如何从中找到自己需要的呢?将所有代码都拿来显然是不太现实。但是这些代码,早已被早期的开发者们分门别类地放在了不同的文件中,并且每一段代码都有唯一的名字。所以其实学习C语言并没有那么难,尤其是可以在动手锻炼做项目中进行。使用代码时,只要在对应的名字后面加上( )就可以。这样的一段代码就是函数,函数能够独立地完成某个功能,一次编写完成后可以多次使用。很多初学者可能都会把C语言中的函数和数学中的函数概念搞混淆。其实真相并没有那么复杂,C语言中的函数是有规律可循迹的,只要搞清楚了概念你会发现还挺有意思的。函数的英文名称是 Function,对应翻译过来的中文还有“功能”的意思。C语言中的函数也跟功能有着密切的关系。我们来看一小段C语言代码:#includeint main()puts("Hello World");return 0;把目光放在第4行代码上,这行代码会在显示器上输出“Hello World”。前面我们已经讲过,puts 后面要带(),字符串也要放在()中。在C语言中,有的语句使用时不能带括号,有的语句必须带括号。带括号的就是函数(Function)。C语言提供了很多功能,我们只需要一句简单的代码就能够使用。但是这些功能的底层都比较复杂,通常是软件和硬件的结合,还要要考虑很多细节和边界,如果将这些功能都交给程序员去完成,那将极大增加程序员的学习成本,降低编程效率。有了函数之后,C语言的编程效率就好像有了神器一样,开发者们只需要随时调用就可以了,像进程函数、操作函数、时间日期函数等都可以帮助我们直接实现C语言本身的功能。C语言函数是可以重复使用的。函数的一个明显特征就是使用时必须带括号(),必要的话,括号中还可以包含待处理的数据。例如puts("果果小师弟")就使用了一段具有输出功能的代码,这段代码的名字是 puts,"尚观科技" 是要交给这段代码处理的数据。使用函数在编程中有专业的称呼,叫做函数调用(Function Call)。如果函数需要处理多个数据,那么它们之间使用逗号,分隔,例如:pow(10, 2);该函数用来求10的2次方。好了,看到这里你有没有觉得其实C语言函数还是比较有意思的,而且并没有那么复杂困难。以后再遇到菜鸟小白的时候,你一口一个C语言的函数,说不定就能当场引来无数膜拜的目光。0x03 结构体、递归很多在大学学习C语言的,很多课程都没学完,结构体都没学到,因为从章节的安排来看好像,结构体学习放在教材的后半部分了,弄得很多学生觉得结构体不重要,如果只是应付学校的考试,或者就是为了混个毕业证,的确学的意义不大。如果想从事编程这个行业,对这个概念还不了解,基本上无法构造数据模型,没有一个业务体是完全使用原生数据类型来完成的,很多高手在设计数据模型的时候,一般先把头文件中的结构体数据整理出来。然后设计好功能函数的参数,以及名字,然后才真正开始写c源码。如果从节省空间考虑结构体里面的数据放的顺序不一样在内存中占用的空间也不一样,结构体与结构体之间赋值,结构体存在指针那么赋值要特别注意,需要进行深度的赋值。递归一般用于从头到位统计或者罗列一些数据,在使用的时候很多初学者都觉得别扭,怎么还能自己调用自己?而且在使用的时候,一定设置好跳出的条件,不然无休止的进行下去,真就成无线死循环了。对于结构体方面的知识,可以参见此前推送的文章《C语言结构体(struct)最全的讲解(万字干货)》。具体也可以参见大佬的经验:相信大家对于结构体都不陌生。在此,分享出本人对C语言结构体的研究和学习的总结。如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了。当然,水平有限,若发现不足之处恳请指出。代码文件test.c我放在下面。在此,我会围绕以下2个问题来分析和应用C语言结构体:C语言中的结构体有何作用结构体成员变量内存对齐有何讲究(重点)对于一些概念的说明,我就不把C语言教材上的定义搬上来。我们坐下来慢慢聊吧。1. 结构体有何作用三个月前,教研室里一个学长在华为南京研究院的面试中就遇到这个问题。当然,这只是面试中最基础的问题。如果问你你怎么回答?我的理解是这样的,C语言中结构体至少有以下三个作用:(1) 有机地组织了对象的属性。比如,在STM32的RTC开发中,我们需要数据来表示日期和时间,这些数据通常是年、月、日、时、分、秒。如果我们不用结构体,那么就需要定义6个变量来表示。这样的话程序的数据结构是松散的,我们的数据结构最好是“高内聚,低耦合”的。所以,用一个结构体来表示更好,无论是从程序的可读性还是可移植性还是可维护性皆是:typedef struct //公历日期和时间结构体vu16 year;vu8 month;vu8 date;vu8 hour;vu8 min;vu8 sec;}_calendar_obj;_calendar_obj calendar; //定义结构体变量(2) 以修改结构体成员变量的方法代替了函数(入口参数)的重新定义。如果说结构体有机地组织了对象的属性表示结构体“中看”,那么以修改结构体成员变量的方法代替函数(入口参数)的重新定义就表示了结构体“中用”。继续以上面的结构体为例子,我们来分析。假如现在我有如下函数来显示日期和时间:void DsipDateTime( _calendar_obj DateTimeVal)那么我们只要将一个_calendar_obj这个结构体类型的变量作为实参调用DsipDateTime()即可,DsipDateTime()通过DateTimeVal的成变量来实现内容的显示。如果不用结构体,我们很可能需要写这样的一个函数:void DsipDateTime( vu16 year,vu8 month,vu8 date,vu8 hour,vu8 min,vu8 sec)显然这样的形参很不可观,数据结构管理起来也很繁琐。如果某个函数的返回值得是一个表示日期和时间的数据,那就更复杂了。这只是一方面。另一方面,如果用户需要表示日期和时间的数据中还要包含星期(周),这个时候,如果之前没有用机构体,那么应该在DsipDateTime()函数中在增加一个形参vu8 week:void DsipDateTime( vu16 year,vu8 month,vu8 date,vu8 week,vu8 hour,vu8 min,vu8 sec)可见这种方法来传递参数非常繁琐。所以以结构体作为函数的入口参数的好处之一就是函数的声明void DsipDateTime(_calendar_obj DateTimeVal)不需要改变,只需要增加结构体的成员变量,然后在函数的内部实现上对calendar.week作相应的处理即可。这样,在程序的修改、维护方面作用显著。typedef struct //公历日期和时间结构体vu16 year;vu8 month;vu8 date;vu8 week;vu8 hour;vu8 min;vu8 sec;}_calendar_obj;_calendar_obj calendar; //定义结构体变量(3) 结构体的内存对齐原则可以提高CPU对内存的访问速度(以空间换取时间)。并且,结构体成员变量的地址可以根据基地址(以偏移量offset)计算。我们先来看看下面的一段简单的程序,对于此程序的分析会在第2部分结构体成员变量内存对齐中详细说明。#includeint main(){struct //声明结构体char_short_long{char c;short s;long l;}char_short_long;struct //声明结构体long_short_char{long l;short s;char c;}long_short_char;struct //声明结构体char_long_short{char c;long l;short s;}char_long_short;printf(" ");printf(" Size of char = %d bytes ",sizeof(char));printf(" Size of shrot = %d bytes ",sizeof(short));printf(" Size of long = %d bytes ",sizeof(long));printf(" "); //char_short_longprintf(" Size of char_short_long = %d bytes ",sizeof(char_short_long));printf(" Addr of char_short_long.c = 0x%p (10进制:%d) ",&char_short_long.c,&char_short_long.c);printf(" Addr of char_short_long.s = 0x%p (10进制:%d) ",&char_short_long.s,&char_short_long.s);printf(" Addr of char_short_long.l = 0x%p (10进制:%d) ",&char_short_long.l,&char_short_long.l);printf(" ");printf(" "); //long_short_charprintf(" Size of long_short_char = %d bytes ",sizeof(long_short_char));printf(" Addr of long_short_char.l = 0x%p (10进制:%d) ",&long_short_char.l,&long_short_char.l);printf(" Addr of long_short_char.s = 0x%p (10进制:%d) ",&long_short_char.s,&long_short_char.s);printf(" Addr of long_short_char.c = 0x%p (10进制:%d) ",&long_short_char.c,&long_short_char.c);printf(" ");printf(" "); //char_long_shortprintf(" Size of char_long_short = %d bytes ",sizeof(char_long_short));printf(" Addr of char_long_short.c = 0x%p (10进制:%d) ",&char_long_short.c,&char_long_short.c);printf(" Addr of char_long_short.l = 0x%p (10进制:%d) ",&char_long_short.l,&char_long_short.l);printf(" Addr of char_long_short.s = 0x%p (10进制:%d) ",&char_long_short.s,&char_long_short.s);printf(" ");return 0;}程序的运行结果如下(注意:括号内的数据是成员变量的地址的十进制形式):首先,我们来分析一下上面程序的运行结果。前三行说明在我的程序中,char型占1个字节,short型占2个字节,long型占4个字节。char_short_long、long_short_char和char_long_short是三个结构体成员相同但是成员变量的排列顺序不同。并且从程序的运行结果来看,Size of char_short_long = 8 bytesSize of long_short_char = 8 bytesSize of char_long_short = 12 bytes //比前两种情况大4 byte !并且,还要注意到,1 byte (char)+ 2 byte (short)+ 4 byte (long) = 7 byte,而不是8 byte。所以,结构体成员变量的放置顺序影响着结构体所占的内存空间的大小。一个结构体变量所占内存的大小不一定等于其成员变量所占空间之和。如果一个用户程序或者操作系统(比如uC/OS-II)中存在大量结构体变量时,这种内存占用必须要进行优化,也就是说,结构体内部成员变量的排列次序是有讲究的。结构体成员变量到底是如何存放的呢?在这里,我就不卖关子了,直接给出如下结论,在没有#pragma pack宏的情况下:原则1 结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。原则2 结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。原则3 结构体作为成员时,结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素时,那么b应该从8的整数倍地址处开始存储,因为sizeof(double) = 8 bytes)这里,我们结合上面的程序来分析(暂时不讨论原则3)。先看看char_short_long和long_short_char这两个结构体,从它们的成员变量的地址可以看出来,这两个结构体符合原则1和原则2。注意,在 char_short_long的成员变量的地址中,char_short_long.s的地址是1244994,也就是说,1244993是“空的”,只是被“占位”了!成员变量 成员变量十六进制地址 成员变量十进制地址 char_long_short.c 0x0012FF2C 1244972 char_long_short.l 0x0012FF30 1244976 char_long_short.s 0x0012FF34 1244980可见,其内存分布图如下,共12 bytes:首先,1244972能被1整除,所以char_long_short.c放在1244972处没有问题(其实,就char型成员变量自身来说,其放在任何地址单元处都没有问题),根据原则1,在之后的1244973~1244975中都没有能被4(因为sizeof(long)=4bytes)整除的,1244976能被4整除,所以char_long_short.l应该放在1244976处,那么同理,最后一个.s(sizeof(short)=2 bytes)是应该放在1244980处。是不是这样就结束了?不是,还有原则2。根据原则2的要求,char_long_short这个结构体所占的空间大小应该是其占内存空间最大的成员变量的大小的整数倍。如果我们到此就结束了,那么char_long_short所占的内存空间是1244972~1244981共计10bytes,不符合原则2,所以,必须在最后补齐2个 bytes(1244982~1244983)。至此,一个结构体的内存布局完成了。下面我们按照上述原则,来验证这样的分析是不是正确。按上面的分析,地址单元1244973、1244974、1244975以及1244982、1244983都是空的(至少char_long_short未用到,只是“占位”了)。如果我们的分析是正确的,那么,定义这样一个结构体,其所占内存也应该是12 bytes:struct //声明结构体char_long_short_newchar c;char add1; //补齐空间char add2; //补齐空间char add3; //补齐空间long l;short s;char add4; //补齐空间char add5; //补齐空间}char_long_short_new;可见,我们的分析是正确的。至于原则3,大家可以自己编程验证,这里就不再讨论了。所以,无论你是在VC6.0还是Keil C51,还是Keil MDK中,当你需要定义一个结构体时,只要你稍微留心结构体成员变量内存对齐这一现象,就可以在很大程度上节约MCU的RAM。这一点不仅仅应用于实际编程,在很多大型公司,比如IBM、微软、百度、华为的笔试和面试中,也是常见的。这三大块硬骨头是学习C语言的绊脚石,下功夫拿掉基本上C语言的大动脉就打通了,那么再去学习别的内容就相对比较简单了。编程学习过程中越是痛苦的时候,学到的东西就会越多,克服过去就会自己的技能,放弃了前面的付出的时间都将清零。越是难学的语言在入门之后,在入门之后越觉得过瘾,而且还容易上瘾。你上瘾了没?还是放弃了?--- EOF ---2023-08-01 17:56:071
Linux的起源是?
创始人林纳斯·托瓦兹,最早是为了玩游戏而开发出来的。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU计划、POSIX 标准和Internet 网络。1981 年IBM公司推出微型计算机IBM PC。1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell 软件了。1991年7月3日,第一个与Linux有关的消息是在comp.os.minix上发布的(当然此时还不存在Linux这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。1991年的10月5日,林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生(Freeminix-like kernel sources for 386-AT)。1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux 0.99的代码大约有十万行,用户大约有10万左右。1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。1995年1月,Bob Young创办了RedHat(小红帽),以GNU/Linux为核心,集成了400多个源代码开放的程序模块,搞出了一种冠以品牌的Linux,即RedHat Linux,称为Linux"发行版",在市场上出售。这在经营模式上是一种创举。1996年6月,Linux 2.0内核发布,此内核有大约40万行代码,并可以支持多个处理器。此时的Linux 已经进入了实用阶段,全球大约有350万人使用。1998年2月,以Eric Raymond为首的一批年轻的"老牛羚骨干分子"终于认识到GNU/Linux体系的产业化道路的本质,并非是什么自由哲学,而是市场竞争的驱动,创办了"Open Source Intiative"(开放源代码促进会)"复兴"的大旗,在互联网世界里展开了一场历史性的Linux产业化运动。2001年1月,Linux 2.4发布,它进一步地提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:USB,PC卡(PCMCIA)的支持,内置的即插即用,等等功能。2003年12月,Linux 2.6版内核发布,相对于2.4版内核2.6在对系统的支持都有很大的变化。2004年的第1月,SuSE嫁到了Novell,SCO继续顶着骂名四处强行“化缘”, Asianux, MandrakeSoft也在五年中首次宣布季度赢利。3月,SGI宣布成功实现了Linux操作系统支持256个Itanium 2处理器。2023-08-01 17:56:185
递归和迭代有哪些区别?
一、含义不同:递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。二、结构不同:递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止,使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。递归算法一般用于解决三类问题:(1)数据的定义是按递归定义的。(Fibonacci函数)(2)问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。(3)数据的结构形式是按递归定义的。如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。以上内容参考:百度百科-递归2023-08-01 17:56:352
3.2.4符号的组合(1)
3自然语言 3.1动物的语言 3.2自然语言 3.2.1英文语法考察 3.2.2中文语法考察 3.2.3乔姆斯基的语言观 3.4符号的组合 组合 如果只用一个词汇来描写自然语言最根本的机制,会是“组合”一词。乔姆斯基的产生式,右边字符串长度大于左边,就是组合的一种表示。组合是很容易观察到的,虽然对它的准确解读并不容易。语言学家经常用层次分析法或直接成分分析法对语言单位进行层次、结构、成分的分析,效果是线性的字符串语句可显示为树形的展开,叶子结点为一个个词汇。直接成分分析法用其创始人美国语言学家布龙菲尔德Leonard Bloomfield,1887.4-1949.4)所举的例子,Poor John ran away这一句子最终分析为(((Poor)( John))((ran)(away)))四个单词。拆分的过程如下:直接成分分析又称为二分法,直接成分也就是偏正结构中的中心词,本例中是Poor John中John,ran away中的ran。一般地说,自然语言语句的表达都是这样的输出:ABCDE,并可拆分为A、B、C、D、E多个部分,每个大写字母表示一个词汇,拆分的顺序与层次依据方法不同而不同。表现于口语上,人类一次表达发出的声音可以拆分成多个不同的音段;表现于书面语,每一次的表述最终可拆分为多个不同的字或词。ABCDE的各部分A、B、C、D、E可出现于其它的语句中,其它语句可以是:AXYZ、XBCWS、ABCFE……。 人类使用符号要面对的第一个问题是:要指称或描写的内容是无限的,而且我们也能知道存在无数我们现在还不知道的事物、现象。我们不可能像动物那样为每一个需要表达的内容独立构造一串声音或其它媒介形式,表达不同内容的声音或其它媒介形式相互间没有什么关系,各自独立地存在,每次的使用都是一次单一的操作。换句话说,只有命名的方式是不够的,这里命名包括用词汇指称一次简单的对象,或者用词汇指称一个复合的现象,这并没有天然的限制。 最初,可能只是把容易联想其组合意义的二个声音放在一起说出来,当这个过程开始后,人类自然语言就开始得到塑造。从语用来说,组合与命名会形成分工。可以给每一类事物命名,对于分类下一具体事物,除非本身很重要,否则不会单独给予名称。可以通过组合来指称分类下一个具体的事物,比如“距离太阳最近的星球”来指称水星。一个家庭从祖先x、y开始,理论上其绵延不绝的后代都可以由“儿子”、“女儿”二个词,再加上序数词以递归的方式来指称:第一(儿子(x、y)),、第二(女儿(x、y))、第二(女儿(第一(儿子(x、y))))、第一(儿子(第二(女儿(x、y))))……。利用组合的方式也可以指称一个类别,如“吃草动物”。我们对动作、关系、属性……都只是抽象地命名,在组合中直接应用这些泛指的符号,通过上下文语境得到具体语义。这些策略大大缩减了需要命名的符号。麻烦在于我们也经常使用多义词的策略。 最重要的分工是:给现实中可区分出的事物、属性、关系等要素的类别赋予名称,就可以通过组合来描写事物参与的现象、事件,以及现象、事件的发展变化。对于现象、事件这样的意义我们不需要直接给予名称,组合是更适合的描写方式,这在更大程度上减少了独立命名的需要。从语法上说,一门具体的自然语言不一定完全按上面描述的方式使用,这只是一个趋向,不倾向于此趋向的自然语言需以其它方式达到同样的效果,本质上很难想象其它不同的方式。组合就是自然语言的表现力所在。对组合的使用,符号组合与表达意义的互配。塑造了多数自然语言的格局,产生了语言的使用规则,今天所说的语法。 我们按规则组合所形成的表述,特别适合于我们经验世界的描写。同时我们也可以说出或写下这样的语句:“三足兽展开翅膀,飞向月亮”;“暗物质闪耀着黑色的光芒”,这不是我们见过的真实景象,但语句是合乎语法,可以被理解的。我们可以组合出与此时此地此物此事不相符的符号组合,表示我们的猜测、想象,或者就是幻想。自然语言的表述与其说是由内容决定的描写,不如说是主动的意义生成,只是这种生成用于对现实进行表述时必须能实现符号表述与语义的一致对应,至少要能接近这一目标。 语言符号组合的结果是符号的前后排列,解读时会分解为层次、结构、规则等。就呈现形式而言,语言具有线性特征。线性排列产生语序,多数的语言将语序作为重要的语法手段,比如汉语里说“老虎吃狮子”与“狮子吃老虎”二个句子,它们构成成分都相同,意义完全不一样,这种不一样就是由语序体现出来的。线性对口语是必然的。在文字的一般的应用中,我们在纸的二维平面通过确定一个顺序,如从左至右,再从上至下的顺序,创造一个线性序列来等效口语,我们把这看作历史沿袭,当前文字应用的一个特征,但不认为是纸面应用的必然。 层次 语句进行层次分析或直接成分分析时,分解出下级层次的成分,本身是不同类型的语言单位,这些语言单位在语言里也呈层次的分布,这是我们前面对英语与中文的讲解时说到的: 5句子(包括:小句、单句、复合句) 4复合词/词组 3字/词(包括基础字、词、合成词、派生词) 2词根词素/偏旁部首 1视觉构件(字母、笔划) 视觉构件层次以上,每一层次的语言单位又称为不同的语法实体。第3、4层可以理解为命名得到的符号,命名所用的名称可以是通过已有符号组合得到,这提供了一种可论证性。分层机制实现了表达形式潜在数量几何级数的增长,可以更容易应对表现内容的无限性。自然语言到了语句一层,可组合出的形式理论上是无限多的,这让我们日常生活中的自然语言应用得心应手。 借用分层的概念,我们可虚拟一种经济的语言模型。我们先忽略第1层的内容,然后重新定义语法层级。我们把字或词作为0阶的单位。把0阶的单位通过组合、复合出的单位作为1阶单位,把0阶、1阶的单位组合、复合出的单位作为2阶单位,以此类推,整体最好是有5阶层级。阶层系统应该这样构造:阶层数越低,其语法实体的数量越少,其语法单位统计上使用频率越高。从低阶层到高阶层组合的规则最好是各个阶层之间通用的(注:汉语基本做到了这一点),且数量越少越好。每一阶的单位加上表述性都可成为表述层级的语句,如果需要表述层级可附加尽量少的规则。设计出这样的系统,学习记忆的负载将最小化,只是这种设计的现实意义不大。自然语言是一个意义的发生系统,比如说词汇的出现是由人类的认知决定的,不是语言上的设计,组合的规则同时也兼有意义模式的作用,不可能一味地删减。另外语言是一种文化的载体,惰性是其特征。语言也经常类比为一种制度,制度特性是各个方面的此消彼长,减少命名词汇的数量,反过来不一定能控制复合的阶数,即在一个向度的强化就可能弱化另一向度。 句子层次以上还可以划分成如下的层次: 9丛书 8分册(书) 7章节 6段落(也称:句群) 这些层次也称为语篇层级,它们不再认为是语法实体,因为在这个范围内没有对应的语法规则。连续的多个语句,它们在在语法层面是各自独立的,合理要求是它们在语义层面是连续的,但这种连续性是由人把握的,并没有通用的标准,除非应用了逻辑。 组合与分层的说法包含着一个意思:基础词、派生词、合成词、复合词、甚至词组,它们是离散存在的,每一语法实体可作为一个单位参与不同的组合,就如积木游戏里的木块一样。离散说法这对汉语这样的孤立语言,从心理到物理都是成立的,汉语里的组合也都是物理的、机械的,仅仅把语言单位前后排列在一起。对于英语这样有形态变化的语言,组合有了“化学”的性质,我们还要变换各成份的形态并保持相互的一致。这样就涉及到词的同一性的问题。离散性并不是一开始就明显的事实,说话时人的发音是连续的,文字分析中断句分词也一直是个难点。2023-08-01 17:57:001
人工神经网络概念梳理与实例演示
人工神经网络概念梳理与实例演示神经网络是一种模仿生物神经元的机器学习模型,数据从输入层进入并流经激活阈值的多个节点。递归性神经网络一种能够对之前输入数据进行内部存储记忆的神经网络,所以他们能够学习到数据流中的时间依赖结构。如今机器学习已经被应用到很多的产品中去了,例如,siri、Google Now等智能助手,推荐引擎——亚马逊网站用于推荐商品的推荐引擎,Google和Facebook使用的广告排名系统。最近,深度学习的一些进步将机器学习带入公众视野:AlphaGo 打败围棋大师李世石事件以及一些图片识别和机器翻译等新产品的出现。在这部分中,我们将介绍一些强大并被普遍使用的机器学习技术。这当然包括一些深度学习以及一些满足现代业务需求传统方法。读完这一系列的文章之后,你就掌握了必要的知识,便可以将具体的机器学习实验应用到你所在的领域当中。随着深层神经网络的精度的提高,语音和图像识别技术的应用吸引了大众的注意力,关于AI和深度学习的研究也变得更加普遍了。但是怎么能够让它进一步扩大影响力,更受欢迎仍然是一个问题。这篇文章的主要内容是:简述前馈神经网络和递归神经网络、怎样搭建一个递归神经网络对时间系列数据进行异常检测。为了让我们的讨论更加具体化,我们将演示一下怎么用Deeplearning4j搭建神经网络。一、什么是神经网络?人工神经网络算法的最初构思是模仿生物神经元。但是这个类比很不可靠。人工神经网络的每一个特征都是对生物神经元的一种折射:每一个节点与激活阈值、触发的连接。连接人工神经元系统建立起来之后,我们就能够对这些系统进行训练,从而让他们学习到数据中的一些模式,学到之后就能执行回归、分类、聚类、预测等功能。人工神经网络可以看作是计算节点的集合。数据通过这些节点进入神经网络的输入层,再通过神经网络的隐藏层直到关于数据的一个结论或者结果出现,这个过程才会停止。神经网络产出的结果会跟预期的结果进行比较,神经网络得出的结果与正确结果的不同点会被用来更正神经网络节点的激活阈值。随着这个过程的不断重复,神经网络的输出结果就会无限靠近预期结果。二、训练过程在搭建一个神经网络系统之前,你必须先了解训练的过程以及网络输出结果是怎么产生的。然而我们并不想过度深入的了解这些方程式,下面是一个简短的介绍。网络的输入节点收到一个数值数组(或许是叫做张量多维度数组)就代表输入数据。例如, 图像中的每个像素可以表示为一个标量,然后将像素传递给一个节点。输入数据将会与神经网络的参数相乘,这个输入数据被扩大还是减小取决于它的重要性,换句话说,取决于这个像素就不会影响神经网络关于整个输入数据的结论。起初这些参数都是随机的,也就是说神经网络在建立初期根本就不了解数据的结构。每个节点的激活函数决定了每个输入节点的输出结果。所以每个节点是否能够被激活取决于它是否接受到足够的刺激强度,即是否输入数据和参数的结果超出了激活阈值的界限。在所谓的密集或完全连接层中,每个节点的输出值都会传递给后续层的节点,在通过所有隐藏层后最终到达输出层,也就是产生输入结果的地方。在输出层, 神经网络得到的最终结论将会跟预期结论进行比较(例如,图片中的这些像素代表一只猫还是狗?)。神经网络猜测的结果与正确结果的计算误差都会被纳入到一个测试集中,神经网络又会利用这些计算误差来不断更新参数,以此来改变图片中不同像素的重要程度。整个过程的目的就是降低输出结果与预期结果的误差,正确地标注出这个图像到底是不是一条狗。深度学习是一个复杂的过程,由于大量的矩阵系数需要被修改所以它就涉及到矩阵代数、衍生品、概率和密集的硬件使用问题,但是用户不需要全部了解这些复杂性。但是,你也应该知道一些基本参数,这将帮助你理解神经网络函数。这其中包括激活函数、优化算法和目标函数(也称为损失、成本或误差函数)。激活函数决定了信号是否以及在多大程度上应该被发送到连接节点。阶梯函数是最常用的激活函数, 如果其输入小于某个阈值就是0,如果其输入大于阈值就是1。节点都会通过阶梯激活函数向连接节点发送一个0或1。优化算法决定了神经网络怎么样学习,以及测试完误差后,权重怎么样被更准确地调整。最常见的优化算法是随机梯度下降法。最后, 成本函数常用来衡量误差,通过对比一个给定训练样本中得出的结果与预期结果的不同来评定神经网络的执行效果。Keras、Deeplearning4j 等开源框架让创建神经网络变得简单。创建神经网络结构时,需要考虑的是怎样将你的数据类型匹配到一个已知的被解决的问题,并且根据你的实际需求来修改现有结构。三、神经网络的类型以及应用神经网络已经被了解和应用了数十年了,但是最近的一些技术趋势才使得深度神经网络变得更加高效。GPUs使得矩阵操作速度更快;分布式计算结构让计算能力大大增强;多个超参数的组合也让迭代的速度提升。所有这些都让训练的速度大大加快,迅速找到适合的结构。随着更大数据集的产生,类似于ImageNet 的大型高质量的标签数据集应运而生。机器学习算法训练的数据越大,那么它的准确性就会越高。最后,随着我们理解能力以及神经网络算法的不断提升,神经网络的准确性在语音识别、机器翻译以及一些机器感知和面向目标的一些任务等方面不断刷新记录。尽管神经网络架构非常的大,但是主要用到的神经网络种类也就是下面的几种。3.1前馈神经网络前馈神经网络包括一个输入层、一个输出层以及一个或多个的隐藏层。前馈神经网络可以做出很好的通用逼近器,并且能够被用来创建通用模型。这种类型的神经网络可用于分类和回归。例如,当使用前馈网络进行分类时,输出层神经元的个数等于类的数量。从概念上讲, 激活了的输出神经元决定了神经网络所预测的类。更准确地说, 每个输出神经元返回一个记录与分类相匹配的概率数,其中概率最高的分类将被选为模型的输出分类。前馈神经网络的优势是简单易用,与其他类型的神经网络相比更简单,并且有一大堆的应用实例。3.2卷积神经网络卷积神经网络和前馈神经网络是非常相似的,至少是数据的传输方式类似。他们结构大致上是模仿了视觉皮层。卷积神经网络通过许多的过滤器。这些过滤器主要集中在一个图像子集、补丁、图块的特征识别上。每一个过滤器都在寻找不同模式的视觉数据,例如,有的可能是找水平线,有的是找对角线,有的是找垂直的。这些线条都被看作是特征,当过滤器经过图像时,他们就会构造出特征图谱来定位各类线是出现在图像的哪些地方。图像中的不同物体,像猫、747s、榨汁机等都会有不同的图像特征,这些图像特征就能使图像完成分类。卷积神经网络在图像识别和语音识别方面是非常的有效的。卷积神经网络与前馈神经网络在图像识别方面的异同比较。虽然这两种网络类型都能够进行图像识别,但是方式却不同。卷积神经网络是通过识别图像的重叠部分,然后学习识别不同部分的特征进行训练;然而,前馈神经网络是在整张图片上进行训练。前馈神经网络总是在图片的某一特殊部分或者方向进行训练,所以当图片的特征出现在其他地方时就不会被识别到,然而卷积神经网络却能够很好的避免这一点。卷积神经网络主要是用于图像、视频、语音、声音识别以及无人驾驶的任务。尽管这篇文章主要是讨论递归神经网络的,但是卷积神经网络在图像识别方面也是非常有效的,所以很有必要了解。3.3递归神经网络与前馈神经网络不同的是,递归神经网络的隐藏层的节点里有内部记忆存储功能,随着输入数据的改变而内部记忆内容不断被更新。递归神经网络的结论都是基于当前的输入和之前存储的数据而得出的。递归神经网络能够充分利用这种内部记忆存储状态处理任意序列的数据,例如时间序列。递归神经网络经常用于手写识别、语音识别、日志分析、欺诈检测和网络安全。递归神经网络是处理时间维度数据集的最好方法,它可以处理以下数据:网络日志和服务器活动、硬件或者是医疗设备的传感器数据、金融交易、电话记录。想要追踪数据在不同阶段的依赖和关联关系需要你了解当前和之前的一些数据状态。尽管我们通过前馈神经网络也可以获取事件,随着时间的推移移动到另外一个事件,这将使我们限制在对事件的依赖中,所以这种方式很不灵活。追踪在时间维度上有长期依赖的数据的更好方法是用内存来储存重要事件,以使近期事件能够被理解和分类。递归神经网络最好的一点就是在它的隐藏层里面有“内存”可以学习到时间依赖特征的重要性。接下来我们将讨论递归神经网络在字符生成器和网络异常检测中的应用。递归神经网络可以检测出不同时间段的依赖特征的能力使得它可以进行时间序列数据的异常检测。递归神经网络的应用网络上有很多使用RNNs生成文本的例子,递归神经网络经过语料库的训练之后,只要输入一个字符,就可以预测下一个字符。下面让我们通过一些实用例子发现更多RNNs的特征。应用一、RNNs用于字符生成递归神经网络经过训练之后可以把英文字符当做成一系列的时间依赖事件。经过训练后它会学习到一个字符经常跟着另外一个字符(“e”经常跟在“h”后面,像在“the、he、she”中)。由于它能预测下一个字符是什么,所以它能有效地减少文本的输入错误。Java是个很有趣的例子,因为它的结构包括很多嵌套结构,有一个开的圆括号必然后面就会有一个闭的,花括号也是同理。他们之间的依赖关系并不会在位置上表现的很明显,因为多个事件之间的关系不是靠所在位置的距离确定的。但是就算是不明确告诉递归神经网络Java中各个事件的依赖关系,它也能自己学习了解到。在异常检测当中,我们要求神经网络能够检测出数据中相似、隐藏的或许是并不明显的模式。就像是一个字符生成器在充分地了解数据的结构后就会生成一个数据的拟像,递归神经网络的异常检测就是在其充分了解数据结构后来判断输入的数据是不是正常。字符生成的例子表明递归神经网络有在不同时间范围内学习到时间依赖关系的能力,它的这种能力还可以用来检测网络活动日志的异常。异常检测能够使文本中的语法错误浮出水面,这是因为我们所写的东西是由语法结构所决定的。同理,网络行为也是有结构的,它也有一个能够被学习的可预测模式。经过在正常网络活动中训练的递归神经网络可以监测到入侵行为,因为这些入侵行为的出现就像是一个句子没有标点符号一样异常。应用二、一个网络异常检测项目的示例假设我们想要了解的网络异常检测就是能够得到硬件故障、应用程序失败、以及入侵的一些信息。模型将会向我们展示什么呢?随着大量的网络活动日志被输入到递归神经网络中去,神经网络就能学习到正常的网络活动应该是什么样子的。当这个被训练的网络被输入新的数据时,它就能偶判断出哪些是正常的活动,哪些是被期待的,哪些是异常的。训练一个神经网络来识别预期行为是有好处的,因为异常数据不多,或者是不能够准确的将异常行为进行分类。我们在正常的数据里进行训练,它就能够在未来的某个时间点提醒我们非正常活动的出现。说句题外话,训练的神经网络并不一定非得识别到特定事情发生的特定时间点(例如,它不知道那个特殊的日子就是周日),但是它一定会发现一些值得我们注意的一些更明显的时间模式和一些可能并不明显的事件之间的联系。我们将概述一下怎么用 Deeplearning4j(一个在JVM上被广泛应用的深度学习开源数据库)来解决这个问题。Deeplearning4j在模型开发过程中提供了很多有用的工具:DataVec是一款为ETL(提取-转化-加载)任务准备模型训练数据的集成工具。正如Sqoop为Hadoop加载数据,DataVec将数据进行清洗、预处理、规范化与标准化之后将数据加载到神经网络。这跟Trifacta"s Wrangler也相似,只不过它更关注二进制数据。开始阶段第一阶段包括典型的大数据任务和ETL:我们需要收集、移动、储存、准备、规范化、矢量话日志。时间跨度的长短是必须被规定好的。数据的转化需要花费一些功夫,这是由于JSON日志、文本日志、还有一些非连续标注模式都必须被识别并且转化为数值数组。DataVec能够帮助进行转化和规范化数据。在开发机器学习训练模型时,数据需要分为训练集和测试集。训练神经网络神经网络的初始训练需要在训练数据集中进行。在第一次训练的时候,你需要调整一些超参数以使模型能够实现在数据中学习。这个过程需要控制在合理的时间内。关于超参数我们将在之后进行讨论。在模型训练的过程中,你应该以降低错误为目标。但是这可能会出现神经网络模型过度拟合的风险。有过度拟合现象出现的模型往往会在训练集中的很高的分数,但是在遇到新的数据时就会得出错误结论。用机器学习的语言来说就是它不够通用化。Deeplearning4J提供正则化的工具和“过早停止”来避免训练过程中的过度拟合。神经网络的训练是最花费时间和耗费硬件的一步。在GPUs上训练能够有效的减少训练时间,尤其是做图像识别的时候。但是额外的硬件设施就带来多余的花销,所以你的深度学习的框架必须能够有效的利用硬件设施。Azure和亚马逊等云服务提供了基于GPU的实例,神经网络还可以在异构集群上进行训练。创建模型Deeplearning4J提供ModelSerializer来保存训练模型。训练模型可以被保存或者是在之后的训练中被使用或更新。在执行异常检测的过程中,日志文件的格式需要与训练模型一致,基于神经网络的输出结果,你将会得到是否当前的活动符合正常网络行为预期的结论。代码示例递归神经网络的结构应该是这样子的:MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder(.seed(123).optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1).weightInit(WeightInit.XAVIER).updater(Updater.NESTEROVS).momentum(0.9).learningRate(0.005).gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue).gradientNormalizationThreshold(0.5).list().layer(0, new GravesLSTM.Builder().activation("tanh").nIn(1).nOut(10).build()).layer(1, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT).activation("softmax").nIn(10).nOut(numLabelClasses).build()).pretrain(false).backprop(true).build();MultiLayerNetwork net = new MultiLayerNetwork(conf);net.init();下面解释一下几行重要的代码:.seed(123)随机设置一个种子值对神经网络的权值进行初始化,以此获得一个有复验性的结果。系数通常都是被随机的初始化的,以使我们在调整其他超参数时仍获得一致的结果。我们需要设定一个种子值,让我们在调整和测试的时候能够用这个随机的权值。.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)决定使用哪个最优算法(在这个例子中是随机梯度下降法)来调整权值以提高误差分数。你可能不需要对这个进行修改。.learningRate(0.005)当我们使用随机梯度下降法的时候,误差梯度就被计算出来了。在我们试图将误差值减到最小的过程中,权值也随之变化。SGD给我们一个让误差更小的方向,这个学习效率就决定了我们该在这个方向上迈多大的梯度。如果学习效率太高,你可能是超过了误差最小值;如果太低,你的训练可能将会永远进行。这是一个你需要调整的超参数。2023-08-01 17:57:261
汇编语言递归求C(n,k)
我觉得你还是把pascal语言的贴出来吧看汇编本来就是很恼火的事情你还放上来编译器生成的汇编2023-08-01 17:57:361
程序员主要的工作
程序员主演从事编码工作;划分的有初级、中级、高级;在我们国家,程序员和软件工程师等价;2023-08-01 17:58:041
巧用tree命令导出文件目录递归详情
我清楚的记得在我读研二的时候有一次我帮老师收“海外名师课堂”的作业,有一名巴基斯坦的学生,想要老师的课件,我当时给他说这个不被允许,随便给外国留学生拷贝课件原则上是不允许的,我是这样认为的。但是他说这个是经过了我们老师的同意,听到这我就给他拷贝了课件,不然好像显得我们巴铁关系也不怎么铁,一个课件都不拷贝。但是同时他希望我能给他提供课件的目录概览信息,他当时说的英文,但是我听出来了,并想都没想就回答:“OK,I"ll send you later.” 回到教研室,我就开始琢磨这个事儿,因为课件很大,目录很深,并且内容也是非常多的。靠人为梳理目录关系肯定是不行的,我就想起来以前用过的 tree 命令,在网上搜罗了一下,还真的有类似的功能样例,可以直接输出指定目录的递归文件概览详情。 二话不说,先看命令: <pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">`# 切换至目标目录, /d是切换盘符的意思 cd /d W:Google_Download tree /f > W: ree.txt` </pre> 不过说真的,Windows的cmd命令真是恶心极了,难道就不能向Linux一样,直接 cd 吗!还非得加个 /d 参数。 命令执行如下: 执行结果如图所示: 从上图来看,我们完整的拿到了目标目录 W:Google_Download 的文件递归详情。 如果你也有类似的需求,那么这个 命令对你会非常有帮助!省时省力~ Linux tree命令用于以树状图列出目录的内容。 执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。 <pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"> -a 显示所有文件和目录。 -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。 -C 在文件和目录清单加上色彩,便于区分各种类型。 -d 显示目录名称而非内容。 -D 列出文件或目录的更改时间。 -f 在每个文件或目录之前,显示完整的相对路径名称。 -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。 -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。 -i 不以阶梯状列出文件或目录名称。 -L level 限制目录显示层级。 -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。 -n 不在文件和目录清单加上色彩。 -N 直接列出文件和目录名称,包括控制字符。 -p 列出权限标示。 -P<范本样式> 只显示符合范本样式的文件或目录名称。 -q 用"?"号取代控制字符,列出文件和目录名称。 -s 列出文件或目录大小。 -t 用文件和目录的更改时间排序。 -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。 -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。 </pre> 使用 tree 命令如下,经过我的使用,好像Windows OS不完全支持 tree 命令! 不过在某些情况下, tree 命令还是能够帮我们解决一些问题的。2023-08-01 17:58:111
关于数据结构的问题,用C语言描述
数据结构复习重点归纳笔记[清华严蔚敏版]数据结构复习重点归纳[适于清华严版教材]一、数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。所以,大家在这三章上可以不必花费过多的精力,只要知道基本的概念即可。但是,对于报考名校特别是该校又有在试卷中对这三章进行过考核的历史,那么这部分朋友就要留意这三章了。按照以上我们给出的章节以及对后三章的介绍,数据结构的章节比重大致为:概论:内容很少,概念简单,分数大多只有几分,有的学校甚至不考。线性表:基础章节,必考内容之一。考题多数为基本概念题,名校考题中,鲜有大型算法设计题。如果有,也是与其它章节内容相结合。栈和队列:基础章节,容易出基本概念题,必考内容之一。而栈常与其它章节配合考查,也常与递归等概念相联系进行考查。串 :基础章节,概念较为简单。专门针对于此章的大型算法设计题很少,较常见的是根据KMP进行算法分析。多维数组及广义表 :基础章节,基于数组的算法题也是常见的,分数比例波动较大,是出题的“可选单元”或“侯补单元”。一般如果要出题,多数不会作为大题出。数组常与“查找,排序”等章节结合来作为大题考查。树和二叉树 :重点难点章节,各校必考章节。各校在此章出题的不同之处在于,是否在本章中出一到两道大的算法设计题。通过对多所学校的试卷分析,绝大多数学校在本章都曾有过出大型算法设计题的历史。图 :重点难点章节,名校尤爱考。如果作为重点来考,则多出现于分析与设计题型当中,可与树一章共同构成算法设计大题的题型设计。查找 :重点难点章节,概念较多,联系较为紧密,容易混淆。出题时可以作为分析型题目给出,在基本概念型题目中也较为常见。算法设计型题中可以数组结合来考查,也可以与树一章结合来考查。排序 :与查找一章类似,本章同属于重点难点章节,且概念更多,联系更为紧密,概念之间更容易混淆。在基本概念的考查中,尤爱考各种排序算法的优劣比较此类的题。算法设计大题中,如果作为出题,那么常与数组结合来考查。二、数据结构各章节重点勾划:第0章 概述本章主要起到总领作用,为读者进行数据结构的学习进行了一些先期铺垫。大家主要注意以下几点:数据结构的基本概念,时间和空间复杂度的概念及度量方法,算法设计时的注意事项。本章考点不多,只要稍加注意理解即可。第一章 线性表作为线性结构的开篇章节,线性表一章在线性结构的学习乃至整个数据结构学科的学习中,其作用都是不可低估的。在这一章,第一次系统性地引入链式存储的概念,链式存储概念将是整个数据结构学科的重中之重,无论哪一章都涉及到了这个概念。总体来说,线性表一章可供考查的重要考点有以下几个方面:1.线性表的相关基本概念,如:前驱、后继、表长、空表、首元结点,头结点,头指针等概念。2.线性表的结构特点,主要是指:除第一及最后一个元素外,每个结点都只有一个前趋和只有一个后继。3.线性表的顺序存储方式及其在具体语言环境下的两种不同实现:表空间的静态分配和动态分配。静态链表与顺序表的相似及不同之处。4.线性表的链式存储方式及以下几种常用链表的特点和运算:单链表、循环链表,双向链表,双向循环链表。其中,单链表的归并算法、循环链表的归并算法、双向链表及双向循环链表的插入和删除算法等都是较为常见的考查方式。此外,近年来在不少学校中还多次出现要求用递归算法实现单链表输出(可能是顺序也可能是倒序)的问题。在链表的小题型中,经常考到一些诸如:判表空的题。在不同的链表中,其判表空的方式是不一样的,请大家注意。5.线性表的顺序存储及链式存储情况下,其不同的优缺点比较,即其各自适用的场合。单链表中设置头指针、循环链表中设置尾指针而不设置头指针以及索引存储结构的各自好处。第二章 栈与队列栈与队列,是很多学习DS的同学遇到第一只拦路虎,很多人从这一章开始坐晕车,一直晕到现在。所以,理解栈与队列,是走向DS高手的一条必由之路,。学习此章前,你可以问一下自己是不是已经知道了以下几点:1.栈、队列的定义及其相关数据结构的概念,包括:顺序栈,链栈,共享栈,循环队列,链队等。栈与队列存取数据(请注意包括:存和取两部分)的特点。2.递归算法。栈与递归的关系,以及借助栈将递归转向于非递归的经典算法:n!阶乘问题,fib数列问题,hanoi问题,背包问题,二叉树的递归和非递归遍历问题,图的深度遍历与栈的关系等。其中,涉及到树与图的问题,多半会在树与图的相关章节中进行考查。3.栈的应用:数值表达式的求解,括号的配对等的原理,只作原理性了解,具体要求考查此为题目的算法设计题不多。4.循环队列中判队空、队满条件,循环队列中入队与出队算法。如果你已经对上面的几点了如指掌,栈与队列一章可以不看书了。注意,我说的是可以不看书,并不是可以不作题哦。第三章 串经历了栈一章的痛苦煎熬后,终于迎来了串一章的柳暗花明。串,在概念上是比较少的一个章节,也是最容易自学的章节之一,但正如每个过来人所了解的,KMP算法是这一章的重要关隘,突破此关隘后,走过去又是一马平川的大好DS山河了,呵呵。串一章需要攻破的主要堡垒有:1.串的基本概念,串与线性表的关系(串是其元素均为字符型数据的特殊线性表),空串与空格串的区别,串相等的条件2.串的基本操作,以及这些基本函数的使用,包括:取子串,串连接,串替换,求串长等等。运用串的基本操作去完成特定的算法是很多学校在基本操作上的考查重点。3.顺序串与链串及块链串的区别和联系,实现方式。4.KMP算法思想。KMP中next数组以及nextval数组的求法。明确传统模式匹配算法的不足,明确next数组需要改进之外。其中,理解算法是核心,会求数组是得分点。不用我多说,这一节内容是本章的重中之重。可能进行的考查方式是:求next和nextval数组值,根据求得的next或nextval数组值给出运用KMP算法进行匹配的匹配过程。第四章 数组与广义表学过程序语言的朋友,数组的概念我们已经不是第一次见到了,应该已经“一回生,二回熟”了,所以,在概念上,不会存在太大障碍。但作为考研课程来说,本章的考查重点可能与大学里的程序语言所关注的不太一样,下面会作介绍。广义表的概念,是数据结构里第一次出现的。它是线性表或表元素的有限序列,构成该结构的每个子表或元素也是线性结构的,所以,这一章也归入线性结构中。本章的考查重点有:1.多维数组中某数组元素的position求解。一般是给出数组元素的首元素地址和每个元素占用的地址空间并组给出多维数组的维数,然后要求你求出该数组中的某个元素所在的位置。2.明确按行存储和按列存储的区别和联系,并能够按照这两种不同的存储方式求解1中类型的题。3.将特殊矩阵中的元素按相应的换算方式存入数组中。这些矩阵包括:对称矩阵,三角矩阵,具有某种特点的稀疏矩阵等。熟悉稀疏矩阵的三种不同存储方式:三元组,带辅助行向量的二元组,十字链表存储。掌握将稀疏矩阵的三元组或二元组向十字链表进行转换的算法。4.广义表的概念,特别应该明确表头与表尾的定义。这一点,是理解整个广义表一节算法的基础。近来,在一些学校中,出现了这样一种题目类型:给出对某个广义表L若干个求了若干次的取头和取尾操作后的串值,要求求出原广义表L。大家要留意。5.与广义表有关的递归算法。由于广义表的定义就是递归的,所以,与广义表有关的算法也常是递归形式的。比如:求表深度,复制广义表等。这种题目,可以根据不同角度广义表的表现形式运用两种不同的方式解答:一是把一个广义表看作是表头和表尾两部分,分别对表头和表尾进行操作;二是把一个广义表看作是若干个子表,分别对每个子表进行操作。第五章 树与二叉树从对线性结构的研究过度到对树形结构的研究,是数据结构课程学习的一次跃变,此次跃变完成的好坏,将直接关系到你到实际的考试中是否可以拿到高分,而这所有的一切,将最终影响你的专业课总分。所以,树这一章的重要性,已经不说自明了。总体来说,树一章的知识点包括:二叉树的概念、性质和存储结构,二叉树遍历的三种算法(递归与非递归),在三种基本遍历算法的基础上实现二叉树的其它算法,线索二叉树的概念和线索化算法以及线索化后的查找算法,最优二叉树的概念、构成和应用,树的概念和存储形式,树与森林的遍历算法及其与二叉树遍历算法的联系,树与森林和二叉树的转换。下面我们来看考试中对以上知识的主要考查方法:1.二叉树的概念、性质和存储结构考查方法可有:直接考查二叉树的定义,让你说明二叉树与普通双分支树的区别;考查满二叉树和完全二叉树的性质,普通二叉树的五个性质:第i层的最多结点数,深度为k的二叉树的最多结点数,n0=n2+1的性质,n个结点的完全二叉树的深度,顺序存储二叉树时孩子结点与父结点之间的换算关系(左为:2*i,右为:2*i+1)。二叉树的顺序存储和二叉链表存储的各自优缺点及适用场合,二叉树的三叉链表表示方法。2.二叉树的三种遍历算法这一知识点掌握的好坏,将直接关系到树一章的算法能否理解,进而关系到树一章的算法设计题能否顺利完成。二叉树的遍历算法有三种:先序,中序和后序。其划分的依据是视其每个算法中对根结点数据的访问顺序而定。不仅要熟练掌握三种遍历的递归算法,理解其执行的实际步骤,并且应该熟练掌握三种遍历的非递归算法。由于二叉树一章的很多算法,可以直接根据三种递归算法改造而来(比如:求叶子个数),所以,掌握了三种遍历的非递归算法后,对付诸如:“利用非递归算法求二叉树叶子个数”这样的题目就下笔如有神了。我会在另一篇系列文章()里给出三种遍历的递归和非递归算法的背记版,到时请大家一定熟记。3.可在三种遍历算法的基础上改造完成的其它二叉树算法:求叶子个数,求二叉树结点总数,求度为1或度为2的结点总数,复制二叉树,建立二叉树,交换左右子树,查找值为n的某个指定结点,删除值为n的某个指定结点,诸如此类等等等等。如果你可以熟练掌握二叉树的递归和非递归遍历算法,那么解决以上问题就是小菜一碟了。4.线索二叉树:线索二叉树的引出,是为避免如二叉树遍历时的递归求解。众所周知,递归虽然形式上比较好理解,但是消耗了大量的内存资源,如果递归层次一多,势必带来资源耗尽的危险,为了避免此类情况,线索二叉树便堂而皇之地出现了。对于线索二叉树,应该掌握:线索化的实质,三种线索化的算法,线索化后二叉树的遍历算法,基本线索二叉树的其它算法问题(如:查找某一类线索二叉树中指定结点的前驱或后继结点就是一类常考题)。5.最优二叉树(哈夫曼树):最优二叉树是为了解决特定问题引出的特殊二叉树结构,它的前提是给二叉树的每条边赋予了权值,这样形成的二叉树按权相加之和是最小的。最优二叉树一节,直接考查算法源码的很少,一般是给你一组数据,要求你建立基于这组数据的最优二叉树,并求出其最小权值之和,此类题目不难,属送分题。6.树与森林:二叉树是一种特殊的树,这种特殊不仅仅在于其分支最多为2以及其它特征,一个最重要的特殊之处是在于:二叉树是有序的!即:二叉树的左右孩子是不可交换的,如果交换了就成了另外一棵二叉树,这样交换之后的二叉树与原二叉树我们认为是不相同的两棵二叉树。但是,对于普通的双分支树而言,不具有这种性质。树与森林的遍历,不像二叉树那样丰富,他们只有两种遍历算法:先根与后根(对于森林而言称作:先序与后序遍历)。在难度比较大的考试中,也有基于此二种算法的基础上再进行扩展要求你利用这两种算法设计其它算法的,但一般院校很少有这种考法,最多只是要求你根据先根或后根写出他们的遍历序列。此二者的先根与后根遍历与二叉树中的遍历算法是有对应关系的:先根遍历对应二叉树的先序遍历,而后根遍历对应二叉树的中序遍历。这一点成为很多学校的考点,考查的方式不一而足,有的直接考此句话,有的是先让你求解遍历序列然后回答这个问题。二叉树、树与森林之所以能有以上的对应关系,全拜二叉链表所赐。二叉树使用二叉链表分别存放他的左右孩子,树利用二叉链表存储孩子及兄弟(称孩子兄弟链表),而森林也是利用二叉链表存储孩子及兄弟。树一章,处处是重点,道道是考题,大家务必个个过关。第六章 图如果说,从线性结构向树形结构研究的转变,是数据结构学科对数据组织形式研究的一次升华,那么从树形结构的研究转到图形结构的研究,则进一步让我们看到了数据结构对于解决实际问题的重大推动作用。图这一章的特点是:概念繁多,与离散数学中图的概念联系紧密,算法复杂,极易被考到,且容易出大题,尤其是名校,作为考研课程,如果不考查树与图两章的知识,几乎是不可想像的。下面我们看一下图这一章的主要考点以及这些考点的考查方式:1.考查有关图的基本概念问题:这些概念是进行图一章学习的基础,这一章的概念包括:图的定义和特点,无向图,有向图,入度,出度,完全图,生成子图,路径长度,回路,(强)连通图,(强)连通分量等概念。与这些概念相联系的相关计算题也应该掌握。2.考查图的几种存储形式:图的存储形式包括:邻接矩阵,(逆)邻接表,十字链表及邻接多重表。在考查时,有的学校是给出一种存储形式,要求考生用算法或手写出与给定的结构相对应的该图的另一种存储形式。3.考查图的两种遍历算法:深度遍历和广度遍历深度遍历和广度遍历是图的两种基本的遍历算法,这两个算法对图一章的重要性等同于“先序、中序、后序遍历”对于二叉树一章的重要性。在考查时,图一章的算法设计题常常是基于这两种基本的遍历算法而设计的,比如:“求最长的最短路径问题”和“判断两顶点间是否存在长为K的简单路径问题”,就分别用到了广度遍历和深度遍历算法。4.生成树、最小生成树的概念以及最小生成树的构造:PRIM算法和KRUSKAL算法。考查时,一般不要求写出算法源码,而是要求根据这两种最小生成树的算法思想写出其构造过程及最终生成的最小生成树。5.拓扑排序问题:拓扑排序有两种方法,一是无前趋的顶点优先算法,二是无后继的顶点优先算法。换句话说,一种是“从前向后”的排序,一种是“从后向前”排。当然,后一种排序出来的结果是“逆拓扑有序”的。6.关键路径问题:这个问题是图一章的难点问题。理解关键路径的关键有三个方面:一是何谓关键路径,二是最早时间是什么意思、如何求,三是最晚时间是什么意思、如何求。简单地说,最早时间是通过“从前向后”的方法求的,而最晚时间是通过“从后向前”的方法求解的,并且,要想求最晚时间必须是在所有的最早时间都已经求出来之后才能进行。这个问题拿来直接考算法源码的不多,一般是要求按照书上的算法描述求解的过程和步骤。在实际设计关键路径的算法时,还应该注意以下这一点:采用邻接表的存储结构,求最早时间和最晚时间要采用不同的处理方法,即:在算法初始时,应该首先将所有顶点的最早时间全部置为0。关键路径问题是工程进度控制的重要方法,具有很强的实用性。7.最短路径问题:与关键路径问题并称为图一章的两只拦路虎。概念理解是比较容易的,关键是算法的理解。最短路径问题分为两种:一是求从某一点出发到其余各点的最短路径;二是求图中每一对顶点之间的最短路径。这个问题也具有非常实用的背景特色,一个典型的应该就是旅游景点及旅游路线的选择问题。解决第一个问题用DIJSKTRA算法,解决第二个问题用FLOYD算法。注意区分。第七章 查找在不少数据结构的教材中,是把查找与排序放入高级数据结构中的。应该说,查找和排序两章是前面我们所学的知识的综合运用,用到了树、也用到了链表等知识,对这些数据结构某一方面的运用就构成了查找和排序。现实生活中,search几乎无处不在,特别是现在的网络时代,万事离不开search,小到文档内文字的搜索,大到INTERNET上的搜索,search占据了我们上网的大部分时间。在复习这一章的知识时,你需要先弄清楚以下几个概念:关键字、主关键字、次关键字的含义;静态查找与动态查找的含义及区别;平均查找长度ASL的概念及在各种查找算法中的计算方法和计算结果,特别是一些典型结构的ASL值,应该记住。在DS的教材中,一般将search分为三类:1st,在顺序表上的查找;2nd,在树表上的查找;3rd,在哈希表上的查找。下面详细介绍其考查知识点及考查方式:1.线性表上的查找:主要分为三种线性结构:顺序表,有序顺序表,索引顺序表。对于第一种,我们采用传统查找方法,逐个比较。对于及有序顺序表我们采用二分查找法。对于第三种索引结构,我们采用索引查找算法。考生需要注意这三种表下的ASL值以及三种算法的实现。其中,二分查找还要特别注意适用条件以及其递归实现方法。2.树表上的查找:这是本章的重点和难点。由于这一节介绍的内容是使用树表进行的查找,所以很容易与树一间的某些概念相混淆。本节内容与树一章的内容有联系,但也有很多不同,应注意规纳。树表主要分为以下几种:二叉排序树,平衡二叉树,B树,键树。其中,尤以前两种结构为重,也有部分名校偏爱考B树的。由于二叉排序树与平衡二叉树是一种特殊的二叉树,所以与二叉树的联系就更为紧密,二叉树一章学好了,这里也就不难了。二叉排序树,简言之,就是“左小右大”,它的中序遍历结果是一个递增的有序序列。平衡二叉树是二叉排序树的优化,其本质也是一种二叉排序树,只不过,平衡二叉树对左右子树的深度有了限定:深度之差的绝对值不得大于1。对于二叉排序树,“判断某棵二叉树是否二叉排序树”这一算法经常被考到,可用递归,也可以用非递归。平衡二叉树的建立也是一个常考点,但该知识点归根结底还是关注的平衡二叉树的四种调整算法,所以应该掌握平衡二叉树的四种调整算法,调整的一个参照是:调整前后的中序遍历结果相同。B树是二叉排序树的进一步改进,也可以把B树理解为三叉、四叉....排序树。除B树的查找算法外,应该特别注意一下B树的插入和删除算法。因为这两种算法涉及到B树结点的分裂和合并,是一个难点。B树是报考名校的同学应该关注的焦点之一。键树也称字符树,特别适用于查找英文单词的场合。一般不要求能完整描述算法源码,多是根据算法思想建立键树及描述其大致查找过程。3.基本哈希表的查找算法:哈希一词,是外来词,译自“hash”一词,意为:散列或杂凑的意思。哈希表查找的基本思想是:根据当前待查找数据的特征,以记录关键字为自变量,设计一个function,该函数对关键字进行转换后,其解释结果为待查的地址。基于哈希表的考查点有:哈希函数的设计,冲突解决方法的选择及冲突处理过程的描述。第八章 内部排序内排是DS课程中最后一个重要的章节,建立在此章之上的考题可以有多种类型:填空,选择,判断乃至大型算法题。但是,归结到一点,就是考查你对书本上的各种排序算法及其思想以及其优缺点和性能指标(时间复杂度)能否了如指掌。这一章,我们对重点的规纳将跟以上各章不同。我们将从以下几个侧面来对排序一章进行不同的规纳,以期能更全面的理解排序一章的总体结构及各种算法。从排序算法的种类来分,本章主要阐述了以下几种排序方法:插入、选择、交换、归并、计数等五种排序方法。其中,在插入排序中又可分为:直接插入、折半插入、2路插入、希尔排序。这几种插入排序算法的最根本的不同点,说到底就是根据什么规则寻找新元素的插入点。直接插入是依次寻找,折半插入是折半寻找。希尔排序,是通过控制每次参与排序的数的总范围“由小到大”的增量来实现排序效率提高的目的。交换排序,又称冒泡排序,在交换排序的基础上改进又可以得到快速排序。快速排序的思想,一语以敝之:用中间数将待排数据组一分为二。快速排序,在处理的“问题规模”这个概念上,与希尔有点相反,快速排序,是先处理一个较大规模,然后逐渐把处理的规模降低,最终达到排序的目的。选择排序,相对于前面几种排序算法来说,难度大一点。具体来说,它可以分为:简单选择、树选择、堆排。这三种方法的不同点是,根据什么规则选取最小的数。简单选择,是通过简单的数组遍历方案确定最小数;树选择,是通过“锦标赛”类似的思想,让两数相比,不断淘汰较大(小)者,最终选出最小(大)数;而堆排序,是利用堆这种数据结构的性质,通过堆元素的删除、调整等一系列操作将最小数选出放在堆顶。堆排序中的堆建立、堆调整是重要考点。树选择排序,也曾经在一些学校中的大型算法题中出现,请大家注意。归并排序,故名思义,是通过“归并”这种操作完成排序的目的,既然是归并就必须是两者以上的数据集合才可能实现归并。所以,在归并排序中,关注最多的就是2路归并。算法思想比较简单,有一点,要铭记在心:归并排序是稳定排序。基数排序,是一种很特别的排序方法,也正是由于它的特殊,所以,基数排序就比较适合于一些特别的场合,比如扑克牌排序问题等。基数排序,又分为两种:多关键字的排序(扑克牌排序),链式排序(整数排序)。基数排序的核心思想也是利用“基数空间”这个概念将问题规模规范、变小,并且,在排序的过程中,只要按照基排的思想,是不用进行关键字比较的,这样得出的最终序列就是一个有序序列。本章各种排序算法的思想以及伪代码实现,及其时间复杂度都是必须掌握的,学习时要多注意规纳、总结、对比。此外,对于教材中的10.7节,要求必须熟记,在理解的基础上记忆,这一节几乎成为很多学校每年的必考点。至此,数据结构所有章节的章节重点问题,我们已经规纳完毕,使用清华严版教材的同学,在复习的同时,可以参照本贴给出的重点进行复习。但是,由于作者本人水平有限,可能有很多考点没有规纳出来,也可能有些考点规纳有误,在此,作者本人诚恳希望诸位朋友直面提出,我会不断完善和发布新的关于数据结构复习的总结以及笔记严蔚敏数据结构为主的笔记二第二章:线性表(包括习题与答案及要点)--------------------------------------------------------------------------------本章的重点是掌握顺序表和单链表上实现的各种基本算法及相关的时间性能分析,难点是使用本章所学的基本知识设计有效算法解决与线性表相关的应用问题。要求达到<识记>层次的内容有:线性表的逻辑结构特征;线性表上定义的基本运算,并利用基本运算构造出较复杂的运算。要求达到<综合应用>层次的内容有:顺序表的含义及特点,顺序表上的插入、删除操作及其平均时间性能分析,解决简单应用问题。链表如何表示线性表中元素之间的逻辑关系;单链表、双链表、循环链表链接方式上的区别;单链表上实现的建表、查找、插入和删除等基本算法及其时间复杂度。循环链表上尾指针取代头指针的作用,以及单循环链表上的算法与单链表上相应算法的异同点。双链表的定义和相关算法。利用链表设计算法解决简单应用问题。要求达到<领会>层次的内容就是顺序表和链表的比较,以及如何选择其一作为其存储结构才能取得较优的时空性能。--------------------------------------------------------------------------------线性表的逻辑结构特征是很容易理解的,如其名,它的逻辑结构特征就好象是一条线,上面打了一个个结,很形象的,如果这条线上面有结,那么它就是非空表,只能有一个开始结点,有且只能有一个终端结点,其它的结前后所相邻的也只能是一个结点(直接前趋和直接后继)。关于线性表上定义的基本运算,主要有构造空表、求表长、取结点、查找、插入、删除等。--------------------------------------------------------------------------------线性表的逻辑结构和存储结构之间的关系。在计算机中,如何把线性表的结点存放到存储单元中,就有许多方法,最简单的方法就是按顺序存储。就是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中。在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一致的。在顺序表中实现的基本运算主要讨论了插入和删除两种运算。相关的算法我们通过练习掌握。对于顺序表的插入和删除运算,其平均时间复杂度均为O(n)。--------------------------------------------------------------------------------线性表的链式存储结构。它与顺序表不同,链表是用一组任意的存储单元来存放线性表的结点,这组存储单元可以分布在内存中任何位置上。因此,链表中结点的逻辑次序和物理次序不一定相同。所以为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还存储了其后继结点的地址信息(即2023-08-01 17:58:201
请问在大学里,数据结构这门课都学什么。请举例说明。
链表结构啦、树的遍历之类的~2023-08-01 17:58:302
用递归方法求n! 下面递归函数的编写有错,改正。
float fac(int n) { float f; if (n<0) { printf(“n<0, dataerror!”); } else if(n==0||n==1) f=1; else f=fac(n-1)*n; return f;}2023-08-01 17:58:402
10道经典的C语言例题(含参考程序)
1.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153是一个“水仙花数”,因为153=1^3+5^3+3^3。 #include #include int main() { int bai_wei,shi_wei,ge_wei,i,sum=0; for(i=100;i<1000;i++) { bai_wei=i/100; shi_wei=(i%100)/10; ge_wei=i%10; if(i==pow(bai_wei,3)+pow(shi_wei,3)+pow(ge_wei,3)) { printf("%d ",i); sum++; if(sum%5==0) printf(" "); } } printf(" "); return 0; } 2.请输入任意两个整数x和y,求其最大公约数和最小公倍数。 #include int main() { int x,y,min,max,i; printf("请输入任意两个整数:"); scanf("%d%d",&x,&y); min=x>y?y:x; max=x>y?x:y; for(i=min;i>0;i--) if(x%i==0&&y%i==0) { printf("这两个整数的最大公约数为:%d ",i); break; } for(i=max;i<=x*y;i++) if(i%x==0&&i%y==0) { printf("这两个整数的最小公倍数为:%d ",i); break; } return 0; } 3.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 #include #include #define N 50 int main() { int sum1=0,sum2=0,sum3=0,sum4,i=0; char str[N]; printf("请输入一串字符串:"); scanf("%s",str); for(i=0;i<strlen(str);i++) p=""> </strlen(str);i++)> { if((str[i]>="a"&&str[i]="A"&&str[i]<="Z")) sum1++; if(str[i]==" ") sum2++; if(str[i]>="0"&&str[i]<="9") sum3++; } sum4=strlen(str)-sum1-sum2-sum3; printf("英文字母的个数:%d ",sum1); printf("空格的个数:%d ",sum2); printf("数字的个数:%d ",sum3); printf("其他符号的个数:%d ",sum4); return 0; } 4.求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 #include #include int main() { int a,n,s=0,i,x=0,y=0; printf("请输入整数a的值:"); scanf("%d",&a); printf("请输入相加的个数n:"); scanf("%d",&n); for(i=0;i<n;i++) p=""> </n;i++)> { x=y+2*pow(10,i); y=x; s=s+x; } printf("s=%d ",s); return 0; } 5.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。编程找出1000以内的所有完数。 #include int main() { int sum=0,i,j; printf("在1000以内的完数有:"); for(i=2;i<=1000;i++) { for(j=1;j<i;j++) p=""> </i;j++)> if(i%j==0) sum=sum+j; if(sum==i) printf("%d ",i); sum=0; } printf(" "); return 0; } 6.输入一个不多于5位的正整数,要求:1、求它是几位数;2、逆序打印出个位数字。 #include int pows(int a,int n) { int sum=1,i; for(i=0;i<n;i++) p=""> </n;i++)> sum=sum*a; return sum; } int main() { int n,i,k,x; printf("n="); scanf("%d",&n); for(i=1;i<6;i++) if(n/pows(10,i)==0) { printf("%d ",i); k=i; break; } for(i=0;i<k;i++) p=""> </k;i++)> { x=n/pows(10,i)%10; printf("%d",x); } printf(" "); return 0; } 7.输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 #include int main() { int n,a[5],i=0; printf("请输入一个5位数:"); scanf("%d",&n); while(n!=0) { a[i]=n%10; n=n/10; i++; } if(a[0]==a[4]&&a[1]==a[3]) printf("这个数是回文数 "); else printf("这个数不是回文数 "); return 0; } 8.利用递归算法,将所输入的5个字符,以相反顺序打印出来。 #include void digui(char a[],int n) { if(n==1) printf("%c",a[0]); else { printf("%c",a[n-1]); digui(a,n-1); } } int main() { char str[5]; printf("请输入5个字符:"); scanf("%s",str); digui(str,5); printf(" "); return 0; } 9.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…球出这个序列的前20项之和。 #include int main() { int i,a=1,b=1; float sum=0.0; for(i=1;i<=20;i++) { sum=sum+(float)(a+i)/b; b=a+i; a=i; } printf("sum=%f ",sum); return 0; } 10.利用递归算法求5!。 #include int digui(int n) { if(n==1) return 1; else return n*digui(n-1); } int main() { int n,sum; printf("n:"); scanf("%d",&n); sum=digui(n); printf("sum=%d ",sum); return 0; }2023-08-01 17:58:471
微软英文面试经历分享
微软英文面试经历分享 以下是由我为大家推荐的微软英文面试经历,欢迎大家学习参考。 经验一 ATC PM 面经 首先声明,我是被人推荐面试去的。不要和现在的校园招聘混淆了,面试的流程应该是不一样的。感谢推荐我的Darren.Wang,这位ee的师兄是我的伯乐,虽然我们就见过2面。注:以下的面试都是全英文,就最后报告offer的是中文。ok,首先是电面,9月中旬,是hr打过来的,问了一些基本问题,问了简历上的问题,然后问我最熟悉的编程语言是什么,我大言不惭的说c#。于是她问了我3个c#的问题,都是概念性问题,期间听到有用笔在记录什么东西 (汗)。 分别是thread pool, overload/overri de, 还有一个忘记了。。大概就是看你能不能流利的说出来的把。这一轮的重点大概就是英语。最后告诉我给我一个on-site interview, 过了一周左右,通知了我是在10-17号面试,天,一个月。折磨阿,早上7.45??折磨阿基本上是从10月12号之后开始准备的,在此推荐一个 pdf,programer interview,有中文版。 17号早上6.30点钟起床,东川路么,很近的"。但是我还是打了车。在上车之前的准备工作有:上厕所,吃半块德福的白巧克力,喝了一点水。其他都带着上车了。 7。30到了,5个人,3个工作的,一个intern,还有一个我 8点开始面试,一共5轮,2轮中国人,3轮外国人,遗憾的我一个名字都没记住。每轮 1个小时 1面,很nice的gg,英语说得很慢,明显照顾我。先问了问简历的问题,然后开始做题,首先是 “TestString"->"StringTest"的问题,而且第二个单词是给定位置的,用区间反转解之。然后是一个随机数字的数组,求和是 100的两个数字位置,用两边夹逼解之。这两个都要写detail的程序的。然后问了一道open question,怎么样在拥有很多书的情况下把书摆的适合查找,而且增加的时候也要保持查找的顺序。后来觉得这道题就是数据库的文件系统怎么设计么。还不用考虑删除,用物理索引解之。 2面,很有气质的gg,感觉是里面的资深工程师。先给我解释了一下sde,sdet,pm的区别。然后问了我简历上的问题。编程上问了我两个sorted single list的merge问题。让我写代码。 我是真的从上完数据结构课就没写过c 的东西了,居然把节点指针写成了in t *。。费了半天劲终于写好了。结果指针移位的时候多用了个temp指针,被指出,道歉,改正。。然后继续讨论sde,sdet,pm的选择问题。真的是很有风度,恩。 3面,很有趣的foreign gg,感觉是开发部的lead。先简单问了我实习的问题,然后问了我毕业论文的情况。令我惊讶的是我毕业论文写的是本体的进化,他居然懂得。。紧张阿 ,不是遇到这方面的大牛了八。还好没有继续问下去(虽然我不是没做,但总是心虚阿)。然后出了一道我至今见的最巧妙的面试题(大概是我孤陋了)。 首先,写个power(x, y)的test cases,就是x的y次方拉。 然后,用循环实现,不用循环实现(用递归),递归费内存如何解决。。我到写递归的时候已经晕了,test case 写了7,8个,自己写程序的时候每个都要注意,真正的test case driven... 这面感觉最不好。 4面,很pp的foreign jj,是test lead(我问的,确定)。先问我sde,sdet,pm有没有讲过,我想当哪个。我说sde,pm把,sdet不干。后来最后才知道她是test lead。。汗阿。首先问了我一个设计问题,让我设计一个媒体播放器,越细越好。我一顿mvc,3层架构,设计模式,插件结构,哈哈,我强项阿。然后吹了一通我的设计的健壮,完整,扩充。恩。然后她让我写个算法,一个随机整形数组,找出里面第一对相同的item。我当时吹得太兴奋了,头脑还是处于结构性状态中,于是只想出了排序的nlogn,没有能做出n的算法(但是我用空间换时间的办法得到了n,就是开一个65563的数组。。)。 4面结束 5面,很有气质的foreign jj,是unit manager。先问我sde,sdet,pm选哪个,我说sde,pm. 她说为什么每个人都是sde。我辩解一通。然后她给了我一个case,说如果一个世界冠军给你1/4 billion dollar让你造一台自行车,但是轮子是别人造的,而且要time-critical你怎么办。我当时想,这造火箭都出来了。 我用标准流程应对之,plan,采购,评估。。,后,她继续:如果造轮子的说好了周二给你又没给怎么办。我说首先通知客户,这是 integrity问题。然后push那边快点,实在不行就换人! 反正老子钱多。问题1结束。问题 2:假设现在你有几个best developer,你想做一个什么软件?并解释,设计它。这真是天赐良机阿,我前一周刚和allen讨论过要做一个personal的高级收藏夹一样的东西。于是略作思考,提升至personal knowledge center的级别一顿猛说,激动阿。感觉那个manager 跟你说话就能感染你,让你很有passion。基本上说完,中间她就提了一两个问题,还是我接下来就要说得,问题2结束。 离开 atc. 感觉后两轮就是按照pm来面试我。等待睡不好,吃不好。听到手机响就紧张。周五我一个好久不见的高中同学过来了,陪他了一天,期间作了一点心理咨询。送他去车站的时候,电话响了,通知我给我pm的offer。 至此我job的**面试结束。总结一下:英语是基础,尽量做到能流畅的表达自己的意思,我觉得后两轮我能通过有很大部分是因为我的想法充分表达出来了。简历是过去,要有漂亮的实习和奖学金。前者是你证明自己能力的最好方式,后面是补充。热情是必须,当你表达出你对这个job的热情并且面试官也很high的时候,offer就来了。 恩,bless all who will have their interview and wish they get what they want. 经验二 上周三晚上,我收到了ATC的面试通知(邮件)周四晚上,整整复习了一天,直到晚上2点钟,主要看数据结构,重点看了排序,检索,二叉书,自己还想了想怎么存储一个二叉树到文件中,怎么从文件恢复(这个据说今年考过),怎么不用递归实现前序,后序,中序遍历。图论部分稍微看了一下。结果,上周五(19日),我参加ATC的面试时候,我看的一个都没有考到2,惨啊。 第二轮的时候,考官的问题是:怎么实现在一个图中,判断能否沿所有边走一遍且只走一遍,如果能够,写出走法。需要自己定义数据结构和写算法。其实,这个就是著名的七孔桥问题,反正我当时一下就有点懵了,幸亏考官给我一些提示,后来还简化了一些条件和要求,但是我自己感觉答的不是很好。 不过,幸运的是,我还是能参加了下午的面试,只有一个人面试,呵呵。现在等待结果中。。。 总之,大家还是看看图论的一些东西吧,当然二叉树还是要看的。至于其它一些编程题,主要要考虑编程习惯,边界条件(保证程序正确),以及算法效率,估计都得靠临场发挥了。就像版上所说的,自己不会的时候,一定要和面试官多聊,试探性的说出自己想法, 他总不会让你往一个明显错误的方向走下去吧1 ;2023-08-01 17:58:541
C语言递归算法?
C语言开发学习有困难,到AAA试听一下2023-08-01 17:59:3912
递归和迭代有哪些区别?
一、含义不同:递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。二、结构不同:递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止,使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。递归算法一般用于解决三类问题:(1)数据的定义是按递归定义的。(Fibonacci函数)(2)问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。(3)数据的结构形式是按递归定义的。如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。以上内容参考:百度百科-递归2023-08-01 18:00:074
在source insight 添加文件时选择递归选项为什么会失败
添加工程文件步骤:1、打开某个工程后,菜单Project -> Add and Remove Project Files2、此时出现让你选择添加工程文件的对话框,右侧一排按钮中间只有一个可以打勾的位置(Show only known documents types),将此项打勾则只显示Source Insight可以识别的文档类型。3、正常情况下此时不是代码的那些无关文件应该就不会出现了,但是如果仍然会出现PNG等特别文件类型,则可能你的Source Insight在安装后经过了其他设置,或者并不是标准的英文原版安装文件安装来的,我用英文原版+注册码这样选就没问题了。4、仍然解决不了,则需要看看设置选项: 菜单Options->Document Options 出现对话框后左上角是Document Type下拉条,看看里面有没有和PNG扩展名的文件关联的文档类型(看右上角的File filter框中的文件扩展名是否有*.png之类的),选择此Document Type然后按下Remove Type按钮后确认删除,这样应该就不会再添加PNG文件类型了。2023-08-01 18:00:411
java编程: 1.用递归方法编写:用java语言写! 输出如下所示: 1 1 2 1 1 2 3 2 1 的代码帮我写下!
第一题:package com.mtv.test;public class TestMain { public static void printFor(int i){ int m,n,j; for(j=1;j<=i;j++){ for(m=0;m<9-j;m++){ System.out.print(" "); } for(n=1;n<=j;n++){ System.out.print(n+" "); } for(n=j-1;n>0;n--){ System.out.print(n+" "); } System.out.println(); } } public static void printRe(int i){ int m,n; if(i==0){// for(m=0;m<8;m++){// System.out.print(" ");// }// System.out.println(i); }else{ printRe(i-1);//递归调用 for(m=0;m<9-i;m++){ System.out.print(" "); } for(n=1;n<=i;n++){ System.out.print(n+" "); } for(n=i-1;n>0;n--){ System.out.print(n+" "); } System.out.println(); } } public static void main(String[] args){ TestMain.printFor(9); TestMain.printRe(9); }} 第二题: public class TestM { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] num = new int[12][]; num[0] = new int[1]; num[1] = new int[2]; num[0][0] = 1; num[1][0] = num[1][1] = 1; for(int row=2;row<12;row++){ num[row] = new int[row+1]; num[row][0] = num[row][row] =1; for(int n=1;n<row;n++){ num[row][n]=num[row-1][n-1]+num[row-1][n]; } } for(int m=0;m<num.length;m++){ for(int n=0;n<num[m].length;n++){ System.out.print(num[m][n]+" "); } System.out.println(); } }}2023-08-01 18:01:074
C语言解答
一般编译器将其视作语法上讲合法,但是行为是典型的未定义行为,结果是不确定的http://bbs.csdn.net/topics/3701537752023-08-01 18:01:302
SQL递归查询所有子节点
你这样设计的表用递归来显示最恰当我刚刚好有这个的代码发给你参考下吧///<summary>///绑定根节点///</summary>///<paramname="id"></param>///<paramname="ddlList"></param>publicvoidBindSysMenu(stringid,DropDownListddlList){ListItemll=newListItem();ll.Text="╋--请选择-----";ll.Value="-1";ddlList.Items.Add(ll);DataTabledt=newManageContentInfoBll().GetWName(id).Tables[0];foreach(DataRowdrindt.Rows){ListItemli=newListItem();li.Text="╋"+dr["W_Name"].ToString();li.Value=dr["W_ID"].ToString();ddlList.Items.Add(li);BindSysMenuChild((dr["W_ID"].ToString()),ddlList,"├-");}}///<summary>///绑定子节点///</summary>publicvoidBindSysMenuChild(stringid,DropDownListddlList,Stringsepartor){DataTabledt=newManageContentInfoBll().GetWName(id).Tables[0];foreach(DataRowdrindt.Rows){ListItemli=newListItem();li.Text=separtor+dr["W_Name"].ToString();li.Value=dr["W_ID"].ToString();stringsepartor_=separtor+"--";ddlList.Items.Add(li);BindSysMenuChild(dr["W_ID"].ToString(),ddlList,separtor_);}}sql语句很简单的select*fromWebSubjectMenuwhereW_Logo="+id+"W_Logo是上级的ID希望对你有帮助吧。2023-08-01 18:01:524
两个正整数的最大公约数是指能够整除这两个数的最大整数。请用递归的方法编写最大公约数函数int Gc?
int gcd(int a, int b) { if (a == b) { return a; } else if (a > b) { return gcd(b, a - b); } else { return gcd(a, b - a); }}2023-08-01 18:02:052
常用的数据挖掘算法有哪几类?
频繁模式挖掘、分类2023-08-01 18:02:162
DNS是什么作用?
我来答一下吧,我要把DNS的问题全回答完!!!DNS中文名就是域名解析系统,作用就是为了上网方便,不用记IP地址,因为互联网里通信是用IP通信的,IP很难记,所以有了DNS,DNS就是互联网世界里的通讯录。怎么实现?windows server 自带,LINUX Bind,不过都没有酷捷信息的免费智能DNS好用。2023-08-01 18:02:5814
C语言程序答案:将一个整数n转成字符串输出。???不用递归法,还能怎么写
#include <stdio.h>void f(int n, char* buf){ sprintf(buf,"%d",n);}2023-08-01 18:04:313
编程语言是谁发明的?
编程语言多着呢,每一种都有个创始人呢?2023-08-01 18:04:465
linux 把当前目录的一个子目录里的文件移动到另一个子目录里用什么命令
mv dir1/* dir2/2023-08-01 18:05:136
求C语言的笔试题和编程题!!~~~谢谢~~!!
99乘法表输入十个从大到小数排序输入日期YYYYMMDD判断是不是闰年,这个月有多少天,这个日期的前一天和后一天。2023-08-01 18:05:335
集合操作 用单链表模拟有序集合,实现集合的加入一个元素、删除一个元素、集合的交、并、差运算。
数据结构与C语言综合训练实习 1 序号 项目名称 任务描述 指导教师 1 英文文本压缩 问题描述利用哈夫曼编码实现英文文本的压缩和解压缩。基本要求对于给定的英文文本可以根据其频度进行哈夫曼编码并能输出对应的哈夫曼树和哈夫曼编码实现哈夫曼解码。提高要求1能够分析文件统计文件中出现的字符统计字符出现的概率再对文件进行编码实现文件的压缩和解压缩。2能够对于文件的压缩比例进行统计。 2 文本编辑系统 1分别统计出其中英文字母数和空格数及整篇文章总字数2统计某一字符串在文章中出现的次数并输出该次数3删除某一子串并将后面的字符前移。 3 简单算术表达式运算 给定简单的算术表达式包括加减乘除括号这几种运算操作符请计算表达式的值。1能够正确处理加减乘除这四种运算2能够正确处理括号运算。 4 小学生测验系统 面向小学12年级学生随机选择两个整数和加减法形成算式要求学生解答。功能要求1电脑随机出10道题每题10分程序结束时显示学生得分2确保算式没有超出12年级的水平只允许进行50以内的加减法不允许两数之和或之差超出050的范围负数更是不允许的3每道题学生有三次机会输入答案当学生输入错误答案时提醒学生重新输入如果三次机会结束则输出正确答案4对于每道题学生第一次输入正确答案得10分第二次输入正确答案得7分第三次输入正确答案得5分否则不得分5总成绩90以上显示“SMART”80-90显示“GOOD”70-80显示“OK”60-70显示“PASS”60以下“TRY AGAIN”。 5 数字游戏的设计 实现一个简单的猜数字游戏1一个四位数各位上的数字不重复从1到9。2按以下提示猜出这个四位数。 3每次猜测输入的数据给出类似的提示AB。4其中A前的代表你本次猜对了多少个数字。 5其中B前的代表你本次猜对的数字并且位置正确的个数。6给定猜测次数如果超过次数未猜中游戏失败。 6 学生成绩管理程序 设计一个简单的学生成绩管理程序要求根据菜单处理相应功能。1管理功能包括列表、求平均成绩、查找最高分等。2可按指定的性别或高于指定的个人平均分来筛选列表3可按平均成绩排序4平均成绩可按个人或科目进行5查找可按最高个人平均分进行或按指定科目的最高分进行6每个学生的信息包括序号、学号、性别、成绩1、成绩2、 数据结构与C语言综合训练实习 2 成绩3、成绩47基本功能为建立文件、增加学生记录、新建学生信息文件、删除/修改学生记录。 7 图书登记管理程序 该程序应该具有下列功能1 通过键盘输入某本图书的信息2 给定图书编号显示该本图书的信息3 给定作者姓名显示所有该作者编写的图书信息4 给定出版社显示该出版社的所有图书信息5 给定图书编号删除该本图书的信息6 提供一些统计各类信息的功能。 8 集合操作 用单链表模拟有序集合实现集合的加入一个元素、删除一个元素、集合的交、并、差运算。1用单链表存放集合中的元素链表中的元素按大小存放2实现集合加入一个元素删除一个元素的元素操作3实现集合的交、并、差集合操作 9 树的重构和遍历系统 系统菜单信息输入、输出遍历。 10 个人关系网的设计与实现系统 系统菜单信息输入、输出建图、查询。 11 简单栈和队列演示系统的设计与实现 系统菜单信息输入、输出。 12 按每个数的各位值进行排序的系统 系统菜单信息输入、输出排序。 13 学生基本信息管理系统 系统菜单信息输入、输出查询。 14 身份证管理程序 该程序应该具有下列功能1 通过键盘可以输入身份证信息大量信息可存放在文件中。身份证包含的信息请参看自己的身份证2 给定身份证号码显示其身份证信息3 给定省份的编号显示该省的人数4 给定某区的编号显示该区的人数5 给定身份证号码可以修改该身份证信息6 给定身份证号码可以删除该身份证信息。 15 学生宿舍管理查询软件 设计一个简单的学生宿舍管理查询程序要求根据菜单处理相应功能。1建立数据文件 数据文件按关键字姓名、学号、房号进行排序 2查询菜单: 可以用二分查找实现以下操作A. 按姓名查询 B. 按学号查询 C. 按房号查询等3可以打印任一查询结果4每个学生的信息包括序号、学号、性别、房号、楼号等。 数据结构与C语言综合训练实习 3 16 万年历查询程序 实现万年历程序功能要求1提供菜单方式选择假定输入的年份在1940-2040年之间。2输入一个年份输出是在屏幕上显示该年的日历。3输入年月输出该月的日历。如4输入年份、月份、日期计算得到的是这一天据今天有多少天星期几5输入公历的年月日输出农历年月日。6输入农历节气输出当年农历的年月日及公历年月日。可以假定只涉及年份是1940年到2040年。 17 二叉树遍历算法的实现 四种算法都是前序、中序、后序三种算法要求递归和非递归实现层遍历用非递归实现。 18 二叉排序树的实现 要求分别以顺序表和二叉链表作为储结构实现二叉排序树。基本操作有插入、删除。 19 管道铺设施工的最佳方案选择 功能设计一个最佳方案使得这N个居民区之间铺设煤气管道所需代价最少。 20 数组编码和解码问题的求解设计与实现 设有一个数组A: array0..N-1存放的元素为0-N-11ltNlt10之间的整数且不存在重复数据。例如当N6时有A430512。此时数组A的编码定义如下:A0编码为0Ai编码为在A0A1�6�7Ai-1中比Ai的值小的个数i12�6�7N-1上面数组A的编码为B000312要求如下给出数组A 利用C 求解A的编码.给出数组A的编码后求出A中原数据。 21 简易文本编辑器的设计与实现 功能具有图形菜单界面查找、替换、块移动行块列块移动、删除具有基本功能。 22 利用哈希表实现电话号码查找系统 功能建立哈希表。选择不同的哈希函数选择不同的解决冲突的办法。 23 迷宫问题求解 要求对任意设定的迷宫求出一条从入口到出口的通路或得出没有通路的结论。 24 排序算法综合 功能数据随机生成五种常用排序算法实现从时间上分析效率并比较。 25 简易通讯录的制作 功能输入信息 显示信息 查找以姓名作为关键字 删除信息 存盘 装入。 数据结构与C语言综合训练实习 4 26 图的遍历的实现 功能实现图的深度优先 广度优先遍历算法并输出原图结构及遍历结果。 27 稀疏矩阵运算器的设计与实现 功能压缩存储矩阵的基本运算加、乘、求逆常规矩阵方式输出。 28 小学生作业题练习系统利用堆栈实现 功能建立试题库文件随机产生n个题目 题目涉及加减乘除带括弧的混合运算给出分数判定 随时可以退出 保留历史分数能回顾历史根据历史分数给出评价。 29 一元多项式的加法、减法、乘法的实现 要求判定是否稀疏分别采用顺序和链式存储结构实现结果Mx中无重复阶项和无零系数项要求输出结果的升幂和降幂两种排列情况 30 邻接表克鲁斯卡尔算法的实现 要求根据需要建立图的邻接表存储结构构造最小生成树模拟演示生成过程。 31 期刊论文管理程序 该程序应该具有下列功能1 通过键盘输入某期刊论文的信息也可以把大量期刊论文信息放在文件中2 给定期刊论文的论文名称显示该论文的作者信息作者单位发表期刊的名称3 给定作者姓名显示所有该作者发表的期刊论文情况4 给定期刊名称显示该期刊的所有论文信息 32 字符串操作 编写程序不使用标准库函数实现字符串的拷贝、拼接、字串查找、长度计算等函数。1在不使用相关的标准库函数的情况下完成本任务2实现两个字符串拼接的函数strcatstr1 str23实现字符串拷贝的函数strcpystr1str24实现字符串查找的函数strcstrstr1str25实现字符串长度计算的函数strlenstr16实现字符串查找字符的函数strccharstr1c7实现字符串替换的函数strcreplacestrstr1str2str38实现字符串替换字符的函数strcreplacecharstr1str2c 33 单源最短路径求解 给定一个带权有向图GVE其中每条边的权是一个非负实数。另外还给定V中的一个顶点成为源。现在计算从源到其他各顶点的最短路径。路径的长度是指路上各边权值之和。 34 歌手比赛系统 设计一个简单的歌手比赛绩管理程序对一次歌手比赛的成绩进行管理功能要求1.输入每个选手的数据包括编号、姓名、十个评委的成绩根据输入计算出总成绩和平均成绩去掉最高分去掉最低分。2.显示主菜单如下1输入选手数据 2评委打分 3成绩排序按 数据结构与C语言综合训练实习 5 平均分4数据查询 5追加学生数据 6写入数据文件7退出系统 35 找数字对 输入N2ltNlt100个数字在0与9之间然后统计出这组数种相邻两数字组成的链环数字对出现的次数。例如 输入N20 表示要输入数的数目 0 1 5 9 8 7 2 2 2 3 2 7 8 7 8 7 9 6 5 9 输出782 873指78、87数字对出现次数分别为2次、3次 36 二叉树遍历算法的实现 四种算法都是前序、中序、后序三种算法要求递归和非递归实现层遍历用非递归实现。 37 中文文本压缩 问题描述利用哈夫曼编码实现中文文本的压缩和解压缩。基本要求对于给定的中文文本可以根据其频度进行哈夫曼编码并能输出对应的哈夫曼树和哈夫曼编码实现哈夫曼解码。提高要求1能够分析文件统计文件中出现的字符统计字符出现的概率再对文件进行编码实现文件的压缩和解压缩。2能够对于文件的压缩比例进行统计。 38 邻接矩阵普利姆算法的实现 要求根据需要建立图的邻接矩阵存储结构构造最小生成树模拟演示生成过程。 39 邻接矩阵克鲁斯卡尔算法的实现 要求根据需要建立图的邻接矩阵存储结构构造最小生成树模拟演示生成过程。 40 n元多项式乘法 1 界面友好函数功能要划分好 2 总体设计应画一流程图 3 程序要加必要的注释 4 要提供程序测试方案 5 程序一定要经得起测试宁可功能少一些也要能运行起来不能运行的程序是没有价值的。 41 学生成绩管理程序 设计一个简单的学生成绩管理程序要求根据菜单处理相应功能。 1管理功能包括列表、求平均成绩、查找最高分等。 2可按指定的性别或高于指定的个人平均分来筛选列表 3可按平均成绩排序 数据结构与C语言综合训练实习 6 4平均成绩可按个人或科目进行 5查找可按最高个人平均分进行或按指定科目的最高分进行 6每个学生的信息包括序号、学号、性别、成绩1、成绩2、成绩3、成绩4 7基本功能为建立文件、增加学生记录、新建学生信息文件、删除/修改学生记录。 42 数组操作 设计菜单处理程序对一维数组进行不同的操作。 1操作项目包括求数组最大值、最小值、求和、求平均值、排序、 二分查找、有序插入 2设计并利用字符菜单进行操作项目的选择程序一次运行可根据选择完成一项或多项操作通过菜单“退出”来结束程序的运行 3数组的输入、输出可支持命令行输入文件名、界面输入文件名从数据文件中输入和输出也支持界面录入。 43 打印日历表 打印指定年份的公历表和农历表。 1输入年份为19902050内任一年 2可以选择输出公历表或农历表 3农历表包括二十四节气。 44 学生证管理程序 该程序应该具有下列功能 1 通过键盘输入某位学生的学生证信息。学生证包含的信息请参看自己的学生证 2 给定学号显示某位学生的学生证信息 3 给定某个班级的班号显示该班所有学生的学生证信息 4 给定某位学生的学号修改该学生的学生证信息 5 给定某位学生的学号删除该学生的学生证信息 6 提供一些统计各类信息的功能。 45 图书登记管理程序 该程序应该具有下列功能 1 通过键盘输入某本图书的信息 2 给定图书编号显示该本图书的信息 3 给定作者姓名显示所有该作者编写的图书信息 4 给定出版社显示该出版社的所有图书信息 数据结构与C语言综合训练实习 7 5 给定图书编号删除该本图书的信息 6 提供一些统计各类信息的功能。 46 学生学分管理程序 假设每位学生必须完成基础课50学分、专业课50学分、选修课24学分、人文类课程8学分、实验性课程20学分才能够毕业。因此在管理学分时要考虑每个学分所属于的课程类别。 该程序应该具有下列功能 1 通过键盘输入某位学生的学分 2 给定学号显示某位学生的学分完成情况 3 给定某个班级的班号显示该班所有学生学分完成情况 4 给定某位学生的学号修改该学生的学分信息 5 按照某类课程的学分高低进行排序 6 提供一些统计各类信息的功能。 47 作业完成情况管理程序 假设某门课程一学期要留10次作业每次老师要进行批改给出分数后还要进行登记。学期期末要根据每次作业的成绩计算出最终的平时成绩满分100。 该程序应该具有下列功能 1 通过键盘输入某位学生某次作业的分数 2 给定学号显示某位学生作业完成情况 3 给定某个班级的班号显示该班所有学生的作业完成情况 4 给定某位学生的学号修改该学生的作业完成信息 5 给定某位学生的学号删除该学生的信息 6 提供一些统计各类信息的功能。 48 旅店POS机管理系统 旅店收款POS机管理系统的简单实现。 1前台管理包括空房分等级显示、入住登记、退房结算、洗衣房管理、娱乐项目管理 2后台管理包括客房预定分析、营业额统计、日报表、月报表、年报表 3设计数据结构文件来实现数据库管理包括数据录入、查询、删除、修改、更新。 49 学生通讯录管理系统 用链表方式来实现学生通讯录管理系统。 1通过定义一个包含学生通讯录主要包括学号、姓名、系别、专业、籍贯、家庭住址、 数据结构与C语言综合训练实习 8 联系电话等的结构体类型实现增加学生通讯录的内容、删除某个学生通讯录、输出全部学生通讯录内容、根据用户需求查找某个或某些学生的通讯录内容如按系别、专业、学号、姓名等内容进行查找。 2能够实现以上给定的各项功能具有方便简洁的操作界面具有一定的容错性。 50 超长正整数的乘法 设计一个算法来完成两个超长正整数的乘法。 算法提示 首先要设计一种数据结构来表示一个超长的正整数然后才能够设计算法。 51 个人电话号码查询系统 问题描述实现简单的个人电话号码查询系统根据用户输入的信息如姓名身份证号电话号码、邮件地址等进行快速查询。 基本要求 1 插入实现将用户的信息插入到系统中2 删除删除某个用户的信息3 修改修改某个用户的信息4 查询根据姓名、身份证号等查询用户信息包括简单条件查询组合条件查询、模糊查询等5 排序对于用户信息进行排序提高查询速度6 输出输出用户信息。 提示 1 在内存中设计数据结构存储电话号码的信息在外存中利用文件的形式来保存电话号码信息系统运行时将电话号码信息从文件调入内存来进行插入、查找等操作。 2 如果数据的插入删除频繁可以考虑采取二叉排序树组织电话号码信息也可采用较复杂的平衡二叉树可以提高查找和维护的时间性能。 3 选择不同的排序和查找算法尽可能提高查找和维护性能。 52 数字文本压缩 问题描述利用哈夫曼编码实现数字文本的压缩和解压缩。基本要求对于给定的数字文本可以根据其频度进行哈夫曼编码并能输出对应的哈夫曼树和哈夫曼编码实现哈夫曼解码。提高要求1能够分析文件统计文件中出现的字符统计字符出现的概率再对文件进行编码实现文件的压缩和解压缩。2能够对于文件的压缩比例进行统计。 53 订票系统 基本要求 1录入可以录入航班情况数据可以存储在一个数据文件中数据结构、具体数据自定 2查询可以查询某个航线的情况如输入航班号查询起降时间起飞抵达城市航班 数据结构与C语言综合训练实习 9 票价票价折扣确定航班是否满仓 3可以输入起飞抵达城市查询飞机航班情况 4订票订票情况可以存在一个数据文件中结构自己设定可以订票如果该航班已经无票可以提供相关可选择航班退票 可退票退票后修改相关数据文件客户资料有姓名证件号订票数量及航班情况订单要有编号 5修改航班信息当航班信息改变可以修改航班数据文件。 54 学籍管理系统 问题描述建立学籍管理系统实现对于学生信息的添加和维护管理。 基本要求完成学籍登记表中的下面功能登记表中包括学号、姓名、性别、出生日期、政治面貌、联系方式、家庭住址等信息。 ⑴ 插入将某学生的基本信息插入到登记表中 ⑵ 删除将满足条件的基本信息删除 ⑶ 修改对基本信息的数据项进行修改 ⑷ 查询查找满足条件的学生 ⑸ 输出将登记表中的全部或满足条件基本信息输出。 提高要求 ⑴ 可以添加课程信息如开课学期、上课时间、上课地点等信息学生选课信息实现学生的选课功能 ⑵ 增加学生成绩信息可以对学生的成绩进行插入、删除、修改等操作 ⑶ 实现查找某学生的选课记录课程成绩等 ⑷ 利用二叉排序树、平衡树、排序算法等数据结构知识提高排序和查找速度。 提示 ⑴ 学生登记表一般建立后比较少更改因此可以采用顺序表方式建立 ⑵ 学生选课、成绩等信息一般更改比较频繁则可以采取链表建立 ⑶ 可以将学生的信息存储到文件中系统运行时将信息从文件调入到内存中运行。 55 数字游戏的设计 1一个四位数各位上的数字不重复从1到9。 2按以下提示猜出这个四位数。 数据结构与C语言综合训练实习 10 3每次猜测输入的数据给出类似的提示AB。 4其中A前的代表你本次猜对了多少个数字。 5其中B前的代表你本次猜对的数字并且位置正确的个数。 56 稀疏矩阵的压缩与还原 一个矩阵含有非零元素比较少而零元素相对较多这样的矩阵称为稀疏矩阵对稀疏矩阵的存储我们不用完全用二维数组来存储可以用一个三元组即任意一个稀疏矩阵可以用一个只有三列的二维数组来存放 要求把给定的稀疏矩阵用为三元组表示同时把三元组转换为稀疏矩阵形式。 57 文章编辑 输入一页文字程序可以统计出文字、数字、空格的个数。静态存储一页文章每行最多不超过80个字符。 要求 1分别统计出其中英文字母数和空格数及整篇文章总字数 2统计某一字符串在文章中出现的次数并输出该次数 3删除某一子串并将后面的字符前移。 存储结构使用线性表分别用几个子函数实现相应的功能 输入数据的形式和范围可以输入大写、小写的英文字母、任何数字及标点符号。 输出形式 1 分行输出用户输入的各行字符 2 分4行输出quot全部字母数quot、quot数字个数quot、quot空格个数quot、quot文章总字数quot 3 输出删除某一字符串后的文章 58 拓扑排序 建立有向无环图并输出拓扑的序列。 59 随机探测再散列哈希表 实现随机探测再散列哈希表的创建与查找 60 公园的导游图 给出一张某公园的导游图游客通过终端询问可知 从某一景点到另一景点的最短路径。游客从公园大门进入选一条最佳路线使游客可以不重复地游览各景点最后回到出口出口就在入口旁边。 分步实施 数据结构与C语言综合训练实习 11 1 初步完成总体设计建好框架确定人机对话的界面确定函数个数 2 完成最低要求建立一个文件包括5个景点情况能完成遍历功能 3 进一步要求进一步扩充景点数目画出景点图有兴趣的同学可以自己扩充系统功能。 61 商店存货管理系统 建立一商店存货管理系统要求每次出货时取进货时间最早且最接近保质期中止时间的货物。 分步实施 1初步完成总体设计建好框架确定人机对话的界面确定函数个数 2完成最低要求建立一个文件包括5个种类的货物情况能对商品信息进行扩充追加修改和删除以及简单的排序 3进一步要求扩充商品数量以及完成系统查询功能。有兴趣的同学可以自己扩充系统功能。 62 运动会分数统计 输入统计排序查询信息存储。 63 二叉树遍历算法的实现 四种算法都是.2023-08-01 18:06:063
java 编程题集
楼上罗列的够详细了。2023-08-01 18:06:155
对Lisp 新手来说,学习哪种方言,使用哪些参考书和开发软件更适合
为什么学?用来解决什么问题?背景很重要。2023-08-01 18:07:192
程序的概念
以前想的太狭隘,现在看来,程序就是 一系列的 按部就班的过程 ,生物上基因程序,机械化生产的程序,软件化的程序,都是程序.2023-08-01 18:07:303
科学计算机怎么用
电脑是一个强大的工具,所以大家要充分利用,下面小编就为大家详细介绍电脑自带的科学计算器怎么使用方法,不会的朋友可以参考本文,希望这篇文章能对大家有所帮助! 方法/步骤 1、移动鼠标点击“开始”--所有程序----附件----计算器 窗口弹出相应计算器对话框,这时就可以进行简单的计算了,电脑中的计算器不是这么简单,还有复杂的一面,就是科学型。 2、将鼠标点击 计算器 工具栏 “查看”出现选项选择“科学型”计算器变身成为多功能计算器,多功能计算器可以进行多功能计算,包括弧度、方、进制变换计算等等功能十分强大。 3、在计算器的左边是主要负责函数计算的,这里有sin、dms、Exp、ln、log等都可以在这个区域找到,同时计算方式有一定要求像是方计算的话要求先按数字后按方计算然后再输入次数。 4、在右边数值按键以及专业功能这里有And、Or、 Not、 Xor都是一些简单的操作。相比Lsh、Rsh是Left Shift和Right Shift的缩写,RoL、RoR是Rotate Left和Rotate Right的缩写,对于向左移动一位就是RoL,,并将移出的那位补到最右边那位上,RoR同理。 5、在查看中还有更多的选项供选择,其中数字分组就在这里选择,在编辑里有复制和粘贴方便将计算结果和数据导入导出,在帮助中选择帮助主题你就会获得更多计算器相关的运用知识在一声声哀嚎声中,数学老师带着一摞试卷走了进来。好像是因为冬天天冷,体育老师冻感冒了。所以变成了两节数学课,顺便考个试。数学老师名叫欧岛,一个很富有数学气息的名字,常年带着一个黑框眼睛。卷子陆续分发。作为一个学渣,苏牧无奈的拿出了数学参考资料,想碰碰运气看能不能找到原题。“叮!查看了数学题目,数学积分+1,当前积分1/100,等级:一级”突然,从脑海中冒出来的声音,将他吓了一大跳,差点没从凳子上滑落下来。一旁的同桌颜小珂忍住没有笑场。欧岛则是狠狠的瞪了苏牧一眼。“???…”苏牧瞪大了眼睛,有些不可置信。“这是什么鬼东西?这是系统??居然真的有系统这种东西?”苏牧继续翻动,又出现了同样的声响。“叮!您查看了数学题目,数学积分+1,当前积分2/100,等级:一级”他只是瞟了一眼,居然就增加了积分?苏牧觉得自己的脑子清明了些。这些陌生的数学题目,似乎看起来也熟悉了几分。他越发的激动起来。这些都是真正出现在他眼前的变化!苏牧翻书的动作越来越快,积分也越来越多,直到欧岛走过来站到了他的面前,才反应过来迅速收了回去。这个时候,他的积分已经达到了81/100。他并没有慌张,而是继续将试卷上的题目查看了一遍。终于,系统迎来了新的提示音。“叮,您的数学积分已经足够,等级:二级,当前积分0/1000!”这一瞬间,苏牧仿佛像醍醐灌顶一般,曾经那些陌生的数学题,仿佛变成了多年的好友!他居然!看懂了!看懂了!!居然看懂了!!苏牧的内心顿时内流满面,颇有苦尽甘来的感觉。仿佛是要检验自己的成果,苏牧的心思完全沉寂在了试卷之中,这是一个学渣对于知识的渴望。时间一点一滴的过去,就连苏牧自己都没有发现。可惜的是,虽然他的数学已经达到了二级,但还是有些题目没办法运算出来。“叮…..”这一次不是系统的提示音,而是下课的铃声。苏牧真的是头一次感受到了时间过的如此之快。曾经漫长的两个小时,现在居然还让他有些意犹未尽。这就是学霸的感觉吗?他默默的想到。这张试卷,苏牧觉得自己应该是103分。因为不会的题目他都空着。而那些简单一点的题目,苏牧有一种迷之自信。他得出的答案,一定是正确答案!……“我要好好学习了。”强忍住内心的激动,苏牧摆正了2023-08-01 18:07:402
计算机是怎么被发明创造出来的
熨斗: 公元800年代,中国人发明了熨斗,并开始使用了它。那时中国人用木炭加热的熨斗熨丝质衣服,当时的熨斗像个长柄的小平底锅。在约公元16世纪荷兰裁缝开始使用空心盒型铁制大熨斗。1738年英国的威尔金森取得了铁制熨斗的专利权,这熨斗是一个可熨亚麻布的铁铸盒子。1850年代中斯煤气加热熨斗面世,到1890年代被电熨斗所淘汰,美国西利发明了电熨斗(用的是无罩电弧)。1926年纽约市的埃尔迪克公司制成了家庭蒸汽熨斗。1938年康乃狄格州制成的熨斗附有可调温度的恒温器,使用十分方便2023-08-01 18:07:506
使用通用存储过程时条件列名3个表中都有导致条件不明确如何解决
数据库设计方法、规范与技巧 一、数据库设计过程 数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。 数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求),在概念设计阶段形成独立于机器特点、独立于各个DBMS产品的概念模式(信息世界模型),用E-R图来描述。在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库逻辑模式。然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图(VIEW)形成数据的外模式。在物理设计阶段根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。 1. 需求分析阶段 需求收集和分析,结果得到数据字典描述的数据需求(和数据流图描述的处理需求)。 需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。 需求分析的方法:调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。 常用的调查方法有: 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。 分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法(Structured Analysis,简称SA方法)从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。 数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典(Data Dictionary,简称DD)来描述。 数据字典是各类数据描述的集合,它是关于数据库中数据的描述,即元数据,而不是数据本身。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分(至少应该包含每个字段的数据类型和在每个表内的主外键)。 数据项描述={数据项名,数据项含义说明,别名,数据类型,长度, 取值范围,取值含义,与其他数据项的逻辑关系} 数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}} 数据流描述={数据流名,说明,数据流来源,数据流去向, 组成:{数据结构},平均流量,高峰期流量} 数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流, 组成:{数据结构},数据量,存取方式} 处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流}, 处理:{简要说明}} 2. 概念结构设计阶段 通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型,可以用E-R图表示。 概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。 概念模型特点: (1) 具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识。 (2) 应该简单、清晰、易于用户理解,是用户与数据库设计人员之间进行交流的语言。 概念模型设计的一种常用方法为IDEF1X方法,它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术,用于建立系统信息模型。 使用IDEF1X方法创建E-R模型的步骤如下所示: 2.1 第零步——初始化工程 这个阶段的任务是从目的描述和范围描述开始,确定建模目标,开发建模计划,组织建模队伍,收集源材料,制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果,业务流程,原有系统的输入输出,各种报表,收集原始数据,形成了基本数据资料表。 2.2 第一步——定义实体 实体集成员都有一个共同的特征和属性集,可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有“代码”结尾的术语,如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来,从而初步找出潜在的实体,形成初步实体表。 2.3 第二步——定义联系 IDEF1X模型中只允许二元联系,n元联系必须定义为n个二元联系。根据实际的业务需求和规则,使用实体联系矩阵来标识实体间的二元关系,然后根据实际情况确定出连接关系的势、关系名和说明,确定关系类型,是标识关系、非标识关系(强制的或可选的)还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识,则为标识关系,否则为非标识关系。非标识关系中,如果每个子实体的实例都与而且只与一个父实体关联,则为强制的,否则为非强制的。如果父实体与子实体代表的是同一现实对象,那么它们为分类关系。 2.4 第三步——定义码 通过引入交叉实体除去上一阶段产生的非确定关系,然后从非交叉实体和独立实体开始标识侯选码属性,以便唯一识别每个实体的实例,再从侯选码中确定主码。为了确定主码和关系的有效性,通过非空规则和非多值规则来保证,即一个实体实例的一个属性不能是空值,也不能在同一个时刻有一个以上的值。找出误认的确定关系,将实体进一步分解,最后构造出IDEF1X模型的键基视图(KB图)。 2.5 第四步——定义属性 从源数据表中抽取说明性的名词开发出属性表,确定属性的所有者。定义非主码属性,检查属性的非空及非多值规则。此外,还要检查完全依赖函数规则和非传递依赖规则,保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。 2.6 第五步——定义其他对象和规则 定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。 3. 逻辑结构设计阶段 将概念结构转换为某个DBMS所支持的数据模型(例如关系模型),并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型,然后选择最合适的DBMS。 将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则: 1)一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。 2)一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 3)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。 4)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。 5)三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 6)同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。 7)具有相同码的关系模式可合并。 为了进一步提高数据库应用系统的性能,通常以规范化理论为指导,还应该适当地修改、调整数据模型的结构,这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准,即: 表内的每一个值都只能被表达一次。 表内的每一行都应该被唯一的标识(有唯一键)。 表内不应该存储依赖于其他键的非键信息。 4. 数据库物理设计阶段 为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。 5. 数据库实施阶段 运用DBMS提供的数据语言(例如SQL)及其宿主语言(例如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 数据库实施主要包括以下工作:用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行 6. 数据库运行和维护阶段 数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。 建模工具的使用 为加快数据库设计速度,目前有很多数据库辅助工具(CASE工具),如Rational公司的Rational Rose,CA公司的Erwin和Bpwin,Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。 ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式,描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型,不仅能得到优秀的业务功能和数据需求模型,而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中,IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中,ERwin可以定义对应的表、列,并可针对各种数据库管理系统自动转换为适当的类型。 设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后,设计人员可以使用Erwin画ER图,将ER图转换为关系数据模型,生成数据库结构;画数据流图,生成应用程序。 二、数据库设计技巧 1. 设计数据库之前(需求分析阶段) 1) 理解客户需求,询问用户如何看待未来需求变化。让客户解释其需求,而且随着开发的继续,还要经常询问客户保证其需求仍然在开发的目的之中。 2) 了解企业业务可以在以后的开发阶段节约大量的时间。 3) 重视输入输出。 在定义数据库表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪些是必要的表和字段。 举例:假如客户需要一个报表按照邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。 4) 创建数据字典和ER 图表 ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。 5) 定义标准的对象命名规范 数据库各种对象的命名必须规范。 2. 表和字段的设计(数据库逻辑设计) 表设计原则 1) 标准化和规范化 数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。 举例:某个存放客户及其有关定单的3NF 数据库就可能有两个表:Customer 和Order。Order 表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向Customer 表里包含该客户信息的那一行。 事实上,为了效率的缘故,对表不进行标准化有时也是必要的。 2) 数据驱动 采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。 举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。 3) 考虑各种变化 在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。 举例,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。 字段设计原则 4) 每个表中都应该添加的3 个有用的字段 dRecordCreationDate,在VB 下默认是Now(),而在SQL Server 下默认为GETDATE() sRecordCreator,在SQL Server 下默认为NOT NULL DEFAULT USER nRecordVersion,记录的版本标记;有助于准确说明记录中出现null 数据或者丢失数据的原因 5) 对地址和电话采用多个字段 描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。 6) 使用角色实体定义属于某类别的列 在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化。 举例:用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说,当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值,同时增加一个日期/时间字段来知道变化是何时发生的。这样,你的PERSON_TYPE 表就包含了所有PERSON 的可能类型,比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化,不过这样一来在时间上无法跟踪个人所处位置的具体时间。 7) 选择数字类型和文本类型尽量充足 在SQL 中使用smallint 和tinyint 类型要特别小心。比如,假如想看看月销售总额,总额字段类型是smallint,那么,如果总额超过了$32,767 就不能进行计算操作了。 而ID 类型的文本字段,比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。 8) 增加删除标记字段 在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。 3. 选择键和索引(数据库逻辑设计) 键选择原则: 1) 键设计4 原则 为关联字段创建外键。 所有的键都必须唯一。 避免使用复合键。 外键总是关联唯一的键字段。 2) 使用系统生成的主键 设计数据库的时候采用系统生成的键作为主键,那么实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点:当拥有一致的键结构时,找到逻辑缺陷很容易。 3) 不要用用户的键(不让主键具有可更新性) 在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。 4) 可选键有时可做主键 把可选键进一步用做主键,可以拥有建立强大索引的能力。 索引使用原则: 索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。 1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。 2) 大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。 3) 不要索引memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。 4) 不要索引常用的小型表 不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。 4. 数据完整性设计(数据库逻辑设计) 1) 完整性实现机制: 实体完整性:主键 参照完整性: 父表中删除数据:级联删除;受限删除;置空值 父表中插入数据:受限插入;递归插入 父表中更新数据:级联更新;受限更新;置空值 DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制 用户定义完整性: NOT NULL;CHECK;触发器 2) 用约束而非商务规则强制数据完整性 采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。 3) 强制指示完整性 在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。 4) 使用查找控制数据完整性 控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。 5) 采用视图 为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。 5. 其他设计技巧 1) 避免使用触发器 触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。 2) 使用常用英语(或者其他任何语言)而不要使用编码 在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。 3) 保存常用信息 让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。 4) 包含版本机制 在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。 5) 编制文档 对所有的快捷方式、命名规范、限制和函数都要编制文档。 采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。 对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。 6) 测试、测试、反复测试 建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。 7) 检查设计 在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。 三、数据库命名规范 1. 实体(表)的命名 1) 表以名词或名词短语命名,确定表名是采用复数还是单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如果表的名字由3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成4 字母长的别名,其余依次类推) 对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中,根据语义拼凑缩写即可。注意,由于ORCLE会将字段名称统一成大写或者小写中的一种,所以要求加上下划线。 举例: 定义的缩写 Sales: Sal 销售; Order: Ord 订单; Detail: Dtl 明细; 则销售订单明细表命名为:Sal_Ord_Dtl; 2) 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词。 举例: 定义的缩写 Material Ma 物品; 物品表名为:Material, 而不是 Ma. 但是字段物品编码则是:Ma_ID;而不是Material_ID 3) 所有的存储值列表的表前面加上前缀Z 目的是将这些值列表类排序在数据库最后。 4) 所有的冗余类的命名(主要是累计表)前面加上前缀X 冗余类是为了提高数据库效率,非规范化数据库的时候加入的字段或者表 5) 关联类通过用下划线连接两个基本类之后,再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。 关联表用于保存多对多关系。 如果被关联的表名大于10个字母,必须将原来的表名的进行缩写。如果没有其他原因,建议都使用缩写。 举例:表Object与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object; 表 Depart和Employee;存在多对多的关系;则关联表命名为R_Dept_Emp 2. 属性(列)的命名 1) 采用有意义的列名,表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码,统一命名为:ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。 举例:销售订单的编号字段命名:Sal_Ord_ID;如果还存在一个数据库生成的自动编号,则命名为:ID。 2) 所有的属性加上有关类型的后缀,注意,如果还需要其它的后缀,都放在类型后缀之前。 注: 数据类型是文本的字段,类型后缀TX可以不写。有些类型比较明显的字段,可以不写类型后缀。 3) 采用前缀命名 给每个表的列名都采用统一的前缀,那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来。 3. 视图的命名 1) 视图以V作为前缀,其他命名规则和表的命名类似; 2) 命名应尽量体现各视图的功能。 4. 触发器的命名 触发器以TR作为前缀,触发器名为相应的表名加上后缀,Insert触发器加"_I",Delete触发器加"_D",Update触发器加"_U",如:TR_Customer_I,TR_Customer_D,TR_Customer_U。 5. 存储过程名 存储过程应以"UP_"开头,和系统的存储过程区分,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为"UP_Ins_Agent_Account"。 6. 变量名 变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。 7. 命名中其他注意事项 1) 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。 2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名。绝对不要在对象名的字符之间留空格。 3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突 5) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。2023-08-01 18:08:071
嵌入式软件工程师创业
我也面对你这个问题 不过我已经毕业一年了 各位IT高手可否指点一下?2023-08-01 18:08:185
怎么判断自己适合学java啊?
第一,有一定的逻辑思维能力。Java开发工程师是通过用Java语言编程来实现各种功能的,所以要求你有一定的逻辑思维能力,如果你的逻辑思维能力比较好,那就很适合学Java了。不过逻辑思维真的不好也没有关系,这个可以在学习中慢慢锻炼自己的这种能力。第二,学习Java需要一定的英语基础。这点说的不是要你英语多么好,而是因为Java的编程代码都是英文的,所以需要学习Java的人有一些英语基础。当然如果你英语不好也没关系,Java的代码都比较简单,只要把常用的死记硬背下来就可以了。第三,如果你一点基础也没有的话,那么通过培训来学习Java因为培训机构会有经验丰富的讲师一点点的从基础开始给你讲Java知识,而且有人监督你学习,零基础跟着认真学也是能学会的。最后也是比较重要的一点就是自制力强并不断的自我学习不管你是通过自学还是培训学好了Java技术并顺利就业,就业之后也要不断的学习Java新知识,因为Java行业的技术更新很快,每天都有新的技术在产生,如果你不能自己在工作中继续学习下去的话迟早会被这个行业淘汰。所以大家在工作后也要坚持学习才行,这就需要你的自制力以及比较强的自我学习能力了。2023-08-01 18:08:386
C# windows应用程序中,如何从文本框TextBox中提取数字?
isNaN();判断是否是数字,是就接受,不是就排除!也还有其他方法,靠你自己多动脑了...2023-08-01 18:09:135
【3.30】用递归实现将输入小于32768的整数按逆序输出。如输入12345,则输出54321。
答案是:①:&n;②:m%10;③:m/10;④:m!=0;⑤:return r(m)。scanf的输出格式规定,输出的变量前要加&,所以第一个空的答案是:&n。由于是逆序输出,所以当“12345”传到r函数时,先输出个位,通过12345%10得到个位,所以第二处的答案是:m%10。由于已经把个位输出,所以要把变量的个位进行去掉,通过除以10去掉个位,故第三空的答案是:m/10。删除变量最后一位的数字后,需要判断是否为0,如果为0就不需要计算,直接返回结果,所以第四空的答案是:m!=0;第五的答案是:return r(m)。通过补全修改代码,并在电脑的vc6.0中进行运行(如下图),得到结果,并验证了答案代码的正确。扩展资料:注意事项:1、理解题目意思很重要,在根据题目补充代码时,要根据上下文推敲,如本题中:scanf("%d", ① );,就可根据scanf的使用规则,进行推出答案&n。2、注意中英文的分号,代码中出现中文分号结尾,会报错。且在电脑书写代码时,大部分人都会遇到过这个错误,所以在打分号时要注意输入法。3、注意格式,在书写代码时,要注意换行和空格,好的格式可以一眼看出代码的结构,可以选择每行写一句代码。2023-08-01 18:09:291