2009-10-23 4 views
-1
void distinct (void) { 
char sent; 
int n1, n2, n3, n4, n5, n6, n7; 
FILE *fp2 = fopen ("distinct.txt", "w"); 

while (sent != 'n') { 
    for (n1=2;n1<=9;n1++) { 
    for (n2=2;n2<=9;n2++) { 
    if (n2 != n1) { 
    for (n3=2;n3<=9;n3++) { 
     if (n3 != n2 && n3 != n1) { 
     for (n4=2;n4<=9;n4++) { 
     if (n4 != n3 && n4 != n2 && n4 != n1) { 
     for (n5=2;n5<=9;n5++) { 
      if (n5 != n4 && n5 != n3 && n5 != n2 && n5 != n1) { 
      for (n6=2;n6<=9;n6++) { 
      if (n6 != n5 && n6 != n4 && n6 != n3 && n6 != n2 && n6 != n1) { 
      for (n7=2;n7<=9;n7++) { 
       if (n7 != n6 && n7 != n5 && /* you get the idea */ && n7 != n1) { 
       fprintf (fp2, "%d", n1); 
       fprintf (fp2, "%d", n2); 
       fprintf (fp2, "%d", n3); 
       fprintf (fp2, "%d", n4); 
       fprintf (fp2, "%d", n5); 
       fprintf (fp2, "%d", n6); 
       fprintf (fp2, "%d\n", n7); 
       } 
      } 
      } 
      } 
      } 
     } 
     } 
     } 
     } 
    } 
    } 
    } 
    } 
    printf ("Press any key to continue or 'n' to stop writing the file\n"); 
    scanf ("%c", &sent); 
} 
fclose (fp2); 
} 

Я хочу, чтобы цикл приостанавливался всякий раз, когда меняется первая цифра, чтобы спросить, продолжать или останавливаться.невозможно приостановить цикл .. как?

2xxxxxx 
2xxxxxx 
2xxxxxx 
Press any key to continue or 'n' to stop writing the file 
    // continues if 'y' is entered // 
3xxxxxx 
3xxxxxx 
3xxxxxx 
Press any key to continue or 'n' to stop writing the file 
    // stops when 'n' is entered // 

Программа я написал не работает, как я хочу ... T___T

+6

Я думаю, что моя голова просто взорвалась. Слишком много кода, который выглядит слишком много. Уменьшите его. – 2009-10-23 06:20:27

+0

Попробуйте прочитать его без отступлений ... – carl

+4

Этот код _hurt_ me. –

ответ

2

Я думаю, что с точки зрения удобочитаемости вы лучше поместите его в верхнюю часть соответствующего цикла. Избавиться от внешнего, а в целом и изменения:

char sent; 
: : 
for (n1=2;n1<=9;n1++) { 
    for (n2=2;n2<=9;n2++) { 

в:

char sent[100]; 
: : 
for (n1=2;n1<=9;n1++) { 
    if (n1 > 2) { 
     printf("press any key to continue or 'n' to stop writing the file\n"); 
     scanf("%s",sent); 
     if (*sent == 'n') break; 
    } 
    for (n2=2;n2<=9;n2++) { 

Изменение sent из символа в строку, так что вам не нужно беспокоиться о том, как символы перевода строки (если вы печатаете уENTER, вы получите следующие две секции, так как у один символ и ENTER еще одна - еще хуже, если вы вводите уеsENTER). Использование строки фиксированного размера и scanf() является опасным и не должно использоваться в производственном коде. Я включаю его здесь, только сделаю вашу жизнь немного легче.

+0

спасибо !! =) это действительно мне очень помогает .. – keitamike

+0

@keitamike: Тогда вы должны принять этот ответ. – sbi

2

Похоже, что подсказка находится внутри в то время как цикла, но за пределами внешней для цикла. Следовательно, подсказка появится только после завершения всех итераций. Переместите подсказку внутри самой внешней линии для цикла.

+0

+1 для ответа на фактический вопрос – csj

2

Если я правильно понимаю ваш код, вы вычисляете все возможные перестановки из 8 разных чисел. Попробуйте использовать гораздо более быстрый алгоритм:

http://en.wikipedia.org/wiki/Permutation#Algorithms_to_generate_permutations есть два примера псевдокода. (один для неупорядоченных и один для лексикографических порядковых перестановок)

Смежные вопросы