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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2013, 21:59   #1
igagogi
Пользователь
 
Регистрация: 23.12.2012
Сообщений: 11
Радость Разработка алгоритма и кода для трех строковых функций.

Помогите пожалуйста, буду очень благодарен за любую помощь. Зарание спасибо.

Язык - Turbo Pascal.

Требуется разработать алгоритм и код для трех строковых функций, и объединить их в пользовательскую библиотеку (модуль - UNIT MyString). Необходимо также создать программу «тесты», обращающиеся к библиотеке для проверки работоспособности ваших функций при всех возможных вариантах исходных данных.

1) Функция - CHARSORT(C: STRING; N1, N2: BYTE; L: BOOLEAN): STRING - возвращает отсортированную строку C. N2 - номер позиции в C, с которой идет сортировка, а N1 - количество литер, которое необходимо сортировать. Сортировка по возрастанию L = TRUE, по убыванию L = FALSE.
2) Функция - CHARODD(C: STRING): STRING - возвращает строку, содержащую только нечетные символы строки C.
3) Функция - ISLOWER(C: STRING): BOOLEAN - возвращает TRUE, если первый символ строки С является символом нижнего регистра.
igagogi вне форума Ответить с цитированием
Старый 05.01.2013, 22:20   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,377
По умолчанию

Так, сходу:
3) Функция - ISLOWER(C: STRING): BOOLEAN - возвращает TRUE, если первый символ строки С является символом нижнего регистра.
Код:
Function IsLower(C : String): Boolean;
begin
   if (Length(C) <> 0) then
      If (C[1] <> Upper(C[1])) then
         IsLower = true
      Else
         IsLower = false;
end;
2) Функция - CHARODD(C: STRING): STRING - возвращает строку, содержащую только нечетные символы строки C.
Код:
Function CharOdd(C : String): String;
   var i : integer;
begin
   if (Length(C) <> 0) then
      for i := 1 to Length(C) do
         if ((i mod 2) <> 0) then
            CharOdd[i] := C[i];
end;

как-то так ...
Как-то так, ...
ViktorR на форуме Ответить с цитированием
Старый 05.01.2013, 22:38   #3
igagogi
Пользователь
 
Регистрация: 23.12.2012
Сообщений: 11
По умолчанию

Спасибо большо за помощь, вот еще хотел узнать, как объединить их в пользовательскую библиотеку (модуль - UNIT MyString).
igagogi вне форума Ответить с цитированием
Старый 05.01.2013, 23:49   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Некоторые исправления и дополнения:
Код:
Function IsLower(C : String): Boolean;
begin
   if (Length(C) <> 0) then
     IsLower := C[1] in ['a'..'z']// вписать все нужные буквы
  else
     IsLower := false;
end;
Код:
Function CharOdd(C : String): String;
   var i : integer;
begin
  CharOdd := '';
  i:=1;
 while i <= Length(C) do 
  begin
    CharOdd  := CharOdd  + C[i];
    inc(i, 2);
  end;
end;
http://www.pascal.helpov.net/index/p...es_programming
Цитата:
Пример модуля Паскаля
Код:
Unit complexn; 
{--------------------------------} 
Interface 
Type 
Complex= record 
   Re, im: real; 
End; 
Procedure AddC(x,y: complex, var z: complex); 
{---------------------------------} 
Implementation 
   Procedure AddC; 
      z.re:= x.re + y.re; 
      z.im:= x.im + y.im; 
   end ; 
end .
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.01.2013, 00:57   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
Function CharOdd(C : String): String;
    CharOdd  := CharOdd  + C[i];
BDA, так нельзя! Паскаль откажется компилировать, ибо увидит рекурсивный вызов (причём неверный).


нужно сделать так:
Код:
Function CharOdd(C : String): String;
var i : integer;
  rez : string;
begin
  rez := '';
  i:=1;
  while i <= Length(C) do
  begin
    rez  := rez  + C[i];
    inc(i, 2);
  end;
  CharOdd := rez
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.01.2013, 01:07   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Serge_Bliznykov, Вы правы. Спасибо. Уже не первый раз пишу так
(но когда пишешь в ide, то сразу исправляешь).

Update Вспомнил, что тестировал.
http://ideone.com/TwZoW4
Т.е. pascal (fpc) "спокойно" компилирует (классический Турбо Паскаль не скомпилировал бы).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 06.01.2013 в 01:41.
BDA вне форума Ответить с цитированием
Старый 06.01.2013, 04:20   #7
igagogi
Пользователь
 
Регистрация: 23.12.2012
Сообщений: 11
По умолчанию

Поправьте пожалуйста, если что не так, я новичек в этом и че-то весь запутался. Как то она у меня не работает, делал по похожему примеру.

Вот модуль:
Код:
unit modul1;
interface
uses crt;
var i,j,n,a:integer;
    c:string;
    n1,n2:byte;
    l:boolean;
function CHARSORT(C: STRING; N1, N2: BYTE; L: BOOLEAN): STRING;
function CHARODD(C: STRING): STRING;
function ISLOWER(C: STRING): BOOLEAN;
implementation
function CHARSORT(C: STRING; N1, N2: BYTE; L: BOOLEAN): STRING;
var i,j:integer;
    res:string;
    temp:char;
begin
 res:=c;
if L then begin
            for i:=n2+1 to n1+n2-1 do
             for j:=n1+n2-1 downto i do
                if res[j]<res[j-1] then
                 begin
                  temp:=res[j];
                  res[j]:=res[j-1];
                  res[j-1]:=temp;
                 end;
          end
   else begin
          begin
            for i:=n2+1 to n1+n2-1 do
             for j:=n1+n2-1 downto i do
                if res[j]>res[j-1] then
                 begin
                  temp:=res[j];
                  res[j]:=res[j-1];
                  res[j-1]:=temp;
                 end;
          end
        end;
Charsort:=res;
end;

function CHARODD(C: STRING): STRING;
var i : integer;
  rez : string;
begin
  rez := '';
  i:=1;
  while i <= Length(C) do
  begin
    rez  := rez  + C[i];
    inc(i, 2);
  end;
  CharOdd := rez
end;

Function IsLower(C : String): Boolean;
begin
   if (Length(C) <> 0) then
      If (C[1] <> (C[1])) then
         IsLower := true
      Else
         IsLower := false;
end;
end.
Программа:
Код:
program pr;
uses crt, modul1;
var i,n:integer;
    c:string;
    l:boolean;
    n1,n2:byte;
begin
  repeat  writeln;writeln('vvedite nomer funcsiyi : 1 - CHARSORT,2 - CHARODD,3 - ISLOWER');
  readln(i);case i of
  1:CHARSORT(c,n1,n2,L);
  2:CHARODD(c);
  3:ISLOWER(c);
  end;if #27=readkey then break;
  until false;
end.
igagogi вне форума Ответить с цитированием
Старый 06.01.2013, 10:37   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,377
По умолчанию

Serge_Bliznykov, BDA - Спасибо Вам.
С утра прибежал исправляться, а тут за мной уже "подмели".

igagogi
Без деталей, так, сверху:
function CHARSORT - группа операторов после else дважды в операторных скобках.

Function IsLower - Условие надо вписать по одному из вариантов
If (C[1] <> UpCase(C[1])) then - НО это только для латиницы
а вариант BDA
if (Length(C) <> 0) then
IsLower := C[1] in ['a'..'z']// Тут можно и кириллицу указать
else
IsLower := false;
т.е. более предпочтительный.
Как-то так, ...
ViktorR на форуме Ответить с цитированием
Старый 06.01.2013, 12:54   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,377
По умолчанию

Переписывать все символы, включая и кириллические не очень удобный способ.
Вот вспомнил другой:
Код:
function UpSimv(a : char) : char; {в верхний регистр}
begin
   UpSimv := chr(Ord(a) AND $DF);
{как вариант c Ord('<символ пробела>') }
UpSimv := chr(Ord(a) - Ord(' '));
end;

function LoSimv(a : char) : char; {в нижний регистр}
begin
   LoSimv := chr(Ord(a) OR $20);
  {как вариант c Ord('<символ пробела>') }
   LoSimv := chr(Ord(a) + Ord(' '));
end;
Тогда можно:
Код:
Function IsLower(C : String): Boolean;
begin
   if (Length(C) <> 0) then
     IsLower := C[1] = LoSimv(C[1])
end;
Вроде того ...
Как-то так, ...
ViktorR на форуме Ответить с цитированием
Старый 06.01.2013, 13:18   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вот вспомнил другой
для русских букв (кириллицы) в Дос кодировке (она же OEM, она же 866) такой способ работать не будет.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка структуры данных, алгоритма, программы smurf Помощь студентам 0 23.10.2012 19:35
разработка алгоритма Shaggrath Помощь студентам 6 05.01.2012 10:57
Как избежать конфликта строковых функций? Trust_357 Visual C++ 2 09.04.2011 15:09
Разработка программ обработки символьных и строковых данных(блок-схема) Stellar_light Помощь студентам 0 27.12.2010 20:50
нужен аналог строковых функций DOS Общие вопросы C/C++ 4 05.01.2008 00:05