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

Обсуждение

Неизвестный
13.05.2010, 18:30
общий
Кобышев В Ю:
А как хранить информацию: типизированный файл, текстовый, БД?
Неизвестный
14.05.2010, 09:23
общий
Тимошенко Дмитрий:
Информация хранится в текстовом файле.
давно
Профессионал
153662
1070
16.05.2010, 00:44
общий
Кобышев В Ю:
Могу предложить свой вариант решения данной задачи. Вот проект, правда он пока без комментариев, если это Вас устраивает, оформлю как ответ.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.05.2010, 08:06
общий
Евгений/Genia007/:
Можно ли эту задачу решить только с помощью консольного приложения, не используя форму, как в Паскале??? Мне нужно обращаться к файлу через assign, и, используя запись, искать и редактировать жильцов, которые проживают в гостинице.
давно
Профессионал
153662
1070
16.05.2010, 12:24
общий
Кобышев В Ю:
Дак и здесь обращение к файлу идёт через assign, только он используется для хранения данных, а поиск идёт не в файле, а по сеткам. А как тогда в консоли отображать всех жильцов для редактирования, через текстовый файл это делать мне кажется совсем не удобно.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
17.05.2010, 10:56
общий
Преподаватель строгий, ему нужно чтобы программа была написана в консольном приложении. Как мне объяснили, нет необходимости сразу показывать всех проживающих. Сначала программа запрашивает фамилию и затем ищет ее в файле и показывает в каком номере проживает этот человек. Только я думаю как сделать, чтобы фамилию можно было корректировать. Есть такой вариант: под каждый номер в файле отвести строчку и в начале программы вывести меню, в котором пользователь выбирает, что ему нужно сделать (заселить жильца в свободный номер; поиск жильца по фамилии; корректирование данных о жильце в номере). У меня всегда возникала проблема со считыванием данных с файла, постоянно получалось неправильно, так здесь еще необходимо эти данные менять и сохранять.
Если возможно, убедительная просьба написать код В пятницу нужно сдавать эту лабораторную, если сдам, то возможно экзамен сдавать не придется.) Вся нажеда на вас.)
давно
Профессионал
153662
1070
17.05.2010, 16:44
общий
Кобышев В Ю:
Вот Вам и консольное приложение, правда там так же пока нет комментариев, если надо напишите.
Код:
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: string):string; // Перекодировка ANSI->OEM
// В ANSI русские буквы кодируются числами от 192 до 255,
// в ASCII - от 128 до 175 (А..Яа..п) и от 224 до 239 (р..я).
begin
SetLength(Result, Length(mes));
if Length(Result) > 0 then
AnsiToOem(PChar(mes), PChar(Result));
end;

function dos(mes: string): string; // Перекодировка OEM->ANSI
begin
SetLength(Result, Length(mes));
if Length(Result) > 0 then
OemToAnsi(PChar(mes), PChar(Result));
end;

procedure Zag;
var
f: TextFile;
i, j: integer;
s0, s1: string;
begin
if not FileExists('Gostin.txt') 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
{readln(s);}
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 then
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;
{spisok;}
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;
{spisok; }
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.
Работает на том же текстовом файле, поиск и все комбинации происходят с массивами (один для одноместных и один для двухместных номеров), которые содержат информацию о жителях, файл только хранит данные. В двухкомнатных фамилии нужно вводить через запятую.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
17.05.2010, 17:27
общий
Модераторы:
Просьба продлить вопрос. Спасибо.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
18.05.2010, 07:18
общий
Евгений/Genia007/:
Большое спасибо!!! То что нужно) Можно оформить как ответ, но и комментарии бы не помешали)
давно
Профессионал
153662
1070
18.05.2010, 22:57
общий
это ответ
Здравствуйте, Кобышев В Ю.
По договорённости с Вами предлагаю консольный вариант решения данной задачи. Поиск и все комбинации с фамилиями жильцов происходят с помощью массивов (один для одноместных и один для двухместных номеров). На диске информация хранится в текстовом файле. В двухместных номерах фамилии нужно вводить через запятую (например: Иванов И.И.,Петров П.П.). Для правильного поиска жильца, нужно вводить его фамилию с большой буквы.
Код:
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: string):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') 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 then
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.
Прикрепленные файлы:
5
Спасибо большое!!!
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
19.05.2010, 12:22
общий
Модераторы:
Просьба закрыть вопрос. Спасибо.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
7438
7205
19.05.2010, 13:27
общий
Евгений/Genia007/:
Как скажете
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа