Проблемы с использованием Case of, Val[Pascal]

Ответить
Stream
Сообщения: 26
Зарегистрирован: 05 фев 2008, 13:09

Задача такая нужно подсчитать скоко раз нажмёт некто на кнопку телефона чтобы получить определенную букву проверка проверка проходит так вводится текст(транслит мал. буквы) нужно подсчитать скоко сделано кликов на циферки на сотке как бы пишеш смс.
у меня такой не замысловатый код и не правельный разумеется т.к мне надо решить задачу именно через case of но думаю что также приёдется использовать val
прога:

Код: Выделить всё

var i,z,a1,a2,a3:integer; n:string;    a,c,b:integer;  nomer:string;
begin
read(nomer);
a:=0;
For i:= 1 to length(nomer) do
begin
case nomer[i] of
'a','d','j','m','p','s','v','y','.',' ':val(nomer[i],a,b);a=a+1;
'b','e','h','k','n','q','t','w','z',',':val(nomer[i],a,b); a:=a+2;
'c','f','i','l','o','r','u','x','!': val(nomer[i],a,b);a:=a+3;
end;
end;
end.
В программе уже как вы заметили указано скоко кликов на каждую букву к примеру a,d,j это 1 клик итд...Я эту задачу решил с лёгкостью через If (nomer='a') of )nomer='d') ...THen a:=a+1; итд...
Но суть проблемы я выложил выше у меня трудности с case of и хотелось бы понять как её решить через case of.
ПРоверка:"pokupaite gvozdi tolko v kompanii gvozdederov i tovarischi!" кажется это 114 нажатий.
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Обязательно испрользовать Case по условию задачи?
Вот решение без Case:
[syntax='Delphi']
program Key;

const
KeyMap:array[1..9]of string=(' ','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz');

var
Txt:string;
Keys:array[1..9]of integer;
i,kn,kp:integer;
b:boolean;

begin
writeln('Введите текст');
readln(Txt);
for i:=1 to Length(Txt) do
begin
kn:=0;

b:=false;
repeat
inc(kn);
kp:=0;
repeat
inc(kp);
if KeyMap[kn][kp]=Txt then
begin
b:=true;
inc(Keys[kn],kp);
end;
until kp=Length(KeyMap[kn]);
until b;
end;

for i:=1 to 9 do
writeln(i,'-',Keys);

readln;

end.
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
Medved
Сообщения: 256
Зарегистрирован: 14 фев 2008, 20:51
Контактная информация:

Проблемма в том,что case можнщ передавать только численные значения.
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

простите, или я чего-то не до понял, или Вы написали готовое решение!!
Правда, я абсолютно не понял, зачем нужно val(буква, a,b) ?!!
вот Ваше решение.

Код: Выделить всё

var 
  i,z,a1,a2,a3:integer; 
  n:string;    
  a,c,b:integer;  
  nomer:string;
begin
  {read(nomer);}
  {для отладки строчку присвоим} 
  nomer := 'pokupaite gvozdi tolko v kompanii gvozdederov i tovarischi!';
a:=0;
For i:= 1 to length(nomer) do
begin
case nomer[i] of
  'a','d','j','m','p','s','v','y','.',' ': begin a:=a+1 end;
  'b','e','h','k','n','q','t','w','z',',': begin a:=a+2 end;
  'c','f','i','l','o','r','u','x','!':  begin  a:=a+3 end;
end;
end;
WriteLn(a);
end.
&quot писал(а):Проблемма в том,что case можнщ передавать только численные значения.
;) ))) Вы хотели сказать - только перечисляемые типы ;-)))


MOTOCoder, не смог разобраться в Вашем коде ;-((( видно старею, теряю хватку ;-((
и при отладочной строчке
Txt := 'pokupaite gvozdi tolko v kompanii gvozdederov i tovarischi!'; программа вообще ушла в бесконечный цикл...
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Serge_Bliznykov писал(а): MOTOCoder, не смог разобраться в Вашем коде ;-((( видно старею, теряю хватку ;-((
и при отладочной строчке
Txt := 'pokupaite gvozdi tolko v kompanii gvozdederov i tovarischi!'; программа вообще ушла в бесконечный цикл...
Дело в том, что я забыл про знаки препинания.
Внешний цикл идет фактически до тех пор, пока нужный символ не будет найден в массиве KeyMap, а в данном случае восклицательного знака в масссиве нет(хотя любые символы можно просто добавить в нужные строки массива KeyMap.
Ни что так не ограничивает фантазию программиста, как компилятор...
Stream
Сообщения: 26
Зарегистрирован: 05 фев 2008, 13:09

Спасибо всем, оказывается просто надо было добавить begin end;(Как показалSerge_Bliznykov) в case в этом была моя ошибка.
Моя проблема была в том что всё всемя выдавал ошибка паскаль а если поставить begin end; они проподают =)
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

Stream, так поясните, пожалуйста, что в вашем коде делает
val(nomer,a,b);
Не обижайтесь, но, имхо, это БРЕД!!!
1) он выполняется в любой ветке CASE - т.о. его надо выносить за case
2) Вы тем самым СРАЗУ теряете значение в переменной a (VAL - это преобразовать числовое значение из строчки в число (переменную числовую)
3) для букв VAL в переменную a будет возращать 0

Что Вы хотели добиться этим кодом?!?!
Stream
Сообщения: 26
Зарегистрирован: 05 фев 2008, 13:09

Val я добавил от безвыходности и.к прога не работала и я думал в этом и есть проблема.
Ответить