Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 16.04.2022
Сообщений: 23
1

Сформировать отдельные очереди для цифр, букв и спецсимволов

04.10.2022, 10:33. Показов 1289. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан файл input.txt, компонентами которого являются случайные символы: цифры, буквы, спецсимволы %,!,@,# и другие.

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

Пример:

input.txt 1e2(3efccc)))$#23r-ew^^7

output.txt

123237

eefcccrew

())$#-^^
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2022, 10:33
Ответы с готовыми решениями:

Строки. Чего больше: букв, цифр или спецсимволов?
мне нужно составить программу которая будет определять чего больше букв, цифр, или специальных...

С клавиатуры вводится строка S, состоящая из букв и цифр; из букв строки S сформировать строку S1, из цифр – S2
Помогите пожалуйста решить задачу на ассемблере: С клавиатуры вводится строка S, состоящая из...

Расставить по очереди слова из цифр, из букв и смешанные.
Преобразовать строку так что бы сначала выводило слова состоящие только из цифр, потом только из...

Дано две очереди целых чисел. Сформировать 2 очереди...
...в первую поместить положительные значения, во вторую - отрицательные. Кто может - помогите,...

Очередь: Сформировать две новые очереди, записав в них соответственно первую и вторую части исходной очереди.
Помогите пожалуйста решить В составе целочисленной очереди имеется единственный нулевой...

20
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
04.10.2022, 12:13 2
Какие темы проходили? Очереди как строки или списки? Что насчёт кириллицы? Если без CASE, основная идея
Pascal
1
2
3
4
5
6
##
var a:array[0..2]of string;
 
foreach var x in ReadAllText('input.txt')do if x.IsDigit then a[0]+=x else
  if x.IsLetter then a[1]+=x else a[2]+=x;
Println(a)
0
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
04.10.2022, 14:36 3
Цитата Сообщение от Yuri V Посмотреть сообщение
Pascal
1
var a:array[0..2]of string;
Pascal
1
var a := new string[3];
А ещё лучше
Pascal
1
var a := new StringBuilder[3];
Потому что вы используете строки как изменяемые.

Цитата Сообщение от Yuri V Посмотреть сообщение
Println(a)
Запустите и посмотрите как это выводит. И в задании сказано вывод в файл...
1
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
04.10.2022, 15:43 4
Sun Serega, спасибо, но чуть внимательней -
Цитата Сообщение от Yuri V Посмотреть сообщение
основная идея
0
0 / 0 / 0
Регистрация: 16.04.2022
Сообщений: 23
11.10.2022, 11:14  [ТС] 5
Нужно сделать очередь как списки

Добавлено через 28 секунд
нужно сделать очередь со списками
0
0 / 0 / 0
Регистрация: 16.04.2022
Сообщений: 23
11.10.2022, 11:17  [ТС] 6
Работать нужно со СПИСКАМИ!

Дан файл input.txt, компонентами которого являются случайные символы: цифры, буквы, спецсимволы %,!,@,# и другие.

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

1. Входные данные берутся из файла.

2. Результат записывается в файл.

2. По окончании работы вся выделенная память освобождается (стек или очередь очищается).

Пример:

input.txt

1e2(3efccc)))$#23r-ew^^7

output.txt


123237

eefcccrew

())$#-^^
0
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
11.10.2022, 12:12 7
Если не особо нравится .isLetter и .isDigit, возможно пригодится вариант с CASE
Pascal
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
begin
// 1. читаем содержимое в одну строку
var содержимое:=ReadAllText('input.txt' {,можно указать кодировку});
 
// 2. объявляем переменные
var цифры:=new List<char>;
var буквы:=new List<char>;
var другое:=new List<char>;
 
// 3. заполняем согласно условия
foreach var символ in содержимое do case символ of
'0'..'9':цифры.Add(символ);
'a'..'z','A'..'Z':буквы.Add(символ)
{в задании про кириллицу не сказано} else
другое.Add(символ)
end; //case
 
// 4. вывод в файл
var результат:=OpenWrite('output.txt' {,тоже можно указать кодировку});
 
foreach var очередь in |цифры, буквы, другое| do begin
  foreach var символ in очередь do результат.write(символ);
  Writeln(результат); //догадаетесь как добавить пустую строку?
  очередь.Clear; //очистить уже ненужное, хотя это делает сборщик мусора
 end;
 
 результат.close
end.
А вообще у .NET есть уйма способов работать с массивами данных вроде Select, Where, MAtch и т.д.
0
0 / 0 / 0
Регистрация: 16.04.2022
Сообщений: 23
17.10.2022, 08:25  [ТС] 8
Цитата Сообщение от Yuri V Посмотреть сообщение
|цифры, буквы, другое|
вот эта часть выдает ошибку, то есть | данный знак
0
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
17.10.2022, 11:29 9
Leo-polbd, Какая версия PascalABC.NET?
Или попробуйте
Pascal
21
foreach var очередь in Arr(цифры, буквы, другое) do begin
0
0 / 0 / 0
Регистрация: 16.04.2022
Сообщений: 23
18.10.2022, 08:19  [ТС] 10
[1,2,3,2,3,7,8,8][1,2,3,2,3,7,8,8][1,2,3,2,3,7,8,8][1,2,3,2,3,7,8,8][1,2,3,2,3,7,8,8][1,2,3,2,3,7,8,8][1,2,3,2,3,7,8,8][1,2,3,2,3,7,8,8]
[e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w][e,e,f,c,c,c,r,e,w]
[(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
][(,),),),$,#,-,^,^,
,
]
Выдало вот такие строки в конце результата

Добавлено через 9 минут
Цитата Сообщение от Yuri V Посмотреть сообщение
foreach var очередь in Arr(цифры, буквы, другое) do begin
выдает массив с содержимым через запятые а нужно вот
input.txt

1e2(3efccc)))$#23r-ew^^7

output.txt

123237

eefcccrew

())$#-^^
0
0 / 0 / 0
Регистрация: 16.04.2022
Сообщений: 23
18.10.2022, 09:01  [ТС] 11
Дан файл input.txt, компонентами которого являются случайные символы: цифры, буквы, спецсимволы %,!,@,# и другие.
Сформировать отдельные очереди для цифр, букв и спецсимволов. Записать результат в файл output.txt, занося каждую очередь с новой строки.

1 Входные данные берутся из файла.

2 Результат записывается в файл.

3 По окончании работы вся выделенная память освобождается (стек или очередь очищается

Пример:
input.txt
1e2(3efccc)))$#23r-ew^^7
output.txt
123237
eefcccrew
())$#-^^

ниже пример одного из заданий реализация должна быть плюс минус такой же

Пример 2. Из заданного текста перенести все цифры в конец каждой строки, сохранив их порядок.
Pascal
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
Type
  EXO = ^O;
  O = record
       Data : integer;
       Next : EXO;
  End;
Var
  i : integer;
  O1, EndO1, O2, EndO2 : EXO;
  f1, f2 : text;
  Name, NewName, Stroka, NewStroka : string;
Procedure writeO(Var BeginO, EndO : EXO; k : char);
  . . .
Procedure readO(u : EXO);
  . . .
ModifStr(St : string, NewSt : string);
Var
  l : char;
  O1 := Nil;
  EndO1 := Nil;
  O2 := Nil;
  EndO2 := Nil;
  NewSt := '';
  for i := 1 to Length(St) do
    if St[i] in ['1', '2', '3', '4', '5', '6', '7', '8', '8', '9', '0']
      then
        writeO(O2, EndO2, St[i])
      else
        writeO(O1, EndO1, St[i]);
        while O1 <> Nil do
          begin
            readO(O1, EndO1, l);
            NewSt := NewSt + l;
          end;
        while O2 <> Nil do
          begin
            readO(O2, EndO2, l);
            NewSt := NewSt + l;
          end;
End;
Begin
  write('Введите имя исходного файла: ');
  readln(Name);
  write('Введите имя файла-результата: ');
  readln(NewName);
  assign(f1, Name);
  assign(f2, NewName);
  reset(f1);
  rewrite(f2);
  while not Eof(f1) do
    begin
      readln(f1, Stroka);
      ModifStr(Stroka, NewStroka);
      writeln(f2, NewStroka);
    end;
  close(f1);
  close(f2);
End.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
18.10.2022, 09:42 12
Pascal
25
  if St[i] in ['0'..'9']
Добавлено через 2 минуты
Цитата Сообщение от Leo-polbd Посмотреть сообщение
Pascal
1
2
3
4
5
6
Type
  EXO = ^O;
  O = record
       Data : integer;
       Next : EXO;
  End;
В PascalABC.NET с этим получите проблемы.
0
3022 / 1646 / 651
Регистрация: 19.03.2019
Сообщений: 5,322
18.10.2022, 10:41 13
Цитата Сообщение от bormant Посмотреть сообщение
В PascalABC.NET с этим получите проблемы.
какие?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Type
  EXO = ^O;
  O = record
       Data : integer;
       Next : EXO;
  End;
  
var X : EXO;
begin
  New(X);
  X^.Data := 200;
  X^.Next := X;
  WriteLn(X^.Data);
  Dispose(X)
end.
или вот пример подобной задачи от ТС с решением: Оставить в списке только первые вхождения одинаковых элементов

Добавлено через 53 минуты
Цитата Сообщение от Leo-polbd Посмотреть сообщение
реализация должна быть плюс минус такой же
не максимально близко, но примерно такая же идея, как и в твоём примере:

Pascal
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
type
  EXO = ^O;
  O = record
    Data: char;
    Next: EXO;
  End;
 
procedure writeO(var BeginO: EXO; k: char);
var tmp:EXO;
begin
  new(tmp); 
  tmp^.next:=BeginO; 
  tmp^.data:=k;
  BeginO:=tmp; 
end;
 
procedure GetList(O: EXO; var NewStroka: string);
var tmp:EXO;
begin
  NewStroka := '';
  tmp := O;
  while tmp <> nil do
  begin  
    NewStroka := tmp^.Data + NewStroka;
    tmp := tmp^.next;
  end;
end;
 
procedure ModifyList(var O1,O2,O3 : EXO; St: string);
var i: integer;
begin
  for i := 1 to Length(St) do
    if St[i] in ['1', '2', '3', '4', '5', '6', '7', '8', '8', '9', '0']
      then writeO(O1, St[i])
    else
      if St[i] in ['a'..'z', 'A'..'Z'] 
         then writeO(O2, St[i])
         else writeO(O3, St[i]);
end;
 
procedure FreeList(var O : EXO);
var tmp:EXO;
begin
  while O <> nil do
  begin  
    tmp:=O; 
    O := O^.next;
    dispose(tmp);
  end;
  O := nil
end;
 
procedure FreeLists(var O1,O2,O3 : EXO);
begin
  FreeList(O1);
  FreeList(O2);
  FreeList(O3);
end;
 
var
  f1, f2: text;
  Name, NewName, Stroka: string;
  O1, O2, O3 : EXO;  
 
begin
  write('Введите имя исходного файла: ');
  readln(Name);
  write('Введите имя файла-результата: ');
  readln(NewName);
  
  assign(f1, Name);
  reset(f1);
  O1 := nil; O2 := nil; O3 := nil;
  while not Eof(f1) do
  begin
    readln(f1, Stroka);
    ModifyList( O1, O2, O3, Stroka);
  end;
  close(f1);
  
  {вывод результатов в файл output}
  assign(f2, NewName);
  rewrite(f2);
  GetList(O1, Stroka);
  writeln(f2, Stroka);
  GetList(O2, Stroka);
  writeln(f2, Stroka);
  GetList(O3, Stroka);
  writeln(f2, Stroka);
  close(f2);
  
  {очистить выделенную под списки память}
  FreeLists(O1,O2,O3);
  
  WriteLn('Готово.')
  
end.
0
bormant
18.10.2022, 11:26
  #14

Не по теме:

Цитата Сообщение от mr-Crocodile Посмотреть сообщение
какие?
Вот точно не вспомню.
С ссылочными типами внутри записи (обещают, что кроме строк и массивов) точно (да, тут такого нет).
Если правильно путаю, с взятием адреса указателя, заменой значения указателя по указателю тоже что-то было нехорошее, это надо в прошлых темах искать, когда в общем разделе или в PABC выяснялось, что в PABC.NET тот или иной код не работает, но мне лень ;) Будем считать, что на воду дую (q)

0
mr-Crocodile
18.10.2022, 13:55
  #15

Не по теме:

bormant, да, я тоже помню, что были какие-то косяки, думал у Вас узнать, что именно глючит в PABC.NET ;)
Ну и ладно. При случае это себя покажет.

А в связи с тем, что использование указателей в .NET вообще моветон и заканчивая тем, что в пост #7 Yuri V написал красивый и нативный код по использованию настоящих списков (List<char>), а не вот этого копролита из моей темы, который, видимо, требует преподаватель, можно считать, что данная тема для ТС завершилась.

0
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
18.10.2022, 17:33 16
Цитата Сообщение от bormant Посмотреть сообщение
Вот точно не вспомню.
Проблемы только при указателях и ссылках, указывающих друг на друга.
То есть, к примеру, если в теле записи, на которую есть указатель, присутствует управляемая ссылка, то есть переменная типа-класса.

Если в запись O добавить короткую строку или статический массив - в код добавит пару заплаток "лишь бы запускалось". Для совместимости.
А если какие-то другие классы - то поидее и указатель на такую запись сделать не выйдет.

---

Тем временем с St[i] in ['0'..'9'] основная проблема то - что создаётся и инициализируется новое множество на каждую проверку. Достаточно St[i] in '0'..'9' - это проверка попадания в простой диапазон из 2 значений.
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
18.10.2022, 19:29 17
Цитата Сообщение от Sun Serega Посмотреть сообщение
Тем временем с St[i] in ['0'..'9'] основная проблема то - что создаётся и инициализируется новое множество на каждую проверку
Ну тут все претензии к компилятору.
Ещё TP собирал это (if s in ['0'..'9'] then) в аналог
Pascal
1
if (s[i]>='0') and (s[i]<='9') then
только ещё чуть короче и ещё чуть эффективнее:
Assembler
1
2
3
4
5
6
7
8
9
10
    mov  di,[i]    ; счётчик цикла
    mov  al,[di+s] ; s -- строка
    cmp  al,'0'
    jb   @cnt
    cmp  al,'9'
    ja   @cnt
 
    ; тело then
 
 @cnt:
Чтобы TP сконструировал множество, в нем должно быть более 8 квазиэлементов (поддиапазонов или значений, не сливаемых вместе), что эффективнее, чем 8 последовательных проверок.

Можете проверить IL-код, PABS.NET действительно конструирует в этом случае множество?
0
259 / 205 / 60
Регистрация: 25.05.2022
Сообщений: 879
18.10.2022, 20:26 18
Leo-polbd, старался код зря не усложнять, но мне нет смысла обманывать.
Скорее всего, нюанс с версией PABC.NET, системой или настройками.

bormant, фишка .Net как раз в том, что "одинаковые" переменные не пересоздаются и коллектор даёт жить переменным ровно столько, сколько нужно, а временные расчёты де-факто тоже переменные. Хотя возможно именно поэтому могут возникнуть неоднозначности.
Миниатюры
Сформировать отдельные очереди для цифр, букв и спецсимволов  
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7771 / 4600 / 2824
Регистрация: 22.11.2013
Сообщений: 13,080
Записей в блоге: 1
18.10.2022, 20:45 19
Цитата Сообщение от Yuri V Посмотреть сообщение
фишка .Net как раз в том
Про .Net можно начать говорить только после того, как увидим сгенерированный PABC.NET код, например, в ILDasm.
0
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
19.10.2022, 17:44 20
Цитата Сообщение от Yuri V Посмотреть сообщение
"одинаковые" переменные не пересоздаются
Переменные это области под данные на стеке. А вы наверное объекты имели в виду. Несколько переменных может ссылаться на один объект.

Что касается одинаковых - это работает только со строками и то не всегда. Зато всегда с литеральными.
Вы можете использовать string.Intern чтобы экономить память явно, но обычно это бессмысленно.

Цитата Сообщение от bormant Посмотреть сообщение
Ещё TP собирал это (if s in ['0'..'9'] then) в аналог
То есть используется более тяжёлый тип данных, только чтобы потом его оптимизировало из программы...
В любом случае, такие множества в PascalABC.Net для совместимости, поэтому не странно что код с ними работает не оптимально. Нефиг писать в PascalABC.Net на TP.
0
19.10.2022, 17:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2022, 17:44
Помогаю со студенческими работами здесь

Определить количество вхождений каждого символа цифр и спецсимволов строки
Дана некоторая строка S, вводимая пользователем с клавиатуры. Определить количество вхождений...

Сформировать три множества: букв, цифр, знаков препинания. Вывести на экран каждое множество в [] скобках
Помогите пожалуйста написать программу в Turbo Delphi!!! Сформировать три множества: букв, цифр,...

Множества.Дан текст из строчных латинских букв и цифр. Определить чего – букв или цифр – больше в этом тексте
Переделать код,чтобы там были множества.Или написать новый код с множествами PROGRAM pr1; VAR...

Дан массив состоящий из букв и цифр. Подсчитать в нем колличество букв и цифр.
Условия задачи: Дан массив состоящий из букв и цифр. Подсчитать в нем колличество букв и цифр. ...

Дан текст из букв и цифр. Определить чего больше букв или цифр. В С++
Помогите пожалуйста, очень нужно.

Процедура. Сформировать вектор: если букв больше чем цифр, то элемент вектора-‘истина’, иначе ’ложь’
процедурка. переделать через процедуры 2)Случайным образом заполнить матрицу символов 6х6....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru