Помощь - Поиск - Пользователи - Календарь
Полная версия: Составьте программу вычисления суммы номеров мест, на которых в слове S стоят гласные буквы.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
Составьте программу вычисления суммы номеров мест, на которых в слове S стоят гласные буквы. Есть кое-какие мысли, вот
 function Rus(mes: string):string;
var i: integer;
begin
for i:=1 to length(mes) do
case mes [i] of
'А'..'п': mes[i]:=chr(Ord (mes [i])-64);
'р'..'я': mes[i]:=chr(ord (mes[i])-16);
end;
rus:=mes;
end;

var s:string;
i,summa:integer;
begin
write (rus('введите текст - '));
readln (s);
summa:=0;
for i:=1 to length (s) do
case s[i] of
'а': summa:=summa+1;
'е': summa:=summa+1;
'и': summa:=summa+1;
'о': summa:=summa+1;
'у': summa:=summa+1;
'ы': summa:=summa+1;
'ю': summa:=summa+1;
'э': summa:=summa+1;
'я': summa:=summa+1;
end;
writeln (rus('текст-" '),s,' "');
writeln (rus('сумма номеров='),summa);
readln;
end.
Но программа выдает 0. Помогите разобраться

Добавлено через 5 мин.
ой, только сейчас понял, что я написал blink.gif case вместе с for-ом blink.gif вот дурак
Lapp
Для английских слов можно вот как-то так:
function SumVowelPos (s: string): integer;
var
i,n: integer;
begin
n:=0;
for i:=1 to Length(s) do if UpCase(s[i]) in ['A','E','I','O','U','Y'] then n:=n+i;
SumVowelPos:=n
end;

Для русского языка нужно вместо UpCase использовать свою функцию.

Добавлено через 2 мин.
кстати, case можно записать короче:
case s[i] of
'а','е','и','о','у','ы','ю','э','я': summa:=summa+i;
end;



Добавлено через 8 мин.
Цитата(Lapp @ 27.03.2010 23:06) *
Для русского языка нужно вместо UpCase использовать свою функцию.
Еще вариант - просто перечислить в условии мелкие буквы тоже:
  for i:=1 to Length(s) do
if s[i] in ['А','Е','И','О','У','Ы','Ю','Э','Я','а','е','и','о','у','ы','ю','э','я'] then
n:=n+i;
marwell
Цитата(Lapp @ 27.03.2010 23:06) *

Для английских слов можно вот как-то так:
function SumVowelPos (s: string): integer;
var
i,n: integer;
begin
n:=0;
for i:=1 to Length(s) do if UpCase(s[i]) in ['A','E','I','O','U','Y'] then n:=n+i;
SumVowelPos:=n
end;

Для русского языка нужно вместо UpCase использовать свою функцию.

Добавлено через 2 мин.
кстати, case можно записать короче:
case s[i] of
'а','е','и','о','у','ы','ю','э','я': summa:=summa+i;
end;

Добавлено через 8 мин.
Еще вариант - просто перечислить в условии мелкие буквы тоже:
  for i:=1 to Length(s) do
if s[i] in ['А','Е','И','О','У','Ы','Ю','Э','Я','а','е','и','о','у','ы','ю','э','я'] then
n:=n+i;


большое спасибо good.gif
marwell
не понимаю, в чем проблема, но программа все равно не хочет считать сумму номеров

function Rus(mes: string):string;
var i: integer;
begin
for i:=1 to length(mes) do
case mes [i] of
'А'..'п': mes[i]:=chr(Ord (mes [i])-64);
'р'..'я': mes[i]:=chr(ord (mes[i])-16);
end;
rus:=mes;
end;
var s:string;
i,summa:integer;
begin
write (rus('введите текст - '));
readln (s);
summa:=0;
for i:=1 to Length(s) do
if s[i] in ['А','Е','И','О','У','Ы','Ю','Э','Я','а','е','и','о','у','ы','ю','э','я'] then
summa:=summa+i;
writeln (rus('текст-" '),s,' "');
writeln (rus('сумма номеров='),summa);
readln;
end.
Выводит 0
Client
а что ты вводишь?
у меня для английских букв все нормально отработало
marwell
Цитата(Client @ 28.03.2010 11:48) *

а что ты вводишь?
у меня для английских букв все нормально отработало

я с русскими работаю
Client
ну сделай скрин того, что ты вводишь и прикрепи его.
volvo
Хитрый какой... То есть, для того, чтобы текст показывался в консоли нормально, ты догадался вызвать Rus, а то, что пользователь вводит ответ другой кодировке - не догадался? Либо делай обратное преобразование полученного от пользователя ответа, и потом, как ты делал - сравнивай посимвольно, либо так:

{ ...  }
var
alpha: string;

begin
write (rus('введите текст - '));
readln (s);
summa:=0;
alpha := rus('АЕИОУЫЮЭЯаеиоуыюэя');
for i:=1 to Length(s) do
if Pos(s[ i ], alpha) > 0 then summa:=summa+i;
writeln (rus('текст-" '),s,' "');
writeln (rus('сумма номеров='),summa);
readln;
end.
Понимаешь, что изменилось?
marwell
Цитата(volvo @ 28.03.2010 12:03) *

Хитрый какой... То есть, для того, чтобы текст показывался в консоли нормально, ты догадался вызвать Rus, а то, что пользователь вводит ответ другой кодировке - не догадался? Либо делай обратное преобразование полученного от пользователя ответа, и потом, как ты делал - сравнивай посимвольно, либо так:

{ ...  }
var
alpha: string;

begin
write (rus('введите текст - '));
readln (s);
summa:=0;
alpha := rus('АЕИОУЫЮЭЯаеиоуыюэя');
for i:=1 to Length(s) do
if Pos(s[ i ], alpha) > 0 then summa:=summa+i;
writeln (rus('текст-" '),s,' "');
writeln (rus('сумма номеров='),summa);
readln;
end.
Понимаешь, что изменилось?

понял! в моем варианте программа никак не могла найти заданные символы в веденной строке... не догодался еще раз использовать rus... спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.