|
Вопрос # 2 204/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Не могу найти ошибку в коде. Работа со строками(лабораторная работа). Дана строка символов, которая состоит из отдельных слов, отделённых интервалом. Нужно вывести на экран все слова этой строки в алфавитном порядке. Помогите пожалуйста найти ошибку. возможно изначально выбран неправильный ход решения?
Приложение: Переключить в обычный режим- program Project2;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- var StrArray:array of string;
- i,n,p:byte;
- S:string;
- begin
- write ('input string:');
- readln (S);
- n:=1;
- for i:=1 to length(S) do
- begin
- p:=pos(S,'');
- StrArray[i]:=copy(S,1,p);
- delete (S,1,p);
- end;
- S:=StrArray[low(StrArray)];
- for i:=low(StrArray) to high(StrArray) do
- for n:=low(StrArray) to high(StrArray) do
- if (StrArray[n]<StrArray[i]) and (n<i) then
- begin
- S:=StrArray[n];
- StrArray[n]:=StrArray[i];
- StrArray[i]:=S;
- end;
- write ('sorted words: ');
- for i:=low(StrArray) to high(StrArray) do
- write (StrArray[i],'');
- readln;
- readln
- { TODO -oUser -cConsole Main : Insert code here }
- end.
-
 |
Вопрос задала: Nostalgia (статус: Посетитель)
Вопрос отправлен: 17 декабря 2008, 19:33
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Может быть стоит воспользоваться некоторым стандартным классом и не мучиться?
См. приложение.
Приложение: Переключить в обычный режим- program p2204;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils, Classes;
-
- const
-
-
-
- var
- S, W: string;
- Words: TStringList;
- Index: Integer;
-
- begin
- Write('Input string: ');
- ReadLn(S);
-
- Words:= TStringList.Create();
- W:= '';
-
- try
-
- for Index:= 1 to Length(S) do
- if (S[Index] in Letters)
-
- else if W <> ''
- then begin
-
- W:= '';
- end;
-
- if W <> ''
-
-
- Words.Sort();
-
-
- WriteLn('Words found: ', Words.Count);
- for Index:= 0 to Words.Count - 1 do
- WriteLn(Words[Index]);
- finally
- Words.Free();
- end;
-
- Write(#13#10' Press "ENTER" to exit...');
- ReadLn;
- end.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 декабря 2008, 20:09
Оценка за ответ: 4
|
Ответ #2. Отвечает эксперт: Anderson N.N
Здравствуйте, Nostalgia!
Все просто вы используете динамический массив
StrArray:array of string;
и перед его использованием надо задать его размеры
SetLength(StrArray, n);
где n число элементов
Вот переделанный код не самый лучший но рабочий
Приложение: Переключить в обычный режим- program Project2;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- var StrArray:array of string;
- i,n,p:byte;
- S,s1:string;
- begin
- write ('input string:');
- readln (S);
- s1:=trim(s);
- s :=trim(s);
- i:=0;
-
- repeat
- p:= Pos(' ',s1);
- delete (S1,1,p);
- inc(i);
- until not(p>0);
- setLength(StrArray,i);
-
- i:=0;
- repeat
- p:=pos(' ',s);
- StrArray[i]:=copy(S,1,p);
- inc(i);
- delete (S,1,p);
- until not(p>0);
- StrArray[i-1]:=s+' ';
- S:=StrArray[low(StrArray)];
- for i:=low(StrArray) to high(StrArray) do
- for n:=low(StrArray) to high(StrArray) do
- if (StrArray[n]>StrArray[i]) and (n<>i) then
- begin
- S:=StrArray[n];
- StrArray[n]:=StrArray[i];
- StrArray[i]:=S;
- end;
-
- write ('sorted words: ');
- for i:=low(StrArray) to high(StrArray) do
- write (StrArray[i],'');
- readln;
- readln;
- { TODO -oUser -cConsole Main : Insert code here }
- end.
-
 |
Ответ отправил: Anderson N.N (статус: 2-ой класс)
Время отправки: 17 декабря 2008, 21:49
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 17 декабря 2008, 21:44; участников в обсуждении: 4.
|
Ученый (статус: 8-ой класс), 17 декабря 2008, 19:36 [#1]:
А что нетак? Точнее что делфи говорит по этому поводу?
|
|
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 (статус: Посетитель), 17 декабря 2008, 20:03 [#4]:
всёравно окно С:\Program Files\Borland\Delphi7\Projects\Project2.exe после ввода строки и нажатия ''ENTER'' сразу закрывается...
|
|
Вадим К (статус: Академик), 17 декабря 2008, 20:12 [#5]:
Это не ошибка, что оно закрывается. Просто программа завершилась и окно закрылось.
Хотя в конце есть Readln. Но иногда он не спасает (долго обяснять почему), но двойной Readln обычно помогает всегда. А ещё лучше с консольного окошка запустить.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 17 декабря 2008, 20:13 [#6]:
Ну чо, ответ я запостил.
Если по условию задачи использование стандартных классов (таких как TStringList) запрещено, могу переделать через дин. массивы.
Цитата:
осле ввода строки и нажатия ''ENTER'' сразу закрывается...
Это означает runtime error. Так как исключения ничге не ловятся, прога падает.
А вообще, учись юзать отладчик.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Nostalgia (статус: Посетитель), 17 декабря 2008, 20:17 [#7]:
переделайте если не затруднит.
|
|
min@y™ (статус: Доктор наук), 17 декабря 2008, 21:33 [#8]:
Цитата:
переделайте если не затруднит.
Не затруднило. Высал в личку.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Nostalgia (статус: Посетитель), 17 декабря 2008, 21:44 [#9]:
спс)
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|