博文
另一种使用指针变量处理二维数组的方法(2006-12-27 20:49:00)
摘要:#include"stdio.h"
#define M 3
#define N 2
void main()
{
int a[M][N];
int (*p)[N];/*定义一个指向包含N个元素的整形一维数组的指针变量*/
int i;
for(p=a;p<a[M];p++)
for(i=0;i<N;i++)
scanf("%d",*p+i);
for(p=a;p<a[M];p++)
{
for(i=0;i<N;i++)
printf("%d",*(*p+i));
printf("\n");
}
}
/*注意不要将int (*p)[N];写成int *p[N];后者表示一个包含N个元素的一维数组,每个元素为基类型为整形的指针变量,前者定义的指针变量P的基类型为包含N个元素的整形一维数组.
每执行一次P++;指针将移动2*N个字节,即指向二维数组的下一行,*P+I指向当前第I 个元素,*(*P+I)为当前第I个元素的值.*/
......
删除某指定字符的C函数(2006-12-27 20:28:00)
摘要:
#include"stdio.h"
void del_char(char *s,char ch);
main()
{
char *buffer1=NULL;
gets(buffer1);
del_char(buffer1,'a');
puts(buffer1);
}
void del_char(char *s,char ch)
{
char *p;
while(*s!='\0')
{
if(ch==*s)
{
for(p=s;*p!='\0';p++)
*p=*(p+1);
}
else
s++;
}
}......
成为编程高手的八大奥秘 (2006-12-27 15:53:00)
摘要:成为编程高手的八大奥秘
转摘于:《中国电脑教育报》 作者:未知
不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差得太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。
1、扎实的基础
数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。
2、丰富的想像力
不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。开阔的思维对程序员来说很重要。
3、最简单的是最好的
这也许是所有科学都遵循的一条准则,复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
4、不钻牛角尖
当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5、对答案的渴求&n......
TC的一个BUG(2006-12-26 17:10:00)
摘要:#include<stdio.h>
main()
{
static float f[3][4];
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%f",&f[i][j]);
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%f ",f[i][j]);
printf("\n");
}
}
scanf:floating point formats not linked
Abnormal program termination
如果你用的编译器是TC的活,我们经常会碰到上面的问题!!
实则是:
Turbo-C......
网络基础命令大全(2006-12-25 17:14:00)
摘要:
)如何查看本机所开端口:
用netstat -a —n命令查看!再stat下面有一些英文,我来简单说一下这些英文具体都代表什么
LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态
2)如何获得一个IP地址的主机名?
利用ping -a ip 命令查看!再第一行的pinging后面的 『ip』前面的英文就是对方主机名!
同样道理,利用ping machine_name也可以得到对方的ip
获得一个网站的ip地址的方法是:ping www.***.com
比如想知道sohu的ip,就用ping http://www.sohu.com/来查看就可以了
顺便说一句:如果返回:Reply from *.*.*.*: TTL expired in transit的话,呵呵,代表TTL(生命周期)在传输过程中过期
什么意思呢?我来解释一下!
导致这个问题出现的原因有两个:1)TTL值太小!TTL值小于你和对方主机之间经过的路由器数目。 2)路由器数量太多,经过路由器的数量大于TTL值!
呵呵,其实这两点是一个意思!只不过说法不同而已!
3)如何查看本机的ip地址?
用ipconfig来查看就可以!
也可以再Windows中的开始菜单,运行中输入win......
端口(补充)(2006-12-25 16:39:00)
摘要:
端口概念
在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。
端口分类
逻辑意义上的端口有多种分类标准,下面将介绍两种常见的分类:
1. 按端口号分布划分
(1)知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
(2)动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
不过,动态端口也常常被病毒木马程序所利用,如冰河默认连接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。
2. 按协议类型划分
按协议类型划分,可以分为TCP、UDP、IP和ICMP(Internet控制消息协议)等端口。下面主要介绍TCP和UDP端口:
(1)TCP端口
TCP端口,即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP服务的21端口,Telnet服务的23端口,SMTP服务的25端口,以及HTTP服务的80端口等等。
(2)UDP端口
UDP端口,即用户数据包协议端口,无需在客户端和服务器之间建立连接,安全性得不到保障。常见的......
端口(下)(2006-12-25 16:38:00)
摘要:同一台电脑对外来说只有一个IP,但是一台电脑可以提供各种不同的服务,比如WEB服务,FTP服务,SMTP邮键服务。
端口就是用来区别的服务的,也就是说网络上的服务是用IP+端口这样的形式来区别的。
一般而言,FTP端口大家都用21,web(http)用80,这些端口也可以自己指定。
0~1023之间的端口是周知端口,就是说哪个端口分配给哪个服务一般是固定的,网络上大家都这么用,都知道。
1024~65535之间的端口是动态端口,不固定分配。
每个网络程序通信都要通过端口的,不管是QQ,BT,迅雷等等。
端口概念
在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。
端口分类
逻辑意义上的端口有多种分类标准,下面将介绍两种常见的分类:
1. 按端口号分布划分
(1)知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
(2)动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
不过,动态端口也常常被病毒木马程序所利用,如冰河默认连接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等......
端口(中)(2006-12-25 16:34:00)
摘要:端口号---具有网络功能的应用软件的标识号。注意,端口号是不固定的,即可以由用户手工可以分配(当然,一般在软件编写时就已经定义)。当然,有很多应用软件有公认的默认的端口,比如FTP:20和21,HTTP:80,TELNET:23等等,这里就不一一列举了。一个软件可以拥有多个端口号,这证明这个软件拥有不止一个网络功能。
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的,而1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。
那么端口号到底有什么作用呢?请大家继续往下看。
当一台电脑启动了一个可以让远程其他电脑访问的程序,那么它就要开启至少一个端口号来让外界访问。我们可以把没有开启端口号的电脑看作是一个密封的房间,密封的房间当然不可能接受外界的访问,所以当系统开启了一个可以让外界访问的程序后它自然需要在房间上开一个窗口来接受来自外界的访问,这个窗口就是端口。
那么为什么要给端口编号来区分它们呢,既然一个程序开了一个端口,那么不是外部信息都可以通过这个开启的端口来访问了吗?答案是不可以。为什么呢?因为数据是用端口号来通知传输层协议送给哪个软件来处理的,数据是没有智慧的,如果很多的程序共用一个端口来接受数据的话,那么当外界的一个数据包送来后传输层就不知道该送给哪一个软件来处理,这样势必将导致混乱。
上一次提到提到在一个经过OSI第四层传输层封装的数据段的第四层报头里包含两个端口号,既源端口号和目的端口号,目的端口号的作用上面已经介绍了,下面让我们了解一下原端口号吧。
源端口号一般是由系统自己动态生成的一个从1024-65535的号码,当一台计算机A通过网络访问计算机B时,如果它需要对方返回数据的话,它也会随机创建一个大于1023的端口,告诉B返回数据时把数据送到自己的哪个端口,然后软件开始侦听这个端口,等待数据返回。而B收到数据后会读取数据包的源端口号和目的端口号,然后记录下来,当软件创建了要返回的数据后就把原来数据包中的原端口号作为目的端口号,而把自己的端口号作为原端口号,也就是说把收到的数据包中的原和目的反过来,然后再送回A,A再重复这个过程如此反复直到数据传输完成。当数据全部传输完A就把源端口释放出来,所以同一个软件每次传输数据时不一定是同一个......
端口(上)(2006-12-25 16:33:00)
摘要:计算机"端口"是英文port的义译,可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和I/O(基本输入输出)缓冲区。
可以先了解面向连接和无连接协议(Connection-OrientedandConnectionlessProtocols)面向连接服务的主要特点有:面向连接服务要经过三个阶段:数据传数前,先建立连接,连接建立后再传输数据,数据传送完后,释放连接。面向连接服务,可确保数据传送的次序和传输的可靠性。无连接服务的特点是:无连接服务只有传输数据阶段。消除了除数据通信外的其它开销。只要发送实体是活跃的,无须接收实体也是活跃的。它的优点是灵活方便、迅速,特别适合于传送少量零星的报文,但无连接服务不能防止报文的丢失、重复或失序。
区分"面向连接服务"和"无连接服务"的概念,特别简单、形象的例子是:打电话和写信。两个人如果要通电话,必须先建立连接--拨号,等待应答后才能相互传递信息,最后还要释放连接--挂电话。写信就没有那么复杂了,地址姓名填好以后直接往邮筒一扔,收信人就能收到。TCP/IP协议在网络层是无连接的(数据包只管往网上发,如何传输和到达以及是否到达由网络设备来管理)。而"端口",是传输层的内容,是面向连接的。协议里面低于1024的端口都有确切的定义,它们对应着因特网上常见的一些服务。
这些常见的服务可以划分为使用TCP端口(面向连接如打电话)和使用UDP端口(无连接如写信)两种。
网络中可以被命名和寻址的通信端口是操作系统的一种可分配资源。由网络OSI(开放系统互联参考模型,OpenSystemInterconnectionReferenceModel)七层协议可知,传输层与网络层最大的区别是传输层提供进程通信能力,网络通信的最终地址不仅包括主机地址,还包括可描述进程的某种标识。所以TCP/IP协议提出的协议端口,可以认为是网络通信进程的一种标识符。
应用程序(调入内存运行后一般称为:进程)通过系统调用与某端口建立连接(binding,绑定)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都从该端口输出。在TCP......
[转载]网易学院程序系教授管宁(2006-12-25 12:07:00)
摘要:
对于c/c++中的数组排序及计算平均值和得到最大最小值的思考
作者:网易学院程序系教授管宁
最近在帮助其它人的学习中发现了许多问题就数组和局部变量和全居变量的两道例题进行刨析和思考!
排序操作
#include
voidsort(array,n)
intarray[];
intn;
{
inti,j,k,t;
for(i=0;i)/* 循环9次,这里循环9次因为排列到第9次的时候最大的已经自动被排列到最后了 */
{
k=i;[/LIGHT] /* 把i记录下来,以便进行调换操作 */
for(j=i+1;)j/* 在外部i循环内进行第二次循环,检查所有的剩余元素 */
{
if(array[j])/* 利用k对比j循环的元素大小是否比外部i循环当前元素的值 */
{
k=j; /* 将k的值定义为j循环的最小元素的(下标),以便进行调换操作 */
}
t=array[k]; /* 将t的值定义为j循环的最小值元素的值 */
array[k]=array[i]; /* 把j循环内的(也就是array[j])的值,调换为此次外部i循环元素的值 */
array[i]=t; /* 将外部i循环的当前元素的值替换为前面以t为临时存储的(也就是array[j])的值 */
}
}
}
main()
{
inta[10],i; /* 定义a[10]为一个数组,用于输入10个不同的数字;定义用于循环的便量i; */
printf("enter the array\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]); /* 利用这10次循环给每个数组元素尽心赋值操作从a[0]到a[9] */
}
sort(a,10);/* 把数组a的各数组元素地址和数组数量传递给自定义排序涵数的形式参数 */
printf("the sorted array:\n");
for(i=0;i<10;i++)
{
printf("%......