Задача сделана на языке паскаль, при помощи
PaskalPlus<span>
Оформление сделана как для студенческой задачи
<span>Если есть вопросы пиши в личку</span></span>
<u>1. Программа, которая создает файл</u>
<em>// PascalABC.NET 3.3, сборка 1547 от 07.10.2017</em>
<em>// Внимание! Если программа не работает, обновите версию!</em>
type
tДатаРождения=record
день, месяц, год:integer
end;
tАдрес=record
город:string[16];
улица:string[16];
дом:string[16]
end;
tСтудент=record
ФИО:string[24];
Датарождения:tДатаРождения;
Пол:char; // М/Ж
Адрес:tАдрес
end;
begin
Writeln('Вводите данные анкеты, значение * в ФИО - конец ввода');
var Stud:tСтудент;
var f:file of tСтудент;
Rewrite(f,'Student.bin');
while true do begin
Stud.ФИО:=ReadlnString('ФИО студента:');
if Stud.ФИО='*' then break;
Writeln('День, месяц и год рождения: ');
Readln(Stud.Датарождения.день, Stud.Датарождения.месяц,
Stud.Датарождения.год);
Stud.Пол:=ReadlnChar('Пол (М/Ж):').ToUpper;
Stud.Адрес.город:=ReadlnString('Город:');
Stud.Адрес.улица:=ReadlnString('Улица:');
Stud.Адрес.дом:=ReadlnString('Дом:');
Write(f,Stud);
end;
f.Close
end.
<u>2. Программа, которая выводит существующий файл</u>
type
tДатаРождения=record
день, месяц, год:integer
end;
tАдрес=record
город:string[16];
улица:string[16];
дом:string[16]
end;
tСтудент=record
ФИО:string[24];
Датарождения:tДатаРождения;
Пол:char; // М/Ж
Адрес:tАдрес
end;
begin
var Stud:tСтудент;
var f:file of tСтудент;
Reset(f,'Student.bin');
while not Eof(f) do begin
Read(f,Stud);
Writeln(Stud.ФИО,' (',Stud.Пол,'), ',Stud.Датарождения.день,'.',
Stud.Датарождения.месяц,'.',Stud.Датарождения.год,', ',
Stud.Адрес.город,', ',Stud.Адрес.улица,', ',Stud.Адрес.дом);
end;
f.Close
end.
<u>3. Программа, которая делает все это вместе</u>
type
tДатаРождения=record
день, месяц, год:integer
end;
tАдрес=record
город:string[16];
улица:string[16];
дом:string[16]
end;
tСтудент=record
ФИО:string[24];
Датарождения:tДатаРождения;
Пол:char; // М/Ж
Адрес:tАдрес
end;
begin
Writeln('Вводите данные анкеты, значение * в ФИО - конец ввода');
var Stud:tСтудент;
var f:file of tСтудент;
Rewrite(f,'Student.bin');
while true do begin
Stud.ФИО:=ReadlnString('ФИО студента:');
if Stud.ФИО='*' then break;
Writeln('День, месяц и год рождения: ');
Readln(Stud.Датарождения.день, Stud.Датарождения.месяц,
Stud.Датарождения.год);
Stud.Пол:=ReadlnChar('Пол (М/Ж):').ToUpper;
Stud.Адрес.город:=ReadlnString('Город:');
Stud.Адрес.улица:=ReadlnString('Улица:');
Stud.Адрес.дом:=ReadlnString('Дом:');
Write(f,Stud);
end;
Seek(f,0);
while not Eof(f) do begin
Read(f,Stud);
Writeln(Stud.ФИО,' (',Stud.Пол,'), ',Stud.Датарождения.день,'.',
Stud.Датарождения.месяц,'.',Stud.Датарождения.год,', ',
Stud.Адрес.город,', ',Stud.Адрес.улица,', ',Stud.Адрес.дом);
end;
f.Close
end.
<u>Пример работы программы 3)</u>
Вводите данные анкеты, значение * в ФИО - конец ввода
ФИО студента: Иванов И.И.
День, месяц и год рождения:
24 6 1998
Пол (М/Ж): м
Город: Москва
Улица: пр.Ленина
Дом: 152, кор.3
ФИО студента: Петрова Т.Н.
День, месяц и год рождения:
13 11 1999
Пол (М/Ж): ж
Город: Тверь
Улица: ул.Сиреневая
Дом: 18
ФИО студента: *
Иванов И.И. (М), 24.6.1998, Москва, пр.Ленина, 152, кор.3
Петрова Т.Н. (Ж), 13.11.1999, Тверь, ул.Сиреневая, 18
Program algorithm;
Var i, S: integer;
Begin
S:=1;
For i:=1 to 100 do
Begin
S := S*i;
End;
Writeln(S);
End.
1а) Заметим, что для всех S≥5 операция 2) более выгодна, чем 1). Тогда ясно, что для всех S таких, что S∈N, 2S-1≥38 ⇔ S≥20 Петя может использовать операцию 2) и сразу же выиграть. Очевидно, что для остальных S это невозможно.
1б) Ваня выигрывает первым ходом, если к его ходу в куче не меньше 20 камней, причем до хода Пети в куче был <em>меньше</em> 20 камней. Отсюда S+3≥20 ⇔ S≥17. Получаем, что S ∈ [17;19];
2) Очевидно, что Петя выигрывает своим вторым ходом, если выполняются следующие условия: (i) Петя не выиграл первым ходом (⇔S≤19), (ii) Следующим ходом не выиграл Ваня (⇔S≤16). Эти два условия выполняются при S≤16. Ясно также, что при 11≤S≤13 Петя не сможет выиграть вторым ходом: Петя добавляет 3 камня, точно также может поступить Ваня, то есть будет не более 19 камней, чего недостаточно. Если S≤8, то ко второму ходу будет не более 15 камней, а Ваня может добавить всего 3, итого 18, чего опять недостаточно. При S=9 или 10 все работает: ко второму ходу Пети будет не менее 20 камней (Петя может так сделать). S∈[9;10]∪[14;16]
3) Ваня выигрывает своим первым или вторым ходом - это объединение значений, при которых он выигрывает первым ходом и при которых он выигрывает вторым ходом. Первым ходом он выигрывает при S∈[17;19]. Петя не выигрывает своим вторым ходом (и первым) при S∈[11;13]. Поработаем с остальными значениями. Заметим, что, если после первого хода число попадает в область S∈[9;10]∪[14;16] - то это те и только те значения на момент первого хода Вани, при которых он выигрывает вторым ходом. Это неминуемо при 11≤S≤14 - либо Ваня выиграет первым ходом, либо вторым.
Ответ: 1а) 20≤S≤37
1б) S=17, 18, 19
2) S=9, 10, 14, 15, 16
3) S=11, 12, 13, 14, 17, 19