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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2011, 11:28   #1
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию ФИО, работа со строками

Задали на писать программку, которая при вводе фамилии, имени, и отчества, выведет фамилию, пробел, первую букву имени, точку и первую букву отчества, точку.Но между ФИО есть до хрена пробелов.
програмку я на писал она рабочая :
Код:
program FIO;

var 
             s : string;
             i, k, j : Integer;

begin
             ReadLn (s);
             i :=  Pos ('  ', s);
             while i <> 0 do begin
                         j := 1 + 2;
                         while s [j] = '  ' do
                                         Inc (j);
                         Delete (s, i, j- i -1);
                         i := Pos ('  ', s);
            end;
            i := Pos (' ', s);
            Delete (s, i, 1);
            j := Pos (s, j, 1);
            Delete (s, j, 1);
            Delete (s, j + 1; Length (s));
            Insert ('.', s, j + 1);
            Delete (s, i + 1, j - i -1);
            Insert ('.',  s, i + 1);
            Insert (' ', s, i);
            WriteLn (s)
end.
вот НО сначала я удаляю пробел
Код:
  
            i := Pos (' ', s);
            Delete (s, i, 1);
а потом его всталяю
Код:
  
            Insert (' ', s, i);
Помогите избежать этого
Poma][a вне форума Ответить с цитированием
Старый 17.10.2011, 18:36   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
program FIO;

 function Trim(const S: string): string;
 var  I ,L : Integer;
 begin
   L := Length(S);
   I := 1;
   while (I <= L) and (S[I] <= ' ') do Inc(I);
   if I > L then Result := '' else
   begin
     while S[L] <= ' ' do Dec(L);
     Result := Copy(S, I, L - I + 1);
   end;
 end;

var 
  f,i,o: string;
begin
  writeln('familia ');readln(f);
  writeln('mane ');readln(i);
  writeln('bigname ');readln(o);

  i:=i+' '; o:=o+' ';
  f:=trim(f)+' '+i[1]+'.'+o[1]+'.';
  writeln(f);
end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 17.10.2011 в 18:44.
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 18:46   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Код:
program FIO;

 function Trim(const S: string): string;
 var  I ,L : Integer;
 begin
   L := Length(S);
   I := 1;
   while (I <= L) and (S[I] <= ' ') do Inc(I);
   if I > L then Result := '' else
   begin
     while S[L] <= ' ' do Dec(L);
     Result := Copy(S, I, L - I + 1);
   end;
 end;

var 
  f,i,o: string;
begin
  writeln('familia ');readln(f);
  writeln('mane ');readln(i);
  writeln('bigname ');readln(o);

  i:=i+' '; o:=o+' ';
  f:=trim(f)+' '+i[1]+'.'+o[1]+'.';
  writeln(f);
end.
спасибо, НО мне нужно ИМЕННО эту( МОЮ) программу только без удаления первого пробела ПОМОГИТЕ
Poma][a вне форума Ответить с цитированием
Старый 17.10.2011, 18:57   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
мне нужно ИМЕННО эту программу
Извините, но мне лучше написать свой код чем переписать чужую кашу.
--------
Давайте попробуем проанализировать:

Код:
 
 ReadLn (s); // ввод строки
 i :=  Pos ('  ', s); // ищем первый пробел
 while i <> 0 do   // если побел есть (в независимости от возможного ввод двойной фамилии типо Панкратов Чёрный, Ван Гог и.т.п Ваш цикл начинает маслать)
 begin
    j := 1 + 2; // j=3 всегда
    while s [j] = '  ' do Inc (j); // пока символ пробел (с 3-го по беконечность ) идёт счёт  ВОПРОС: тут не зацыкливается прога и не вылетает если J> длины ???
   Delete (s, i, j- i -1); // удалчем с И-го символа 3 или больше симолов (включая двойную фамилию)
   i := Pos ('  ', s); // ищем очередной символ "пробел"
 end;
// первая часть кода очень заманичива (((
 // не смотря на то что все пробелы удаляются вверху ищем пробел ещё раз 
  i := Pos (' ', s);
  Delete (s, i, 1); // в независимости i=0 или <>0 удаляем 1 символ (не вылетает если не пробелов)?
  j := Pos (s, j, 1); // тут я вообще не понял синтаксис 
  Delete (s, j, 1);   // и что удаляется
  
  Delete (s, j + 1; Length (s));  // непонятній синаксис
  Insert ('.', s, j + 1); // вставка 
  Delete (s, i + 1, j - i -1);
  Insert ('.',  s, i + 1);
  Insert (' ', s, i);
  WriteLn (s)
end.
и.т.п
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 19:07   #5
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
program Project1;
var
  fio,R : string;
  p,i   : integer;
begin
  writeln('familia name otchestvo ');readln(fio);
  // удаляем двойные пробелы
  while Pos('  ', fio)>0 do
  delete(fio, Pos('  ', fio),1);
  // удаляем пробелы вначале
  while (fio<>'') and (fio[1]=' ') do
  delete(fio, 1, 1);
  // удаляем пробелы в конце
  while (fio<>'') and (fio[length(fio)]=' ') do
  setlength(fio, LenGth(fio)-1);
  p:=0;
  for i:=LenGth(fio) downto 1 do
  if (p<2) and (fio[i]=' ') then
  begin
   R:=fio[i+1]+'.'+R;
   inc(p);
   if p=2 then
   begin
    R:=Copy(fio,1,i-1)+' '+R;
    break;
   end;
  end;
  writeln(R);
end.
Предлагаю вариант 2 вводится одной строкой Ф.И.О (включая двойные и тройные фамилии) делает что надо
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 19:10   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Извините, но мне лучше написать свой код чем переписать чужую кашу.
--------
Давайте попробуем проанализировать:

Код:
 
 ReadLn (s); // ввод строки
 i :=  Pos ('  ', s); // ищем первый пробел
 while i <> 0 do   // если побел есть (в независимости от возможного ввод двойной фамилии типо Панкратов Чёрный, Ван Гог и.т.п Ваш цикл начинает маслать)
 begin
    j := 1 + 2; // j=3 всегда
    while s [j] = '  ' do Inc (j); // пока символ пробел (с 3-го по беконечность ) идёт счёт  ВОПРОС: тут не зацыкливается прога и не вылетает если J> длины ???
   Delete (s, i, j- i -1); // удалчем с И-го символа 3 или больше симолов (включая двойную фамилию)
   i := Pos ('  ', s); // ищем очередной символ "пробел"
 end;
// первая часть кода очень заманичива (((
 // не смотря на то что все пробелы удаляются вверху ищем пробел ещё раз 
  i := Pos (' ', s);
  Delete (s, i, 1); // в независимости i=0 или <>0 удаляем 1 символ (не вылетает если не пробелов)?
  j := Pos (s, j, 1); // тут я вообще не понял синтаксис 
  Delete (s, j, 1);   // и что удаляется
  
  Delete (s, j + 1; Length (s));  // непонятній синаксис
  Insert ('.', s, j + 1); // вставка 
  Delete (s, i + 1, j - i -1);
  Insert ('.',  s, i + 1);
  Insert (' ', s, i);
  WriteLn (s)
end.
и.т.п
)) в цикле о удаляет НЕ 1 пробел, а 2 в, а дальше остаётся 2 пробела : один между фамилией и именем, другой между имене и отчеством, цикл на ходит 1 и удаляет его, находит 2 и удаляет все пробелы от найденолй позиции, до конца строки, затем вставляет туда '.' , а после вспоминаем позицию 1 пробела, и удаляем от этой позиции, до первой буквы отчества, вставляем туда точку И самое гласное вставляем пробел между именем и фамилией, и мне нужно избежать сначал удаления потом вставки пробела
Poma][a вне форума Ответить с цитированием
Старый 17.10.2011, 19:12   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

и кстати можно использовать только 1 строку)
Poma][a вне форума Ответить с цитированием
Старый 17.10.2011, 19:12   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

помоги мне завтра уже здавать...
Poma][a вне форума Ответить с цитированием
Старый 17.10.2011, 19:13   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

http://www.programmersforum.ru/showp...77&postcount=5 пост 5 попробуйте.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 19:14   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
ТОЛЬКО 1 строка
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со строками ilshat09 C# (си шарп) 1 24.06.2011 19:45
Работа со строками deadmaross Помощь студентам 1 08.04.2011 18:07
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
Работа со строками gani84 Помощь студентам 1 30.03.2010 17:39
Работа со строками eR- Помощь студентам 2 23.02.2009 15:11