生如火花 发表于 2004-10-26 17:23:10

求C好一点的朋友帮我写这一段,多谢了

定义数组a1[]={1,2,3},   tsl语句:static a1[]={1,2,3};
定义输出长度可变的数组key[];          tsl语句:public key[];
删除数组元素:delete key;
显示输出结果   report_msg("key[]="key);
想要得到key[]依次输出a1[]中元素的全排列
即:
key[]={1};key[]={2};key[]={3};key[]={4};key[]={5};
key[]={1,2}; key[]={1,3};key[]={1,4};key[]={1,5};
key[]={2,1};......
key[]={1,2,3}......

多谢了。

keen_20 发表于 2004-10-26 17:30:13

表达不是很清楚,我没弄明白,能否说清楚点
还有,是要用tsl写,还是用纯粹的c语言写出来

生如火花 发表于 2004-10-26 17:33:16

用tsl写,
想要得到key[]依次输出a1[]中元素的全排列
即:
key[]={1};key[]={2};key[]={3};key[]={4};key[]={5};
key[]={1,2}; key[]={1,3};key[]={1,4};key[]={1,5};
key[]={2,1};......
key[]={1,2,3}......

这个不清楚么。。。。。不知道该怎么说了。

keen_20 发表于 2004-10-26 17:36:09

明白了,晚上试试看,呵呵

keen_20 发表于 2004-10-27 13:16:15

static a1[] = {1, 2, 3, 4};
public key[];
static n;

public function key_num(in n)
{
        auto result, i;
        result = 1;
        for(i=1; i<=n; i++)
                result = result * 2;
        return result;
}

public function int_to_bstr(in num)
{
        auto result, i;
        result = "";
        i = num;
        while(i != 0){
                if((i % 2) == 0)
                        result = ",0" & result;
                else
                        result = ",1" & result;
                i = int(i / 2);
        }
        while(length(result) != 2 * n)
                result = ",0" & result;
        result = substr(result, 2, length(result) - 1);
        return result;
}

public function build_key(in key_num)
{
        auto i, j, temp_arr[], result;
        for(i=0; i<key_num; i++)
        {
                result = "";
                key = int_to_bstr(i);
                split(key, temp_arr, ",");
                for(j=0; j<n; j++)
                        if(temp_arr == 1)
                                result = result & a1;
                key = result;
        }
}

n = 4;
key_number = key_num(n);
build_key(key_number);
for(i=0; i<key_number; i++)
        report_msg(key);

生如火花 发表于 2004-10-27 13:17:59

非常感谢,我去试试

生如火花 发表于 2004-10-27 13:21:15

结果不对。。。

keen_20 发表于 2004-10-27 13:35:49

怎么不对?
刚才发现,最好把开头的static改成const

生如火花 发表于 2004-10-27 13:38:34

2
23
234
1
中间少了很多,23,21,24,213,231,241,214,243,其他也是,
1,2,3,4的全排列有64个。

keen_20 发表于 2004-10-27 13:46:49

有点麻烦,晚上再说,上班了咯

QA_BAY 发表于 2004-10-27 18:18:16

#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>

typedef unsigned long HUGEINT;//对64位系统定义 unsigned __int64

inline unsigned getBit(HUGEINT d, int i)
{
return (d >> i) & 1;
}

void getAllSubStr(const char str[])
{
        int N = strlen(str);
        assert( N < 32 );// 因为采用32位整数,为简化问题,最多处理31个元素

        // 计算 ResultCount = 2^N - 2
        HUGEINT ResultCount = (1ul << N) - 2ul;

        // 所有的整数 1..ResultCount-1 对应所有的排列
        printf("\nresults of %s:\n", str);
        for ( HUGEINT placement = 1; placement <= ResultCount; placement++ )
        {
                char buf;
                char * p = buf;
                // placement 各位就表示各元素的出现情况
                for ( int i = 0; i < N; i ++ )
                {
                        unsigned bit = getBit(placement, i);
                        // 其实这里可以优化,但为了清晰,先这么写吧
                        // 如果此位=1,对应字符放入 buf
                        if ( bit )
                        *p++ = str;
                }
                *p = 0;
                // 输出此结果
                printf("    key[%lu]=%s\n", placement, buf);
               
        }
}

int main(void)
{
    getAllSubStr("123");
        cout<<"Press any key to halt...";
    getch();
return 0;
}

QA_BAY 发表于 2004-10-27 18:19:20

、这个是我的程序员做的不关我的事,

QA_BAY 发表于 2004-10-27 18:20:17

对不对,我不知道,自己试一下吧

生如火花 发表于 2004-10-27 18:48:45

汗。。。。我把这换成TSL还要费很大的劲

girl04 发表于 2004-10-27 19:19:43

汗ing

QA_BAY 发表于 2004-10-27 20:35:52

哦,原来是这样,那你说出你想干什么吧!让大家给你出计谋吧

生如火花 发表于 2004-10-27 20:56:18

用tsl帮我写这一段,我是用来调用测试模块的
页: [1]
查看完整版本: 求C好一点的朋友帮我写这一段,多谢了