Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите найти ошибку, Pascal abc (http://www.tehnari.ru/f41/t52386/)

Zont 28.05.2011 21:35

Помогите найти ошибку, 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:

Vladimir_S 28.05.2011 21:48

Цитата:

Сообщение от Zont (Сообщение 528446)
Особенно надеюсь на Владимира :

Ну, Вы знаете, увидя ТАКУЮ аттестацию своей персоны, грех не откликнуться. Но сразу предупреждаю:
1. С Паскалем ABC дела никогда не имел и не собираюсь. Так что решить попробую в обычном Borland-Turbo Паскале. Если не устраивает - сообщите сразу.
2. Скорее всего, сегодня не получится - только завтра.
Да, и прошу прощения, что проигнорировал Ваше предыдущее обращение. Просто пробежав глазами текст и увидев слово "список", решил, что речь идет о динамических структурах, стеках и пр., а в этом я, увы не силен.

Zont 28.05.2011 21:53

Ох
Спасибо, что откликнулись (:
Ну у меня тут куча друзей кидают Вам "реши да напиши" на паскале. У всех у них тоже авс. Так что в принципе пишите на чем угодно, мне лишь бы суть понять, переделать под себя всегда смогу (:

Мне завтра надо сдавать готовый отчет по всем программам :(
Я просто более чем уверена, что тут дел на 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+ ...
надо КОЕ-ЧТО написать
и будет чудо (:

Vladimir_S 28.05.2011 22:02

Цитата:

Сообщение от Zont (Сообщение 528468)
Я просто более чем уверена, что тут дел на 2-5 мин.

Увы, я - нет. То есть совсем не уверен. И даже уверен в обратном.

Zont 28.05.2011 22:04

Ооох :(

Конечно же сейчас сама посижу еще.
Я не понимаю функцию (если это я вообще правильно называю) char
Если можете пояснить сейчас, то... (:

Если завтра ждать помощи, то во сколько?
В 11-12 дня я уезжаю в универ.

Zont 28.05.2011 22:21

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

Vladimir_S 28.05.2011 22:59

А потестируйте:
Код:

program az;
var
 s1,s2:String;
 s:Array[1..255] of Char;
 i,i1,i2,j,N:Byte;
 ch:Char;
BEGIN
 writeln ('Введите строку:');
 readln(s1);
 N:=0;
 i:=0;
 i1:=0;
 i2:=0;
 Repeat
  Inc(i);
  If (i>1) and (s1[i-1]<>'-') and (s1[i]='-') then i1:=Ord(s1[i-1]);
  If (i>1) and (s1[i-1]='-') and (s1[i]<>'-') then i2:=Ord(s1[i]);
  If (i1>0) and (i2>0) then
  begin
    for j:=i1 to i2 do
    s[N+j+1-i1]:=Chr(j);
    Inc(N,(i2-i1+1));
    i1:=0;
    i2:=0;
  end;
 Until i=Length(s1);
 s2:=s;
 Writeln(s2);
 Readln;
END.


Zont 28.05.2011 23:52

Во-первых, Владимир, хочу сказать большое спасибо, что все-таки отозвались и потратили на меня свое время.

Во-вторых, программа выдает много ошибок о неправильном присвоении типов. Я пыталась изменить. Но в любом случае Ваш вариант слишком сложен для меня. ( в плане сложности решения)

Я видать эту тему проболела.
Поэтому признаюсь честно, что не понимаю.

Мало ли кому пригодится, потом кину сюда конечную программу.

Еще раз спасибо, прям правда очень приятно, что уделили мне время (:

Vladimir_S 29.05.2011 09:05

Цитата:

Сообщение от Zont (Сообщение 528528)
Во-первых, Владимир, хочу сказать большое спасибо, что все-таки отозвались и потратили на меня свое время.

Да не за что.
Цитата:

Во-вторых, программа выдает много ошибок о неправильном присвоении типов. Я пыталась изменить.
Какая из программ? Моя? Если так, то это как раз то, о чем я предупреждал: заморочки версий Паскаля. Естественно, перед выкладыванием программа была мною тщательно отлажена и оттестирована. У меня она работает безупречно.
А всё-таки - в каком конкретно месте ругается?
Цитата:

Но в любом случае Ваш вариант слишком сложен для меня. ( в плане сложности решения)
На самом деле - абсолютно ничего сложного там нет. Программа существенно проще Вашей. Сейчас объясню.
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];
Это должно пройти полюбому.
Программа обрабатывает и более сложные исходные строки, как и велено. По тому же алгоритму.
Цитата:

Я видать эту тему проболела.
Сочувствую.
Цитата:

Поэтому признаюсь честно, что не понимаю.
Ну, надеюсь, что после вышеприведенных объяснений разберетесь.
Цитата:

Мало ли кому пригодится, потом кину сюда конечную программу.
Давайте.
Цитата:

Еще раз спасибо, прям правда очень приятно, что уделили мне время (:
Еще раз - не за что.

Zont 31.05.2011 16:26

Не ожидала, что Вы ответите в 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.