Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
vovka239
Помогите пожалуйста решить задачу:
Дана последовательность литер, имеющая следующий вид: +-d1+-d2+-d3+-dn(где di - цифра от 0 до
9). Последовательность заканчивается знаком "=". Вычислить значение алгебраической суммы.
С чего надо начать? Я вообще не въезжаю smile.gif Дотянул до последнего дня, ещё и спать охота...
Lapp
Цитата(vovka239 @ 3.12.2009 21:57) *
С чего надо начать?
Просматриваешь строку в цикле. Нечетный символ - знак (+, - или =). Четный - цифра. По ходу вычисляешь сумму.


Добавлено через 9 мин.
Что-то типо так:
m:=0;
i:=1;
while (i<=Length(s))and(s[i]<>'=') do begin
if s[i]='+' then m:=m+Ord(s[i+1])-48 else m:=m-Ord(s[i+1])+48;
i:=i+2
end;

vovka239
Непонимаю...
Там ещё массив должен быть? Или цикл for?
Короче пока забью, всё равно щас не сделаю... может позже что придумаю.
Lapp
Цитата(vovka239 @ 4.12.2009 2:01) *
Там ещё массив должен быть? Или цикл for?
Нет, ни массива, ни for не нужно (вместо for я сделал while). Опиши переменные и добавь ввод самой строки с начальными данными. Ну и вывод результата, конечно.
andriano
Цитата(vovka239 @ 4.12.2009 2:01) *
Там ещё массив должен быть?
В данном случае массив символов - это строка. Другого массива не нужно.
vovka239
Сори за столь долгое молчание в теме, задачу всё ещё не сделал, и петух клюнул в одно место smile.gif
по поводу кода:
Цитата
m:=0;
i:=1;
while (i<=Length(s))and(s[i]<>'=') do begin
if s[i]='+' then m:=m+Ord(s[i+1])-48 else m:=m-Ord(s[i+1])+48;
i:=i+2
end;

откуда взялось +-48? мне непонятно...
Lapp
Цитата(vovka239 @ 17.12.2009 10:09) *
откуда взялось +-48? мне непонятно...

ASCII код символа 0 есть 48 ($30). Далее по порядку: 1 - 49, 2 - 50.. При переводе символа в цифру нужен пересчет.
vovka239
Примерно так?
program Project2;

uses
SysUtils;
var
m:integer;
i:integer;
s:string;
begin
m:=0;
i:=1;
writeln('Vvedite s');
read(s[i]);
begin
while (i<=Length(s))and(s[i]<>'=') do begin
if s[i]='+' then m:=m+Ord(s[i+1])-48 else m:=m-Ord(s[i+1])+48;
i:=i+2;
end ;
Writeln(m);
readln;
end;
end.

А почему у меня не выводится результат, а просто вылетает программа? Ведь readln прописал как положено вроде.
Lapp
Замени
read(s[i]);
на
readLn(s[i]);
vovka239
Всё-равно вылетает... glare.gif
volvo
Ничего не вылетает, если подумать, что ты хочешь ввести, и куда ты это пытаешься ввести. Убери 3 символа - все запустится...
andriano
Цитата(Lapp @ 17.12.2009 10:58) *
ASCII код символа 0 есть 48 ($30). Далее по порядку: 1 - 49, 2 - 50.. При переводе символа в цифру нужен пересчет.
Дабы не возникало лишних вопросов:
m:=m+(Ord(s[i+1])-Ord('0'))
Lapp
Цитата(vovka239 @ 17.12.2009 13:29) *
Всё-равно вылетает... glare.gif
Поясняй, где, что, как и куда вылетает.
-1
vovka239
Цитата
Замени
read(s[i]);
на
readLn(s[i]);

Заменил, всё-равно не пашет. Запускаю программу, Ввожу "+", жму интер, оно мне выдаёт 0, снова "+" или "-", интер и всё, закрывается...
Lapp
Цитата(vovka239 @ 21.12.2009 22:19) *
Заменил, всё-равно не пашет. Запускаю программу, Ввожу "+", жму интер, оно мне выдаёт 0, снова "+" или "-", интер и всё, закрывается...

Моя ошибка, извини. Я не заметил, что ты читаешь посимвольно. Нужно не
ReadLn(s[i]);
, а вот так:
ReadLn(s);
- то есть ты должен читать всю строку сразу, а не по одному символу.

Теперь твои ошибки.. Одну уже сказал, вторая, видимо, вытекает из нее. При вводе нужно набирать всю строку - энтер нужно нажимать один раз в самом конце строки (и еще один раз после вывода результата). То есть ты вводишь:

+2+5-4+3-1= (и жмешь энтер)

Получаешь:

5

Жмешь энтер еще раз, чтобы выйти из проги.

Строка всегда должна начинаться со знака (+ или -), содержать только однозначные числа и заканчиваться знаком "=".

Вот тебе на всякий случай полный код, без излишеств и правильно отформатированный.
program Project2;
var
i,m: integer;
s: string;
begin
m:=0;
i:=1;
Write('Vvedite s: ');
ReadLn(s);
while (i<=Length(s))and(s[i]<>'=') do begin
if s[i]='+' then m:=m+Ord(s[i+1])-48 else m:=m-Ord(s[i+1])+48;
i:=i+2;
end ;
Writeln(m);
readln;
end.

Успехов.
vovka239
Спасибо большое за помощь!!! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.