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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2015, 19:24   #1
gabach
Пользователь
 
Регистрация: 23.12.2014
Сообщений: 14
По умолчанию Работа со строками Delphi

Из первых и последних букв слов сформировать массив букв и отсортировать по алфавиту. Вывести исходную строку, преобразованную, массив букв и отсортированный массив букв.
Подскажите, где ошибка в сортировке

Код:
Program Stroki;
{$APPTYPE CONSOLE}

uses
  SysUtils;
const
alph='АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя';

function Rus(S:String) :String;
var i:byte;
begin
  Result:='';
  For i:=1 to Length(S) do
    case S[i] of
 'А'..'п': Result:=Result+Chr(Ord(S[i])-64);
 'р'..'я': Result:=Result+Chr(Ord(S[i])-16);
 'Ё': Result:=Result+Chr(240);
 'ё': Result:=Result+Chr(241);
  else
    Result:=Result+S[i];
  end;
end;

Type MShStr=array[1..100] of ShortString;
     TMBukv=array[1..200] of String[1];
var st:ShortString;
    n,k:byte;
    MSlov:MShStr;
    MBukv:TMBukv;

//Ввод и вывод(Процедура)
procedure VvodVivod(var Str:ShortString);
begin
writeln(rus('Введите строку:')); readln(str);
writeln;
writeln(rus('Введёная строка:'));writeln(str);
writeln;
end;

//удаление лишних пробелов(Процедура)
procedure DelProb(var Str:ShortString);
var k:byte;
begin
if str[Length(str)]<>' ' then
str:=str+' ';
k:=pos('  ',str);
while k<>0 do
  begin
    delete(str,k,1);
    k:=pos('  ',str);
  end;
if str[1]=' ' then delete(str,1,1);//удалить пробел в начале строки
writeln(rus('Результат:'));
if length(str)<>0 then writeln(str)
else writeln(rus('Строка содержала только пробелы'));
end;

//Выделение слов и вывод массива(Процедура)
procedure VidSlov(var Str:ShortString; out MSlov1:MShStr;var n:byte);
Var i:byte;
begin
n:=0;
while pos(' ',str)>0 do
  begin
    n:=n+1;
    MSlov1[n]:=copy(str,1,pos(' ',str)-1);
    delete(str,1,pos(' ',str));
  end;
writeln;
if n<>0 then begin
Writeln(rus('Массив слов:'));
for i:=1 to n do
writeln(MSlov1[i]);
end;
writeln;
end;

//Выделение букв в массив
procedure VidBukv(var MSlov1:MShStr; out MBukv1:TMBukv; var n:byte;out k:byte);
var strx:ShortString; i:byte;
begin
  Writeln(Rus('Массив букв:'));
  strx:='';
  for i:= 1 to n do
    begin
     if length(MSlov[i])>1
     then
        strx:=strx+Copy(MSlov1[i],1,1)+Copy(MSlov1[i],length(MSlov[i]),1)
     else
        strx:=strx+Copy(MSlov1[i],1,1);
    end;
  k:=0;
  for i:=1 to length(strx) do
  begin
    MBukv1[i]:=copy(strx,i,1);
    k:=k+1;
  end;
  for i:=1 to k do write(MBukv1[i],' ');
end;

//Процедура для сортировки массива букв
procedure Sort(var MBukv1:TMBukv; k:byte);
var a:String[1];i,j:byte;
Begin
    for i:=1 to k-1 do
    for j:=1 to k-1 do
    if pos(MBukv1[j],alph)>pos(MBukv1[j+1],alph) then
    begin
      a:=MBukv1[j];
      MBukv1[j]:=MBukv1[j+1];
      MBukv1[j+1]:=a;
    end;
  writeln;
  writeln(Rus('Отсортированный массив букв: '));
  for i:=1 to k do write(MBukv1[i],' ');
  writeln;
End;

//Основная программа
begin
VvodVivod(St);
DelProb(St);
VidSlov(St,MSlov,n);
VidBukv(MSlov,MBukv,n,k);
Sort(MBukv,k);
readln;
end.
gabach вне форума Ответить с цитированием
Старый 14.01.2015, 20:17   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,871
По умолчанию

вот, всё работает!
Код:
Program Stroki;
{$APPTYPE CONSOLE}

uses
  SysUtils;
const
alph='ÀàÁáÂâÃãÄäÅå¨¸ÆæÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖö×÷ØøÙùÚúÛûÜüÝýÞþßÿ';

function Rus(S:String) :String;
var i:byte;
begin
  Result:='';
  For i:=1 to Length(S) do
    case S[i] of
 'À'..'ï': Result:=Result+Chr(Ord(S[i])-64);
 'ð'..'ÿ': Result:=Result+Chr(Ord(S[i])-16);
 '¨': Result:=Result+Chr(240);
 '¸': Result:=Result+Chr(241);
  else
    Result:=Result+S[i];
  end;
end;

Type MShStr=array[1..100] of ShortString;
     TMBukv=array[1..200] of Char;
var st:ShortString;
    n,k:byte;
    MSlov:MShStr;
    MBukv:TMBukv;

//Ââîä è âûâîä(Ïðîöåäóðà)
procedure VvodVivod(var Str:ShortString);
begin
writeln(rus('Ââåäèòå ñòðîêó:')); readln(str);
writeln;
writeln(rus('Ââåä¸íàÿ ñòðîêà:'));writeln(str);
writeln;
end;

//óäàëåíèå ëèøíèõ ïðîáåëîâ(Ïðîöåäóðà)
procedure DelProb(var Str:ShortString);
var k:byte;
begin
if str[Length(str)]<>' ' then
str:=str+' ';
k:=pos('  ',str);
while k<>0 do
  begin
    delete(str,k,1);
    k:=pos('  ',str);
  end;
if str[1]=' ' then delete(str,1,1);//óäàëèòü ïðîáåë â íà÷àëå ñòðîêè
writeln(rus('Ðåçóëüòàò:'));
if length(str)<>0 then writeln(str)
else writeln(rus('Ñòðîêà ñîäåðæàëà òîëüêî ïðîáåëû'));
end;

//Âûäåëåíèå ñëîâ è âûâîä ìàññèâà(Ïðîöåäóðà)
procedure VidSlov(var Str:ShortString; out MSlov1:MShStr;var n:byte);
Var i:byte;
begin
n:=0;
while pos(' ',str)>0 do
  begin
    n:=n+1;
    MSlov1[n]:=copy(str,1,pos(' ',str)-1);
    delete(str,1,pos(' ',str));
  end;
writeln;
if n<>0 then begin
Writeln(rus('Ìàññèâ ñëîâ:'));
for i:=1 to n do
writeln(MSlov1[i]);
end;
writeln;
end;

//Âûäåëåíèå áóêâ â ìàññèâ
procedure VidBukv(var MSlov1:MShStr; out MBukv1:TMBukv; var n:byte;out k:byte);
var strx:ShortString; i:byte;
begin
  Writeln(Rus('Ìàññèâ áóêâ:'));
  strx:='';
  for i:= 1 to n do
    begin
     if length(MSlov[i])>1
     then
        strx:=strx+Copy(MSlov1[i],1,1)+Copy(MSlov1[i],length(MSlov[i]),1)
     else
        strx:=strx+Copy(MSlov1[i],1,1);
    end;
  k:=0;
  for i:=1 to length(strx) do
  begin
    MBukv1[i]:=copy(strx,i,1)[1];
    k:=k+1;
  end;
  for i:=1 to k do write(MBukv1[i],' ');
end;

//Ïðîöåäóðà äëÿ ñîðòèðîâêè ìàññèâà áóêâ
procedure Sort(var MBukv1:TMBukv; k:byte);
var a:String[1];i,j,m:byte;
Begin
    for m:=1 to k-1 do
    for i:=1 to k-1 do
    for j:=1 to k-1 do
    if ord(Char(MBukv1[j])) >ord(Char(MBukv1[j+1])) then
    begin
      a:=MBukv1[j];
      MBukv1[j]:=MBukv1[j+1];
      MBukv1[j+1]:=a[1];
    end;
  writeln;
  writeln(Rus('Îòñîðòèðîâàííûé ìàññèâ áóêâ: '));
  for i:=1 to k do write(MBukv1[i],' ');
  writeln;
End;

//Îñíîâíàÿ ïðîãðàììà
begin
VvodVivod(St);
DelProb(St);
VidSlov(St,MSlov,n);
VidBukv(MSlov,MBukv,n,k);
Sort(MBukv,k);
readln;
end.
Изображения
Тип файла: jpg блок 1.JPG (27.4 Кб, 53 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 14.01.2015 в 20:22.
NetSpace вне форума Ответить с цитированием
Старый 14.01.2015, 20:26   #3
gabach
Пользователь
 
Регистрация: 23.12.2014
Сообщений: 14
По умолчанию

я имел ввиду, что он не сортирует должным образом, буквы не в алфавитном порядке расположены после сортировки, не понимаю почему
gabach вне форума Ответить с цитированием
Старый 14.01.2015, 20:26   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,871
По умолчанию

вот второй, удачный скриншот
Изображения
Тип файла: jpg блок 1.JPG (27.0 Кб, 48 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 14.01.2015, 20:27   #5
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,871
По умолчанию

у тебя в сортировке сравнение было по позиции буквы. буква П была первой - так первой и оставалась. лучше всего было сделать не по буквам, а по цифрам. я перевёл символы в код и цифры сравнивал. тип символьный str сделал str[1] - чтоб он был похож на Char; просмотри весь код - кое-что изменено!
MBukv1[i]:=copy(strx,i,1)[1];
TMBukv=array[1..200] of Char;
если помог - жми на весы
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 14.01.2015 в 20:32.
NetSpace вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками(Delphi) Neostat Помощь студентам 20 20.10.2014 07:33
работа со строками в Delphi Anton94.by Общие вопросы Delphi 17 04.05.2013 01:31
Delphi работа со строками Balloonatic Помощь студентам 6 09.07.2011 11:58
Работа со строками в Delphi alterius Помощь студентам 2 17.04.2011 01:55
работа со строками delphi fize Помощь студентам 22 07.01.2010 03:59