2014-09-12 10 views
0

동일한 출력을 수행하려면이 코드를 어떻게 단순화해야합니까? 출력은 가능한 모든 문자열이 길이와 변수 한계에 따라 달라집니다. 예를 들어 길이가 3 인 문자열에서 영원히 사용할 수있는 26 개의 변수는 aaa, aab, aac ..... aaz, aba입니다. , ABB ...... 당신은 문자열을 사용하고, 숫자가 허용 범위의 문자 인과 숫자로 취급하는 기능 next를 작성할 수C - Simplifiy 순열 알고리즘

//#define 'char_set_begin' 'char_begin' 
//#define 'char_set_end' 'char_end' 

#define numeric_b '0' 
#define numeric_e '9' 
/** init string intervals ---*/ 
static char c0=numeric_b; 
static char c1=numeric_b; 
static char c2=numeric_b; 
static char c3=numeric_b; 
static char c4=numeric_b; 
static char c5=numeric_b; 
static char c6=numeric_b; 
static char c7=numeric_b; 
/** init start & end ----------------*/ 
static const char en = numeric_e +1; 
static const char st = numeric_b +1; 

void str_in(int length); 
void permute(int length); 

#include <stdio.h> 

int main() 
{ 
    int x=5; 

    permute(x); 

    return 0; 
} 


void str_in(int length){ 

FILE *f; 
f=fopen("C:\\file\\path\\goes\\here\\fileIO.txt", "a+"); 


    switch(length){ 
     case 0: 
      fprintf(f,"%c\n",c0);break; 
     case 1: 
      fprintf(f,"%c%c\n",c0,c1);break; 
     case 2: 
      fprintf(f,"%c%c%c\n",c0,c1,c2);break; 
     case 3: 
      fprintf(f,"%c%c%c%c\n",c0,c1,c2,c3);break; 
     case 4: 
      fprintf(f,"%c%c%c%c%c\n",c0,c1,c2,c3,c4);break; 
     case 5: 
      fprintf(f,"%c%c%c%c%c%c\n",c0,c1,c2,c3,c4,c5);break; 
     case 6: 
      fprintf(f,"%c%c%c%c%c%c%c\n",c0,c1,c2,c3,c4,c5,c6);break; 
     case 7: 
      fprintf(f,"%c%c%c%c%c%c%c%c\n",c0,c1,c2,c3,c4,c5,c6,c7);break; 
    } 

fclose(f); 

} 
void permute(int length){ 

    while(c0<=en){ 
     str_in(length); 
     c0++; 
     if(c0==en && length==0){break;} 
     if(c0==en){ 
      c0=st; 
      c1++; 
      if(c1==en && length==1){break;} 
      if(c1==en){ 
       c1=st; 
       c2++; 
       if(c2==en && length==2){break;} 
       if(c2==en){ 
        c2=st; 
        c3++; 
        if(c3==en && length==3){break;} 
        if(c3==en){ 
         c3=st; 
         c4++; 
         if(c4==en && length==4){break;} 
         if(c4==en){ 
          c4=st; 
          c5++; 
          if(c5==en && length==5){break;} 
          if(c5==en){ 
           c5=st; 
           c6++; 
           if(c6==en && length==6){break;} 
           if(c6==en){ 
            c6=st; 
            c7++; 
            if(c7==en && length==7){break;} 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+1

첫째, 왜 당신은 길이 8 대신 c0..c8 (정적 숯불 C '같은의 문자 배열을 사용하지 않는 [8]?'배열하면 (당신의'str_in을 단순화 할 수) fprintf (f, "% c", c [i]); fprintf (f, "\ n"); ' – user3159253

+0

또한 이렇게하면 – user3159253

+0

내가 선택한 닉네임이 비 키릴 문자가 아닌 언어를 사용하는 동료들에게 편리하지 않다는 것을 제안하고자한다. 많은 사람들이 키릴 문자를 입력 할 수 없으므로 @ ОлегИгоревич 표기법으로 대화에서 이름으로 전화를 걸 수 없습니다. 중국어 상형 문자가있는 닉네임 사용자와 비슷한 문제가 발생했습니다. – user3159253

답변

1

ZZZ. 하나를 추가하는 것은 가장 낮은 자릿수를 증가시키는 것이고, 오버플로한다면 재설정하고 그 다음으로 낮은 자릿수를 증가시키는 것입니다.

다음은 'a'및 'z'한도를 하드 코딩하고 시작하기 위해 'a'문자로 구성된 (변경 가능한) 문자열이 필요합니다. 이를 좀 더 일반적인 형태로 변환하는 것은 간단해야합니다. 모든

#include <stdio.h> 
#include <string.h> 

int next(char *data, int k) { 
    while (k >= 0 && data[k] == 'z')data[k--] = 'a'; 
    return (k >= 0) && data[k]++; 
} 

int main(int argc, char**argv) { 
    char a[] = "aaaaa"; 
    int n = strlen(a); 
    do printf("%s\n", a); while (next(a, n-1)); 
    return 0; 
}