用C语言实现字典生成

#include <stdio.h>

double pow(double x,double y);
void Clean(char *cArray, int iBit);
int Bits(char *cArray);
void Generic(int iAssign,int iBit,int iSourceMax,char *cSources,char *cStrings);
int main()
{
    //cStrings保存即将生成的字符串,cSources表示源字符串,即生成的字典中包含哪些字符
    char cStrings[10],cSources[100];
    //iBitMax表示生成字典的最大位数
    //iSourceMax表示源字符串包含的字符数
    //iBitNow表示目前生成的是多少位的字符串
    //iAssign表示目前是第多少次生成,详情见图
    int iBitMax,iSourceMax,iBitNow,iAssign;
    //fFileName保存文件名
    char fFileName[50];
    FILE *file;
    printf("输入要保存的文件名:");
    fgets(fFileName,50,stdin); //输入文件名
    Bits(fFileName); //用来去掉fgets产生的回车符号,见Bits函数
    if((file = fopen(fFileName,"w")) == NULL)
    {
        printf("文件创建失败!\n");
        return 1; //出现问题,退出
    }
    printf("输入位数:");
    scanf("%d",&iBitMax);
    getchar(); //吸收scanf产生的回车符号,以免在下面的fgets中出现问题
    printf("输入源字符串:");
    fgets(cSources,100,stdin);
    iSourceMax = Bits(cSources); //获得源字符串的大小
    for(iBitNow=1;iBitNow<=iBitMax;iBitNow++) //按生成位数进行递增
    {
        for(iAssign=0;iAssign<(int)pow((double)iSourceMax,(double)iBitNow);iAssign++) //按第多少次生成进行递增
        {
            Generic(iAssign,iBitNow-1,iSourceMax,&cSources[0],&cStrings[0]);
            fputs(cStrings,file);
            fputc('\n',file);
            Clean(cStrings,10);
        }
    }
    fclose(file);
    return 0;
}
//清除一个字符串的内容
void Clean(char *cArray, int iBit)
{
    int i;
    for(i=0;i<iBit;i++)
    {
        *(cArray+i) = '\0';
    }
}
//探测字符串长度,并把最后的回车符号变成空字符
int Bits(char *cArray)
{
    int i=0;
    while(1)
    {
        if((*(cArray+i) == '\n')||(*(cArray+i) == '\0'))
        {
            *(cArray+i) = '\0';
            break;
        }
        i++;
    }
    return i;
}
//根据传入的数据生成一个字符串,需要传入源字符串数组指针
void Generic(int iAssign,int iBit,int iSourceMax,char *cSources,char *cStrings)
{
    int iPow = 1;
    for(iBit;iBit>=0;iBit--)
    {
        //将源字符串中的字符分别赋给目标字符串,方法见图
        *(cStrings+iBit) = *(cSources+(iAssign/iPow)%iSourceMax);
        iPow = iPow*iSourceMax;
    }
}
//x的y次方函数实现
double pow(double x,double y)
{
    int i;
    double result=1;
    if(x <= 0)
    {
        return -1;
    }
    for(i=0;i<(int)y;i++)
    {
        result = result*x;
    }
    return result;
}

如,输入位数:3    输入源字符串:0123,则可以输出如下字典:

0

1

2

3

00

01

02

03

10

11

……

一些基本思路:

下面这张图片大概是上图生成值的大致方法吧……

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值