IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> динам. списки. Стандартные операции, Неккоректная процедура удаления эл-та.
Insomnia
сообщение 10.10.2011 23:45
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


идея задачи в том: что бы произвести со списком различные действия. Проблема в удалении элемента списка по имени. Пробовал различные условия и составление процедуры/ процедур, но что бы полноценно из любого места удалял эл-т не выходит. Как пр: "если ввожу 3 эл-та и удаляю последний - все хорошо. но если следом удаляю 2 то он впринцепи прогоняет и выводит ответ: но вмете с тем и вылетает." . Косяк, я предполагаю, в неккоректных условиях, т.е. выходит за пределы списка.
опишите подробней пожалуйста мои ошибки.

P.S.
остальные условия работают хорошо, но если заметите недочеты , укажите их, пожалуйста.


Прикрепленные файлы
Прикрепленный файл  _______________________.rar ( 33.18 килобайт ) Кол-во скачиваний: 119
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 11.10.2011 15:33
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Цитата
еще вопрос. как мне написать корректный ввод номера телефона ?
Критерий корректности можно узнать? Если это, чтобы программа не вылетала при вводе "не числа" - то:

{--заполнение списка--}
procedure fill_spisok (var p: PPErson);
var
s, aName : string; aPhone : integer;
i, v : integer;
isOk : boolean;
begin
writeln('сколько персон собираетесь вписать?');
readln(v);
for i:=1 to v do
begin
writeln;
writeln('write a phone');
repeat
readln(s);

// Эта функция описана в SysUtils, подключи ее после Implementation
isOk := TryStrToInt(s, aPhone);
if not isOk then
writeln('Неправильно введен номер. Попробуйте еще раз');
until isOk;

writeln('write a name');
repeat
readln(aName);
LowCase(aName);
isOk := CheckName(aName)
if not isOk then
writeln('неправильно введено имя. Повторите ввод');
until isOk; // Зачем было функцию вызывать дважды?

writeln;
create_spisok(p, aName, aPhone);
end;
end;
прекрасно с этим справляется. Программа будет запрашивать ввод до тех пор, пока то, что пользователь введет не будет правильным целым числом. Можно там же, скажем, запретить отрицательные числа:
isOk := TryStrToInt(s, aPhone) and (aPhone > 0);
, или числа с маленьким количеством цифр (подумай сам как это сделать)...

Теперь о LowCase... На кой надо было писать свою функцию, переводящую строки в нижний регистр (которая работает и с кириллицей), если CheckName определи имя как неправильное при введении кириллицы? Воспользуйся стандартной LowerCase для латиницы (кстати, для кириллицы есть AnsiLowerCase, не надо велосипедов).

Реализация CheckName не очень понятна:
function CheckName(var s: string): boolean;
var
i : integer;
begin
result := false;
for i := 1 to Length(s) do
if not (s[i] in ['a' .. 'z']) then exit;
result: = true;
end;
выглядит привычнее, и не будет идти по строке до упора, как только "поймает" первый неподходящий символ - тут же вернет "ложь"...

Я бы не стал хранить string в структуре TPerson. Если программа будет расширяться, и надо будет сделать сохранение в файл - столкнешься с проблемами, которых можно было бы избежать. String в Дельфи (в отличие от Паскаля) это не 255 char-ов, а указатель на класс. Можно использовать ShortString, она ведет себя подобно строкам Турбо-Паскаля. По той же причине я бы вообще не стал держать вместе информационную (имя и телефон) и вспомогательную (указатель на следующий элемент списка) часть. "Мухи - отдельно, котлеты - отдельно" (С). Если понадобится сохранять - то придется делать это поэлементно (или прибегать к грязным хакам), вместо того чтобы сделать все сохранение в одну строку.

+ ко всему я бы немного по другому реализовал работу со списком: написал бы функцию Search, которая по имени пользователя возвращала бы указатель на элемент списка, предшествующий искомому (или nil, если ничего не было найдено). Используя эту функцию можно будет упростить реализации delete_person и found_phone...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 21:00
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"