径向柱塞泵原理:设计一程序,用随机函数产生30个两位整数(不能有相同的数),按从小到大的顺序排列输出

来源:百度文库 编辑:中科新闻网 时间:2024/05/01 01:34:39
不好意思是VB

 
 
 

' 注释在底端。
Private Sub Form_Load()
    Const LOWER_LIMIT = 10
    Const UPPER_LIMIT = 99
    Const RANGE = UPPER_LIMIT - LOWER_LIMIT + 1

    On Error Resume Next    ' 注 1

    Dim sortedRandoms As New Collection     ' 注 2
    Randomize   ' 注 3
    Do Until sortedRandoms.Count = 30   ' 注 4
        newRandom = Int(RANGE * Rnd) + LOWER_LIMIT   ' 注 5
        For Each random In sortedRandoms    ' 注 6
            If random > newRandom Then Exit For
        Next
        sortedRandoms.Add newRandom, CStr(newRandom), CStr(random)  ' 注 7
        sortedRandoms.Add newRandom, CStr(newRandom)    ' 注 8
    Loop
    
    AutoRedraw = True   ' 注 9
    Height = 6666
    For Each random In sortedRandoms
        Print Tab; random
    Next
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 注:
'
' 1)策略性地忽略集合(Collection)的 Add 方法可能引起的错误:
'       5 和 457(参见注 7 和 8)

' 2)为了利用集合的这个属性:不添加已添加过的键。
'   另外,集合提供的 Add 方法让添加元素的操作非常方便 !

' 3)没有这一句则每一次程序运行都输出同一组随机数。

' 4)这个外部循环会一直运行到 sortedRandoms 收集到 30 个元素为止。

' 5)取下一个随机的二位整数。
'
'   Rnd 的返回值是大于或等于 0 但小于 1 的随机浮点数( 0.0 <= Rnd < 1.0 )。
'   乘以 RANGE 的作用是把 Rnd 的返回值上限扩大成 RANGE:
'         RANGE * 0.0 <= Range * Rnd < RANGE * 1.0
'       = 0.0 <= RANGE * Rnd < RANGE
'
'   我们的 RANGE = 90,所以 0.0 <= RANGE * Rnd < 90.0 。
'
'   Int 返回其参数的整数部分,所以 0 <= Int(RANGE * Rnd) <= 89 。
'
'   加 LOWER_LIMIT 的目的则是移动整个范围,逼它涵盖所有二位整数:
'         0 + LOWER_LIMIT <= Int(RANGE * Rnd) + LOWER_LIMIT <= 89 + LOWER_LIMIT
'       = 10 <= Int(Range * Rnd) + LOWER_LIMIT <= 99

' 6)这个内部循环加上这循环之后的两个元素添加语句造就了插入排序。
'   这样的安排使得 sortedRandoms 能名副其实的一直保持它包含的所有元素的升序状态。
'
'   原理简单。其实就跟这种情况一样:
'   玩纸牌时玩家把庄家派过来的(随机)牌一张一张地加到握牌的手上时,
'   总把要添加的牌加在所有比它大的牌当中最小的一张的左边。
'   若手上没有更大的牌,则添加到最右侧。结果是手里的牌总保持升序状态。
'
'   这个 For Each 循环遍历集合的元素时,一旦遇上比要添加的数更大的元素便中止,
'   否则遍历所有元素并把 Empty 赋值给循环变量 random 。
'   所以,循环结束后,random 的值是以下的其中一个:
'       A)所有比要添加的数更大的元素当中最小的一个
'       B)Empty
'   另外,若集合是空的(程序第一次进入外部循环时),这个循环就会直接被跳过,
'   random 也就从未被赋值,也为 Empty 。

' 7)以 CStr(newRandom) 作为 newRandom 的键,
'   尝试把 newRandom 这个值添加到 sortedRandoms 里 CStr(random) 的前面(注 6A)。
'
'   调用 CStr 函数把参数转换成字符串的原因是元素的键必须是字符串。
'
'   若 random 是 Empty,这句会引起错误 5:非法的参数或函数调用。(当然是前者。)
'   引起错误 457 则表示要添加的元素的键已存在于集合中。
'
'   结果是,这一句只有在 sortedRandoms 里有大于 newRandom 的元素,同时没有等于
'   newRandom 的元素时,才会把 newRandom 加进去。
'
'   sortedRandoms 是空的或里头没有大于 newRandom 的元素的状况交给下一句处理。

' 8)效果跟注 7 的一样,只不过是尝试添加到 sortedRandoms 的尾段,
'   而且因为少了可能 Empty 的 random 做参数,所以不可能引起错误 5 。

' 9)没有这一句则看不到打印在这个表格上的 30 个随机二位整数。

 
 
 

VB啊,C啊?C++,还是什么啊

#include "stdio.h"
#include "time.h"
#include "string.h"
int jiedian(int *n,int low,int high)
{
int key,temp;
key=n[low];
while(low<high)
{
while(low<high&&n[high]>=key)high--;
temp=n[low];n[low]=n[high];n[high]=temp;
while(low<high&&n[low]<=key)low++;
temp=n[low];n[low]=n[high];n[high]=temp;
}
return low;
}
void mysort(int *n,int low,int high)//快速排序
{
int key;
if(low<high)
{
key=jiedian(n,low,high);
mysort(n,low,key-1);
mysort(n,key+1,high);
}
}
int main()
{
int i,j;
int n[30],buf[100];
memset(n,0,sizeof(n));
memset(buf,0,sizeof(buf));
srand((unsigned)time(NULL));
for(i=0;i<30;i++)
{
while(1)
{
j=rand()%100;
if(buf[j]++==0){n[i]=j;break;}
}
}
mysort(n,0,30);
for(i=0;i<30;i++)printf("%d ",n[i]);
system("pause");
return 0;
}

看看不能一下子看懂

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <iomanip>
#define LEN 30
using namespace std;

bool re_input(int arr[],int n);//检查数组中的元素是否重复
void create_num(int arr[]);//输入数组
void sort(int arr[]);//排序数字

void sort(int arr[])
{
int temp;

for (int i=0;i<LEN-1;i++)
{
for (int j=i+1;j<LEN;j++)
{
if (arr[i]>arr[j])
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}

bool re_input(int arr[],int n)//检查数组中的元素是否重复
{
bool ans=0;

for (int i=0;i<=n-1;i++)
{
for (int j=i+1;j<=n;j++)
{
if (arr[i]==arr[j])
{
ans=1;
break;
}
}
}

return ans;
}

void create_num(int arr[])//产生随机数
{
srand(time(0));//设置随机数种子

for (int i=0;i<LEN;i++)
{
arr[i]=rand()%89+10;//产生随机数,并把随机数设置在预定范围内
if (re_input(arr,i)) i--;//如果随机数重复,重新产生
}
sort(arr);
}

int main()
{
int arr[30],turn_line=0;//turn_line换行变量

create_num(arr);

for (int i=0;i<LEN;i++,turn_line++)
{
if (turn_line%10==0 && turn_line) cout<<endl;
cout<<setw(3)<<arr[i];

}
cout<<endl;

return 0;
}