Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 2343
∙ повысить рейтинг »
star9491
Статус: Практикант
Рейтинг: 1936
∙ повысить рейтинг »
Евгений/Genia007/
Статус: Бакалавр
Рейтинг: 973
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Delphi и Lazarus

Номер выпуска:1533
Дата выхода:19.05.2010, 13:30
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:353 / 190
Вопросов / ответов:1 / 1

Вопрос № 178364: Здравствуте уважаемые эксперты. Помогите пожалуйста решить задачку: В гостинице имеется 15 номеров, из них 5 одноместных и 10 двухместных. Составить программу которая заполняет и/или корректирует данные о жильцах и по фамилии определяет номер прож...



Вопрос № 178364:

Здравствуте уважаемые эксперты. Помогите пожалуйста решить задачку:
В гостинице имеется 15 номеров, из них 5 одноместных и 10 двухместных. Составить программу которая заполняет и/или корректирует данные о жильцах и по фамилии определяет номер проживания жильца. Программа запрашивает фамилию жильца.
Если жильца с такой фамилией нет, об этом выдается сообщение.
Если жилец с такой фамилией в гостинице единственный, программа выдает фамилию жильца и номер проживания.
Если в гостинице проживают 2 и более жильцов с такой фамилией, программа дополнительно запрашивает инициалы.
Заранее благодарен

Отправлен: 13.05.2010, 22:10
Вопрос задал: Кобышев В Ю, 1-й класс
Всего ответов: 1
Страница вопроса »


Отвечает Евгений/Genia007/, Бакалавр :
Здравствуйте, Кобышев В Ю.
По договорённости с Вами предлагаю консольный вариант решения данной задачи. Поиск и все комбинации с фамилиями жильцов происходят с помощью массивов (один для одноместных и один для двухместных номеров). На диске информация хранится в текстовом файле. В двухместных номерах фамилии нужно вводить через запятую (например: Иванов И.И.,Петров П.П.). Для правильного поиска жильца, нужно вводить его фамилию с большой буквы.
Код:
program gostin;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows;

var
mas1: array[0..4] of string; // Жильцы по одноместным номерам
mas2: array[0..1, 0..9] of string; // Жильцы по двухместным номерам
s: string;
nom: byte; // Выбор меню

function Rus(mes: st ring):string; // Перекодировка ANSI->OEM, что бы не было кракозябров на экране
// В ANSI русские буквы кодируются числами от 192 до 255,
// в ASCII для dos - от 128 до 175 (А..Яа..п) и от 224 до 239 (р..я).
begin
SetLength(Result, Length(mes)); // Устанавливаем длину выходной строки равной входящей
if Length(Result) > 0 then // Если длина больше 0 перекодируем строку
AnsiToOem(PChar(mes), PChar(Result));
end;

function Dos(mes: string): string; // Перекодировка OEM->ANSI, что бы не было кракозябров после ввода строки
begin
SetLength(Result, Length(mes)); // Устанавливаем длину выходной строки равной входящей
if Length(Result) > 0 then // Если длина больше 0 перекодируем строку
OemToAnsi(PChar(mes), PChar(Result));
end;

procedure Zag; // Процедура загрузки данных из файла
var
f: TextFile;
i, j: integer;
s0, s1: string;
begin
if not FileExists('Gostin.txt 9;) then // Проверяем существование файла
begin
writeln(rus('Файла Gostin.txt не существует'));
Exit; // Выход из процедуры
end;
AssignFile(f, 'Gostin.txt'); // Связали файловую переменную с файлом
Reset(f); // Встали на начало файла
Readln(f, s0); // Считываем одну строку
for i:= 0 to 4 do // Загружаем данные по одноместным номерам
begin
Readln(f, s0); // Считываем строку
delete(s0, 1, 2); // Удаляем первые два символа
mas1[i]:= s0; // Записали в массив
end;
Readln(f, s0); // Считали строку
for i:= 0 to 9 do // Загружаем данные по двухместным номерам
begin
Readln(f, s0); // Считали строку
While s0[1] <> ' ' do // Делаем пока не дойдём до пробела
delete(s0, 1, 1); // Удаляем первый символ
delete(s0, 1, 1); // Удаляем первый символ
s1:= '';
for j := 1 to Length(s0) do
if s0[j] <> ',' then
s1:= s1 + copy(s0, j, 1) // Копируем символы пока не дойдём до символа ,
else
break; // Досрочный выход из цикла
mas2[0, i]:= s1; // Записали в массив строку
While s0[1] <> ',' do // Удаляем первый символ пока не дойдём до символа ,
delete(s0, 1, 1);
delete(s0, 1, 1); // Удаляем первый символ
mas2[1, i]:= s0; // Записали строку в массив
end;
CloseFile(f); // Закрыли файл
end;

procedure Find; // Процедура поиска жильца
var
s0, s1: string;
i: integer;
fnd: boolean;
begin
fnd:= false;
for i := 0 to 4 do // Ищем по одноместным номерам
if (Pos(s, mas1[i]) <> 0) AND ((mas1[i][length(s) + 1] = ' ')
OR (length(mas1[i]) = length(s))
OR (mas1[i][length(s) + 1] = '.')) then
{Нашли вхождение фамилии в массиве}
begin
if fnd t hen
begin
writeln(rus('Таких жильцов несколько! Введите инициалы жильца'));
readln(s0); // Запомнили введёные данные с клавиатуры
s0:= dos(s0); // Перекодировали строку
s:= s + ' ' + s0; // Добавили к фамилии инициалы
Find; // Запуск процедуры поиска с начала
exit; // Выход из процедуры
end;
s1:= rus('Жилец с фамилией ' + s + ' проживает в номере ') + IntToStr(i + 1);
fnd:= true;
end;
for i:= 0 to 9 do // Ищем по двухместным номерам
begin
if (Pos(s, mas2[0, i]) <> 0) AND ((mas2[0, i][length(s) + 1] = ' ')
OR (length(mas2[0, i]) = length(s))
OR (mas2[0, i][length(s) + 1] = '.')) then
{Нашли вхождение фамилии в массиве}
begin
if fnd then
begin
writeln(rus('Таких жильцов несколько! Введите инициалы жильца'));
readln(s0); // Запомнили введёные данные с клавиатуры
s0:= dos(s0); // Перекодировали строку
s:= s + ' ' + s0; // Добавили к фамилии инициалы
Find; // Запуск процедуры поиска с начала
exit; // Выход из процедуры
end;
s1:= rus('Жилец с фамилией ' + s + ' проживает в номере ') + IntToStr(i + 6);
fnd:= true;
end;
if (Pos(s, mas2[1, i]) <> 0) AND ((mas2[1, i][length(s) + 1] = ' ')
OR (length(mas2[1, i]) = length(s))
OR (mas2[1, i][length(s) + 1] = '.')) then
{Нашли вхождение фамилии в массиве}
begin if fnd then
begin
writeln(rus('Таких жильцов несколько! Введите инициалы жильца'));
readln(s0); // Запомнили введёные данные с клавиатуры
s0:= dos(s0); // Перекодировали строку
s:= s + ' ' + s0; // Добавили к фамилии инициалы
Find; // Запуск процедуры поиска с начала
exit; // Выход из процедуры
end;
s1:= rus('Жилец с фамилией ' + s + ' проживает в номере ') + IntToStr(i + 6);
fnd:= true;
end;
end;
if not fnd then
writeln(rus('Жильца с фамилией ' + s + ' нет')) // Вывод результата поиска
else
begin
writeln(s1); // Вывод результата поиска
end;

end;

procedure spisok; // Процедура вывода списка всех жильцов
var
i: integer;
begin
writeln(rus('Одноместные номер а'));
for i:= 0 to 4 do // Выводим по одноместным
writeln('#' + IntToStr(i + 1) + ' ' + rus(mas1[i]));
writeln(''); // Вывели на экран пустую строку
writeln(rus('Двухместные номера'));
for i:= 0 to 9 do // Выводим по двухместным
writeln('#' + IntToStr(i + 6) + ' ' + rus(mas2[0, i]) + ',' + rus(mas2[1, i]));
end;

procedure save; // Процедура сохранения списка жильцов в файл
var
f: TextFile;
i: integer;
begin
AssignFile(f, 'Gostin.txt'); // Связали файловую переменную с файлом
Rewrite(f); // Открыли файл для перезаписи
Writeln(f, '[1]'); // Записали идентификатор одноместных номеров
for i := 0 to 4 do // Записали данные по одноместным
Writeln(f, IntToStr(i + 1) + ' ' + mas1[i]);
Writeln(f, '[2]'); // Записали идентификатор двухместных
for i := 0 to 9 do // Записали данн ые по двухместным
Writeln(f, InttoStr(i + 6) + ' ' + mas2[0, i] + ',' + mas2[1, i]);
CloseFile(f); // Закр ыли файл
end;

procedure edit; // Процедура редактирования жильцов
var
x, j: integer;
s0, s1: string;
begin
writeln(rus('Введите номер комнаты'));
readln(x); // Сохранили введённый номер
if x < 6 then
begin // По одноместным
writeln(rus('В этом номере проживают ') + rus(mas1[x - 1]));
writeln(rus('Введите Фамилии и инициалы новых жильцов'));
readln(s0); // Сохранили фамилию жильца
s0:= dos(s0); // Перекодировали строку
mas1[x - 1]:= s0; // Записали в массив
end
else
begin // По двухместным
writeln(rus('В этом номере проживают ') + rus(mas2[0, x - 6]) + ', ' + rus(mas2[1, x - 6]));
writeln(rus('Введите Фамилии и инициалы новых жильцов'));
readln(s0); // Сохранили фамилию жильца
s0:= dos(s0); // Перекодировали строку
for j:= 1 to Length(s0) do
if s0[j] <> ',' then
s1:= s1 + copy(s0, j, 1) // Копируем символы пока не дойдём до символа ,
else
break; // Досрочный выход из цикла
mas2[0, x - 6]:= s1; // Записали в массив
While s0[1] <> ',' do
delete(s0, 1, 1); // Удаляем первый символ пока не дойдём до символа ,
delete(s0, 1, 1); // Удаляем первый символ
mas2[1, x - 6]:= s0; // Записали в массив
end;
save; // Вызов процедуры сохранения списка жильцов
end;

procedure vubor; // Процедура выбора меню
begin
writeln(rus('Выберите нужную операцию'));
writeln(rus('1: Список жильцов'));
writeln(rus('2: Изменить жильца'));
writeln(rus('3: Сохранить список жильцов'));
writeln(rus('4: Поиск жильца'));
writeln(rus('5: Выход'));
readln(nom); // Запомнили номер пункта меню
Case nom of // Выбор номера меню из списка
1: spisok; // Вызов процедуры вывода списка жильцов
2: edit; // Вызов процедуры редактирования списка жильцов
3: save; // Вызов процедуры сохранения в файл списка жильцов
4: begin
writeln(rus('Введите фамилию жильца'));
readln(s); // Запомнили введёную фамилию жильца
s:= dos(s); // Перекодировали строку
Find; // Вызов процедуры вывода списка жильцов
end;
5: Exit; // Выход из процедуры
end;
writeln('');
vubor; // Вызов процедуры выбора меню
end;

begin
zag; // Вызов процедуры загрузки списка жильцов
vubor; // Вызов процедуры выбора меню
end.
Прикрепленный файл: загрузить »

-----
Помогли тебе, помоги и ты.

Ответ отправил: Евгений/Genia007/, Бакалавр
Ответ отправлен: 18.05.2010, 22:57
Номер ответа: 261479

Оценка ответа: 5
Комментарий к оценке:
Спасибо большое!!!

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261479 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.15 от 18.05.2010

    В избранное