Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
RocKennY
1 / 1 / 0
Регистрация: 23.12.2011
Сообщений: 18
1

Создать файл символьного типа. Создать очереди, решения через подпрограммы

13.06.2012, 21:25. Просмотров 1180. Ответов 5
Метки нет (Все метки)

Создать файл символьного типа. Организовывая очереди по N элементов, cоздать файл слов по N символов в каждом. Решение в программе оформить через подпрограммы.
Всем заранее спасибо

Добавлено через 12 часов 35 минут
Помогите пожалуйста Дороги форумчане

Добавлено через 11 часов 11 минут
Мб кто нить соизволит ответить?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 21:25
Ответы с готовыми решениями:

Имеется файл символьного типа. Организовать очереди по N элементов, создать файл слов по N символов в каждом
Имеется файл символьного типа. Организовать очереди по N элементов, cоздать файл слов по N символов...

Из символьного файла создать новый файл, не содержащий комментарии
из символьного файла на языке Си создать новый файл не содержащий комментарии. Имена исходного и...

Сравнение слова символьного типа с массивом строк также символьного типа
Здравствуйте!! Ребята подскажите по такому вопросу мне нужно сравить слово символьного типа с...

Организовать очереди по N элементов, создать файл слов по N символов в каждом
Помогите пожалуйста с решением задачи на FreePascal по динамическим структурам Имеется файл...

Организовывая очереди по N элементов, создать файл слов по N символов в каждом
Помогите пожалуйста,нашла готовую прогу на делфи,а нужно на паскале.... "Организовывая очереди по...

5
Mawrat
12878 / 5780 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
13.06.2012, 22:31 2
Условие не очень понятное. Что содержит файл? - Там набор символов, из которых надо составить слова по N букв в каждом?
В общем, для начала вот набор функций для работы с очередью. Основные данные очереди - символы.
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
88
89
90
91
type
  //Тип основных данных списка.
  TData = Char;
  //Указатель на элемент списка (это элемент очереди).
  TPElem = ^TElem;
  //Элемент списка.
  TElem = record
    Data : TData; //Основные данные.
    PNext : TPElem; //Указатель на следующий элемент списка.
  end;
  //Очередь.
  TQueue = record
    PFirst, PLast : TPElem; //Указатели на первый и на последний элемент очереди.
  end;
 
//Инициализация очереди. Внимание! Эту процедуру можно выполнять только в том
//случае, если очередь пуста. Иначе, произойдут утечки памяти.
//Эту процедуру следует выполнять только для начальной инициализации очереди.
procedure QueueInit(var aQueue : TQueue);
begin
  aQueue.PFirst := nil;
  aQueue.PLast := nil;
end;
 
//Добавление элемента в конец очереди.
procedure QueuePush(var aQueue : TQueue; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aQueue.PFirst = nil then
    aQueue.PFirst := PElem
  else
    aQueue.PLast^.PNext := PElem
  ;
  aQueue.PLast := PElem;
end;
 
//Изъятие элемента из начала очереди.
//Если очередь не пуста, то из её начала изымается элемент и возвращается
//через параметр aData. В этом случае, функция возвращает значение True.
//Если очередь пуста, то операция отменяется, а функция возвращает значение False.
function QueuePop(var aQueue : TQueue; var aData : TData) : Boolean;
var
  PElem : TPElem;
begin
  Result := False;
  if aQueue.PFirst = nil then Exit;
 
  PElem := aQueue.PFirst;
  aData := PElem^.Data;
  aQueue.PFirst := PElem^.PNext;
  if aQueue.PFirst = nil then aQueue.PLast := nil;
  Dispose(PElem);
  Result := True;
end;
 
//Удаление очереди из памяти (очистка очереди).
procedure QueueFree(var aQueue : TQueue);
var
  Data : TData;
begin
  while QueuePop(aQueue, Data) do;
end;
 
//Распечатка очереди.
function QueueToStr(var aQueue : TQueue) : String;
var
  QTmp : TQueue;
  Data : TData;
begin
  if aQueue.PFirst = nil then begin
    Result := 'Очередь пуста.';
    Exit;
  end;
  Result := '';
 
  //Инициализация вспомогательной очереди.
  QueueInit(QTmp);
  //Переливаем элементы из исходной очереди во временную и при этом
  //выполняем распечатку.
  while QueuePop(aQueue, Data) do begin
    QueuePush(QTmp, Data);
    if Result <> '' then Result := Result + ', ';
    Result := Result + Data;
  end;
 
  aQueue := QTmp;
end;
1
RocKennY
1 / 1 / 0
Регистрация: 23.12.2011
Сообщений: 18
14.06.2012, 02:01  [ТС] 3
Ну у нас просто учебная практика, преподы такие задание по создавали, что сами не знают что хотят. Спасибо, мб что нить сварганю)
0
Mawrat
12878 / 5780 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
14.06.2012, 09:29 4
Если надо из входного файла прочитать набор символов, сформировать из этого набора группы по N символов в каждой и записать в выходной файл в виде отдельных слов, то можно сделать так:
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
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  Capacity = 100; //Величина приращения длины строки.
var
  F : File;
  Q : TQueue;
  S, Path, FileName : String;
  Data : TData; //Char
  i, Size : Integer;
begin
  //Полное имя файла.
  Path := ExtractFilePath(ParamStr(0));
  FileName := Path + Fn1;
  if not FileExists(FileName) then begin
    ShowMessage('Файл не найден. Действие отменено.');
    Exit;
  end;
 
  //Начальная инициализация очереди.
  QueueInit(Q);
 
  //Читаем содержимое файла в строку.
  AssignFile(F, FileName);
  Reset(F, 1);
  Size := FileSize(F);
  SetLength(S, Size);
  BlockRead(F, S[1], Size);
  CloseFile(F);
 
  //Записываем в очередь символы группами по N штук.
  //Группы разделяем знаками #13#10.
  for i := 1 to Size do begin
    //Если текущий символ является первым в группе (i mod 11 = 1)
    //и он не является первым символом первой группы (i > 1),
    //то добавляем в очередь знаки переноса строки.
    if (i > 1) and (i mod 11 = 1) then begin
      QueuePush(Q, #13);
      QueuePush(Q, #10);
    end;
    //Добавляем текущий символ в очередь.
    QueuePush(Q, S[i]);
  end;
 
  //Теперь берём символы из очереди и записываем их в строку.
  Size := 0;
  while QueuePop(Q, Data) do begin
    Inc(Size);
    //Если требуется, увеличиваем длину строки.
    if Size > Length(S) then SetLength(S, Size + Capacity);
    S[Size] := Data;
  end;
  //Корректируем длину строки в соответствие с количеством записанных в неё символов.
  //В данном случае этого делать не требуется, но может понадобится в других задачах.
  //SetLength(S, Size);
 
  //Записываем строку в выходной файл.
  FileName := Path + Fn2;
  AssignFile(F, FileName);
  Rewrite(F, 1);
  BlockWrite(F, S[1], Size);
  CloseFile(F);
 
  //Удаление очереди из памяти. В нашем случае очередь и так уже пуста,
  //но в грамотно построенном коде эта операция обязательно должна присутствовать.
  QueueFree(Q);
 
  ShowMessage('Обработка завершена. Создан выходной файл.');
end;
Здесь в качестве буфера используется строка. Можно было сделать без этой строки, но тогда пришлось бы читать и записывать данные из очереди в файл посимвольно. - Это очень медленный способ работы с файлом. И его надо избегать. Поэтому применена строка в качестве буфера.
1
RocKennY
1 / 1 / 0
Регистрация: 23.12.2011
Сообщений: 18
23.06.2012, 04:12  [ТС] 5
Не работает , почему то ошибку бьет на символе " Q "
0
Mawrat
12878 / 5780 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
23.06.2012, 05:00 6
В предыдущем посте я только код для обработчика нажатия кнопки написал. Чтобы заработало, надо добавить тот код, который в моём первом сообщении.
Полностью будет так:
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
type
  //Тип основных данных списка.
  TData = Char;
  //Указатель на элемент списка (это элемент очереди).
  TPElem = ^TElem;
  //Элемент списка.
  TElem = record
    Data : TData; //Основные данные.
    PNext : TPElem; //Указатель на следующий элемент списка.
  end;
  //Очередь.
  TQueue = record
    PFirst, PLast : TPElem; //Указатели на первый и на последний элемент очереди.
  end;
 
//Инициализация очереди. Внимание! Эту процедуру можно выполнять только в том
//случае, если очередь пуста. Иначе, произойдут утечки памяти.
//Эту процедуру следует выполнять только для начальной инициализации очереди.
procedure QueueInit(var aQueue : TQueue);
begin
  aQueue.PFirst := nil;
  aQueue.PLast := nil;
end;
 
//Добавление элемента в конец очереди.
procedure QueuePush(var aQueue : TQueue; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aQueue.PFirst = nil then
    aQueue.PFirst := PElem
  else
    aQueue.PLast^.PNext := PElem
  ;
  aQueue.PLast := PElem;
end;
 
//Изъятие элемента из начала очереди.
//Если очередь не пуста, то из её начала изымается элемент и возвращается
//через параметр aData. В этом случае, функция возвращает значение True.
//Если очередь пуста, то операция отменяется, а функция возвращает значение False.
function QueuePop(var aQueue : TQueue; var aData : TData) : Boolean;
var
  PElem : TPElem;
begin
  Result := False;
  if aQueue.PFirst = nil then Exit;
 
  PElem := aQueue.PFirst;
  aData := PElem^.Data;
  aQueue.PFirst := PElem^.PNext;
  if aQueue.PFirst = nil then aQueue.PLast := nil;
  Dispose(PElem);
  Result := True;
end;
 
//Удаление очереди из памяти (очистка очереди).
procedure QueueFree(var aQueue : TQueue);
var
  Data : TData;
begin
  while QueuePop(aQueue, Data) do;
end;
 
//Распечатка очереди.
function QueueToStr(var aQueue : TQueue) : String;
var
  QTmp : TQueue;
  Data : TData;
begin
  if aQueue.PFirst = nil then begin
    Result := 'Очередь пуста.';
    Exit;
  end;
  Result := '';
 
  //Инициализация вспомогательной очереди.
  QueueInit(QTmp);
  //Переливаем элементы из исходной очереди во временную и при этом
  //выполняем распечатку.
  while QueuePop(aQueue, Data) do begin
    QueuePush(QTmp, Data);
    if Result <> '' then Result := Result + ', ';
    Result := Result + Data;
  end;
 
  aQueue := QTmp;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn1 = 'file1.txt';
  Fn2 = 'file2.txt';
  Capacity = 100; //Величина приращения длины строки.
var
  F : File;
  Q : TQueue;
  S, Path, FileName : String;
  Data : TData; //Char
  i, Size : Integer;
begin
  //Полное имя файла.
  Path := ExtractFilePath(ParamStr(0));
  FileName := Path + Fn1;
  if not FileExists(FileName) then begin
    ShowMessage('Файл не найден. Действие отменено.');
    Exit;
  end;
 
  //Начальная инициализация очереди.
  QueueInit(Q);
 
  //Читаем содержимое файла в строку.
  AssignFile(F, FileName);
  Reset(F, 1);
  Size := FileSize(F);
  SetLength(S, Size);
  BlockRead(F, S[1], Size);
  CloseFile(F);
 
  //Записываем в очередь символы группами по N штук.
  //Группы разделяем знаками #13#10.
  for i := 1 to Size do begin
    //Если текущий символ является первым в группе (i mod 11 = 1)
    //и он не является первым символом первой группы (i > 1),
    //то добавляем в очередь знаки переноса строки.
    if (i > 1) and (i mod 11 = 1) then begin
      QueuePush(Q, #13);
      QueuePush(Q, #10);
    end;
    //Добавляем текущий символ в очередь.
    QueuePush(Q, S[i]);
  end;
 
  //Теперь берём символы из очереди и записываем их в строку.
  Size := 0;
  while QueuePop(Q, Data) do begin
    Inc(Size);
    //Если требуется, увеличиваем длину строки.
    if Size > Length(S) then SetLength(S, Size + Capacity);
    S[Size] := Data;
  end;
  //Корректируем длину строки в соответствие с количеством записанных в неё символов.
  //В данном случае этого делать не требуется, но может понадобится в других задачах.
  //SetLength(S, Size);
 
  //Записываем строку в выходной файл.
  FileName := Path + Fn2;
  AssignFile(F, FileName);
  Rewrite(F, 1);
  BlockWrite(F, S[1], Size);
  CloseFile(F);
 
  //Удаление очереди из памяти. В нашем случае очередь и так уже пуста,
  //но в грамотно построенном коде эта операция обязательно должна присутствовать.
  QueueFree(Q);
 
  ShowMessage('Обработка завершена. Создан выходной файл.');
end;
1
Вложения
Тип файла: rar FileAndQueue-02.rar (171.3 Кб, 27 просмотров)
23.06.2012, 05:00
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2012, 05:00

Создать cmd-файл, который запишет информацию о системе в txt-файл, нужно несколько способов решения
задание: Создать cmd-файл, который запишет информацию о системе в txt-файл. записал в cmd файл...

Создайте файл строкового типа. Используя содержимое этого файла, создайте файл символьного типа. Содержимое файлов выведите на экран.
Создайте файл строкового типа. Используя содержимое этого файла, создайте файл символьного типа....

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции.
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.