• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите найти ошибку, Pascal abc

  • Автор темы Автор темы Zont
  • Дата начала Дата начала

Zont

Новые
Регистрация
23 Май 2011
Сообщения
12
Реакции
0
Баллы
0
Помогите найти ошибку, 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='' then
begin
for ch:=#0 to #255 do
begin
if s2=s1+s then
s1:=s2+s;
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 then
s1:=s2+s;
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='-' then

for ch:=chr(i) to succ(s) do
s2:=s1+ch
else s1:=s2+s;
writeln (s2);
end;
end.

У меня стало выводить точку О_О ура :D
 
А потестируйте:
Код:
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.
 
Во-первых, Владимир, хочу сказать большое спасибо, что все-таки отозвались и потратили на меня свое время.

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

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

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

Еще раз спасибо, прям правда очень приятно, что уделили мне время (:
 
Во-первых, Владимир, хочу сказать большое спасибо, что все-таки отозвались и потратили на меня свое время.
Да не за что.
Во-вторых, программа выдает много ошибок о неправильном присвоении типов. Я пыталась изменить.
Какая из программ? Моя? Если так, то это как раз то, о чем я предупреждал: заморочки версий Паскаля. Естественно, перед выкладыванием программа была мною тщательно отлажена и оттестирована. У меня она работает безупречно.
А всё-таки - в каком конкретно месте ругается?
Но в любом случае Ваш вариант слишком сложен для меня. ( в плане сложности решения)
На самом деле - абсолютно ничего сложного там нет. Программа существенно проще Вашей. Сейчас объясню.
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;
Это должно пройти полюбому.
Программа обрабатывает и более сложные исходные строки, как и велено. По тому же алгоритму.
Я видать эту тему проболела.
Сочувствую.
Поэтому признаюсь честно, что не понимаю.
Ну, надеюсь, что после вышеприведенных объяснений разберетесь.
Мало ли кому пригодится, потом кину сюда конечную программу.
Давайте.
Еще раз спасибо, прям правда очень приятно, что уделили мне время (:
Еще раз - не за что.
 
Не ожидала, что Вы ответите в 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='-' 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:
 
Вот программа, полностью соответствует Вашим объяснениям, но без массива. Надеюсь кому-нибудь пригодится.
Хорошо сделано. Поздравляю. Правда... не до конца отлажено. Например, у Вас при обработке цепочек вида X-Y-Z средний символ просто выпадает. Но это легко поправимо.
 
Спасибо.

Такой вариант даже не рассматривала.
В принципе, не хотите рассказать, что именно необходимо подправить? (:
Чисто для себя интересно.
 
Спасибо.

Такой вариант даже не рассматривала.
В принципе, не хотите рассказать, что именно необходимо подправить? (:
Чисто для себя интересно.
Да пожалуйста! Просто Вы тут накрутили много лишнего. Меньше, правда, чем я в своём варианте, но всё же. Во всяком случае, функции Pred и Succ тут вовсе "ни к селу, ни к городу". Всё гораздо проще:
Код:
program az;
var
 s,s2,s3:String;
 i:Integer;
 ch:Char;
begin
 writeln ('введите строку:');
 readln (s);
 s2:='';
 for i:=2 to length(s)-1 do
  if s[i]='-' then
   begin
    s3:='';
    for ch:=S[i-1] to S[i+1] do s3:=s3+ch;
    s2:=s2+s3;
   end;
 writeln(s2);
 readln
end.
 
Хм...и правда.
Но может быть препод их потребовал, дабы удостовериться в знании этой темы.

ps теперь, когда случай x-y-z, выдает xyyz (:
 
У нас задача восполнить недостающий символ.
А если он будет восполняться таким образом, нарушая алфавит, что же в этом хорошего?)
Я думала будет выдавать "xyz", таким образом показывая, что нет пропущенного символа в ряду.

Спасибо, Владимир (:
 
Я думала будет выдавать "xyz", таким образом показывая, что нет пропущенного символа в ряду.
Гм... но тогда в чем смысл записи "y" в записи x-y-z? Такой ответ (xyz) получается при введении простого x-z. В общем, в условии некоторый туман IMHO.
 
Ну может быть.
Просто мало ли человек, который вводит ряд, не знает точный порядок символов, и соответственно программа должна ему выдать, что не было ошибки.

Короче не суть, все это доп. заморочки, все и так отлично (:
 
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='-' then
for ch:=succ(S[i-1]) to pred(S[i+1]) do
s2:=s2+ch
else s2:=s2+s;
s2:=s2+S[i+1];
writeln (s2);
end.

так правильнее
все варианты учитываются
a-b-c
a-g12345f-o-z
 
Назад
Сверху