Вопрос № 178364: Здравствуте уважаемые эксперты. Помогите пожалуйста решить задачку: В гостинице имеется 15 номеров, из них 5 одноместных и 10 двухместных. Составить программу которая заполняет и/или корректирует данные о жильцах и по фамилии определяет номер прож...
Вопрос № 178364:
Здравствуте уважаемые эксперты. Помогите пожалуйста решить задачку: В гостинице имеется 15 номеров, из них 5 одноместных и 10 двухместных. Составить программу которая заполняет и/или корректирует данные о жильцах и по фамилии определяет номер проживания жильца. Программа запрашивает фамилию жильца. Если жильца с такой фамилией нет, об этом выдается сообщение. Если жилец с такой фамилией в гостинице единственный, программа выдает фамилию жильца и номер проживания. Если в гостинице проживают
2 и более жильцов с такой фамилией, программа дополнительно запрашивает инициалы. Заранее благодарен
Отвечает Евгений/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;
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.