Страница 8 из 26
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 30.03.2012 13:49:30
Oleg_D
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
А за это спасибо!
==================
Кстати, пользуясь случаем, благодарю бригаду этого сайта, - интерфейс очень удобный, приятно работать!

Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 30.03.2012 15:40:15
Paster Fob
Oleg_D писал(а):Не работает.
Как это не работает?Нормально всё.Только я использовал не 1 файл с данными,а несколько.
Oleg_D писал(а):И переменная m излишня, зачем она? И параметр arg в процедуре ввода тоже.
Я старался упростить главную программу и нужно указывать путь к каждому файлу.Чтобы не вводить каждый раз полностью путь к папке где лежат у меня эти файлы,пришлось сделать так:
s:=('C:\Files for Program Pascal\'+s);
программа подсказывает к какому именно файлу нужно указать путь А,В и т.д. это и есть переменная m пользовательского типа tchar(перечисления от A до Н).

Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 30.03.2012 16:10:30
Oleg_D
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';
Можно добавить после этого и проверку наличия такого файла.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 30.03.2012 17:55:20
Paster Fob
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;
И ничего указывать не надо,спасибо вам огромное.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 30.03.2012 18:11:18
Oleg_D
Paster Fob писал(а):Я не волшебник,я только учусь.
Я понимаю. Хорошо, что Вы экспериментируете, - именно так и учатся, набивая шишаки
Со временем сможете находить простые решения, - программирование само по себе сложно, и дополнительно усложнять "боевые" программы неразумно. Но в учебных проектах - пожалуйста, почему не "похимичить" в свое удовольствие?

Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 30.03.2012 20:04:35
Paster Fob
Мне вот ещё что интересует,задачу б) из раздела "А слабо?" гл.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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 30.03.2012 23:48:08
Oleg_D
Все верно. Операция NOT обладает высшим приоритетом, поэтому not n in sn равносильно (not n) in sn.
О булевых операциях с числами сказано в 48-й главе. А пока, если не уверены в последовательности операций, лучше ставить скобки, - лишние скобки никогда не помешают.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 09:39:07
Paster Fob
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.
Как выполнить условие задачи что-то не придумаю.Может намекнётё или подскажете?
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 10:02:27
Nik
Как выполнить условие задачи что-то не придумаю.Может намекнётё или подскажете?
Вариант 1: сначала генерируете (по отдельности) нужное количество заглавных/строчных/цифр, потом всё это перемешиваете.
Вариант 2: генерируете случайную последовательность, затем в её случайных (или не случайных - для второго варианта) позициях выполняете функцию UpperCase.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 11:11:15
Paster Fob
Nik писал(а):Как выполнить условие задачи что-то не придумаю.Может намекнётё или подскажете?
Вариант 1: сначала генерируете (по отдельности) нужное количество заглавных/строчных/цифр, потом всё это перемешиваете.
А как перемешать?
Nik писал(а):Вариант 2: генерируете случайную последовательность, затем в её случайных (или не случайных - для второго варианта) позициях выполняете функцию UpperCase.
ещё бы знать всё это было бы кул

Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 12:13:09
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.
Чтобы задействовать множества, добавлю еще одно требование: пусть в пароле не будет совпадающих символов.
Если до завтра не осилите все варианты задачи, выложу решения здесь.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 13:30:44
Paster Fob
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];
....
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 16:48:13
Oleg_D
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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 20:24:31
Paster Fob
Что-то я совсем запутался.Не могу понять почему программа выдаёт больше 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.
Re: "Песни о Паскале" - для школьников и начинающих
Добавлено: 08.04.2012 22:22:42
Oleg_D
Paster Fob писал(а):Что-то я совсем запутался.Не могу понять почему программа выдаёт больше 8-ми знаков и не выполняется выход из цикла.
Не понял вопроса. Все так и должно быть: в строке должно быть
не точно 8 символов,
а не менее 8.
И эту строку
PassWord:=S;
надо вынести за пределы цикла, т.е. на строку ниже.