Помогите пожалуйста решить задачу: Дана последовательность литер, имеющая следующий вид: +-d1+-d2+-d3+-dn(где di - цифра от 0 до 9). Последовательность заканчивается знаком "=". Вычислить значение алгебраической суммы. С чего надо начать? Я вообще не въезжаю Дотянул до последнего дня, ещё и спать охота...
Lapp
4.12.2009 4:29
Цитата(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
4.12.2009 6:01
Непонимаю... Там ещё массив должен быть? Или цикл for? Короче пока забью, всё равно щас не сделаю... может позже что придумаю.
Lapp
4.12.2009 6:10
Цитата(vovka239 @ 4.12.2009 2:01)
Там ещё массив должен быть? Или цикл for?
Нет, ни массива, ни for не нужно (вместо for я сделал while). Опиши переменные и добавь ввод самой строки с начальными данными. Ну и вывод результата, конечно.
andriano
4.12.2009 16:57
Цитата(vovka239 @ 4.12.2009 2:01)
Там ещё массив должен быть?
В данном случае массив символов - это строка. Другого массива не нужно.
vovka239
17.12.2009 14:09
Сори за столь долгое молчание в теме, задачу всё ещё не сделал, и петух клюнул в одно место по поводу кода:
Цитата
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
17.12.2009 14:58
Цитата(vovka239 @ 17.12.2009 10:09)
откуда взялось +-48? мне непонятно...
ASCII код символа 0 есть 48 ($30). Далее по порядку: 1 - 49, 2 - 50.. При переводе символа в цифру нужен пересчет.
vovka239
17.12.2009 16:45
Примерно так?
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
17.12.2009 16:55
Замени read(s[i]); на readLn(s[i]);
vovka239
17.12.2009 17:29
Всё-равно вылетает...
volvo
17.12.2009 18:11
Ничего не вылетает, если подумать, что ты хочешь ввести, и куда ты это пытаешься ввести. Убери 3 символа - все запустится...
andriano
17.12.2009 23:53
Цитата(Lapp @ 17.12.2009 10:58)
ASCII код символа 0 есть 48 ($30). Далее по порядку: 1 - 49, 2 - 50.. При переводе символа в цифру нужен пересчет.
Дабы не возникало лишних вопросов:
m:=m+(Ord(s[i+1])-Ord('0'))
Lapp
18.12.2009 6:55
Цитата(vovka239 @ 17.12.2009 13:29)
Всё-равно вылетает...
Поясняй, где, что, как и куда вылетает. -1
vovka239
22.12.2009 2:19
Цитата
Замени read(s[i]); на readLn(s[i]);
Заменил, всё-равно не пашет. Запускаю программу, Ввожу "+", жму интер, оно мне выдаёт 0, снова "+" или "-", интер и всё, закрывается...
Lapp
22.12.2009 9:31
Цитата(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
22.12.2009 16:32
Спасибо большое за помощь!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.