博文
C语言中一个关于洗牌的问题(2005-09-23 12:30:00)
摘要:#include<stdio.h>
#include<stdlib.h>
#include <time.h>
void shuffle(int [][13]);
void deal(const int [][13],const char *[],const char *[]);
main()
{
const char *suit[4]={"Hearts","Diamonds","Clubs","Spades"};
const char *face[13]={"1","2","3","4","5","6","7","8","9","10","J","Q","K"};
int deck[4][13]={0}; // deck[4][13] 全是零
srand(time(NULL));
shuffle(deck);
deal(deck,face,suit);
return 0;
}
void shuffle(int wDeck[][13])
{
int card,row,column;
for(card=1;card<=52;card++)
{
row=rand()%4;
column=rand()%13;
&nbs......
[转帖]成为java高手的八大条件(2005-09-13 17:18:00)
摘要:世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。
1、扎实的基础
数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。因此多读一些计算机基础理论方面的书籍是非常有必要的。
2、丰富的想像力
不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想像力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。开阔的思维对程序员来说很重要。
3、最简单的是最好的
这也许是所有科学都遵循的一条准则,复杂的质能转换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
4、不钻牛角尖
当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5、对答案的渴求
人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
......
c语言的编程风格(2005-09-13 17:10:00)
摘要:第一章:缩进格式
Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.
理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.
现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.
总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序.
第二章:大符号的位置
另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始
的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:
if (x is true) { we do y }
然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:
int function(int x) { body of function }
所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) K&R是___对___的,(第二)如果K&R不对,请参见第一条. (:-))......另外,函数也是特殊的,不一定非得一致.
需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如"while"在do-while循环中,或者"else"在if语句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (x > y) { ... } else { .... }
理由: K&R.
另外,注意到这种大括号的放置方法......
快速排序(2005-09-13 17:06:00)
摘要:分而治之方法还可以用于实现另一种完全不同的排序方法,这种排序法称为快速排序(quick sort)。在这种方法中, n 个元素被分成三段(组):左段l e f t,右段r i g h t和中段m i d d l e。中段仅包含一个元素。左段中各元素都小于等于中段元素,右段中各元素都大于等于中段元素。因此l e f t和r i g h t中的元素可以独立排序,并且不必对l e f t和r i g h t的排序结果进行合并。m i d d l e中的元素被称为支点( p i v o t )。图1 4 - 9中给出了快速排序的伪代码。
/ /使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t
图14-9 快速排序的伪代码
考察元素序列[ 4 , 8 , 3 , 7 , 1 , 5 , 6 , 2 ]。假设选择元素6作为支点,则6位于m i d d l e;4,3,1,5,2位于l e f t;8,7位于r i g h t。当left 排好序后,所得结果为1,2,3,4,5;当r i g h t排好序后,所得结果为7,8。把right 中的元素放在支点元素之后, l e f t中的元素放在支点元素之前,即可得到最终的结果[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]。
把元素序列划分为l e f t、m i d d l e和r i g h t可以就地进行(见程序1 4 - 6)。在程序1 4 - 6中,支点总是取位置1中的元素。也可以采用其他选择方式来提高排序性能,本章稍后部分将给出这样一种选择。
程序14-6 快速排序
template
void QuickSort(T*a, int n)
......
怎么将数组中的n个元素倒放在原来的数组中?- -(2005-09-13 16:57:00)
摘要:#include <stdio.h>
#define N 10
int main()
{ double x[N]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.0,9.9}
int i;
double *pf,*pt;
void swap(double *, double *);
for ( pf=x, pt=&x[N-1}; pf<pt; ++pf,__pt)
swap(pf,pt);
for (i=0;i<N;++i)
printf("\nx[%d]=%f,"i,x[i]);
return(0);
}
void swap( double *px, double *py)
{ &nbs......
随机数的产生办法!- -(2005-09-13 16:55:00)
摘要:在C语言有产生随机数的函数rand().它的函数声明放在了stdlib.h头文件里。rand恶意返回一个0~RANDMAX(32767) 之间的整随机数。
计算机产生的随机数序列都是伪随机数,即这个随机数序列有一个长度,因而会出现重复。每次程序执行rand时,所产生的随机数序列都是相同的。为了弥补这一不足,可以使用随机数序列函数srand,使rand产生不同的伪随机数序列。srand函数的参数称为随机数序列种子(seed)。即不同伪随机数序列种子,可以得到不同的伪随机数序列。所以为了让rand每次产生不同的伪随机数序列,每次要给srand以不同的参数种子。最好这个种子也是随机的。
一个办法是采用系统时间作为伪随机数序列种子,即:
srand((unsigned int) time (NULL));
在rand的前面加上上述语句,就可以产生出相当随机的随机数序列了。表达式是把时间转换成无符号的整数,作为rand函数的种子使用。
此外,还可以使用伪随机数初始化函数randomize来动态地产生伪随机数序列.
应当注意,srand和randomize的说明在头文件stdlib.h中,time说明在头文件time.h中......
字符串处理的两道题,做做看!- -(2005-09-13 16:55:00)
摘要:题一: 判断s1字符串中是否包含s2字符串。例如"china123"包含"na12",但不包含"chn"
题二: 编写程序,使得任意输入一个字符串,将其中的最大字符放在字符串的第2个位置,将最小字符放在字符串的倒数第2个字符位置。这里的最大最小字符是依据字符的ascii码来说......
不用串处理函数,实现字符串之间的复制- -(2005-09-13 16:54:00)
摘要:我们知道,用strcpy函数可以实现字符串的复制,假如我们不用它呢?还有没有别的方法实现字符串的复制呢?有!比如:
用两个字符数组分别存放源字符串和目标字符串。复制时,一边读源字符串的字符,一边把该字符存入目标字符串。
这个过程可以在一个循环中实现,循环结束的条件是遇到源字符串末尾的字符串结束符。
想想该怎么编程?。。。。。自己动动手,再看后面的答案哦^_^
#include "stdio.h"
main()
{ char s1[80],s2[80];
int i;
printf("input string s2:\n");
gets(s2);
for(i=0;s2[i]!='0';i++)
s1[i]=s2[i];
s1[i]='\0';
&nbs......
九九乘法表的实现- -(2005-09-13 16:53:00)
摘要:
九九乘法表实际是由若干个类似"i*j=k",的等式构成的
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*9=9 2*9=18 3*9=27.......9*9=81
详细解答看全文!
算法分析:(1)总共有9行,假设第j行,1<=j<=9,而i的范围为1<=i<=j, k=i*j
(2) 设定两个变量i,j,并且用循环玫举i,j所有可能的值
(3) 根据i,j不同的值,在循环体内输出等式
第(3)步中还要考虑到九九乘法表的格式,怎么换行的?
我们发现: 当j==i 时,在等式的右边输出'\n'换行符,否则,输出'\t'
程序段主要实现:
for (j=1;j<=9;j++)
 ......
动手操练起来吧!看看下面的任务怎么完成?- -(2005-09-13 16:53:00)
摘要:1。设计一个程序,对从键盘上输入的空格、大写字母、小写字母、数字进行统计。
2。给定一个数,并由键盘输入若干个数,找出与预先给定的数最接近的数,并指出它是由键盘输入的第几个数。
3。输入3个数,计算以这3个数为边长的三角形的面积。......