===== PascalABC.NET =====
function HasEven(n:integer): boolean;
begin
if n = 0 then
Result := True;
Exit
end;
n := Abs(n);
while n > 0 do
if (n mod 10).IsEven then
else
n := n div 10;
Result := False
var f: file of integer;
var fn1 := ReadlnString('Укажите имя файла');
if not FileExists(fn1) then // файла нет - создаем
var n := ReadInteger('Количество записей в файле:');
var (a, b) := ReadInteger2('Границы интервала данных:');
if a > b then
Swap(a, b);
f := CreateFileInteger(fn1);
Loop n do
f.Write(Random(a, b));
f.Close;
Println('Файл создан')
// файл есть, обрабатываем его
// Создаем еще один файл и переписываем в него то, что должно остаться
var fn2 := '$$$temp$$$.bin';
if FileExists(fn2) then
DeleteFile(fn2);
var f2 := CreateFileInteger(fn2);
Println('Исходный файл');
var q := False;
f := OpenFileInteger(fn1);
while not f.Eof do
var b := f.Read;
b.Print;
q := q or HasEven(b)
f.Reset;
Writeln;
if q then
// элемент с четной цифрой есть - исключение
if not HasEven(b) then
f2.Write(b)
end
else // нет элемента с четной цифрой - все делим надвое
f2.Write(f.Read div 2);
f2.Close;
DeleteFile(fn1);
RenameFile(fn2, fn1);
// выведем результат
Println('Результат');
ReadElements&<integer>(fn1).Println;
DeleteFile(fn2)
end.
А В С Ā Ā×В С×А Ā×В+С×А
0 0 0 1 0 0 0
0 1 1 1 1 0 1
0 1 0 1 1 0 1
1 0 1 0 0 1 1
1 1 0 0 0 0 0
1 1 1 0 0 1 1
Объяснение:
1) Изначально прописываем одиночные элементы А, В, С.
Когда элемента 2 - прописываем 4 строки.
Когда элементов 3 - прописываем 6 строк.
А при 4 строках=0011 при 6 строках=000111
В при 4 строках=0101 при 6 строках=011011
С при 6 строках=010101
2) Затем прописываем отрицание. Оно меняет значения на противоположные.
3) Как в математике, первым делаем умножение(конъюнкцию) Ā×В. Она равна 1, если все элементы равны 1.
4) Затем идёт второе умножение С×А. Принципы выполнения те же.
5) В конце собираем всё последним действием - сложением(дизъюнкцией). Она равна 1, если хоть 1 элемент равен 1.
===== PascalABC.NET =====
function HasEven(n:integer): boolean;
begin
if n = 0 then
begin
Result := True;
Exit
end;
Result := True;
n := Abs(n);
while n > 0 do
if (n mod 10).IsEven then
Exit
else
n := n div 10;
Result := False
end;
begin
var f: file of integer;
var fn1 := ReadlnString('Укажите имя файла');
if not FileExists(fn1) then // файла нет - создаем
begin
var n := ReadInteger('Количество записей в файле:');
var (a, b) := ReadInteger2('Границы интервала данных:');
if a > b then
Swap(a, b);
f := CreateFileInteger(fn1);
Loop n do
f.Write(Random(a, b));
f.Close;
Println('Файл создан')
end;
// файл есть, обрабатываем его
// Создаем еще один файл и переписываем в него то, что должно остаться
var fn2 := '$$$temp$$$.bin';
if FileExists(fn2) then
DeleteFile(fn2);
var f2 := CreateFileInteger(fn2);
Println('Исходный файл');
var q := False;
f := OpenFileInteger(fn1);
while not f.Eof do
begin
var b := f.Read;
b.Print;
q := q or HasEven(b)
end;
f.Reset;
Writeln;
if q then
begin
// элемент с четной цифрой есть - исключение
while not f.Eof do
begin
var b := f.Read;
if not HasEven(b) then
f2.Write(b)
end
end
else // нет элемента с четной цифрой - все делим надвое
while not f.Eof do
f2.Write(f.Read div 2);
f.Close;
f2.Close;
DeleteFile(fn1);
RenameFile(fn2, fn1);
// выведем результат
Println('Результат');
ReadElements&<integer>(fn1).Println;
if FileExists(fn2) then
DeleteFile(fn2)
end.
А В С Ā Ā×В С×А Ā×В+С×А
0 0 0 1 0 0 0
0 1 1 1 1 0 1
0 1 0 1 1 0 1
1 0 1 0 0 1 1
1 1 0 0 0 0 0
1 1 1 0 0 1 1
Объяснение:
1) Изначально прописываем одиночные элементы А, В, С.
Когда элемента 2 - прописываем 4 строки.
Когда элементов 3 - прописываем 6 строк.
А при 4 строках=0011 при 6 строках=000111
В при 4 строках=0101 при 6 строках=011011
С при 6 строках=010101
2) Затем прописываем отрицание. Оно меняет значения на противоположные.
3) Как в математике, первым делаем умножение(конъюнкцию) Ā×В. Она равна 1, если все элементы равны 1.
4) Затем идёт второе умножение С×А. Принципы выполнения те же.
5) В конце собираем всё последним действием - сложением(дизъюнкцией). Она равна 1, если хоть 1 элемент равен 1.