Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 204

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Не могу найти ошибку в коде. Работа со строками(лабораторная работа). Дана строка символов, которая состоит из отдельных слов, отделённых интервалом. Нужно вывести на экран все слова этой строки в алфавитном порядке. Помогите пожалуйста найти ошибку. возможно изначально выбран неправильный ход решения?

Приложение:
  1. program Project2;
  2. {$APPTYPE CONSOLE}
  3. uses
  4. SysUtils;
  5. var StrArray:array of string;
  6. i,n,p:byte;
  7. S:string;
  8. begin
  9. write ('input string:');
  10. readln (S);
  11. n:=1;
  12. for i:=1 to length(S) do
  13. begin
  14. p:=pos(S,'');
  15. StrArray[i]:=copy(S,1,p);
  16. delete (S,1,p);
  17. end;
  18. S:=StrArray[low(StrArray)];
  19. for i:=low(StrArray) to high(StrArray) do
  20. for n:=low(StrArray) to high(StrArray) do
  21. if (StrArray[n]<StrArray[i]) and (n<i) then
  22. begin
  23. S:=StrArray[n];
  24. StrArray[n]:=StrArray[i];
  25. StrArray[i]:=S;
  26. end;
  27. write ('sorted words: ');
  28. for i:=low(StrArray) to high(StrArray) do
  29. write (StrArray[i],'');
  30. readln;
  31. readln
  32. { TODO -oUser -cConsole Main : Insert code here }
  33. end.
  34.  


Nostalgia Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Nostalgia (статус: Посетитель)
Вопрос отправлен: 17 декабря 2008, 19:33
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Может быть стоит воспользоваться некоторым стандартным классом и не мучиться?
См. приложение.

Приложение:
  1. program p2204;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils, Classes;
  7.  
  8. const
  9.  
  10.  
  11.  
  12. var
  13. S, W: string;
  14. Words: TStringList;
  15. Index: Integer;
  16.  
  17. begin
  18. Write('Input string: ');
  19. ReadLn(S);
  20.  
  21. Words:= TStringList.Create();
  22. W:= '';
  23.  
  24. try
  25.  
  26. for Index:= 1 to Length(S) do
  27. if (S[Index] in Letters)
  28.  
  29. else if W <> ''
  30. then begin
  31.  
  32. W:= '';
  33. end;
  34.  
  35. if W <> ''
  36.  
  37.  
  38. Words.Sort();
  39.  
  40.  
  41. WriteLn('Words found: ', Words.Count);
  42. for Index:= 0 to Words.Count - 1 do
  43. WriteLn(Words[Index]);
  44. finally
  45. Words.Free();
  46. end;
  47.  
  48. Write(#13#10' Press "ENTER" to exit...');
  49. ReadLn;
  50. end.


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 декабря 2008, 20:09
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: Anderson N.N

Здравствуйте, Nostalgia!
Все просто вы используете динамический массив
StrArray:array of string;

и перед его использованием надо задать его размеры
SetLength(StrArray, n);
где n число элементов
Вот переделанный код не самый лучший но рабочий

Приложение:
  1. program Project2;
  2. {$APPTYPE CONSOLE}
  3. uses
  4. SysUtils;
  5. var StrArray:array of string;
  6. i,n,p:byte;
  7. S,s1:string;
  8. begin
  9. write ('input string:');
  10. readln (S);
  11. s1:=trim(s);
  12. s :=trim(s);
  13. i:=0;
  14.  
  15. repeat
  16. p:= Pos(' ',s1);
  17. delete (S1,1,p);
  18. inc(i);
  19. until not(p>0);
  20. setLength(StrArray,i);
  21.  
  22. i:=0;
  23. repeat
  24. p:=pos(' ',s);
  25. StrArray[i]:=copy(S,1,p);
  26. inc(i);
  27. delete (S,1,p);
  28. until not(p>0);
  29. StrArray[i-1]:=s+' ';
  30. S:=StrArray[low(StrArray)];
  31. for i:=low(StrArray) to high(StrArray) do
  32. for n:=low(StrArray) to high(StrArray) do
  33. if (StrArray[n]>StrArray[i]) and (n<>i) then
  34. begin
  35. S:=StrArray[n];
  36. StrArray[n]:=StrArray[i];
  37. StrArray[i]:=S;
  38. end;
  39.  
  40. write ('sorted words: ');
  41. for i:=low(StrArray) to high(StrArray) do
  42. write (StrArray[i],'');
  43. readln;
  44. readln;
  45. { TODO -oUser -cConsole Main : Insert code here }
  46. end.
  47.  


Ответ отправил: Anderson N.N (статус: 2-ой класс)
Время отправки: 17 декабря 2008, 21:49
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 17 декабря 2008, 21:44; участников в обсуждении: 4.
Ученый

Ученый (статус: 8-ой класс), 17 декабря 2008, 19:36 [#1]:

А что нетак? Точнее что делфи говорит по этому поводу?
Nostalgia

Nostalgia (статус: Посетитель), 17 декабря 2008, 19:47 [#2]:

[Hint] Project2.dpr(11): Value assigned to 'n' never used
[Warning] Project2.dpr(15): Variable 'StrArray' might not have been initialized
вот это и говорит. да и строка никакая не выводится
Ученый

Ученый (статус: 8-ой класс), 17 декабря 2008, 19:54 [#3]:

[Hint] Project2.dpr(11): Value assigned to 'n' never used это подсказка что переменная n нигде не используется. Дальше p:=pos(S,''); попробуйте Поставить пробел между '', причем везде где они встречаются, т.к. я понял слова у вас разделены пробелом.
Nostalgia

Nostalgia (статус: Посетитель), 17 декабря 2008, 20:03 [#4]:

всёравно окно С:\Program Files\Borland\Delphi7\Projects\Project2.exe после ввода строки и нажатия ''ENTER'' сразу закрывается...
Вадим К

Вадим К (статус: Академик), 17 декабря 2008, 20:12 [#5]:

Это не ошибка, что оно закрывается. Просто программа завершилась и окно закрылось.
Хотя в конце есть Readln. Но иногда он не спасает (долго обяснять почему), но двойной Readln обычно помогает всегда. А ещё лучше с консольного окошка запустить.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 17 декабря 2008, 20:13 [#6]:

Ну чо, ответ я запостил.
Если по условию задачи использование стандартных классов (таких как TStringList) запрещено, могу переделать через дин. массивы.

Цитата:


осле ввода строки и нажатия ''ENTER'' сразу закрывается...


Это означает runtime error. Так как исключения ничге не ловятся, прога падает.
А вообще, учись юзать отладчик.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Nostalgia

Nostalgia (статус: Посетитель), 17 декабря 2008, 20:17 [#7]:

переделайте если не затруднит.
min@y™

min@y™ (статус: Доктор наук), 17 декабря 2008, 21:33 [#8]:

Цитата:

переделайте если не затруднит.


Не затруднило. Высал в личку.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Nostalgia

Nostalgia (статус: Посетитель), 17 декабря 2008, 21:44 [#9]:

спс)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.03 сек.