1 Востаннє редагувалося Torbins (29.10.2014 22:11:08)

Тема: Генерація паролю, робота з рядками

Почав вчити Паскаль.
Є завдання:
Створити пароль, що генерується на  основі імені користувача, за деякими правилами...

  • Перший символ паролю - перший символ імені

  • другий символ паролю- останній символ імені

  • третій символ паролю - другий  символ  імені

  • четвертий символ паролю - передостанній символ імені
    ...

Пробував робити так:

program happy_paswords;

var
  s, p: string[10];
  i, n: integer;

begin
  readln(s);
  
  i := 1;
  n := 1;
  while i <= (length(s)) do
  begin
    p[i] := s[n];
    i := i + 2;
    n := n + 1;
  end;
  i := 2;
  n := 0;
  while i <= (length(s)) do
  begin
    p[i] := s[length(s) - n];
    i := i + 2;
    n := n + 1;
  end;
  writeln(p);
end.

не виводить нічого...
Де помилка, чи може якось інакшому треба то робити...

2

Re: Генерація паролю, робота з рядками

Виводите масив рядків замість рядка. writeln(p[0]) має щось вивести.

Подякували: Q-bart1

3 Востаннє редагувалося Master_Sergius (20.10.2014 17:59:49)

Re: Генерація паролю, робота з рядками

Це тому, що для змінної p не виділено місце на символи. Тут варто додавати символи:

p := p + s[n]; 

або, самий паршивий варіант, це ініціалізувати пробілами (10 пробілів), одразу після begin:

p := '          ';
Подякували: Q-bart1

4 Востаннє редагувалося Q-bart (20.10.2014 18:08:02)

Re: Генерація паролю, робота з рядками

Master_Sergius написав:

Це тому, що для змінної p не виділено місце на символи.

Як це, не виділено????

var
  s, p: string[10];

все описано... Чому так???

Але другий варіант допоміг....

5

Re: Генерація паролю, робота з рядками

У вас все майже правильно. Просто вивести кожну літеру потрібно: http://ideone.com/3O9CBt

Подякували: Q-bart1

6

Re: Генерація паролю, робота з рядками

Q-bart написав:
Master_Sergius написав:

Це тому, що для змінної p не виділено місце на символи.

Як це, не виділила????

var
  s, p: string[10];

все описано... Чому так???

Але другий варіант допоміг....

Якщо виділила, то чому той варіант допоміг?  :)

7

Re: Генерація паролю, робота з рядками

Master_Sergius написав:
Q-bart написав:
Master_Sergius написав:

Це тому, що для змінної p не виділено місце на символи.

Як це, не виділила????

var
  s, p: string[10];

все описано... Чому так???

Але другий варіант допоміг....

Якщо виділила, то чому той варіант допоміг?  :)

Не знаю...
Цей код працює

program happy_paswords;

var
  
  s, p: string[10];
  i, n: integer;

begin
  p := '          ';
  readln(s);
  
  i := 1;
  n := 1;
  while i <= (length(s)) do
  begin
    p[i] := s[n];
    i := i + 2;
    n := n + 1;
  end;
  i := 2;
  n := 0;
  while i <= (length(s)) do
  begin
    p[i] := s[length(s) - n];
    i := i + 2;
    n := n + 1;
  end;
  writeln(p);
end.

А цей ні

program happy_paswords;

var
  
  s, p: string[10];
  i, n: integer;

begin
  p := '          ';
  readln(s);
  
  i := 1;
  n := 1;
  while i <= (length(s)) do
  begin
    p[i] := s[n];
    i := i + 2;
    n := n + 1;
  end;
  i := 2;
  n := 0;
  while i <= (length(s)) do
  begin
    p[i] := s[length(s) - n];
    i := i + 2;
    n := n + 1;
  end;
  writeln(p);
end.

8

Re: Генерація паролю, робота з рядками

Master_Sergius написав:
Q-bart написав:
Master_Sergius написав:

Це тому, що для змінної p не виділено місце на символи.

Як це, не виділила????

var
  s, p: string[10];

все описано... Чому так???

Але другий варіант допоміг....

Якщо виділила, то чому той варіант допоміг?  :)

Тому що такі фокуси в Паскалі проходять: http://ideone.com/3O9CBt

Подякували: Q-bart1

9

Re: Генерація паролю, робота з рядками

А можна детальніше..? Будь-ласка

10

Re: Генерація паролю, робота з рядками

quez написав:

У вас все майже правильно. Просто вивести кожну літеру потрібно: http://ideone.com/3O9CBt

Прихований текст
program happy_paswords;
 
    var
    s, p: string[10];
    i, n: integer;
 
    begin
    readln(s);
    i := 1;
    n := 1;
    while i <= (length(s)) do
    begin
    p[i] := s[n];
    i := i + 2;
    n := n + 1;
    end;
    i := 2;
    n := 0;
    while i <= (length(s)) do
    begin
    p[i] := s[length(s) - n];
    i := i + 2;
    n := n + 1;
    end;
    for i := 1 to length(s) do writeln(p[i]);
 
    end.

Цей код коли копіюю на комп, теж не працює..

11

Re: Генерація паролю, робота з рядками

Q-bart написав:

А можна детальніше..? Будь-ласка

З цим складніше. Судячи з усього, в момент, коли присвоюють рядок не елементу масиву, а самому масиву, масив починає вважатись рядком і його можна виводити. Але цілком може бути щось інакше; слід зачекати на когось, хто писав на Паскалі в останні кілька років.

12 Востаннє редагувалося Joker (20.10.2014 19:42:40)

Re: Генерація паролю, робота з рядками

Цей код коли копіюю на комп, теж не працює..

З цим складніше. Судячи з усього, в момент, коли присвоюють рядок не елементу масиву, а самому масиву, масив починає вважатись рядком і його можна виводити. Але цілком може бути щось інакше; слід зачекати на когось, хто писав на Паскалі в останні кілька років.

На паскалі не писав. Але може я знаю, де помилка.
Якщо я правильно зрозумів :
1) на ideone все працює
2) якщо скопіювати на комп, то  програма перестає працювати.
Це так?

Може у вас є щось схоже на бібліотеки де зберігаються фукнкції? В такому випадку такий

ideone
int a,b
min(a,b);

код працює і знаходить мінімум з a,b;
Але на комп'ютері потрібно ще підключити бібліотеку яка містить дану функцію

комп
#include <algorithm>
...
int a,b;
min(a,b);

Ще другою прчиною може бути те, що на комп'ютері я використовую функції (_getch() )для того, щоб коли програма закінчеться я зміг побачити результат. Без них програма буде працювати і автоматично виключиться. Але на онлайн контестерах і компіляторах таке робити не можна.

Якщо я помилився щодо цього

Прихований текст

Якщо я правильно зрозумів :
1) на ideone все працює
2) якщо скопіювати на комп, то  програма перестає працювати.
Це так?

то вибачте :)

13

Re: Генерація паролю, робота з рядками

Пане Q-bart, у вас PascalABC.Net?

14

Re: Генерація паролю, робота з рядками

Саме так, Пане Koala.

15

Re: Генерація паролю, робота з рядками

quez написав:
Q-bart написав:

А можна детальніше..? Будь-ласка

З цим складніше. Судячи з усього, в момент, коли присвоюють рядок не елементу масиву, а самому масиву, масив починає вважатись рядком і його можна виводити. Але цілком може бути щось інакше; слід зачекати на когось, хто писав на Паскалі в останні кілька років.

Я взагалі не використовував масивів..

16

Re: Генерація паролю, робота з рядками

PascalABC.Net використовує .Net-івські рядки. При цьому прямо задана довжина рядка ігнорується, і елементів рядку не існує, доки вони не будуть ініціалізовані чимось, тобто не можна звертатися до s[ i ], доки реальна довжина s менша за i. В решті паскалів елементи рядків існують незалежно від вмісту, і можна записати s[100]:='a', не задавши всі попередні символи.

Подякували: Q-bart, quez2

17

Re: Генерація паролю, робота з рядками

Q-bart написав:
Master_Sergius написав:

Це тому, що для змінної p не виділено місце на символи.

Як це, не виділено????

var
  s, p: string[10];

все описано... Чому так???

Але другий варіант допоміг....

Оце почитайте: http://www.transl-gunsmoker.ru/2009/09/ … ml#strings - дуже корисно для загального розвитку. Про старі строки з обмеженням довжини там щоправда не написано, але відповідь на своє запитання ви там знайдете.

Подякували: Q-bart1

18

Re: Генерація паролю, робота з рядками

Тобто для Pascal.ABC треба використовувати

пробілами (10 пробілів), одразу після begin:

p := '          ';

А в інших просто

writeln(p);

19

Re: Генерація паролю, робота з рядками

koala написав:

В решті паскалів елементи рядків існують незалежно від вмісту, і можна записати s[100]:='a', не задавши всі попередні символи.

Тільки якщо довжина s більша за 99 і s є строкою старого типу.

Подякували: koala1