Редактирование и вычитка книги

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 30.03.2012 13:49:30

Paster Fob писал(а):Ну а задачу "Подвиг контрразведчика" из той же главы вот так решил

Не работает. Вот файл для проверки.
Код: Выделить всё
   1   2   4   5   9  11  13  15  22  23  24  25  27  30  31  37  41  42  43  44  45  46  48  50  51  56  64  70  72  73  74  75  76  77  82  84  86  87  89  92  95  97  98 101 102 103 104 105 106 107 108 111 113 116 117 118 124 125 127 130 132 133 134 138 143 144 145 147 149 150
  16  21  22  23  24  25  26  27  28  29  31  33  35  37  39  41  44  47  49  50  51  52  54  55  56  57  59  61  62  65  66  69  70  71  72  77  78  79  81  83  84  85  91  92  93  94  95  96  98 100 101 103 107 108 109 112 113 115 117 118 119 121 122 124 129
   1   3   5   9  12  19  22  25  33  34  41  42  46  50  52  55  56  57  58  59  61  66  69  72  80  81  82  84  87  88  94  97  99 100 101 102 112 119 121 123 125 129 134 137 138 139 149 152 153 154 155 157 158 165 166 168 171 172 180 184 185 190 193 194 198 199 205 213 216 220
   5   6   7   8   9  10  11  12  13  14  16  18  21  22  23  24  27  28  29  30  31  32  34  35  38  40  41  42  43  44  45  46  47  48  51  52  53  54  55  57  58  59  60  61  62  63  64  65  66  67  70  71  73  74  75  76  78  79  80  81  82  84  85  86  88  89  91  92  93  94  95  96  97  98  99 100 104 105 106 107 108 111 112 113 115 116 117 118 119 120
  10  15  16  26  33  40  42  44  50  53  65  67  74  79  82  83  85  87  90  91  93  99 106 108 110 120 121 124 125 132 135 146 148 149 151 156 157 158 163 166 168 169 171 175 183 184 189 195 197 205 206 207 216 220 221 225 226 227 241 244
   8  12  21  25  26  29  30  31  34  48  49  50  52  55  59  60  62  70  71  73  83  85  90  91  92  93  94  96  97  99 100 102 103 104 105 106 108 119 121 122 124 127 128 130 132 141 142 144 156 160 165 166 169 171 173 176 179 191 192 195 199 200 207 209 220 221 222 224 226 229 233 234 236 239 240
  23  24  26  27  29  30  35  36  41  42  44  45  46  49  52  55  56  58  60  61  63  64  65  68  72  74  76  77  81  82  86  87  88  90  93  94  95  96  97  98 100 101 102 107 108 109 112 113 114 115 117 120 123 127 132 133 135 137 138 143 145 146 147 150 152 155 156 159 161 162 163 164 165 168 170 172 177 178 179 180
  15  17  19  20  21  22  23  26  28  29  30  32  33  34  36  38  41  42  44  45  46  48  49  52  57  60  62  65  66  68  73  74  77  78  83  84  85  88  89  90  91  92  95  96  97  98  99 100 101 102 103 104 107 108 115 116 118 127 128 129 130 131 134 135 136 137 139 145 146 150 151 152 154 157 160 161 164 166 167 172 173 177 178 179 180 182 185 188 189 190 193 195 197 204 207

Формула у Вас правильная, только данные из файла не так вводятся - всегда с первой строки начинаете.
И переменная m излишня, зачем она? И параметр arg в процедуре ввода тоже. Поработайте еще, все это делается проще.
Oleg_D писал(а):Кстати нашёл мелкую опечатку.стр. 277

А за это спасибо!
==================
Кстати, пользуясь случаем, благодарю бригаду этого сайта, - интерфейс очень удобный, приятно работать! :D
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 30.03.2012 15:40:15

Oleg_D писал(а):Не работает.

Как это не работает?Нормально всё.Только я использовал не 1 файл с данными,а несколько.
Oleg_D писал(а):И переменная m излишня, зачем она? И параметр arg в процедуре ввода тоже.

Я старался упростить главную программу и нужно указывать путь к каждому файлу.Чтобы не вводить каждый раз полностью путь к папке где лежат у меня эти файлы,пришлось сделать так:
s:=('C:\Files for Program Pascal\'+s);
программа подсказывает к какому именно файлу нужно указать путь А,В и т.д. это и есть переменная m пользовательского типа tchar(перечисления от A до Н).

Изображение
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 30.03.2012 16:10:30

Paster Fob писал(а):программа подсказывает к какому именно файлу нужно указать путь

Ах, вот оно как хитро закручено! Сбивают с толку эти строки:
Код: Выделить всё
writeln('введите путь к файлу ',arg);
    if arg<>'H' then
      arg:=succ(arg);
  readln(s);
  {s:=('C:\Files for Program Pascal\'+s);}

Не проще ли:
Код: Выделить всё
  s:='C:\Files for Program Pascal\'+arg+'.in';

Можно добавить после этого и проверку наличия такого файла.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 30.03.2012 17:55:20

Oleg_D писал(а):Не проще ли:
Код: Выделить всё
s:='C:\Files for Program Pascal\'+arg+'.in';

Можно добавить после этого и проверку наличия такого файла.


Я не волшебник,я только учусь. :) Вот,подправил функцию чтения из файлов:
Код: Выделить всё
function readset(var arg:tchar):tset;
var f:text;s:string;asn:tset;
    n:byte;
begin
  s:=('C:\Files for Program Pascal\'+arg+'.in);
  assign(f,s);
  reset(f);
  asn:=[];
  while not eof(f) do begin
    read(f,n);
    asn:=asn+[n];
  end;
  close(f);
  if arg<>'H' then
    arg:=succ(arg);
  readset:=asn;
end;

И ничего указывать не надо,спасибо вам огромное.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 30.03.2012 18:11:18

Paster Fob писал(а):Я не волшебник,я только учусь.

Я понимаю. Хорошо, что Вы экспериментируете, - именно так и учатся, набивая шишаки :lol:
Со временем сможете находить простые решения, - программирование само по себе сложно, и дополнительно усложнять "боевые" программы неразумно. Но в учебных проектах - пожалуйста, почему не "похимичить" в свое удовольствие? :D
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 30.03.2012 20:04:35

Мне вот ещё что интересует,задачу б) из раздела "А слабо?" гл.36 я решил вот так:
Код: Выделить всё
var sn:set of byte;i,n:byte;
begin
  sn:=[];
  i:=0;
  while i<20 do begin
    n:=1+random(50);
      if not(n in sn) then
        begin
          sn:=sn+[n];
          inc(i);
          writeln(n);
        end;
  end;
  readln
end.

и то подсказали.Я пытался написать так if n not in sn,компилятор ошибку выдавал,подсказали что надо так not(n in sn) в книге не написано как применять not к операции in.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 30.03.2012 23:48:08

Все верно. Операция NOT обладает высшим приоритетом, поэтому not n in sn равносильно (not n) in sn.
О булевых операциях с числами сказано в 48-й главе. А пока, если не уверены в последовательности операций, лучше ставить скобки, - лишние скобки никогда не помешают.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 08.04.2012 09:39:07

Oleg_D Что-то не могу справиться с заданием под буквой г),из главы 38.
"Напишите программу для генерации пароля из восьми букв..."
Вот всё что написал:
Код: Выделить всё
type tset=set of byte;

var n,m:byte;ch:tset;
    s:string;

begin
  randomize;
  ch:=[48..57,65..90,97..122];
  s:='';n:=0;
  while n<>8 do begin
    m:=random(170)+48;
    if m in ch then begin
      s:=s+char(m);
      n:=n+1;
    end;
  end;
  writeln(s);
  readln
end.


Как выполнить условие задачи что-то не придумаю.Может намекнётё или подскажете?
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Nik » 08.04.2012 10:02:27

Как выполнить условие задачи что-то не придумаю.Может намекнётё или подскажете?


Вариант 1: сначала генерируете (по отдельности) нужное количество заглавных/строчных/цифр, потом всё это перемешиваете.
Вариант 2: генерируете случайную последовательность, затем в её случайных (или не случайных - для второго варианта) позициях выполняете функцию UpperCase.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 08.04.2012 11:11:15

Nik писал(а):
Как выполнить условие задачи что-то не придумаю.Может намекнётё или подскажете?


Вариант 1: сначала генерируете (по отдельности) нужное количество заглавных/строчных/цифр, потом всё это перемешиваете.


А как перемешать?

Nik писал(а):
Вариант 2: генерируете случайную последовательность, затем в её случайных (или не случайных - для второго варианта) позициях выполняете функцию UpperCase.

ещё бы знать всё это было бы кул :)
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 08.04.2012 12:13:09

Вариантов можно много придумать, вот очень простой (без мнжеств!)
Код: Выделить всё
var S: string;  { результат }
    v: integer; { вариант очередного символа }
begin
  Randomize;
  S:='';
  while Length(S)<8 do begin
    v:= Random(3);
    case v of
      0: S:=S + Char(Random(10)+Ord('0'));
      1: S:=S + Char(Random(26)+Ord('a'));
      2: S:=... аналогично для больших букв
    end;
  end;
  Writeln(S);
  Readln;
end.

Чтобы задействовать множества, добавлю еще одно требование: пусть в пароле не будет совпадающих символов.
Если до завтра не осилите все варианты задачи, выложу решения здесь.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 08.04.2012 13:30:44

Oleg_D писал(а):Вариантов можно много придумать, вот очень простой (без мнжеств!)
Код: Выделить всё
var S: string;  { результат }
    v: integer; { вариант очередного символа }
begin
  Randomize;
  S:='';
  while Length(S)<8 do begin
    v:= Random(3);
    case v of
      0: S:=S + Char(Random(10)+Ord('0'));
      1: S:=S + Char(Random(26)+Ord('a'));
      2: S:=... аналогично для больших букв
    end;
  end;
  Writeln(S);
  Readln;
end.


Я и такой пробовал и через условный оператор if (n>=48) and (n<=57) or...
Но как я понимаю решение должно быть именно через множества.Да и в вашем предложенном варианте условие задачи не выполняется.

Oleg_D писал(а):Чтобы задействовать множества, добавлю еще одно требование: пусть в пароле не будет совпадающих символов.

ну это не проблема,так наверное:
Код: Выделить всё
type tset=set of byte;
var sn:tset;n:byte;
   ......
   if n in sn then
    .......
    sn:=sn-[n];
    ....
 
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 08.04.2012 16:19:15

Paster Fob писал(а):Но как я понимаю решение должно быть именно через множества.

Не обязательно, иногда даю задачки на повторение.
Но здесь, наверное, имеет смысл слегка изменить условие, иначе просто все решается.
Код: Выделить всё
Г) Напишите программу для генерации пароля не менее чем из восьми цифр и латинских букв.
Он должен включать не менее двух больших букв, не менее двух маленьких букв
и не менее двух цифр. Например: «7UpJ7rsT», «PasCal701».
Сделайте еще три варианта так, чтобы соблюдались следующие условия:
- все символы пароля уникальны (примените множество);
- буквы одного регистра и цифры не соседствовали, например: «Pa7sCaL5»;
- символы не соседствовали и были уникальными.


Добавлено спустя 28 минут 58 секунд:
Виноват, моё предыдущее решение действительно не точное, надо изменить условие так:
"Напишите программу для генерации пароля не менее чем из восьми цифр и латинских букв. ..."
И тогда для первого варианта годится это.
Код: Выделить всё
function PassWord: string;
var S: string;  { результат }
    v: integer; { вариант очередного символа }
    n1,n2,n3: integer;
begin
  S:='';
  n1:=0; n2:=0; n3:=0;
  while (Length(S)<8) or (n1<2) or (n2<2) or (n3<2) do begin
    v:= Random(3);
    case v of
      0: begin S:=S + Char(Random(10)+Ord('0')); Inc(n1) end;
      1: begin S:=S + Char(Random(26)+Ord('a')); Inc(n2) end;
      2: begin S:=S + Char(Random(26)+Ord('A')); Inc(n3) end;
    end;
  end;
  PassWord:=S;
end;

begin
  Randomize;
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Readln;
end.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Paster Fob » 08.04.2012 20:24:31

Что-то я совсем запутался.Не могу понять почему программа выдаёт больше 8-ми знаков и не выполняется выход из цикла.
Написано же :
пока длинна строки меньше 8 или n1<2 или ...
либо это,либо то.но программа продолжает работать как-будто and вместо or написано.Почему так?При использовании repeat...until условие выполняется правильно:
Код: Выделить всё
function PassWord: string;
var S: string;  { результат }
    v: integer; { вариант очередного символа }
    n1,n2,n3: integer;
begin
  S:='';
  n1:=0; n2:=0; n3:=0;
  repeat
    v:=random(3);
    case v of
      0: begin S:=S + Char(Random(10)+Ord('0')); Inc(n1) end;
      1: begin S:=S + Char(Random(26)+Ord('a')); Inc(n2) end;
      2: begin S:=S + Char(Random(26)+Ord('A')); Inc(n3) end;
    end;
  PassWord:=S;
  until  (Length(S)>=8) and (n1>=2) and (n2>=2) and (n3>=2);
end;

begin
  Randomize;
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Writeln(PassWord);
  Readln;
end.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: "Песни о Паскале" - для школьников и начинающих

Сообщение Oleg_D » 08.04.2012 22:22:42

Paster Fob писал(а):Что-то я совсем запутался.Не могу понять почему программа выдаёт больше 8-ми знаков и не выполняется выход из цикла.

Не понял вопроса. Все так и должно быть: в строке должно быть не точно 8 символов, а не менее 8.
И эту строку
PassWord:=S;
надо вынести за пределы цикла, т.е. на строку ниже.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Пред.След.

Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru