Сообщение было отмечено Памирыч как решение
Решение
Задача №1.
Первый способ - файлы рассматриваются, как текстовые.
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
| program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
const
Fn1 = 'file1.txt';
Fn2 = 'file2.txt';
Fn3 = 'file3.txt';
var
F1, F2, F3 : TextFile;
S : String;
begin
//Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
//Если после переключения русские буквы показываются неверно,
//следует открыть системное меню консольного окна - щелчком мыши в левом
//верхнем углу окна консоли и выбрать:
//Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
repeat
//Полный путь к папке, в которой расположен исполняемый файл программы.
//в конце пути записан слеш - в Windows это: "\", в Linux: "/".
S := ExtractFilePath(ParamStr(0));
//Первые два файла открываем в режиме чтения.
AssignFile(F1, S + Fn1);
Reset(F1);
AssignFile(F2, S + Fn2);
Reset(F2);
//Создаём/пересоздаём третий файл и открываем его в режиме записи.
AssignFile(F3, S + Fn3);
Rewrite(F3);
//Переписываем содержимое из первого файла в третий.
while not Eof(F1) do begin
Read(F1, S);
Write(F3, S);
if not Eof(F1) then begin
Readln(F1);
Writeln(F3);
end;
end;
//Если требуется разделить содержимое файлов переводом строки.
if not Eof(F2) then Writeln(F3);
//Переписываем содержимое из второго файла в третий.
while not Eof(F2) do begin
Read(F2, S);
Write(F3, S);
if not Eof(F2) then begin
Readln(F2);
Writeln(F3);
end;
end;
//Закрываем файлы.
CloseFile(F1);
CloseFile(F2);
CloseFile(F3);
Writeln('Данные из файлов: ', Fn1, ' и ', Fn2, ' записаны в файл: ', Fn3);
Writeln('Повторить - Enter. Выход - любой символ + Enter.');
Readln(S);
until S <> '';
end. |
|
Второй способ - файлы рассматриваются, как бинарные.
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
| program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
const
Fn1 = 'file1.txt';
Fn2 = 'file2.txt';
Fn3 = 'file3.txt';
//Размер буфера для чтения данных.
Size = 10000;
var
F1, F2, F3 : File;
Arr : array of Byte;
Cnt : Integer;
S : String;
begin
//Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
//Если после переключения русские буквы показываются неверно,
//следует открыть системное меню консольного окна - щелчком мыши в левом
//верхнем углу окна консоли и выбрать:
//Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
repeat
//Полный путь к папке, в которой расположен исполняемый файл программы.
//в конце пути записан слеш - в Windows это: "\", в Linux: "/".
S := ExtractFilePath(ParamStr(0));
//Открываем первые два файла в режиме чтение/запись с минимальном блоком в 1 байт.
AssignFile(F1, S + Fn1);
Reset(F1, 1);
AssignFile(F2, S + Fn2);
Reset(F2, 1);
//Третий файл создаём/пересоздаём и открываем в режиме записи
//с минимальным блоком в 1 байт.
AssignFile(F3, S + Fn3);
Rewrite(F3, 1);
//Размещаем в памяти буфер данных.
SetLength(Arr, Size);
//Переписываем содержимое из первого файла в третий.
while not Eof(F1) do begin
//Читаем из первого файла очередной блок данных.
BlockRead(F1, Arr[0], Size, Cnt);
//Записываем в третий файл столько байтов, сколько их было
//прочитано из первого файла.
BlockWrite(F3, Arr[0], Cnt);
end;
//Если требуется разделить содержимое файлов переводом строки.
Arr[0] := 13;
Arr[1] := 10;
if not Eof(F2) then BlockWrite(F3, Arr[0], 2);
//Переписываем содержимое из второго файла в третий.
while not Eof(F2) do begin
BlockRead(F2, Arr[0], Size, Cnt);
BlockWrite(F3, Arr[0], Cnt);
end;
//Закрываем файлы.
CloseFile(F1);
CloseFile(F2);
CloseFile(F3);
Writeln('Данные из файлов: ', Fn1, ' и ', Fn2, ' записаны в файл: ', Fn3);
Writeln('Повторить - Enter. Выход - любой символ + Enter.');
Readln(S);
until S <> '';
end. |
|
Задача №4.
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
var
S : String;
Arr : array[#0..#255] of Integer;
Ch : Char;
i, Len : Integer;
begin
//Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
//Если после переключения русские буквы показываются неверно,
//следует открыть системное меню консольного окна - щелчком мыши в левом
//верхнем углу окна консоли и выбрать:
//Свойства - закладка "Шрифт" - выбрать шрифт: "Lucida Console".
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
repeat
Writeln('Задайте строку:');
Readln(S);
//Обнуляем элементы массива.
for Ch := #0 to #255 do Arr[Ch] := 0;
//Анализируем строку.
Len := Length(S);
for i := 1 to Len do Inc(Arr[S[i]]);
//Формируем строку результата.
S := '';
for Ch := #0 to #255 do begin
if Arr[Ch] > 0 then begin
if S <> '' then S := S + ', ';
if Ch <= #32 then
S := S + '#' + IntToStr( Ord(Ch) ) //Неотображаемые символы.
else
S := S + Ch //Отображаемые символы.
;
S := S + '(' + IntToStr(Arr[Ch]) + ')';
end;
end;
//Ответ.
if S <> '' then begin
Writeln('Список различных символов и количество их присутствий:');
Writeln(S);
end else begin
Writeln('Строка пустая.');
end;
Writeln('Повторить - Enter. Выход - любой символ + Enter.');
Readln(S);
until S <> '';
end. |
|
Задача №5. В тексте может быть несколько слов с наибольшей длиной, поэтому в качестве самого длинного слова будем брать первое из самых длинных слов.
Delphi | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
| program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
type
//Сведения о координатах слова.
TWInfo = record
Start, Len : Integer;
end;
const
//Множество разделителей слов.
D = [' ', '.', ',', ':', ';', '!', '?', '-', #9, #10, #13];
var
S, Sw : String;
i, Cnt, Len, LenW : Integer;
W1, W2 : TWInfo;
begin
//Переключение окна консоли на кодовую страницу CP1251 (Win-1251).
//Если после переключения русские буквы показываются неверно,
//следует открыть системное меню консольного окна - слева вверху
//окна консоли и выбрать: Свойства - закладка "Шрифт"
//- шрифт "Lucida Console".
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
repeat
//Исходный текст.
Writeln('Задайте текст:');
Readln(S);
Len := Length(S);
LenW := 0;
Cnt := 0;
//Начальное задание координат первого слова.
W1.Start := 0;
W1.Len := Len;
//Начальное задание координат самого длинного слова.
W2.Start := 0;
W2.Len := 0;
for i := 1 to Len do begin
//Пропускаем разделители.
if S[i] in D then Continue;
//Уточняем длину текущего слова.
Inc(LenW);
//Отслеживаем конец слова.
if (i = Len) or (S[i + 1] in D) then begin
Inc(Cnt); //Порядковый номер слова.
if Cnt = 1 then begin
W1.Len := LenW;
W1.Start := i - LenW + 1;
end;
if LenW > W2.Len then begin
W2.Len := LenW;
W2.Start := i - LenW + 1;
end;
LenW := 0; //Обнуляем длину слова.
end;
end;
if W1.Start = 0 then
Writeln('В тексте нет слов.')
else if W1.Start = W2.Start then
Writeln('Первое слово является самым длинным.')
else begin //Меняем слова местами.
//Запоминаем самое длинное слово.
Sw := Copy(S, W2.Start, W2.Len);
//Удаляем самое длинное слово.
Delete(S, W2.Start, W2.Len);
//На место самого длиного слова вставляем первое слово.
Insert(Copy(S, W1.Start, W1.Len), S, W2.Start);
//Удаляем первое слово.
Delete(S, W1.Start, W1.Len);
//На место первого слова записываем самое длинное слово.
Insert(Sw, S, W1.Start);
//Вывод результатов.
Writeln('Изменённый текст:');
Writeln(S);
end;
Writeln('Повторить - Enter. Выход - любой символ + Enter.');
Readln(S);
until S <> '';
end. |
|
1
|