Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 28.05.2011, 21:35   #1 (permalink)
Zont
Member
 
Регистрация: 23.05.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Помогите найти ошибку, 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.


Я так понимаю, что я неправильно задаю функцию.
А как изменить не знаю.
Помогите пожалуйста.
Особенно надеюсь на Владимира :
Zont вне форума   Ответить с цитированием

Старый 28.05.2011, 21:35
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Ваша проблема будет решаться значительно легче, если ознакомиться с похожими темами

Помогите найти ошибку в программе
Задача на массивы, Pascal. Помогите найти ошибку
Помогите найти ошибку
Не могу найти ошибку в программе. Паскаль

Старый 28.05.2011, 21:48   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Zont Посмотреть сообщение
Особенно надеюсь на Владимира :
Ну, Вы знаете, увидя ТАКУЮ аттестацию своей персоны, грех не откликнуться. Но сразу предупреждаю:
1. С Паскалем ABC дела никогда не имел и не собираюсь. Так что решить попробую в обычном Borland-Turbo Паскале. Если не устраивает - сообщите сразу.
2. Скорее всего, сегодня не получится - только завтра.
Да, и прошу прощения, что проигнорировал Ваше предыдущее обращение. Просто пробежав глазами текст и увидев слово "список", решил, что речь идет о динамических структурах, стеках и пр., а в этом я, увы не силен.
Vladimir_S вне форума   Ответить с цитированием
Старый 28.05.2011, 21:53   #3 (permalink)
Zont
Member
 
Регистрация: 23.05.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Мне завтра надо сдавать готовый отчет по всем программам
Я просто более чем уверена, что тут дел на 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+ ...
надо КОЕ-ЧТО написать
и будет чудо (:
Zont вне форума   Ответить с цитированием
Старый 28.05.2011, 22:02   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Zont Посмотреть сообщение
Я просто более чем уверена, что тут дел на 2-5 мин.
Увы, я - нет. То есть совсем не уверен. И даже уверен в обратном.
Vladimir_S вне форума   Ответить с цитированием
Старый 28.05.2011, 22:04   #5 (permalink)
Zont
Member
 
Регистрация: 23.05.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Ооох

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

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 28.05.2011, 22:21   #6 (permalink)
Zont
Member
 
Регистрация: 23.05.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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.

У меня стало выводить точку О_О ура
Zont вне форума   Ответить с цитированием
Старый 28.05.2011, 22:59   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

А потестируйте:
Код:
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.
Vladimir_S вне форума   Ответить с цитированием
Старый 28.05.2011, 23:52   #8 (permalink)
Zont
Member
 
Регистрация: 23.05.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

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

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

Еще раз спасибо, прям правда очень приятно, что уделили мне время (:
Zont вне форума   Ответить с цитированием
Старый 29.05.2011, 09:05   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Zont Посмотреть сообщение
Во-первых, Владимир, хочу сказать большое спасибо, что все-таки отозвались и потратили на меня свое время.
Да не за что.
Цитата:
Во-вторых, программа выдает много ошибок о неправильном присвоении типов. Я пыталась изменить.
Какая из программ? Моя? Если так, то это как раз то, о чем я предупреждал: заморочки версий Паскаля. Естественно, перед выкладыванием программа была мною тщательно отлажена и оттестирована. У меня она работает безупречно.
А всё-таки - в каком конкретно месте ругается?
Цитата:
Но в любом случае Ваш вариант слишком сложен для меня. ( в плане сложности решения)
На самом деле - абсолютно ничего сложного там нет. Программа существенно проще Вашей. Сейчас объясню.
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];
Это должно пройти полюбому.
Программа обрабатывает и более сложные исходные строки, как и велено. По тому же алгоритму.
Цитата:
Я видать эту тему проболела.
Сочувствую.
Цитата:
Поэтому признаюсь честно, что не понимаю.
Ну, надеюсь, что после вышеприведенных объяснений разберетесь.
Цитата:
Мало ли кому пригодится, потом кину сюда конечную программу.
Давайте.
Цитата:
Еще раз спасибо, прям правда очень приятно, что уделили мне время (:
Еще раз - не за что.
Vladimir_S вне форума   Ответить с цитированием
Старый 31.05.2011, 16:26   #10 (permalink)
Zont
Member
 
Регистрация: 23.05.2011
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Вот программа, полностью соответствует Вашим объяснениям, но без массива.
Надеюсь кому-нибудь пригодится.
Zont вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 13:24.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.