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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2011, 23:32   #1
wackynator
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию оменять местами макс. и мин. эл-нт строки

Столкнулся с такой проблемой:
"Поменять местами слова с максимальной и минимальной длиной при условии, что такие слова единственные."

Строки записываем в массив(10 слов), кол-во симовлов: от 3 до 8, результат выводится через переменую типа string через пробел.

Найтиде пожалуйста ошибку. Не хочет он местами элементы менять:

Код:
Program Nazvanie;
Uses CRT;
Var
 a: Array [1..10] of String;
 i,n,pos1,pos2 : Integer;
 stroka: String;
 max,min,t:String;
 
 BEGIN
 ClrScr;
 WriteLn(' Задача: Поменять местами слова с максимальной и');
 WriteLn(' минимальной длиной при условии, что такие слова единственные.');
 WriteLn;
 WriteLn(' Введите 10 слов от 3 до 8 символов:');
 For i:= 1 to 10 do
    Begin
    Write(' ',i,')');
    ReadLn(a[i]);
    End;
 WriteLn;
 WriteLn(' Заменяем слова с максимальной и минимальной длинами.');
 WriteLn(' При условии, что такие слова единственные.');
 max:=a[1];
 min:=a[1];
 For i:= 2 to 10 do
    Begin
    if length(a[i]) > length(max) then
       max:=a[i];
    End;
    a[i]:=max;
 For i:= 2 to 10 do
    Begin
    if length(a[i]) < length(min) then
       min:=a[i];
    end;
 Writeln;
 writeln(max,' ',min);
 pos1:=pos(max,a[i]);
 pos2:=pos(min,a[i]);
 delete(a[i],pos2,length(min));
 delete(a[i],pos1,length(max));
 insert(max,a[i],pos2);
 insert(min,a[i],pos1);
stroka:=a[1];
 For i:= 2 to 10 do
    stroka:=concat(stroka,' ',a[i]);
 WriteLn(' Получившиеся слова:');
 WriteLn(stroka);
 WriteLn;
 WriteLn(' Для выхода из программы нажмите Enter.');
 ReadLn;
END.
wackynator вне форума Ответить с цитированием
Старый 26.10.2011, 08:02   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Код:
 For i:= 2 to 10 do
    Begin
    if length(a[i]) > length(max) then
       max:=a[i];
    End;
    a[i]:=max;
Последняя строка зачем? Для чего последнему элементу присваивается макс. значение?

И да, зачем гнать цикл 2 раза, если можно обойтись одним?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 26.10.2011, 08:58   #3
wackynator
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию

Спасибо, это исправил:

Код:
max:=a[1];
 min:=a[1];
 For i:= 2 to 10 do
    Begin
    if length(a[i]) > length(max) then
       max:=a[i];
    if length(a[i]) < length(min) then
       min:=a[i];
    end;
а как быть с заменой макс. и мин. элементов местами??
Как это реализовать?
wackynator вне форума Ответить с цитированием
Старый 26.10.2011, 09:05   #4
wackynator
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию

После отладки увидел, что переменные pos1 и pos2
равные единице.
Значит проблема в цикле?
wackynator вне форума Ответить с цитированием
Старый 26.10.2011, 10:03   #5
wackynator
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию

UPDATE

Не получается поменять минимальный элемент на максимальный:

Код:
Program Nazvanie;
Uses CRT;
Var
 a: Array [1..10] of String;
 i,n,pos1,pos2 : Integer;
 stroka: String;
 max,min,t:String;

 BEGIN
 ClrScr;
WriteLn(' Задача: Поменять местами слова с максимальной и');
 WriteLn(' минимальной длинной при условии, что такие слова единственные.');
 WriteLn;
 WriteLn(' Введите 10 слов от 3 до 8 символов:');
 For i:= 1 to 10 do
    Begin
    Write(' ',i,')');
    ReadLn(a[i]);
    End;
 WriteLn;
 WriteLn(' Заменяем слова с максимальной и минимальной длинами.');
 WriteLn(' При условии, что такие слова единственные.');
 min:=a[1];
 For i:= 2 to 10 do
    Begin
    if length(a[i]) > length(max) then
       max:=a[i];
    if length(a[i]) < length(min) then
       min:=a[i];
    end;
    for i:= 1 to 10 do
    write(a[i],' | ');
 Writeln;
 stroka:=a[1];
 For i:= 2 to 10 do
 stroka:=concat(stroka,' ',a[i]);
 WriteLn(' Получившиеся слова:');
 WriteLn(stroka);

 pos1:=pos(min,stroka);
 pos2:=pos(max,stroka);
 if (pos1 <> 0) and (pos2 <> 0) then
    Begin
 delete(stroka,pos2,length(max));
 delete(stroka,pos1,length(min));
 insert(max,stroka,pos1);
 insert(min,stroka,pos2);
    End;
 WriteLn;
 writeln(' ПОСЛЕ ПРЕОБРАЗОВАНИЯ:');
 writeln(stroka);
 WriteLn(' Для выхода из программы нажмите Enter.');
 ReadLn;
END.
wackynator вне форума Ответить с цитированием
Старый 26.10.2011, 11:47   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вы интересный человек..
1) куда Вы дели иницилизацию максимальной величины?
2) если Вы вводите слова раздельно (в массив) /[I.кстати, не уверен, что это допустимо по условию задачи[/I]/ так зачем Вы их собираете в строчку?
3) я бы ещё и проверку добавил на уникальность длин слов (правда, об этом явно сказано в условии, но я бы проверил, правильно ли пользователь ввёл строки).
4) для таких задач (когда требуется после обработки что-то сделать с исходными данными с mian/max элементами) намного удобнее использовать переменные, в которых хранить ИНДЕКСы минимального и максимально элементов.


Код:
Program Nazvanie;
Uses CRT;
const N = 10;
Var
 a : Array [1..N] of String;
 i : Integer;
 stroka: String;
 imax,imin : integer;

 BEGIN
 ClrScr;
WriteLn(' Задача: Поменять местами слова с максимальной и');
 WriteLn(' минимальной длинной при условии, что такие слова единственные.');
 WriteLn;
 WriteLn(' Введите 10 слов от 3 до 8 символов:');
 For i:= 1 to N do
    Begin
    Write(' ',i,')');
    ReadLn(a[i]);
    End;
 WriteLn;
 WriteLn(' Заменяем слова с максимальной и минимальной длинами.');
 WriteLn(' При условии, что такие слова единственные.');
 imin:=1;
 imax:=1;
 For i:= 1 to N do
    Begin
      if length(a[i]) > length(a[imax]) then imax:=i;
      if length(a[i]) < length(a[imin]) then imin:=i;
    end;

 {вывести исходный массив слов}
 for i:= 1 to 10 do
    write(a[i],' | ');
 Writeln;

 {проверка, что найденные длины (мин. и максимальная) - ЕДИНСТВЕННЫЕ в массиве}
 for i:=1 to N do begin
   if (i<>imax)  and (Length(a[i])=Length(a[imax])) then begin
     WriteLn('слово с максимальное длиной НЕ единственное!');
     WriteLn('совпали длины слов "'+a[i]+'" и "'+a[imax]+'".');
     WriteLn('Всё. завершаем работу программы...');
     Readln;
     Halt(1)
   end;
   if (i<>imin)  and (Length(a[i])=Length(a[imin])) then begin
     WriteLn('слово с минимальной длиной НЕ единственное!');
     WriteLn('совпали длины слов "'+a[i]+'" и "'+a[imin]+'".');
     WriteLn('Всё. завершаем работу программы...');
     Readln;
     Halt(1)
   end;
 end;

 {вот, собственно, поменять слова местами}
 stroka := a[imax];
 a[imax] := a[imin];
 a[imin] := stroka;


 {соберём массив в результирующую строку}
 stroka := '';
 For i:= 1 to N do
   stroka:= stroka + a[i]+' ';

 writeln(' ПОСЛЕ ПРЕОБРАЗОВАНИЯ:');
 writeln(stroka);
 WriteLn(' Для выхода из программы нажмите Enter.');
 ReadLn;
END.

Последний раз редактировалось Serge_Bliznykov; 26.10.2011 в 11:57.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.10.2011, 19:41   #7
wackynator
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию

Во-первых, огромное спасибо за программу с комментариями.

Во-вторых, собрать в строчку надо уже после того, как поменяем элементы,
я просто подумал, что поменять местами эл-ты в строке легче, чем в массиве.
Проверку на уникальность хотел сделать после того, как додумаюсь до замены, чего сделать не получилось.
А для хранения индексов не хватило смекалки. это наверно самое печальное. смотрю на код и понимаю, что все довольно таки не так сложно, как мне показалось.

Можно ли ограничить число вводимых символов? Задача: от 3 до 8, можно ли это организовать простым способом?

P.S. Кстати, я думаю не обязательно использовать halt(), мне кажется достаточно сделать ввод массива через метки, а потом, посредством оператора goto перенаправить на очередной ввод массива. Можно же так, да?
wackynator вне форума Ответить с цитированием
Старый 26.10.2011, 20:12   #8
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

Конечно можно, но использование меток считается дурным тоном =), но никто не запрещает их использовать.
zink вне форума Ответить с цитированием
Старый 26.10.2011, 20:19   #9
wackynator
 
Регистрация: 12.10.2011
Сообщений: 6
По умолчанию

Тогда сделаю через процедуру
Просто препод сказал что "Вы еще процедур не знаете. Эта лаба еще не скоро."
Вот и приходится через метки) Хотя знаю что и некрасиво и неудобно.

А насчет ограничения вводимых символов не подскажите?
a : Array [1..N] of String[8]; - это для максимума, а вот минимум как сделать?
wackynator вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение Мин и Макс по условию bskjohn Microsoft Office Excel 1 04.06.2011 20:55
двумерный массив макс мин bwooyaka Помощь студентам 17 19.05.2011 13:17
нахождение мин и макс числа Данил1986 Паскаль, Turbo Pascal, PascalABC.NET 3 07.06.2010 05:46
Ограничение формул МИН и МАКС Bu$ter Microsoft Office Excel 2 29.05.2008 09:21