Помогите найти ошибку, Pascal abc
Я уже просила помощи, но так никто и не откликнулся.
Оказалось, что программа не так трудна как кажется. Задание: Напишите функцию, превращающую сокращенную запись вида a-z в строке s1 в эквивалентный полный список abcd..xyz в s2. Допускаются буквы на двух регистрах и цифры. Учесть варианты a-b-c,a-z0-9; Начальные или конечные символы "-" воспринимаются буквально. Программа: program az; var s, s1, s2:String; i:Integer; ch:Char; begin writeln ('Введите строку:'); readln (s1); s2:=s[1]; for i:=2 to length(s)-1 do begin if s[i]='' then begin for ch:=#0 to #255 do begin if s2=s1+s[i] then s1:=s2+s[i]; writeln (s2 ); end; end;end; end. Я так понимаю, что я неправильно задаю функцию. А как изменить не знаю. Помогите пожалуйста. Особенно надеюсь на Владимира ::tehnari_ru_109: |
Цитата:
1. С Паскалем ABC дела никогда не имел и не собираюсь. Так что решить попробую в обычном Borland-Turbo Паскале. Если не устраивает - сообщите сразу. 2. Скорее всего, сегодня не получится - только завтра. Да, и прошу прощения, что проигнорировал Ваше предыдущее обращение. Просто пробежав глазами текст и увидев слово "список", решил, что речь идет о динамических структурах, стеках и пр., а в этом я, увы не силен. |
Ох
Спасибо, что откликнулись (: Ну у меня тут куча друзей кидают Вам "реши да напиши" на паскале. У всех у них тоже авс. Так что в принципе пишите на чем угодно, мне лишь бы суть понять, переделать под себя всегда смогу (: Мне завтра надо сдавать готовый отчет по всем программам :( Я просто более чем уверена, что тут дел на 2-5 мин. Препод придрался к for ch:=#0 to #255 do begin if s2=s1+s[i] then s1:=s2+s[i]; writeln (s2 ); end; Он сказал, что на месте ch:= ... to ... do и s2:=s1+ ... надо КОЕ-ЧТО написать и будет чудо (: |
Цитата:
|
Ооох :(
Конечно же сейчас сама посижу еще. Я не понимаю функцию (если это я вообще правильно называю) char Если можете пояснить сейчас, то... (: Если завтра ждать помощи, то во сколько? В 11-12 дня я уезжаю в универ. |
program az;
var s, s1, s2:String; i:Integer; ch:Char; begin writeln ('Ââåäèòå ñòðîêó:'); readln (s); s2:=s[1]; for i:=2 to length(s)-1 do begin if s[i]='-' then for ch:=chr(i) to succ(s[i]) do s2:=s1+ch else s1:=s2+s[i]; writeln (s2); end; end. У меня стало выводить точку О_О ура :D |
А потестируйте:
Код:
program az; |
Во-первых, Владимир, хочу сказать большое спасибо, что все-таки отозвались и потратили на меня свое время.
Во-вторых, программа выдает много ошибок о неправильном присвоении типов. Я пыталась изменить. Но в любом случае Ваш вариант слишком сложен для меня. ( в плане сложности решения) Я видать эту тему проболела. Поэтому признаюсь честно, что не понимаю. Мало ли кому пригодится, потом кину сюда конечную программу. Еще раз спасибо, прям правда очень приятно, что уделили мне время (: |
Цитата:
Цитата:
А всё-таки - в каком конкретно месте ругается? Цитата:
1. Вводится строка вида А-В, где под А и В понимаются не собственно буквы, а некие символы, например С-М или 3-7. Пока ограничимся рассмотрением простейшей цепочки. 2. Осуществляется посимвольный перебор введенной строки s1. Если встречается комбинация вида "А-", то есть i-тый сивол есть "-", а предыдущий таковым не является, то переменной i1 присваивается значение кода символа А из кодовой таблицы. Если комбинация "-В", то переменной i2 присваивается значение кода символа В. Таким образом, если как i1, так и i2 оказываются ненулевыми, то это значит, что обработана последовательность вида А-В. 3. В символьный массив s заносится цепочка символов, коды которых лежат в интервале от кода А до кода В, включая сами А и В. Длина цепочки N увеличивается на количество введенных в массив символов. 4. Строковой переменной s2 присваивается значение массива s. Вот тут, как я подозреваю, транслятор и может "взбрыкнуть". Если так, то замените строку s2:=s; строками s2:=''; For i:=1 to N do s2:=s2+s[i]; Это должно пройти полюбому. Программа обрабатывает и более сложные исходные строки, как и велено. По тому же алгоритму. Цитата:
Цитата:
Цитата:
Цитата:
|
Не ожидала, что Вы ответите в 8 утра! $%
И очень обидно, что не прочитала Ваши пояснения. То, что мне и нужно было. program az; var s, s2:String; i:Integer; ch:Char; begin writeln ('введите строку:'); readln (s); s2:=s[1]; for i:=2 to length(s)-1 do if s[i]='-' then for ch:=succ(S[i-1]) to pred(S[i+1]) do s2:=s2+ch else s:=s2; s2:=s2+S[i+1]; writeln (s2); end. Вот программа, полностью соответствует Вашим объяснениям, но без массива. Надеюсь кому-нибудь пригодится. :tehnari_ru_1019: |
Часовой пояс GMT +4, время: 03:29. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.