Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
#1

Пульт для видеотелефона - Turbo Pascal

31.05.2016, 19:47. Просмотров 303. Ответов 17
Метки нет (Все метки)

Пульт для видеотелефона

Ограничение времени 1 секунда
Ограничение памяти 64Mb
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Петя сконструировал пульт для видеотелефона. Пульт представляет собой поверхность с 5-ю кнопками: «стрелка вверх», «стрелка вниз», «стрелка вправо», «стрелка влево» и «Ok». Чтобы набрать номер телефона, на экран выводится виртуальная клавиатура в виде стандартной таблицы, состоящей из 4 строк и 3 столбцов с изображениями цифр от 0 до 9 и кнопками «Выход» и «Звонок».

По ячейкам этой таблицы Петя может перемещать курсор вверх, вниз, вправо или влево. Для выбора цифры необходимо нажать кнопку «Ok». После набора всех цифр необходимо подвинуть курсор на ячейку «Звонок» и нажать «Ok». Таблица не «зациклена» (это означает, что нажатие кнопки «вправо», например, из ячейки с цифрой 6 не приведет к перемещению курсора).
При вызове экранной клавиатуры курсор находится на кнопке с надписью «выход».
Петя занимается исследованием эргономики своего пульта. Для этого он определяет для различных семизначных номеров телефона количество нажатий кнопок, которое должен сделать пользователь, чтобы позвонить по этому номеру.
Формат ввода

Во входном файле задан номер телефона, содержащий ровно 7 цифр.
Формат вывода

В выходной файл выведите одно число — минимальное количество нажатий суммарно на все кнопки, которое необходимо, чтобы совершить звонок по этому номеру.
Пример 1

Ввод Вывод
0800000
12
Пример 2

Ввод Вывод
1234567
24
Примечания

В первом тесте последовательность нажатий кнопок: вправо, Ok,вверх, Ok, вниз, Ok , Ok, Ok, Ok, Ok, вправо, Ok
Есть часть кода,как дальше не знаю.Прошу помочь,спасибо.
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
98
var b:array [1..100] of integer;
xcord:array[1..10] of integer;
ycord:array[1..10] of integer;
 
 
 a:array [1..7] of char;
razn,raznprev,raznstart,i,k,l,m,n:longint;
 
begin
for i:=1 to 7 do
begin
read(a[i]);
end;
 
for i:=1 to 7 do
begin
if(a[i]='1') then
begin
xcord[i]:=1;
ycord[i]:=1;
end;
 
if(a[i]='0') then
begin
xcord[i]:=2;
ycord[i]:=4;
end;
 
if(a[i]='2') then
begin
xcord[i]:=2;
ycord[i]:=1;
end;
 
 
if(a[i]='3') then
begin
xcord[i]:=3;
ycord[i]:=1;
end;
 
 
 
if(a[i]='4') then
begin
xcord[i]:=1;
ycord[i]:=2;
end;
 
 
 
if(a[i]='5') then
begin
xcord[i]:=2;
ycord[i]:=2;
end;
 
if(a[i]='6') then
begin
xcord[i]:=3;
ycord[i]:=2;
end;
 
 
if(a[i]='7') then
begin
xcord[i]:=1;
ycord[i]:=3;
end;
 
 
if(a[i]='8') then
begin
xcord[i]:=2;
ycord[i]:=3;
end;
 
 
if(a[i]='9') then
begin
xcord[i]:=3;
ycord[i]:=3;
end;
 
end;
raznstart:=abs(1-xcord[1])+abs(4-ycord[1]);
writeln(raznstart,' !');
for i:=1 to 6 do
begin
 
razn:=abs(xcord[i]-xcord[i+1])+abs(ycord[i]-ycord[i+1]);
//writeln(razn);
 
end;
 
razn:=razn+raznstart;
writeln(razn);
end.
Добавлено через 12 минут
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
98
99
100
101
102
103
104
105
106
107
108
109
110
var b:array [1..100] of integer;
xcord:array[1..10] of integer;
ycord:array[1..10] of integer;
 
 
 a:array [1..7] of char;
summ,razn,raznprev,raznstart,i,k,l,m,n:longint;
 
begin
summ:=0;
raznprev:=0;
for i:=1 to 7 do
begin
read(a[i]);
end;
 
for i:=1 to 7 do
begin
if(a[i]='1') then
begin
xcord[i]:=1;
ycord[i]:=1;
end;
 
if(a[i]='0') then
begin
xcord[i]:=2;
ycord[i]:=4;
end;
 
if(a[i]='2') then
begin
xcord[i]:=2;
ycord[i]:=1;
end;
 
 
if(a[i]='3') then
begin
xcord[i]:=3;
ycord[i]:=1;
end;
 
 
 
if(a[i]='4') then
begin
xcord[i]:=1;
ycord[i]:=2;
end;
 
 
 
if(a[i]='5') then
begin
xcord[i]:=2;
ycord[i]:=2;
end;
 
if(a[i]='6') then
begin
xcord[i]:=3;
ycord[i]:=2;
end;
 
 
if(a[i]='7') then
begin
xcord[i]:=1;
ycord[i]:=3;
end;
 
 
if(a[i]='8') then
begin
xcord[i]:=2;
ycord[i]:=3;
end;
 
 
if(a[i]='9') then
begin
xcord[i]:=3;
ycord[i]:=3;
end;
 
end;
//raznstart:=abs(1-xcord[1])+abs(4-ycord[1]);
//writeln(raznstart,' !');
for i:=1 to 6 do
begin
raznprev:=razn;
razn:=abs(xcord[i]-xcord[i+1])+abs(ycord[i]-ycord[i+1]);
 
k:=razn+raznprev;
summ:=summ+k;
 
end;
 
 
 
write(summ+8);
 
 
 
 
 
//razn:=razn+raznstart;
//writeln(razn);
end.
Исправил,но все равно есть где то ошибка.В чем?

Добавлено через 3 часа 8 минут
Актуально,помогите пожалуйста.
http://www.cyberforum.ru/cpp-beginners/thread1750597.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2016, 19:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Пульт для видеотелефона (Turbo Pascal):

Пульт 2.4 ГГц трансформировать в пульт управления к ПК
Хочу купить квадрокоптер сразу а не ждать месяц с китая. Поэтому в моделях...

Пульт ду для пк
Извините не знал в какую тему написать! Купил пульт ДУ,работает все класно,но...

Пульт для пк
ребя заказал пульт для пк из китая . на коробке поддержка хр виста но 7ки нет...

Пульт ДУ для фотоаппарата.
У знакомых Никон, у других - Кэнон. Появилося желание сделать пультик...

ИК пульт для шасси
Приветствую. Полгода назад сделал шасси с управлением от телевизионного...

17
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 20:06 #2
Возьмите за точку отсчёта начальное положение курсора.
Все кнопки пульта пронумеруйте в координатах x и y относительно левой нижней кнопки (выход).
Pascal
1
2
  x: array['0'..'9'] of integer = (1, 0, 1, 2,...............);
  y: array['0'..'9'] of integer = (0, 3, 3, 3,...............);
Далее, Xcurr,Ycurr - текущее положение курсора.
Для перемещения курсора к кнопке с очередной цифрой Digit: char нужно нажать:
1. курсорные стрелки abs(Xcurr - x[Digit])+abs(Ycurr-y[Digit]) раз
2. Ok - ещё раз для набора

И так 7 раз.
Потом перейти к кнопке вызов и нажать Ok. Это уже по аналогичным формулам, только Xвызов и Yвызов задать не из массива, а константой.
0
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
31.05.2016, 20:19  [ТС] #3
ФедосеевПавел,
Изменил координаты относительно кнопки "выход".А вот остальное не очень понял.А почему нельзя через массив?
0
Миниатюры
Пульт для видеотелефона  
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 20:22 #4
Какой-такой массив? Массив считанного номера? А зачем он? Можно считывать по одной цифре, обрабатывать и забывать о ней - в потоке.
0
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
31.05.2016, 20:44  [ТС] #5
ФедосеевПавел,
Получилось вот,уже не очень соображаю,можете пожалуйста исправить ошибку,т.к. тороплюсь,большое спасибо!
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
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
var
  b: array [1..100] of integer;
  xcord: array[1..9] of integer;
  ycord: array[1..9] of integer;
  t: text;
  nprev,n:char;
  a: array [1..7] of char;
  summ, razn, raznprev, raznstart, i, k, l, m: longint;
 
begin
  summ := 0;
  raznprev := 0;
  
 // assign(t, 'input.txt');
  //reset(t);
  read(n);
  for i:=2 to 7 do
  begin
  nprev:=n;
  read(n);
  
 
    if(n= '1') then
    begin
      xcord[1] := 1;
      ycord[2] := 4;
    end;
    
    if(n= '0') then
    begin
      xcord[1] := 2;
      ycord[1] := 1;
    end;
    
    if(n= '2') then
    begin
      xcord[1] := 2;
      ycord[1] := 4;
    end;
    
    
    if(n= '3') then
    begin
      xcord[1] := 3;
      ycord[1] := 4;
    end;
    
    
    
    if(n= '4') then
    begin
      xcord[1] := 1;
      ycord[1] := 3;
    end;
    
    
    
    if(n= '5') then
    begin
      xcord[1] := 2;
      ycord[1] := 3;
    end;
    
    if(n= '6') then
    begin
      xcord[1] := 3;
      ycord[1] := 3;
    end;
    
    
    if(n= '7') then
    begin
      xcord[1] := 1;
      ycord[1] := 2;
    end;
    
    
    if(n = '8') then
    begin
      xcord[1] := 2;
      ycord[1] := 2;
    end;
    
    
    
    if(n = '9') then
    begin
      xcord[1] := 3;
      ycord[1] := 2;
    end;
    
    
    
    
    //предыдущее число
    
     if(nprev= '1') then
    begin
      xcord[2] := 1;
      ycord[2] := 4;
    end;
    
    if(nprev= '0') then
    begin
      xcord[2] := 2;
      ycord[2] := 1;
    end;
    
    if(nprev= '2') then
    begin
      xcord[2] := 2;
      ycord[2] := 4;
    end;
    
    
    if(nprev= '3') then
    begin
      xcord[2] := 3;
      ycord[2] := 4;
    end;
    
    
    
    if(nprev= '4') then
    begin
      xcord[2] := 1;
      ycord[2] := 3;
    end;
    
    
    
    if(nprev= '5') then
    begin
      xcord[2] := 2;
      ycord[2] := 3;
    end;
    
    if(nprev= '6') then
    begin
      xcord[2] := 3;
      ycord[2] := 3;
    end;
    
    
    if(nprev= '7') then
    begin
      xcord[2] := 1;
      ycord[2] := 2;
    end;
    
    
    if(nprev = '8') then
    begin
      xcord[2] := 2;
      ycord[2] := 2;
    end;
    
    
    
    if(nprev = '9') then
    begin
      xcord[2] := 3;
      ycord[2] := 2;
    end;
    
     razn := abs(xcord[2] - xcord[1]) + abs(ycord[2] - ycord[1]);
    summ:=summ+razn;
 
    
  end;
  //raznstart:=abs(1-xcord[1])+abs(4-ycord[1]);
  //writeln(raznstart,' !');
 
  
 
 // assign(t, 'output.txt');
 // rewrite(t);
 
      write(summ + 8);
 // close(t);
  
end.
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 21:16 #6
Не торопитесь.
Прочтите, что я написал.

Сделайте два массива x, y.
Задайте текущее положение Xcurr, Ycurr кнопкой выход.
Коротким циклом на 3-5 строк решите задачу (чтение символа, вычисление нажатий для перемещения, кнопка Ok, обновление Xcurr и Ycurr).
Перемещение к кнопке вызов.
Кнопка Ок.

Итого 15-20 строк.

Добавлено через 1 минуту
А на жалость мне не давите
Цитата Сообщение от Varitan Посмотреть сообщение
уже не очень соображаю,можете пожалуйста исправить ошибку,т.к. тороплюсь,большое спасибо!
Я вас не знаю и вы мне безразличны.
0
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
31.05.2016, 21:17  [ТС] #7
ФедосеевПавел, кнопка ОК = +1к ответу итоговому?
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 21:27 #8
Цитата Сообщение от Varitan Посмотреть сообщение
Пример 1
Ввод Вывод
0800000
12
Примечания
В первом тесте последовательность нажатий кнопок: вправо, Ok,вверх, Ok, вниз, Ok , Ok, Ok, Ok, Ok, вправо, Ok
Ну, наверное...
0
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
31.05.2016, 22:01  [ТС] #9
ФедосеевПавел, а как мы можем уложиться в 15-20 строк,если нужно ставить if для введенного символа char ,чтобы определить его координаты относительно кпопки"выход"?
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 22:07 #10
Зачем? Напрямую
Pascal
1
2
  x: array['0'..'9'] of integer = (1, 0, 1, 2,...............);
  y: array['0'..'9'] of integer = (0, 3, 3, 3,...............);
0
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
31.05.2016, 22:09  [ТС] #11
ФедосеевПавел, так нам же неизвестны входящие числа и их координаты,они на разных тестах разные
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 22:17 #12
Вы меня на измор берёте?

В этих двух массивах то, что вы записываете 20 if в переменные xcord, ycord (из-за копирования у вас в 25-26 строке не то дублирование индекса). Только значительно короче.
1
TrueTerm
168 / 116 / 45
Регистрация: 25.12.2014
Сообщений: 384
31.05.2016, 22:25 #13
Может такая аналогия поможет.
Имеется 12 городов (кнопок), есть маршрут, описывающий в каком порядке какие города посетить (набираемый номер). Есть таблица задающая стоимость проезда из одного города в другой (а вот ее и надо разместить в массиве - сколько потребуется нажатий, чтобы от кнопки А сместиться к кнопке В). Требуется найти общие затраты на поездку по этому маршруту (количество нажатий на кнопки).
1
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 22:27 #14
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
program RemoteControl;
 
const                              {0  1  2  3  4  5  6  7  8  9}
  x: array ['0'..'9'] of integer = (1, 0, 1, 2, 0, 1, 2, 0, 1, 2);
  y: array ['0'..'9'] of integer = (0, 3, 3, 3, 2, 2, 2, 1, 1, 1);
var
  Digit: char;
  i: integer;
  Count: integer;
  Xcurr, Ycurr: integer;
begin
  Xcurr := 0;
  Ycurr := 0;
  Count := 0;
  for i := 1 to 7 do
  begin
    Read(Digit);
    Count := Count + abs(Xcurr - x[Digit]) + abs(Ycurr - y[Digit]) + 1;
    Xcurr := x[Digit];
    Ycurr := y[Digit];
  end;
  Count := Count + abs(Xcurr - 2) + abs(Ycurr - 0) + 1;
  writeln(Count);
end.
1
TrueTerm
168 / 116 / 45
Регистрация: 25.12.2014
Сообщений: 384
31.05.2016, 22:33 #15
Чтобы набрать номер 1234567 надо проехать по такому маршруту: Вых-1-2-3-4-5-6-7-Зв.
"Стоимость" равна С(Вых,1)+С(1,2)+С(2,3)+С(3,4)+С(4,5)+С(5,6)+С(6,7)+С(7,Зв)+8
Постоянное слагаемое 8 - нажатие кнопки ОК. Осталось завести в программе таблицу С(n,m)
Само вычисление, полагаю, трудности не составит запрограммировать.
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 22:36 #16
Думаю, что с аналогиями у ТС всё в порядке. Он пропустил темы с массивами, case, предопределённые константы, диапазонные типы, процедуры. И много чего. Отсюда и такое решение. Алгоритмически решение у него верное, но копирование массы строк всё губит.
0
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
31.05.2016, 22:37  [ТС] #17
ФедосеевПавел, Огромное спасибо,разобрался,извините за столько вопросов.
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
31.05.2016, 22:38 #18
Да. Таблицу можно на первом этапе. А потом заменить её отсчётами от какой нибудь кнопки. И разность отсчётов даст расстояние.
0
31.05.2016, 22:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2016, 22:38
Привет! Вот еще темы с решениями:

фонарик-пульт для тсоп
а подскажите на чем лучше собрать типа пульта для тсопа, только как фонарик,...

Пульт для плеера в машину
Я тут малость отходил (от форума). Делал пульт для своего плеера в машину....

Пульт Для Logitech Z-2300
Всем здрасте . Отдали даный сабубен но без пульта и без колонок, ну колонки...

Пульт ДУ для фотоаппарата. Есть вопросы.
Решил сделать пульт ДУ для фотоаппарата. Так как давно решил переходить на...


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

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

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