методичка. метода по ООП для практики. Лабораторная работа 1. Линейный вычислительный процесс 2 Общие теоретические сведения 2 Создание оконного приложения 6
Скачать 1.1 Mb.
|
8.2. Создание оконного приложенияКомпоненты OpenDialog и SaveDialogКомпоненты OpenDialog и SaveDialog находятся на странице Dialogs. Все компоненты этой страницы невизуальны, т.е. не видны при работе программы, поэтому их размещают в любом месте формы. Обе компоненты имеют идентичные свойства. После вызова компоненты появляется стандартное диалоговое окно, с помощью которого выбирается имя программы и путь к ней. В случае успешного завершения диалога имя выбранного файла и его размещение содержaтся в FileName. Для выбора файлов, отображаемых в окне просмотра, используется свойство Filter, а для изменения заголовка окна – используется свойство Title. 8.3. Пример выполнения заданияНаписать программу обработки файла, содержащего информацию о рейтинге студентов. Каждая запись должна содержать Ф.И.О. и полученный балл рейтинга. Вывести информацию, отсортированную в порядке увеличения рейтинга. Результаты выполнения программы сохранить в текстовом файле. При работе с файлом должны быть выполнены следующие действия: создание, просмотр, добавление новой записи, сортировка, сохранение результатов. 8.3.1. Создание оконного приложенияНастройка компонент OpenDialog и SaveDialogНа странице Dialogs выбрать пиктограммы , для установки компонент OpenDialog и SaveDialog соответственно. Для выбора нужных файлов установить фильтры следующим образом: выбрав компоненту, дважды щелкнуть кнопкой мыши по правой части свойства Filter инспектора объектов, и в появившемся окне Filter Editor, в левой части записать текст, характеризующий выбор, в правой части – маску. Для OpenDialog1 установить значения маски, как показано на рис. 8.1. Формат *.dat означает, что будут видны все файлы с расширением dat, а формат *.* – будут видны все файлы (с любыми именами и расширениями). Рис. 8.1 Для того чтобы файл автоматически записывался с расширением dat, в свойстве DefaultExt записать требуемое расширение – .dat. Аналогичным образом настраивается SaveDialog1 для текстового файла, который будет иметь расширение .txt. Работа с программойФорма может иметь вид, представленный на рис. 8.2. Кнопку «Создать» нажимаем только при первом запуске программы или, если захотим заменить прежнюю информацию на новую, в окне Memo1 отображается путь и имя созданного файла. Заполнив оба поля информацией, нажимаем кнопку «Добавить», после чего введенная информация отображается в окне Memo1. Для работы с уже созданным файлом нажимаем кнопку «Открыть» – в Memo1 выводится содержимое всего файла, после чего можно добавлять новые данные в конец этого файла, не уничтожая предыдущие. При нажатии кнопки «Сортировать» в Memo1 выводятся записи, сортированные по возрастанию рейтинга. При нажатии кнопки «Сохранить результаты» создается текстовый файл, в котором сохранится информация, выведенная в Memo1. Этот файл можно просмотреть в любом текстовым редакторе (блокноте, Word). В текст программы включена пользовательская функция void Out(TZap, TMemo*); – для вывода в Memo1 одной записи. Для создания результирующего текстового файла используется функция, SaveToFile(FileNameRez); позволяющая записать все содержимое Memo1 в файл с указанным именем. Рис. 8.2 Текст программы может иметь следующий вид: . . . #include #include . . . //--------------------------------------------------------------------------- struct TZap{ char FIO[30]; double s_b; } Zap; int size = sizeof(TZap); FILE *Fz; AnsiString File_Zap; void Out(TZap, TMemo*); //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Memo1->Clear(); } //------------------ Создать----------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { OpenDialog1->Title="Создать новый файл"; if (OpenDialog1->Execute()){ File_Zap = OpenDialog1->FileName; if ((Fz=fopen(File_Zap.c_str(),"wb"))==NULL) { ShowMessage("Ошибка создания ФАЙЛА!"); return; } } Memo1->Lines->Add("Создали новый файл: "+AnsiString(File_Zap)); fclose(Fz); } //----------------- Добавить----------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Fz = fopen(File_Zap.c_str(),"ab"); strcpy(Zap.FIO, Edit1 -> Text.c_str()); Zap.s_b = StrToFloat(Edit2->Text); Out(Zap, Memo1); fwrite(&Zap, size, 1, Fz); Edit1->Text=""; Edit2->Text=""; fclose(Fz); } //--------------------- Сортировать -------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { TZap st, *mas_Z; Fz = fopen(File_Zap.c_str(),"rb"); int D_f = fileno(Fz); // Находим дескриптор файла int len = filelength(D_f); // Находим размер файла int i, j, kol; kol = len/size; //Количество записей в файле mas_Z = new TZap[kol]; // Считываем записи из файла в динамический массив for (i=0; i < kol; i++) fread((mas_Z+i), size, 1, Fz); fclose(Fz); Memo1->Lines->Add("Сортированные сведения"); for (i=0; i < kol-1; i++) for (j=i+1; j < kol; j++) if (mas_Z[i].s_b > mas_Z[j].s_b) { st = mas_Z[i]; mas_Z[i] = mas_Z[j]; mas_Z[j] = st; } for (i=0; i Out(mas_Z[i], Memo1); delete []mas_Z; } //------------------- Сохранить -------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender) { SaveDialog1->Title="Сохранить файл результатов"; if (SaveDialog1->Execute()) { AnsiString FileNameRez = SaveDialog1->FileName; Memo1->Lines->SaveToFile(FileNameRez); } } //-------------------- Открыть ---------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { OpenDialog1->Title="Открыть файл"; if (OpenDialog1->Execute()) { File_Zap = OpenDialog1->FileName; if ((Fz=fopen(File_Zap.c_str(),"rb"))==NULL) { ShowMessage("Ошибка открытия ФАЙЛА!"); return; } } Memo1->Lines->Add("--------- Все сведения ---------"); while(1){ if(!fread(&Zap,size,1,Fz)) break; Out(Zap, Memo1); } fclose(Fz); } //----------------- Очистка Memo ------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender) { Memo1->Clear(); } //----------------- Функция вывода одной записи ----------------------- void Out(TZap z, TMemo *Memo1) { Memo1->Lines->Add(AnsiString(z.FIO)+ " "+FloatToStrF(z.s_b, ffFixed,6,3)); } 8.3.2. Создание консольного приложенияДля создания текстового файла в консольном приложении используем функцию fprintf(). Текст программы может иметь следующий вид: . . . #include #include . . . struct TZap{ char FIO[30]; double s_b; } Zap; int size = sizeof(TZap); FILE *Fz, *Ft; char File_Zap[] = "zapisi.dat"; char File_Rez[] = "rezult.txt"; void Out(TZap); void main() { int kod, D_f, i=0, j, kol; long len; TZap st, *mas_Z; Ft = fopen(File_Rez, "w"); while(true) { puts("\n Create – 1\n Add – 2\n View – 3\n Sort – 4\n EXIT – 0"); scanf("%d", &kod); switch(kod) { case 1: if ((Fz=fopen(File_Zap,"wb"))==NULL) { puts("\n Create ERROR!"); return; } fclose(Fz); printf("\n Create New File %s !\n",File_Zap); break; case 2: Fz = fopen(File_Zap,"ab"); printf("\n F.I.O. – "); fflush(stdin); gets(Zap.FIO); printf(" Ball – "); scanf("%lf", &Zap.s_b); fwrite(&Zap, size, 1, Fz); fclose(Fz); break; case 3: if ((Fz=fopen(File_Zap,"rb"))==NULL) { puts("\n Open ERROR!"); return; } // Вывод на экран printf("\n\t--------- Informations ---------"); // Запись такой же информации в текстовый файл Ft fprintf(Ft,"\n\t--------- Informations ---------"); while(1) { if(!fread(&Zap,size,1,Fz)) break; Out(Zap); } fclose(Fz); break; case 4: Fz = fopen(File_Zap,"rb"); D_f = fileno(Fz); len = filelength(D_f); kol = len/size; mas_Z = new TZap[kol]; // Считываем записи из файла в динамический массив for (i=0; i < kol; i++) fread((mas_Z+i), size, 1, Fz); fclose(Fz); printf("\n\t----- S O R T -----\n"); fprintf(Ft,"\n\t----- S O R T -----\n"); for (i=0; i < kol-1; i++) for (j=i+1; j < kol; j++) if (mas_Z[i].s_b > mas_Z[j].s_b) { st = mas_Z[i]; mas_Z[i] = mas_Z[j]; mas_Z[j] = st; } for (i=0; i Out(mas_Z[i]); delete []mas_Z; break; case 0: fclose(Ft); return; } } } //----------------- Функция вывода одной записи на экран и в файл -------------------- void Out(TZap z) { printf("\n %20s , %6.3lf .", z.FIO,z.s_b); fprintf(Ft, "\n %20s , %6.3lf .", z.FIO, z.s_b); } Первоначально выбав пункт «1», создаем файл с именем zapisi.dat, который будет располагаться в текущем каталоге (созданной папке). Затем, выбирая пункт «2», последовательно вводим 4 записи. Выбрав пункт «3», просматриваем содержимое файла, а сортированные записи выведем на экран (запишем в файл), выбрав пункт «4». Результаты выполнения программы могут иметь вид: |