Трудно понять это время цикла - PullRequest
0 голосов
/ 28 мая 2018

У меня возникли некоторые затруднения с пониманием этого цикла while, результаты которого - "TT", однако для меня имеет смысл, если он распечатывает "TP".Может кто-нибудь мне помочь?Я покажу, почему я думаю, что он должен печатать «TP», и мне нужно объяснить, почему он печатает «TT» (что правильно).

#include <iostream>
using namespace std;
char txt[] = "ETERNITTPLATENE-OG-TAKPAPPEN-BLE-KASTET";

void funk(char* t1, char* t2, int n)
{
    while (t1 < t2) { ++t1; t2 -= n; } cout << *t1 << *t2;
}

int main() {
    funk(txt, txt + 27, 3); cout << '\n';
    return 0;
}

Так что в первый раз он запускает func (E,N, 3) поэтому мы получаем E < N, что верно, поэтому оно превращает E в T и N в P (поскольку 27-3 равно 24, а в этом массиве P находится в 24-м).

Итак, мы получаем T < P, что ложно, поэтому он должен остановить цикл while и отобразить TP, чего не происходит.Что я не так думаю?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Запустите это, чтобы понять, что происходит:

#include <iostream>
using namespace std;
char txt[] = "ETERNITTPLATENE-OG-TAKPAPPEN-BLE-KASTET";
int length = strlen(txt);//

void show_position(char* t1, char* t2)//
    {
    for (int i = 0; i < length; i++)
        {
        if (t1 - txt == i)
            {
            if (t2 - txt == i)
                {cout << 'X';}
            cout << '1';
            }
        else if (t2 - txt == i)
            {cout << '2';}
        else
            {cout << '-';}
        }
    cout << endl;
    }

void funk(char* t1, char* t2, int n)
    {
    show_position(t1, t2);//
    while (t1 < t2) 
        { 
        ++t1; 
        t2 -= n; 
        show_position(t1, t2);//
        } 
    cout << *t1 << *t2 << endl;
    }

int main() {
    cout << txt << endl;//
    funk(txt, txt + 27, 3);
    return 0;
    }

Строки, за которыми следует // и объявление функции, предназначены только для рисования, остальное - ваш почти нетронутый код.

Несколько подсказок / предложений (которые я изменил в вашем коде):

1) используйте cout << endl; вместо cout << "\n";.endl является стандартным, и, таким образом, он будет работать должным образом на любой платформе (windows, linux, mac - которая является linux, но использует другую новую строку).Многие приложения поддерживают \ n по умолчанию даже на платформе, которая официально не использует их (например, notepad ++ поддерживает стандарт Linux Newline для Windows), но это не является веской причиной, чтобы не использовать endl.

2) Еслиу вас есть функция, целью которой является печать чего-то, что явно требует новой строки, почему вы ставите новую строку после вызова вместо того, чтобы помещать ее непосредственно в вашу функцию печати?

0 голосов
/ 28 мая 2018

Когда вы делаете t1 < t2, вы не сравниваете (*t1) < (*t2), что будет означать сравнение 'T' < 'P'.

Вместо этого он сравнивает значения адреса памяти, в котором символы 'T' и 'P' хранятся.И в этом случае 'T' сохраняется до 'P'.

Я включил, как указатели будут перемещаться по циклу.Это должно прояснить всю итерацию цикла while.

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
^                                                                                ^
t1                                                                               t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   ^                                                                    ^
   t1                                                                   t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
      ^                                                        ^
      t1                                                       t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
         ^                                            ^
         t1                                           t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
            ^                                ^
            t1                               t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
               ^                    ^
               t1                   t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
                  ^        ^
                  t1       t2

E  T  E  R  N  I  T  T  P  L  A  T  E  N  E  -  O  G  -  T  A  K  P  A  P  P  E  N
0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
                  ^  ^
                  t2 t1      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...