не удалось приостановить цикл .. как? - PullRequest
0 голосов
/ 23 октября 2009
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

Ответы [ 3 ]

2 голосов
/ 23 октября 2009

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

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 с символа на строку означает, что вам не нужно беспокоиться о получении перевода строки в виде символов (если вы наберете y ENTER , вы ' Вы получите следующие два раздела, поскольку y - это один символ, а ENTER - другой - еще хуже, если вы введете y e S ENTER ). Однако использование строки фиксированного размера и scanf() опасно и не должно использоваться в рабочем коде. Я включил это здесь только для того, чтобы сделать вашу жизнь немного легче.

2 голосов
/ 23 октября 2009

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

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

2 голосов
/ 23 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...