Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
1

Преобразовать числовую строку по правилу

23.07.2016, 12:34. Показов 1806. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дано число в виде строки S. Требуется каждый элемент
этой строки заменить на
1. Если элемент четная цифра, то заменить на большую
рядом стоящую цифру
2. Если элемент нечетная цифра, то заменить на меньшую
рядом стоящую цифру.
примечание
Дано число 12345. Числа 1 и 5 считаются рядом стоящими.
Данная программа решила задачу, создав новую строку...
Как сделать замену?
Есть мысль ввести пару переменных? Как?

QBasic/QuickBASIC
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
DECLARE FUNCTION M$ (n!)
DECLARE FUNCTION STO$ (u!)
CLS
DIM SHARED s AS STRING
DIM t AS STRING
 
s = "4915440847"
PRINT s
PRINT
s = M(10) + s + M(1)
 
FOR i = 2 TO 11
   n1 = VAL(M(i - 1))
   ni = VAL(M(i))
   n2 = VAL(M(i + 1))
   IF ni MOD 2 THEN
      IF n1 > n2 THEN
         t = t + STO(n2)
      ELSE
         t = t + STO(n1)
      END IF
   ELSE
      IF n1 > n2 THEN
         t = t + STO(n1)
      ELSE
         t = t + STO(n2)
      END IF
   END IF
NEXT
PRINT t
END
 
FUNCTION M$ (n)
   M = MID$(s, n, 1)
END FUNCTION
 
FUNCTION STO$ (u)
   STO = LTRIM$(STR$(u))
END FUNCTION
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2016, 12:34
Ответы с готовыми решениями:

Есть ли способ в числовую переменную преобразовать строку с математическим выражением т
Приветствую. Хочу задать вопрос. Есть ли способ в числовую переменную преобразовать строку с...

Преобразовать строку в строку заданной длины N по указанному правилу
Дано целое число N (> 0) и строка S. Преобразовать строку S в строку длины N следующим образом:...

Преобразовать строку S по правилу
Вот условие - Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом:...

Преобразовать строку по указанному правилу
Помогите с программкой. Данная строка символов S. Преобразовать строку , заменив : а )...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
24.07.2016, 10:39 2
Лучший ответ Сообщение было отмечено echs как решение

Решение

И чего, если мне понадобится добавить пару символов в строку, придется захардкоденные константы менять? Спасибо, я лучше уж вот так напишу:
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
var
  s : string = '4915440847';
 
function min(a, b : char) := (a < b ? a : b);
function max(a, b : char) := (a > b ? a : b);
 
function prev(i : integer) := (i > 1 ? i - 1 : length(s));
function next(i : integer) := (i < length(s) ? i + 1 : 1);
 
type f = function(a, b : char) : char;
const fn : array[boolean] of f = (max, min);
 
procedure process(i : integer);
var ch : char;
begin
  if i <= length(s) then
  begin
    ch := fn[odd(ord(s[i]))](s[prev(i)], s[next(i)]);
    process(i + 1);
  end;
  if i <= length(s) then s[i] := ch;
end;
 
begin
  process(1);
  writeln(s);
end.
И менять ничего не придется при замене исходной строки, да и строка не будет портиться добавлением последнего и первого символов... Только допускает ли QB такую работу с типами, как Паскаль, чтобы написать одну-единственную строку, подобную №18?
2
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.07.2016, 13:04  [ТС] 3
volvo
Спасибо!
Крайне Вам благодарен за то внимание, которое вы проявили
к моей теме. В то время как я считаю, что не имею никаких
оснований тратить Ваше драгоценное время. Но я бесконечно
восхищен вашими достижениями в области программирования
и написания алгоритмов с такой легкостью и изяществом, какая
не подвластна даже богам!
А пока
я предлагаю программу, которую переделал по образу и подобию
предыдущей программы внедрив рекурсивную процедуру. Этому
я научился у Вас, ухватив самую суть решения.
Еще раз спасибо Вам!

QBasic/QuickBASIC
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
DECLARE SUB Stroka (s AS STRING, i!)
DECLARE FUNCTION M$ (n!)
DECLARE FUNCTION STO$ (u!)
CLS
DIM SHARED s AS STRING
 
s = "4915440847"
PRINT s
PRINT
s = M(10) + s + M(1)
 
CALL Stroka(s, 2)
 
s = MID$(s, 2, 10)
PRINT s
END
 
FUNCTION M$ (n)
   M = MID$(s, n, 1)
END FUNCTION
 
FUNCTION STO$ (u)
   STO = LTRIM$(STR$(u))
END FUNCTION
 
SUB Stroka (s AS STRING, i)
   IF i = 12 THEN EXIT SUB
 
   n1 = VAL(M(i - 1))
   ni = VAL(M(i))
   n2 = VAL(M(i + 1))
 
   CALL Stroka(s, i + 1)
 
   IF ni MOD 2 THEN
      IF n1 > n2 THEN
         MID$(s, i, 1) = STO(n2)
      ELSE
         MID$(s, i, 1) = STO(n1)
      END IF
   ELSE
      IF n1 > n2 THEN
         MID$(s, i, 1) = STO(n1)
      ELSE
         MID$(s, i, 1) = STO(n2)
      END IF
   END IF
END SUB
Добавлено через 1 час 8 минут
В этой программе я упростил код, введя еще пару функций,
а также не стал увеличивать исходную строку. Тут надо еще
подумать над тем, можно ли что-то радикально сократить?

QBasic/QuickBASIC
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
DECLARE FUNCTION max! (a!, b!)
DECLARE FUNCTION min! (a!, b!)
DECLARE FUNCTION M$ (n!)
DECLARE FUNCTION STO$ (u!)
DECLARE SUB STRO (i!)
 
CLS
DIM SHARED s AS STRING
 
s = "4915440847"
PRINT s
PRINT
 
CALL STRO(1)
 
PRINT s
END
 
FUNCTION M$ (n)
   M = MID$(s, n, 1)
END FUNCTION
 
FUNCTION max (a, b)
   IF a > b THEN max = a ELSE max = b
END FUNCTION
 
FUNCTION min (a, b)
   IF a < b THEN min = a ELSE min = b
END FUNCTION
 
FUNCTION STO$ (u)
   STO = LTRIM$(STR$(u))
END FUNCTION
 
SUB STRO (i)
   IF i > 10 THEN EXIT SUB
 
   IF i = 1 THEN j = 11 ELSE j = i
   IF i = 10 THEN k = 0 ELSE k = i
   n1 = VAL(M(j - 1))
   ni = VAL(M(i))
   n2 = VAL(M(k + 1))
 
   CALL STRO(i + 1)
 
   IF ni MOD 2 THEN
      MID$(s, i, 1) = STO(min(n1, n2))
   ELSE
      MID$(s, i, 1) = STO(max(n1, n2))
   END IF
END SUB
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
24.07.2016, 13:45 4
Лучший ответ Сообщение было отмечено echs как решение

Решение

Вот так работать будет?
QBasic/QuickBASIC
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
DECLARE FUNCTION max! (a!, b!)
DECLARE FUNCTION min! (a!, b!)
DECLARE FUNCTION M$ (n!)
DECLARE FUNCTION STO$ (u!)
DECLARE SUB STRO (i!)
 
CLS
DIM SHARED s AS STRING
 
s = "4915440847"
PRINT s
PRINT
 
CALL STRO(1)
 
PRINT s
END
 
FUNCTION M$ (n)
   M = MID$(s, n, 1)
END FUNCTION
 
FUNCTION max (a, b)
   IF a > b THEN max = a ELSE max = b
END FUNCTION
 
FUNCTION min (a, b)
   IF a < b THEN min = a ELSE min = b
END FUNCTION
 
FUNCTION STO$ (u)
   STO = LTRIM$(STR$(u))
END FUNCTION
 
SUB STRO (i)
   IF i > LEN(s) THEN EXIT SUB
   
   SELECT CASE i
   CASE 1
      j = LEN(s) : k = 2
   CASE LEN(s)
      j = i - 1 : k = 1
   CASE ELSE
      j = i - 1 : k = i + 1
   END SELECT
 
   n1 = VAL(M(j))
   ni = VAL(M(i))
   n2 = VAL(M(k))
 
   CALL STRO(i + 1)
 
   IF ni MOD 2 THEN
      MID$(s, i, 1) = STO(min(n1, n2))
   ELSE
      MID$(s, i, 1) = STO(max(n1, n2))
   END IF
END SUB
, или тут есть что-то, чего нет в QB?
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.07.2016, 16:32  [ТС] 5
volvo
Она работает. У нее пара плюсов
1. Она работает со строкой любой длины.
2. Она более читабельная.
3. Она передает Вам привет!
Спасибо!
0
5000 / 1672 / 409
Регистрация: 25.04.2010
Сообщений: 4,619
Записей в блоге: 2
31.07.2016, 12:54 6
Она передает Вам привет!

Не по теме:

Дейкстра был прав. Но его наблюдений не хватило, чтобы полностью охарактеризовать
данное явление, в реальности, как это видно, последствия более разрушительные и
непредсказуемые.

0
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
07.08.2016, 14:05 7
volvo, офигеть, программа на паскале в функциональном стиле. Красиво.

Я извиняюсь, но какую версию надо использовать для компиляции? У меня установлены Delphi 2006 и Delphi 2010, они такое не могут, пришлось чуть переписать программу.

Неужели новые версии Delphi такой синтаксис поддерживают?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
07.08.2016, 17:20 8
rdt, я проверял на PascalABC.NET (онлайн-версия компилятора - здесь)
1
07.08.2016, 17:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2016, 17:20
Помогаю со студенческими работами здесь

Каждую строку матрицы Z(5,4) преобразовать по правилу
Дана задача. Каждую строку матрицы Z(5,4) преобразовать по правилу: если максимальный элемент не...

Строка: Преобразовать введенную пользователем строку по заданному правилу...
Ввести символ из интервала от «а» до «d». Если введен символ «а» - преобразовать его в символ «b»,...

Сформировать числовую последовательность по правилу
Есть например число 3 и нужно сформировать числовую последовательность (32123) длинной 5 символов,...

Дана действительная квадратная матрица порядка n. Преобразовать матрицу по правилу: строку с номером n сделать столбц
Как решить в C# Windows Forms? Консольной не надо)


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

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

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