Консультация № 179944
15.09.2010, 23:13
41.49 руб.
0 5 1
Доброе время суток!
Программа на Дельфе (массивы)
Ввести с клавиатуры фамилии студентов и их шифры, сохраняя информацию в файле. Упорядочить данные по фамилии или по шифру в зависимости от желания пользователя. После ввода данных иметь возможность просмотреть введенную информацию. Программу желательно реализовать с использованием подпрограммы.

Если кто сделает, просьба дать не только код, но и все исходники.

Обсуждение

Неизвестный
15.09.2010, 23:15
общий
извините, там опечатка, это не массивы))
давно
Профессионал
153662
1070
16.09.2010, 20:31
общий
pikvar:
Мой вариант решения задачи, шифр в виде числа
[code h=400]unit UnitZadacha2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Menus, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
MainMenu1: TMainMenu;
StringGrid1: TStringGrid;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N6: TMenuItem;
N5: TMenuItem;
procedure N4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure sort(shif: boolean); // Процедура сортировки
var
c, r: integer; // номер колонки и строки таблицы
m: integer; // номер строки с минимальным шифром
i, j: integer; // номер строки и колонки используется во время сортировки
buf: array[0..1] of string; // буфер для обмена строк
list: TStringList; // Список для сортировки
begin
if shif then // Если shif true сортируем по шифру иначе по фамилии
begin
for r:= 1 to form1.StringGrid1.rowcount - 1 do
begin
m:= r; // минимальный элемент - в r-ой строке
for i:= r to form1.StringGrid1.rowcount - 1 do
begin
if form1.StringGrid1.cells[1, i] = '' then break;
if StrToInt(form1.StringGrid1.cells[1, i]) < StrToInt(form1.StringGrid1.cells[1, m]) then
m:= i;
end;
if r <> m then
begin // обменяем r-ую и m-ую строки таблицы
for c:= 0 to 1 do
begin
buf[c]:= form1.StringGrid1.Cells[c, r];
form1.StringGrid1.Cells[c, r]:= form1.StringGrid1.Cells[c, m];
form1.StringGrid1.Cells[c ,m]:= buf[c];
end;
end;
end;
end
else
begin
List:= TStringList.Create; // Создали список
for i:= 1 to form1.StringGrid1.RowCount do
if form1.StringGrid1.Cells[0, i] <> '' then
List.Add(form1.StringGrid1.Cells[0, i]); // Загружаем в список данные
List.Sort; // Сортируем список
for i := 0 to List.Count - 1 do
for j := 1 to form1.StringGrid1.RowCount do
if form1.StringGrid1.Cells[0, j] = List.Strings[i] then
begin // обменяем j-ую и i-ую строки таблицы
for c:= 0 to 1 do
begin
buf[c]:= form1.StringGrid1.Cells[c, j];
form1.StringGrid1.Cells[c, j]:= form1.StringGrid1.Cells[c, i + 1];
form1.StringGrid1.Cells[c ,i + 1]:= buf[c];
end;
end;
List.Free; // Освободили список
end;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGriD1.Cells[0,0]:= 'Фамилия';
StringGriD1.Cells[1,0]:= 'Шифр';
end;

procedure TForm1.N5Click(Sender: TObject);
begin
sort(true); // Сортируем по шифру
end;

procedure TForm1.N6Click(Sender: TObject);
begin
sort(false); // Сортируем по фамилии
end;

procedure TForm1.N1Click(Sender: TObject);
var
i, j, y: word;
f: TextFile;
begin
y:= 0;
AssignFile(f, 'stringdrid.txt'); // Связали переменную с файлом
Rewrite(f); // Открыли файл для перезаписи
with StringGrid1 do // Делаем для сетки
begin
for i:= 0 to RowCount - 1 do
if Cells[0, i] <> '' then
inc(y); // Считаем сколько занято ячеек в сетке
// Записываем номер колонки и строки
Writeln(f, ColCount);
Writeln(f, y);
// Записываем содержимое ячейки
for i:= 0 to ColCount - 1 do
for j:= 0 to y - 1 do
Writeln(F, Cells[i, j]);
end;
CloseFile(F); // Закрыли файл
end;

procedure TForm1.N2Click(Sender: TObject);
var
f: TextFile;
x, i, j: Integer;
str: String;
begin
if not Fileexists('stringdrid.txt') then
begin // Выводим сообщение при отсутствии файла
ShowMessage('Файла не существует.');
exit;
end;
AssignFile(f, 'stringdrid.txt'); // Связали переменную с файлом
Reset(f); // Открыли файл на чтение
with StringGrid1 do // Делаем для сетки
begin
// Получаем номер колонки
Readln(f, x);
ColCount:= x;
// Получаем номер строки
Readln(f, x);
RowCount:= x;
// Загружаем сетку
for i:= 0 to ColCount - 1 do
for j:= 0 to RowCount - 1 do
begin
Readln(f, str);
Cells[i, j]:= str;
end;
end;
CloseFile(f); // Закрыли файл
end;

end.[/code] проект
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
17.09.2010, 10:54
общий
Евгений/Genia007/:
Огромное спасибо. Как тут оценку поставить?
давно
Профессионал
153662
1070
17.09.2010, 11:31
общий
pikvar:
Сейчас оформлю ответ, там и поставите.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
17.09.2010, 11:35
общий
это ответ
Здравствуйте, pikvar.
Предлагаю Вам свой вариант решения данной задачи. Шифр вводится в виде числа.
[code h=400]unit UnitZadacha2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Menus, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
MainMenu1: TMainMenu;
StringGrid1: TStringGrid;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N6: TMenuItem;
N5: TMenuItem;
procedure N4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure sort(shif: boolean); // Процедура сортировки
var
c, r: integer; // номер колонки и строки таблицы
m: integer; // номер строки с минимальным шифром
i, j: integer; // номер строки и колонки используется во время сортировки
buf: array[0..1] of string; // буфер для обмена строк
list: TStringList; // Список для сортировки
begin
if shif then // Если shif true сортируем по шифру иначе по фамилии
begin
for r:= 1 to form1.StringGrid1.rowcount - 1 do
begin
m:= r; // минимальный элемент - в r-ой строке
for i:= r to form1.StringGrid1.rowcount - 1 do
begin
if form1.StringGrid1.cells[1, i] = '' then break;
if StrToInt(form1.StringGrid1.cells[1, i]) < StrToInt(form1.StringGrid1.cells[1, m]) then
m:= i;
end;
if r <> m then
begin // обменяем r-ую и m-ую строки таблицы
for c:= 0 to 1 do
begin
buf[c]:= form1.StringGrid1.Cells[c, r];
form1.StringGrid1.Cells[c, r]:= form1.StringGrid1.Cells[c, m];
form1.StringGrid1.Cells[c ,m]:= buf[c];
end;
end;
end;
end
else
begin
List:= TStringList.Create; // Создали список
for i:= 1 to form1.StringGrid1.RowCount do
if form1.StringGrid1.Cells[0, i] <> '' then
List.Add(form1.StringGrid1.Cells[0, i]); // Загружаем в список данные
List.Sort; // Сортируем список
for i := 0 to List.Count - 1 do
for j := 1 to form1.StringGrid1.RowCount do
if form1.StringGrid1.Cells[0, j] = List.Strings[i] then
begin // обменяем j-ую и i-ую строки таблицы
for c:= 0 to 1 do
begin
buf[c]:= form1.StringGrid1.Cells[c, j];
form1.StringGrid1.Cells[c, j]:= form1.StringGrid1.Cells[c, i + 1];
form1.StringGrid1.Cells[c ,i + 1]:= buf[c];
end;
end;
List.Free; // Освободили список
end;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGriD1.Cells[0,0]:= 'Фамилия';
StringGriD1.Cells[1,0]:= 'Шифр';
end;

procedure TForm1.N5Click(Sender: TObject);
begin
sort(true); // Сортируем по шифру
end;

procedure TForm1.N6Click(Sender: TObject);
begin
sort(false); // Сортируем по фамилии
end;

procedure TForm1.N1Click(Sender: TObject);
var
i, j, y: word;
f: TextFile;
begin
y:= 0;
AssignFile(f, 'stringdrid.txt'); // Связали переменную с файлом
Rewrite(f); // Открыли файл для перезаписи
with StringGrid1 do // Делаем для сетки
begin
for i:= 0 to RowCount - 1 do
if Cells[0, i] <> '' then
inc(y); // Считаем сколько занято ячеек в сетке
// Записываем номер колонки и строки
Writeln(f, ColCount);
Writeln(f, y);
// Записываем содержимое ячейки
for i:= 0 to ColCount - 1 do
for j:= 0 to y - 1 do
Writeln(F, Cells[i, j]);
end;
CloseFile(F); // Закрыли файл
end;

procedure TForm1.N2Click(Sender: TObject);
var
f: TextFile;
x, i, j: Integer;
str: String;
begin
if not Fileexists('stringdrid.txt') then
begin // Выводим сообщение при отсутствии файла
ShowMessage('Файла не существует.');
exit;
end;
AssignFile(f, 'stringdrid.txt'); // Связали переменную с файлом
Reset(f); // Открыли файл на чтение
with StringGrid1 do // Делаем для сетки
begin
// Получаем номер колонки
Readln(f, x);
ColCount:= x;
// Получаем номер строки
Readln(f, x);
RowCount:= x;
// Загружаем сетку
for i:= 0 to ColCount - 1 do
for j:= 0 to RowCount - 1 do
begin
Readln(f, str);
Cells[i, j]:= str;
end;
end;
CloseFile(f); // Закрыли файл
end;

end.[/code] Весь проект.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа