Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2009, 08:54   #1
Rid
Пользователь
 
Регистрация: 02.12.2008
Сообщений: 35
Злость Паскаль.Строки.

Ребят посмотрите пожалуйста код,не могу понять где ошибка!!!
вот задача!!!
Строки, занесение 1 строки в центр 2-ой, с помощью своей функции возвращения длины строки.
Код:
uses crt;

function leng(s:string):word;

var g:word;

begin
while s[g]<>#13 do inc(g);
leng:=g;
end;


procedure Center(s1:string;var s2:string; l:word);

var i,k:word;c:string;

begin
k:=leng(s2) div 2;
for i:=1 to l do begin
c[i]:=s2[i+k];
s2[i+k]:=s1[i];
s2[i+k+l]:=c[i];
end;
end;

var  s1,s2:string;
     l,i:word;

begin clrscr;
write('S1>');readln(s1);
write('S2>');readln(s2);
l:=leng(s1);
Center(s1,s2,l);
writeln;
for i:=1 to leng(s2)+l do write(s2[i]);
readkey;
end.

Последний раз редактировалось Rid; 12.12.2009 в 09:24.
Rid вне форума Ответить с цитированием
Старый 12.12.2009, 11:38   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1)
Цитата:
Код:
while s[g]<>#13 do inc(g);
откуда в вашей строчке возмётся символ перевода строки?!?! (код #13)?! Вы его туда сами добавите?!! Readln(s) НЕ ВСТАВЛЯЕТ в строку код #13

2) чем Вас стандартная функция Length не устраивает?!

3) в TurboPascal длина строки всегда хранится в НУЛЕВОМ байте строки:
Код:
  Readln(s);
 WriteLn('Длина строки = ',ord(S[0]));
4) ужас... а зачем код
Код:
for i:=1 to leng(s2)+l do write(s2[i]);
?!?!?!? чтобы вывести на экран строчку достаточно WriteLn(s2)
а Ваш код (если допустить, что leng(s2) работает и возвращает длину строки) попытается вылезти за границу строки - я про +l

5) а зачем в процеду Center передавать лишний параметер?!
l - судя по вашему коду - это длина первой строки. Не логичнее было бы её вычислять прямо в теле процедуры?!!


и вообще, задача решается ОДНОЙ строчкой:
Код:
  Insert(s1, s2, (length(s2) div 2)+1);
p.s. А это если Вам вдруг всё же надо процедуру сделать:
Код:
procedure Center(s1: string; var s2: string);
var k : integer;
begin
  k := length(s2) div 2;
  Insert(s1, s2, k+1)
end;

Последний раз редактировалось Serge_Bliznykov; 12.12.2009 в 11:56.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2009, 12:02   #3
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Код:
function leng(s:string):word;
var g:word;
begin
  g:=1;  s:=s+'.';
  while s[g]<>'.' do
    inc(g);
  leng:=g-1;
end;
А дальше мб воспользоватся процедурой Insert? У вас в задании говорится только использовать для определения длины, дальше то зачем велосипед изобретать? Тем более не рабочий.

Serge_Bliznykov опоздал У него в задании как раз написано что надо свою функцию определения строки написать, а вот про функцию вставить ничего не говорится.
Цитата:
с помощью своей функции возвращения длины строки.

Последний раз редактировалось dr.Chas; 12.12.2009 в 12:04.
dr.Chas вне форума Ответить с цитированием
Старый 12.12.2009, 14:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

dr.Chas
понятно. возможно. Тогда и Insert нельзя использовать, наверное... так же, как и Copy...

Если уж на то пошло, тогда лучше вообще не пользоваться типом string (которого, кстати, в ANSI Pascal не было, это Борланд его добавил) и реализовывать всё через array[1..255] of char;

да там и процедура Center всё равно не рабочая! Там надо длину строки C ручками задавать! или, хотя бы вначале сделать c:= s1+s2; а потом уже мутить с копированием строчек...

Последний раз редактировалось Serge_Bliznykov; 12.12.2009 в 14:32.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2009, 14:33   #5
IT-man
АльTRUEи$т
Форумчанин
 
Аватар для IT-man
 
Регистрация: 19.03.2009
Сообщений: 784
По умолчанию

Цитата:
s:=s+'.'
А если там уже точка есть - хотя бы в конце==> уже на 1 символ строка короче будет!
Цитата:
«Никто не войдет в Рай, имея хотя бы крупицу гордыни в своем сердце». «Аллах Красив и любит красоту. Гордыня означает отказ от истины и высокомерие»
IT-man вне форума Ответить с цитированием
Старый 12.12.2009, 14:58   #6
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Serge_Bliznykov, если отталкиваться от приведённого задания то вроде как ни чего не запрещено кроме length. А так конечно многое зависит от преподавателя, как он хочет это видеть. Ну а в центр вставить, например можно так сделать цикл до конца строки, которую мы уже определили И проверять i<>(длина строки div 2) собирать новую строку, как равна, добавляем туда наше слово, и опять дальше собираем строку.

IT-man, ну да надо бы заменить на другой какой-нибудь символ, который не встречается в текстах.
dr.Chas вне форума Ответить с цитированием
Старый 12.12.2009, 15:09   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да. с точкой согласен. косяк. Тогда уж лучше прибавлять и #0 искать. (хотя и нулевой байт тоже допускается в строчках, но вероятность его наличия НАМНОГО меньше и в данной задаче ею можно пренебречь!)

а что касается по сути задания. Я никогда не понимал подобные искуственные ограничения.
и повторяю. Либо уж совсем запретить тип string и полностью требовать реализации на array[..] of char
либо, кто мне запретит написать так:
Код:
function Leng(ss:string):integer;
begin
  Leng := ord(ss[0]);
end;
функция своя? да! 100% рабочая? точно! Какие ещё вопросы?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.12.2009, 21:30   #8
Rid
Пользователь
 
Регистрация: 02.12.2008
Сообщений: 35
По умолчанию

Угу,спс учел свои не доработки!!!
А центр я использовал по заданию,чтобы в центр второй строки, вставить 1-ю,а за writeln спасибо недопер=)

еще один вопрос:
Type string1=array[-1..1024] of char;
{первые два байта содержат динамическую длину строки}

как понять динамическую длину строки 1ые - 2 байта,то есть -1 и 0 элемент, содержат длину строки????
Rid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание строки неограниченной длины (Си) 0kopok Помощь студентам 6 05.10.2009 20:46
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
Строки. Как вывести часть строки? Anfall Общие вопросы Delphi 7 26.02.2009 09:10
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27