СОДЕРЖАНИЕ
Лабораторная работа №1. Линейный вычислительный процесс.. 4
1.1. Общие теоретические сведения. 4
1.2. Создание оконного приложения. 8
1.3. Создание консольного приложения. 11
1.4. Пример выполнения задания. 12
1.5. Индивидуальные задания. 15
Лабораторная работа №2. Реализация разветвляющихся алгоритмов.. 17
2.1. Общие теоретические сведения. 17
2.2. Создание оконного приложения. 18
2.3. Пример выполнения задания. 19
2.4. Индивидуальные задания. 22
Лабораторная работа №3. Реализация циклических алгоритмов.. 24
3.1. Общие теоретические сведения. 24
3.2. Пример выполнения задания. 25
3.3. Индивидуальные задания. 27
Лабораторная работа №4. Функции пользователя.. 29
4.1. Краткие теоретические сведения. 29
4.2. Пример выполнения задания. 30
4.3. Индивидуальные задания. 32
Лабораторная работа №5. Обработка одномерных массивов.. 33
5.1. Общие теоретические сведения. 33
5.2. Создание оконного приложения. 33
5.3. Пример выполнения задания. 34
5.4. Индивидуальные задания. 37
Лабораторная работа №6. Обработка двухмерных динамических массивов.. 38
6.1. Краткие теоретические сведения. 38
6.2. Пример выполнения задания. 40
6.3. Индивидуальные задания. 43
Лабораторная работа №7. Использование строк.. 44
7.1. Общие теоретические сведения. 44
7.2. Создание оконного приложения. 44
7.3. Пример выполнения задания. 46
7.4. Индивидуальные задания. 48
Лабораторная работа №8. Обработка структур с использованием файлов.. 49
8.1. Теоретические сведения. 49
8.2. Создание оконного приложения. 51
8.3. Пример выполнения задания. 51
8.4. Индивидуальные задания. 58
Лабораторная работа №9. Построение графиков функций.. 60
9.1. Краткие теоретические сведения. 60
9.2. Пример создания оконного приложения. 61
9.3. Индивидуальные задания. 64
Приложение 1. Операции и основные математические функции.. 65
Приложение 2. Описание общих структур файлов проекта.. 67
ЛИТЕРАТУРА.. 69
Лабораторная работа №1. Линейный вычислительный процесс
Цель работы: изучить правила составления текстов программ, научиться реализовывать линейные алгоритмы, а также составлять каркас простейшей программы в среде C++ B uilder. Написать и отладить программу линейного алгоритма в консольном и(или) оконном приложении.
Общие теоретические сведения
Алфавит языка С/С++ состоит из: прописных и строчных букв латинского алфавита, арабских цифр и специальных символов, смысл и правила использования которых будут рассматриваться далее.
В языке C применяются данные двух категорий: простые (скалярные) и сложные (составные).
К основным (базовым) типам данных относятся целый (int), вещественный (float, double) и символьный (char) типы. В свою очередь, данные целого типа могут быть короткими (short) и длинными (long), со знаком (signed) и беззнаковыми (unsigned). Атрибут long может использоваться и с типом double – длинное вещественное.
К сложным типам данных относятся массивы, структуры (struct), объединения (union) и перечисления (enum).
В языке С++ используются данные типа bool – логические, принимающие значения true (1) – истина и false (0) – ложь, а также AnsiString (String) – строковый тип данных (см. п.7.2).
Запись самоопределенных констант
Тип данных | Общий формат записи | Примеры |
Десятичные целые | ± n | 22 –15 176 –1925 |
Вещественные с фиксированной десятичной точкой | ± n .m | 1.0 –3.125 –0.001 |
Вещественные с плавающей точкой | ± n .mE ± p смысл записи ±n,m×10±p | 1.01E–10 0.12537е+4 |
Символьные | ' * ' | 'A' 'х' '0' '<' |
Строковые | “ ****** ” | “Minsk” “Press any key” |
В таблице * – любой символ, набранный на клавиатуре.
Декларация объектов
Все объекты (переменные, массивы и т.д.), с которыми работает программа, необходимо декларировать. В декларации объектам присваиваются идентификаторы (ID), которые могут включать латинские буквы, символ нижнего подчеркивания «_» и цифры, причем первым символом ID не может быть цифра.
Внимание! В языке С/С++ строчные и прописные буквы имеют различные коды, т.е. PI, Pi и pi – различные идентификаторы.
При декларации объектам можно задавать начальные значения (инициализировать), например:
int k = 10, m = 3, n;
double c = –1.3, w = –10.23, s;
Принято использовать в ID переменных строчные буквы, а в именованных константах – прописные, например:
const double PI = 3.1415926;
double pi = 3.1415926;
Разделителями ID являются пробелы, символы табуляции, перевода строки и страницы, а также комментарии.
Комментарий – любая последовательность символов, начинающаяся парой символов /* и заканчивающаяся парой символов */ или начинающаяся // и до конца текущей строки.
Директивы препроцессора
Перед компиляцией программы с помощью директив препроцессора выполняется предварительная обработка текста программы.
Директивы начинаются с символа #; за которым следует наименование операции препроцессора. Чаще всего используются директивы include и define.
Директива #include используется для подключения к программе заголовочных файлов с декларацией стандартных библиотечных функций, например:
#include <stdio.h> – стандартные функции ввода-вывода;
#include <conio.h> – функции работы с консолью;
#include <math.h> – математические функции.
Директива #define (определить) создает макроконстанту и ее действие распространяется на весь файл, например:
#define PI 3.1415927
– в ходе препроцессорной обработки идентификатор PI везде заменяется указанным значением 3,1415927.
Операции языка С/С++ (арифметические: +,–,*,/,%) и наиболее часто использующиеся стандартные математические функции описаны в прил.1.
Операция присваивания имеет полную и сокращенную формы записи.
Полная форма: ID = выражение;
– выполняется справа налево, т.е. сначала вычисляется выражение, а затем его результат присваивается указанному ID, например: y=(x+2)/(3*x)–5;
В одном операторе можно присвоить значение нескольким переменным, например: x = y = z = 0;
или z = (x = y) * 5; – сначала переменной x присваивается значение переменной y, далее вычисляется выражение x*5 , и результат присваивается переменной z.
Сокращенная форма: ID операция= выражениe;
где операция – одна из арифметических операций + , –, *, /, %; например:
s += 7; (s = s+7;) или y *= x+3; (y = y*(x+3));
Сокращенная форма применяется, когда переменная используется в обеих частях ее полной формы.
В языке С/С++ существуют операции инкремента (--) и декремента (++), т.е. уменьшения или увеличения значения переменной на 1. Операции могут быть префиксные (++i и --i) и постфиксные (i++ и i--). При использовании данной операции в выражении в префиксной форме, сначала выполняется сама операция (изменяется значение i), и только потом вычисляется выражение. В постфиксной форме – операция применяется после вычисления выражения, например, для значений b = 7 и n = 1 будут получены следующие результаты:
1) c = b*++n; – порядок выполнения: n = n+1, c = b*n, т.е. c = 14;
2) c = b*n++; – в этом случае: c = b*n, n = n+1, т.е. c = 7 .
Интегрированная среда разработчика C++ Builder
Среда B uilder визуально реализуется в виде нескольких окон, одновременно раскрытых на экране монитора. Количество, расположение, размер и вид окон может меняться пользователем в зависимости от поставленной задачи. Меню среды B uilder может иметь вид, представленный на рис. 1.1.
Главное окно предназначено для управления процессом создания программы. Основное меню содержит все необходимые средства для управления проектом. Пиктограммы облегчают доступ к наиболее часто применяемым командам основного меню. Через меню компонент осуществляется доступ к набору стандартных сервисных программ среды, которые описывают некоторый визуальный элемент (компоненту), помещенный программистом в окно формы. Каждая компонента имеет определенный набор свойств, которые задаются Пользователем, например, заголовок окна, надпись на кнопке, стиль выводимого текста и т.п.
Окно инспектора объектов (вызывается нажатием клавиши F11) предназначено для изменения свойств выбранных компонент и состоит из двух страниц. Страница Properties (свойства) предназначена для изменения необходимых свойств компоненты, страница Events (события) – для определения реакции компоненты на то или иное событие, например, нажатие определенной клавиши или щелчок кнопкой мыши.
Окно формы представляет собой проект Windows-окна программы, в которое помещаются необходимые компоненты для решения поставленной задачи, причем при выполнении программы помещенные компоненты будут иметь тот же вид, что и на этапе проектирования.
Окно текста (имя Unit1.cpp), предназначено для написания, редактирования и просмотра текста программы. При первоначальной загрузке в окне текста программы находится текст, содержащий минимальный набор операторов для нормального функционирования пустой формы в качестве Windows-окна.
Программа в среде B uilder составляется из функций, которые необходимо выполнить, если возникает определенное событие, связанное с формой, например, щелчок кнопкой мыши – событие OnClick, создание формы – OnCreate.
Для каждого обрабатываемого в форме события с помощью страницы Events инспектора объектов или двойным щелчком кнопкой мыши по выбранной компоненте в текст программы вставляется функция-обработчик, между символами { и } в которой записываются соответствующие действия.
Переключение между окном формы и окном текста программы осуществляется с помощью клавиши F12.
Структура программ C++ Builder
Программа в B uilder состоит из множества функций, объединяемых в один проект с помощью файла проекта Project1. bpr, который создается автоматически, обрабатывается средой B uilder и не предназначен для редактирования.
При создании как консольного, так и оконного приложений системой программирования автоматически формируется текстовый файл с именем Unit1.cpp.
В оконном приложении объявления классов, переменных (объектов) и функций-обработчиков (методов) находятся в заголовочном файле, имеющем то же имя, что и текстовый файл, только с расширением .h. Описание окна формы находится в файле с расширением .dfm. Файл проекта может быть только один, файлов с другими расширениями может быть несколько.
Внимание! Для того чтобы перенести проект на другой компьютер, необходимо переписать все файлы с расширениями: *. bpr, *. h, *. cpp, *. dfm.
Общий вид структур следующих файлов: текст программы (Unit1. cpp), проект (Project1. cpp), заголовочный (Unit1. h) приведен в прил. 2.
Компонента Label
Данная компонента используется для вывода надписей, для чего в меню компонент Standard выбирается пиктограмма , и в нужном месте формы устанавливается надпись Label1, регулируется размер, место положения, изменяется свойство Caption инспектора объектов, в котором вводится нужный текст, например, строка “Значение X = ”, а также выбирается стиль (свойство Font).
При установке таких компонент в текст Unit1.h вставляются переменные типа TLabel, в которых хранятся пояснительные строки. Эти строки можно изменять в процессе работы программы, например:
Label1->Caption = “”; – «очистка» строки;
Label1->Caption = “Не выполняется!”; – вывод строки.
Компонента Memo
Для вывода результатов работы программы обычно используется окно многострочного редактора текста, представленое компонентой Memo, для чего выбирается пиктограмма , помещается на форму, регулируется ее размер и местоположение. После установки с помощью инспектора свойства ScrollBars – SSBoth в окне появятся вертикальная и горизонтальная полосы прокрутки.
При установки данной компонеты в Unit1.h прописывается переменная Memo1 типа ТMemo. Информация, выводимая построчно в окне Memo1, находится в массиве строк Memo1–>Lines, каждая из которых имеет тип String.
Для очистки окна используется метод Memo1–>Clear( ).
Для добавления новой строки используется метод Memo1–>Lines–>Add( ).
Если нужно вывести числовое значение, то его надо преобразовать к типу AnsiString и добавить в массив Memo1–>Lines, например, вывести int u = 100;
double w = –256.38666;
в результате записей
Memo1–>Lines–>Add (“ Значение u = ”+IntToStr(u));
Memo1–>Lines–>Add (“ Значение w = ”+FloatToStrF(w,ffFixed,8,2));
появятся строки
Значение u = 100
Значение w = –256.39
При этом под все число отводится восемь позиций, из которых две позиции занимает его дробная часть.
Если выводимая информация превышает размер окна Memo1, то для просмотра используются полосы прокрутки.
Обработка событий
Напомним, что программа в среде B uilder представляет собой набор функций, выполняющих обработку событий, связанных с формой, например, щелчок кнопкой мыши – событие OnClick, создание формы – событие OnCreate.
Пример создания оконного приложения
В оконном режиме панель диалога программы создать в виде, представленном на рис. 1.2.
Рис. 1.2
Для создания проекта необходимо выполнить следующие действия.
1. Запускаем С++ Builder. Создаем в разрешенной для Пользователя папке (d:\work\ или c:\work\) папку с номером группы (\610101\), открыв ее, сохраняем предлагаемые файлы Unit1.cpp и Project1.cpp (рекомендуем без изменения).
2. Оформляем окно формы, заменив заголовок Form1 на нужный текст. Помещаем на форму необходимые компоненты Label1, Label2, Label3, Label4 (вставляя в Caption соответствующие тексты), Edit1, Edit2, Edit3, Memo1 c полосами прокрутки (см. п. 1.3), Button1 (заменив в Caption текст).
Используя свойство Font, выбираем стили выводимых текстов.
3. Оформляем листинг программы (Unit1.cpp). Двойным щелчком кнопкой мыши по свободному месту формы создаем функцию FormCreate и заполняем ее (см. пример). Переходим на форму (F12), щелкаем дважды по кнопке «ВЫПОЛНИТЬ» и заполняем созданную функцию Button1Click (см. пример).
4. Перед запуском программы на обработку, сохраняем все.
5. Запускаем проект на выполнение, исправляем ошибки.
Текст программы может иметь следующий вид (наклонным мелким шрифтом выделен текст, редактировать который не рекомендуется):
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text = "3,4";
Edit2->Text = "7,4e-2";
Edit3->Text = "1,943e2";
Memo1->Clear();
Memo1->Lines->Add("Лабораторная работа № 1");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x, y, z, a, b ,c, rez;
x = StrToFloat(Edit1->Text);
y = StrToFloat(Edit2->Text);
z = StrToFloat(Edit3->Text);
a = pow(tan(x+y),2);
b = exp(y-z);
c = sqrt(cos(x*x)+sin(z*z));
rez = a-b*c;
Memo1->Lines->Add("При х = "+FloatToStrF(x,ffFixed,7,3)
+ "; y = "+FloatToStrF(y,ffFixed,7,3)+"; z = "+FloatToStrF(z,ffFixed,7,3));
Memo1->Lines->Add("Результат = "+FloatToStr(rez));
}
Внимание! В строковых константах разделитель целой и дробной частей – запятая: Edit1->Text = "3,4"; в отличие от числовых констант в тексте программы.
В результате должно получиться рабочее окно (рис. 1.3). Если щелкнуть мышью по кнопке «ВЫПОЛНИТЬ», в окне Memo1 появится соответствующий текст (результат). Далее в окошках Edit* можно изменять исходные значения и, нажимая кнопку «ВЫПОЛНИТЬ», получать новые результаты.
Рис. 1.3
Оператор выбора switch
Общая форма оператора выбора (переключателя):
switch(выражение) {
case const_1: операторы; break;
…
case const_N: операторы; break;
default: операторы;
}
Вычисляется выражение и проверяется, совпадает ли его результат со значением одной из констант. При совпадении выполняются операторы этого case. Значениями const_1,…, const_N могут быть только целые или символьные константы. Конструкция default выполняется, если результат выражения не совпал ни с одной из констант, и может отсутствовать. Оператор break выполняет досрочный выход из switch (после выполнения ветви case все остальные будут опущены). Если оператор break в case не записан, то будут выполняться операторы следующих ветвей case до появления оператора break, либо до завершения оператора switch.
Например:
switсh(i) {
case 1: f=pow(x,2); break;
case 2: f=fabs(x); break;
case 3: f=sqrt(x); break;
default: printf(“Ошибка!”); exit(1);
}
f=f+5;
Компонента СheckBox
В меню Standard выберите пиктограмму , поместите ее в нужное место формы, измените заголовок Caption на «max модулей», после чего в тексте программы появится переменная CheckBox1 типа TСheckBox. В зависимости от того, сделан выбор или нет, булева переменная CheckBox1->Checked будет принимать значение true или false.
Компонента RadioGroup
В меню Standard выберите пиктограмму , поместите ее в нужное место формы. На форме появится окаймленный линией чистый прямоугольник с заголовком RadioGroup1. Замените заголовок (Caption) на «Выбор функции».
В инспекторе объектов в свойстве Items вызовите строчный редактор списка заголовков кнопок и наберите три строки с именами выбираемых функций (cos(x), sin(x), tg(x)), нажмите ОК. После этого внутри компоненты появятся три кнопки-переключателя с введенными надписями.
В тексте Unit1.h появилась переменная RadioGroup1 типа TRadioGroup. Теперь при нажатии одной из кнопок группы в переменной целого типа RadioGroup1->ItemIndex будет находиться номер выбранной строчки (отсчитывается от нуля).
В функции FormCreate() желательно установить начальное значение этой переменной, например, RadioGroup1->ItemIndex = 0.
Подготовив форму, создайте функции-обработчики событий FormСreate и B utton1Сlick аналогично первой работе. Текст функций приведен в примере.
Запустите программу и убедитесь в том, что все ветви алгоритма выполняются правильно. Форма приведена на рис. 2.1.
Рис. 2.1
Текст программы может быть следующим:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text="0,1";
Edit2->Text="0,356";
Edit3->Text="-3,5";
Memo1->Clear();
Memo1->Lines->Add("Лабораторная работа 2");
RadioGroup1->ItemIndex = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x,y,z,u,ma;
x=StrToFloat(Edit1->Text);
y=StrToFloat(Edit2->Text);
z=StrToFloat(Edit3->Text);
// Проверка номера нажатой кнопки и выбор соответствующей функции
switch(RadioGroup1->ItemIndex){
case 0: u=cos(x);
Memo1->Lines->Add("Cos(x)= "+FloatToStrF(u,ffFixed,8,6));
break;
case 1: u=sin(x);
Memo1->Lines->Add("Sin(x)= "+FloatToStrF(u,ffFixed,8,6));
break;
case 2: u=tan(x);
Memo1->Lines->Add("Tg(x)= "+FloatToStrF(u,ffFixed,8,6));
break;
}
// Проверка состояния кнопки CheckBox1
if (CheckBox1->Checked){
u = fabs(u);
y = fabs(y);
z = fabs(z);
}
// Нахождение максимального из трех чисел
if (u>y) ma=u;
else ma=y;
if (z>ma) ma=z;
if (CheckBox1->Checked)
Memo1->Lines->Add("Max модулей= "+FloatToStrF(ma,ffFixed,8,6));
else Memo1->Lines->Add("Max= "+FloatToStrF(ma,ffFixed,8,6));
}
Пример написания программы консольного приложения
Текст программы может иметь вид
//---------------------------------------------------------------------------
#include <vcl.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
double x,y,z,u,ma;
int kod;
puts("Input x, y, z");
scanf("%lf%lf%lf",&x, &y, &z);
puts("Function U(x):\n 0 - cos(x)\n 1 - sin(x)\n 2 - tan(x)");
scanf("%d", &kod);
switch(kod){
case 0: u=cos(x); printf("\n\t Cos(x)= %8.6lf",u); break;
case 1: u=sin(x); printf("\n\t Sin(x)= %8.6lf",u); break;
case 2: u=tan(x); printf("\n\t Tg(x)= %8.6lf",u); break;
}
puts("\nMax ABS - 1, Else - Max");
scanf("%d", &kod);
if (kod == 1){
u = fabs(u);
y = fabs(y);
z = fabs(z);
}
if (u>y) ma=u;
else ma=y;
if (z>ma) ma=z;
if (kod==1)printf("Max ABS = %8.6lf", ma);
else printf("Max = %8.6lf", ma);
puts("\nPress any key ... ");
getch();
return 0;
}
Результаты выполнения программы:
2.4. Индивидуальные задания
Вычислить значение y в зависимости от выбранной функции j(x), аргумент которой определяется из поставленного условия. Возможные значения функции j(x): 2x, x2, х/3 (в оконном приложениии выбор выполнить с помощью компоненты RadioGroup). Предусмотреть вывод сообщений, показывающих, при каком условии и с какой функцией производились вычисления у.
1. , где
2. , где
3. , где
4. , где
5. , где
6. , где
7. , где
8. , где
9. , где
10. , где
11. , где
12. , где
13. , где
14. , где
15. , где
16. , где
Пример создания оконного приложения
Текст функций-обработчиков может быть следующим (стандартный текст опущен):
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text="0,1"; Edit2->Text="1,0";
Edit3->Text="10"; Edit4->Text="0,2";
Memo1->Lines->Add("Лабораторная работа 3");
}
Рис. 3.1
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double a, b, x, h, r, s;
int n, zn = -1, k;
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
n = StrToInt(Edit3->Text);
h = StrToFloat(Edit4->Text);
for(x = a; x<=b; x+=h) {
r = s = 1;
for(k = 1; k<=n; k++) {
r = zn*r*x/k;
s+=r;
}
Memo1->Lines->Add("при x= "+FloatToStrF(x,ffFixed,8,2)
+" сумма= "+FloatToStrF(s,ffFixed,8,5));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Memo1->Clear();
}
Пример создания консольного приложения
Текст программы предложенного задания может иметь вид
#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[])
{
double a, b, x, h, r, s;
int n, zn = -1, k;
puts("Input a,b,h,n");
scanf("%lf%lf%lf%d", &a, &b, &h, &n);
for(x = a; x<=b; x+=h) {
r = s = 1;
for(k = 1; k<=n; k++) {
r=zn*r*x/k;
s+=r;
}
printf("\n x= %8.2lf sum= %8.5lf", x,s);
}
puts("\nPress any key ... ");
getch();
return 0;
}
Результат программы с введенными значениями a=0.1, b=1.0, h=0.2 и n=10:
3.3. Индивидуальные задания
Для каждого x, изменяющегося от a до b с шагом h, найти значения функции Y(x), суммы S(x) и |Y(x)–S(x)| и вывести в виде таблицы. Значения a, b, h и n вводятся с клавиатуры. Так как значение S(x) является рядом разложения функции Y(x), при правильном решении значения S и Y для заданного аргумента x (для тестовых значений исходных данных) должны совпадать в целой части и в первых двух-четырех позициях после десятичной точки.
Работу программы проверить для a = 0,1; b = 1,0; h = 0,1; значение параметра n выбрать в зависимости от задания.
1. , .
2. .
3. .
4. .
5. .
6. .
7. , .
8. , .
9. , .
10. , .
11. , .
12. , .
13. , .
14. , .
15. , .
16. .
Область действия переменных
Область действия переменной – это правила, которые устанавливают, какие данные доступны из текущего места программы, и определяют переменные двух типов: глобальные и локальные.
Глобальные переменные объявляются вне какой-либо функции и могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены и инициализированы. Область действия глобальных переменных – вся программа с момента их объявления. При объявлении глобальные переменные обнуляются.
Область действия локальных переменных – это блоки, где они объявлены. К локальным относятся и формальные параметры в заголовке функций пользователя с бластью действия – кодом функции. При выходе из блока значения локальных переменных теряются.
В языке С каждая переменная принадлежит одному из четырех классов памяти – автоматической (auto), внешней (extern), статической (static) и регистровой (register). Тип памяти указывается перед спецификацией типа, например, register int a; или static double b; По умолчанию устанавливается класс auto и переменные размещаются в стеке.
Указатель на функцию
Функции могут быть использованы в качестве формальных параметров, для этого используется указатель на функцию. Например, указатель р на функцию, возвращающую результат типа double и имеющую два параметра doublet и int, объявляется следующим образом:
double (*p)(double, int);
Используя операцию typedef, тип такого указателя может быть объявлен так
typedef double (*TFun)(double, int);
4.2. Пример выполнения задания
Написать программу вычисления выбранной функции, вид которой в свою очередь передается в качестве параметра в функцию вывода (Out_Rez).
Компонента StringGrid
При работе с массивами ввод и вывод значений обычно организуется с использованием компоненты StringGrid, предназначенной для отображения информации в виде двухмерной таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично окну Edit). Доступ к информации осуществляется с помощью элемента Cells[ACol][ARow] типа AnsiString, где целочисленные значения ACol, A Row указывают позицию элемента.
Внимание! Первый индекс ACol определяет номер столбца, а второй A Row – номер строки в отличие от индексов массива.
В инспекторе объектов значения ColCount и RowCount устанавливают начальные значения количества столбцов и строк в таблице, а FixedCols и FixedRows задают количество столбцов и строк фиксированной зоны. Фиксированная зона выделена другим цветом и обычно используется для надписей.
5.3. Пример выполнения задания
Удалить из массива А размером N, состоящего из целых чисел (положительных и отрицательных), все отрицательные числа. Новый массив не создавать. Для заполнения массива использовать фунцию random(kod) – генератор случайных равномерно распределенных целых чисел от 0 до (int)kod.
Пример создания оконного приложения
Значение N вводить из Edit, значения массива А – из компоненты StringGrid. Результат вывести в компоненту StringGrid.
Панель диалога и результаты выполнения программы приведена на рис. 5.1.
Рис. 5.1
Пример создания консольного приложения
Текст программы может иметь следующий вид (обратите внимание на то, что функция main используется в простейшей форме – без параметров и не возвращает результатов):
. . .
#include <stdio.h>
#include <conio.h>
void main()
{
int a[10],n, i, kol=0;
randomize(); // Изменение начального адреса для random()
printf("Input N (<=10) ");
scanf("%d", &n);
puts("\n Massiv A");
for(i=0; i<n;i++) {
a[i] = random(21)-10; // Заполнение массива А случайными числами
printf("%4d", a[i]);
}
//Удаление отрицательных элементов из массива А
for(i=0; i<n;i++)
if(a[i]>=0) a[kol++] = a[i];
puts("\n Rezult massiv A");
for(i=0; i<kol;i++) printf("%4d", a[i]);
puts("\n Press any key ... ");
getch();
}
С заполненным случайными числами массивом А результат программы может быть следующим:
5.4. Индивидуальные задания
Написать программу по обработке одномерных массивов. Размеры массивов вводить с клавиатуры. В консольном приложении предусмотреть возможность ввода данных как с клавиатуры, так и с использованием функции random().
При создании оконного приложения скалярный (простой) результат выводить в виде компоненты Label, а массивы вводить и выводить с помощью компонент StringGrid.
В одномерном массиве, состоящем из n вводимых с клавиатуры целых элементов, вычислить:
1. Произведение элементов массива, расположенных между максимальным и минимальным элементами.
2. Сумму элементов массива, расположенных между первым и последним нулевыми элементами.
3. Сумму элементов массива, расположенных до последнего положительного элемента.
4. Сумму элементов массива, расположенных между первым и последним положительными элементами.
5. Произведение элементов массива, расположенных между первым и вторым нулевыми элементами.
6. Сумму элементов массива, расположенных между первым и вторым отрицательными элементами.
7. Сумму элементов массива, расположенных до минимального элемента.
8. Сумму модулей элементов массива, расположенных после последнего отрицательного элемента.
9. Сумму элементов массива, расположенных после последнего элемента, равного нулю.
10. Сумму модулей элементов массива, расположенных после минимального по модулю элемента.
11. Сумму элементов массива, расположенных после минимального элемента.
12. Сумму элементов массива, расположенных после первого положительного элемента.
13. Сумму модулей элементов массива, расположенных после первого отрицательного элемента.
14. Сумму модулей элементов массива, расположенных после первого элемента, равного нулю.
15. Сумму положительных элементов массива, расположенных до максимального элемента.
16. Произведение элементов массива, расположенных между первым и последним отрицательными элементами.
Указатели на указатели
Связь указателей и массивов с одним измерением справедливо и для массивов с бóльшим числом измерений.
Если рассматривать предыдущий массив (int a[2][3];) как массив двух массивов размерностью по три элемента каждый, то обращение к элементу а[i][j] соответствует эквивалентное выражение *(*(а+i)+j), а объявление этого массива с использованием указателей будет иметь вид
int **а;
Таким образом, имя двухмерного массива – ID указателя на указатель.
Пример создания оконного приложения
Значение N вводить из Edit, А и B – из компонент StringGrid. Результат вывести в компоненту StringGrid.
Панель диалога и результаты выполнения программы приведена на рис. 6.1.
Рис. 6.1
Пример создания консольного приложения
Текст программы может иметь следующий вид:
. . .
void main()
{
double **a, *b, s;
int i, j, n;
printf(" Input size N : "); scanf("%d",&n);
a = new double*[n]; // Захват памяти под указатели
for(i=0; i<n;i++)
a[i] = new double[n]; // Захват памяти под элементы
b = new double[n];
puts("\n Input Massiv A:");
for(i=0; i<n;i++)
for(j=0; j<n;j++) scanf("%lf", &a[i][j]);
puts("\n Input Massiv B:");
for( i=0; i<n;i++) scanf("%lf", &b[i]);
puts("\n Massiv Y:");
for(i=0; i<n;i++){
for(s=0, j=0; j<n;j++) s+=a[i][j]*b[j];
printf(" %8.2lf ", s);
}
delete []a;
delete []b;
puts("\n Delete !");
puts("\n Press any key ... ");
getch();
}
При вводе значений элементов массивов в одной строке через пробелы должен получиться следующий результат:
6.3. Индивидуальные задания
Написать программу по обработке динамических массивов. Размеры массивов вводить с клавиатуры. При создании оконного приложения скалярный (простой) результат выводить в виде компоненты Label, а массивы вводить и выводить с помощью компонент StringGrid, в которых 0-й столбец и 0-ю строку использовать для отображения индексов массивов.
1. Из матрицы размером N´M получить вектор B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, иначе 1.
2. Из матрицы размером N´M получить вектор B, присвоив его k-му элементу значение 1, если элементы k-й строки матрицы упорядочены по убыванию, иначе 0.
3. Из матрицы размером N´M получить вектор B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, иначе значение 0.
4. Задана матрица размером N´M. Определить количество «особых» элементов матрицы, считая элемент «особым», если он больше суммы остальных элементов своего столбца.
5. Задана матрица размером N´M. Определить количество элементов матрицы, у которых слева находится элемент больше его, а справа – меньше.
6. Задана матрица размером N´M. Определить количество различных значений матрицы, т.е. повторяющиеся элементы считать один раз.
7. В матрице размером N´M упорядочить строки по возрастанию их первых элементов.
8. В матрице размером N´M упорядочить строки по возрастанию суммы их элементов.
9. В матрице размером N´M упорядочить строки по возрастанию их наибольших элементов.
10. Определить, является ли квадратная матрица симметричной относительно побочной диагонали.
11. Задана матрица размером N´M. Определить количество элементов матрицы, у которых слева находится элемент меньше его, а справа – больше.
12. В квадратной матрице найти произведение элементов, лежащих выше побочной диагонали.
13. В квадратной матрице найти максимальный среди элементов, лежащих ниже побочной диагонали.
14. В матрице размером N´M поменять местами строку, содержащую элемент с наибольшим значением со строкой, содержащей элемент с наименьшим значением.
15. Из матрицы размером n получить матрицу размером n-1 путем удаления строки и столбца, на пересечении которых расположен элемент с наибольшим по модулю значением.
16. В матрице размером n найти сумму элементов, лежащих ниже главной диагонали, и произведение элементов, лежащих выше главной диагонали.
Тип AnsiString
Тип AnsiString является основным строковым классом в B uilder.
Часто используемые методы этого класса: с_str() – преобразование строки AnsiString в массив символов; Delete() – удаление символов, SubString() – копирование подстроки; Pos() – поиск позиции; Length() – определение длины строки.
Компонента ListBox
Данная компонента представляет собой список, элементы которого выбираются при помощи клавиатуры или мыши. Список элементов задается свойством Items, методы Add, Delete и Insert которого используются для добавления, удаления и вставки строк, соответственно. Объект Items хранит строки списка. Для определения номера выделенного элемента используется свойство ItemIndex.
Компонента ComboBox
Список ComboBox – комбинация списка ListBox и редактора текста Еdit, поэтому практически все свойства аналогичны. Для работы с окном редактирования используется свойство Text, как в Edit, а для работы со списком выбора – свойство Items, как в ListBox. Cуществует пять модификаций компоненты, определяемых ее свойством Style, выбрав в котором модификацию csSimple, раскрываем список, потянув его за нижнюю кромку (захватив ее мышью).
Компонента-кнопка BitBtn
Компонента BitBtn расположена на странице Additonal и представляет собой разновидность стандартной кнопки B utton. Ее отличие – наличие изображения на поверхности, определяемое свойством Glyph. Кроме того, свойство Kind задает одну из 11 стандартных разновидностей кнопок, нажатие любой из них, кроме bkCustom и bkHelp, закрывает окно и возвращает в программу результат mr*** (например, bkOk – mrOk). Кнопка bkClose закрывает главное окно и завершает работу программы.
Обработка событий
Обо всех происходящих в системе событиях, таких, как создание формы, нажатие кнопки мыши или клавиатуры и т.д., ядро Windows информирует окна путем посылки соответствующих сообщений. Среда Builder позволяет принимать и обрабатывать большинство таких сообщений. Каждая компонента содержит обработчики сообщений на странице Events инспектора объектов.
Для создания обработчика события необходимо выделить нужную компоненту, далее на странице Events выбрать обработчик и двойным щелчком кнопкой мыши в белом (пустом) окошке в текст программы будет вставлена соответствующая функция. Например, выделив компоненту Form1 и выбрав обработчик OnActivate, будет вставлена функция …FormActivate(…) { }.
Каждая компонента имеет свой набор обработчиков событий, однако некоторые из них присущи большинству компонент. Рассмотрим наиболее часто применяемые события:
OnActivate – форма получает это событие при активации;
OnCreate – возникает при создании формы (Form), в обработчике события задаются действия, которые должны происходить в момент создания формы;
OnKeyPress – возникает при нажатии клавиши клавиатуры, параметр Key типа WORD содержит ASCII-код нажатой клавиши (Enter имеет код 13, Esc – 27) и обычно используется, когда необходима реакция на нажатие одной из клавиш;
OnKeyDown – возникает при нажатии клавиши клавиатуры, обработчик этого события получает информацию о нажатой клавише и состоянии клавиш Shift, Alt и Ctlr, а также о нажатой кнопке мыши;
OnKeyUp – является парным событием для OnKeyDown и возникает при отпускании ранее нажатой клавиши;
OnClick – возникает при нажатии кнопки мыши в области компоненты, а OnDblClick – при двойном щелчке кнопкой мыши в области компоненты.
7.3. Пример выполнения задания
Написать программу подсчета числа слов в строке, содержащей пробелы.
Теоретические сведения
Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием шаблона:
struct Рerson {
char Fio[30];
double sball;
};
Объявление переменных созданного структурного типа:
Person Stud, *p_Stud;
Обращение к элементам структур производится посредством:
1) операции принадлежности ( . ) в виде:
ID_структуры . ID_поля или (*указатель) . ID_поля
2) операции косвенной адресации (–>) в виде:
указатель –> ID_поля или &(ID_структуры) . ID_поля
Для приведенного выше примера
1) Stud.Fio = “Иванов А.И.”; //Инициализация данных
Stud.sball = 5.75;
2) р_Stud –> Fio = “Иванов А.И.”;
р_Stud –> sball =5.75;
В языке C/С++ файл рассматривается как поток (stream), представляющий собой последовательность считываемых или записываемых байт. При этом последовательность записи определяется самой программой.
Работа с файлами
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое. Прототипы большинства функций по обработке файлов описаны в библиотеках stdio. h и io. h.
Прежде чем работать с файлом, его нужно открыть для доступа, т.е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т.д. В языке С/С++ это выполняет функция fopen(), которая связывает физический файл на носителе с логическим именем в программе. Логическое имя – это указатель на файл, т.е. на область памяти, где хранится информация о файле. Указатели на файлы необходимо декларировать:
FILE *указатель на файл;
Формат функции
fopen( “строка 1” , “строка 2” );
в строке 1 указывается место, в которое мы собираемся поместить файл, например: “d:\\work\\sved.txt” – файл с именем sved.txt, который будет находиться на диске d, в папке work; если путь к файлу не указывать, то он будет размещен в рабочей папке проекта.
В строке 2 указывается код открытия файла:
w – для записи, если файла с заданным именем нет, то он будет создан, если же такой файл существует, то перед открытием прежняя информация уничтожается;
r – для чтения; если файла нет, то возникает ошибка;
a – для добавления новой информации в конец;
r+, w+ – возможны чтение и запись информации;
a+ – то же, что и для a, только запись можно выполнять в любое место файла, доступно и чтение файла.
По умолчанию файл открывается в текстовом режиме (t), указав b – файл открывается в двоичном режиме.
Если при открытии файла произошла ошибка, функция fopen возвращает значение NULL.
После работы доступ к файлу необходимо закрыть с помощью функции fclose(указатель файла), например, fclose ( f );
Для закрытия нескольких файлов введена функция: void fcloseall(void);
Приведем пример минимального набора операторов, необходимых для корректной работы с файлом:
#include <stdio.h>
. . .
FILE *f_my;
if( ! ( f_my = fopen(“rez.txt”, “r+t” ) ) ) {
puts(“\n Ошибка открытия файла!”);
// В оконном режиме – ShowMessage("Ошибка открытия файла");
return;
}
. . . // Работа с файлом
fclose(f_my);
. . .
Для работы с текстовыми файлами в консольном приложении удобнее всего пользоваться функциями fprintf() и fscanf(), параметры и выполняемые действия аналогичны функциям printf() и scanf(), (см. лаб.раб.№1), только первым параметром добавлен указатель файла, к которому применяется данная функция.
Функции работы с текстовыми файлами удобны при создании результирующих файлов для отчетов по лабораторным и курсовым работам.
Для создания баз данных удобнее пользоваться функциями работы с бинарными файлами. Рассмотрим некоторые из них, обозначив указатель файла – fp (FILE *fp;):
1) int fread(void *ptv, int size, int n, fp) – считывает n блоков по size байт каждый из файла fp в область памяти, на которую указывает ptv (необходимо заранее отвести память под считываемый блок);
2) int fwrite(void *ptv, int size, int n, fp) – записывает n блоков по size байт каждый из области памяти, на которую указывает ptv в файл fp;
3) int fileno(fp) – возвращает значение дескриптора файла fp (дескриптор –число, определяющее номер файла);
4) long filelength(int дескриптор) – возвращает длину файла в байтах;
5) int chsize(int дескриптор, long pos) – выполняет изменение размера файла fp, признак конца файла устанавливается после байта с номером pos;
6) int fseek(fp, long size, int kod) – выполняет смещение указателя на size байт в направлении признака kod: 0 – от начала файла; 1 – от текущей позиции; 2 – от конца файла;
7) long ftell(fp) – возвращает значение указателя на текущую позицию файла fp (-1 – ошибка);
8) int feof(указатель файла) – возвращает ненулевое значение при правильной записи признака конца файла;
9) int fgetpos(указатель файла, long *pos) – определяет значение текущей позиции pos файла; при успешном завершении возвращает значение 0.
Работа с программой
Форма может иметь вид, представленный на рис. 8.2.
Кнопку «Создать» нажимаем только при первом запуске программы или, если захотим заменить прежнюю информацию на новую, в окне Memo1 отображается путь и имя созданного файла.
Заполнив оба поля информацией, нажимаем кнопку «Добавить», после чего введенная информация отображается в окне Memo1.
Для работы с уже созданным файлом нажимаем кнопку «Открыть» – в Memo1 выводится содержимое всего файла, после чего можно добавлять новые данные в конец этого файла, не уничтожая предыдущие.
При нажатии кнопки «Сортировать» в Memo1 выводятся записи, сортированные по возрастанию рейтинга.
При нажатии кнопки «Сохранить результаты» создается текстовый файл, в котором сохранится информация, выведенная в Memo1. Этот файл можно просмотреть в любом текстовым редакторе (блокноте, Word).
В текст программы включена пользовательская функция void Out(TZap, TMemo*); – для вывода в Memo1 одной записи.
Для создания результирующего текстового файла используется функция, SaveToFile(FileNameRez); позволяющая записать все содержимое Memo1 в файл с указанным именем.
Рис. 8.2
Текст программы может иметь следующий вид:
. . .
#include <stdio.h>
#include <io.h>
. . .
//---------------------------------------------------------------------------
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<kol; 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));
}
Использование класса Сanvas
Для рисования используется класс типа TСanvas, который является не самостоятельной компонентой, а свойством многих компонент, таких как Image, PaintBox, и представляет собой холст (контекст GDI в Windows) с набором инструментов для рисования. Каждая точка холста имеет свои координаты. Начало осей координат располагается в верхнем левом углу холста. Данные по оси Х увеличиваются слева направо, а по оси Y сверху вниз.
Компонента Image находится на странице Additional, а PaintBox – System.
Основные свойства класса Canvas:
Pen – перо (определяет параметры линий),
Brush – кисть (определяет фон и заполнение замкнутых фигур),
Font – шрифт (определяет параметры шрифта).
Некоторые методы класса Canvas:
Ellipse(х1,у1, х2,у2) – чертит эллипс в охватывающем прямоугольнике (х1, у1), (х2, у2) и заполняет внутреннее пространство эллипса текущей кистью;
MoveTo(х,y) – перемещает карандаш в положение (х,y);
LineTo(х,y) – чертит линию от текущего положения пера до точки (х,y);
Rectangle(х1,у1, х2,у2) – вычерчивает и заполняет прямоугольник (х1,у1), (х2, у2). Для вычерчивания без заполнения используйте FrameRect или Polyline;
Polygon(const TPoint* Points, const int Points_Size) – вычерчивает многоугольник по точкам, заданным в массиве Роints размера Points_Size. Конечная точка соединяется с начальной и многоугольник заполняется текущей кистью. Для вычерчивания без заполнения используется метод Polyline.
TextOut(х, у, const AnsiString Text) – выводит строку Техt так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (х, у).
Пример создания оконного приложения
Написать программу отображения графика выбранной функции с помощью компонент С hart и Image.
Настройка формы
Панель диалога программы с получеными результатами представлена на рис. 9.2.
Рис. 9.2
Текст программы, реализующий поставленную задачу, может иметь следующий вид:
. . .
//---------------------------------------------------------------------------
double a,b,h,y_min,y_max;
int n;
typedef double (*Tfun)(double);
Tfun f;
double fun0(double);
double fun1(double);
double fun2(double);
//----------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text="-3,1416"; // a
Edit2->Text="3,1416"; // b
Edit3->Text="50"; // n
RadioGroup1->ItemIndex = 0;
}
//----------------- Задать начальные значения ------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x, r;
a=StrToFloat(Edit1->Text);
b=StrToFloat(Edit2->Text);
n=StrToInt(Edit3->Text);
h = (b-a)/n;
switch(RadioGroup1->ItemIndex) {
case 0: f = fun0; break;
case 1: f = fun1; break;
case 2: f = fun2; break;
}
y_min = y_max = f(a);
for (x = a+h; x<=b; x+=h) {
r = f(x);
if(y_min>r) y_min = r;
if(y_max<r) y_max = r;
}
}
//------------------------ Построить график в Chart ----------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Chart1->Series[0]->Clear(); // Очистка графика
for(double x=a; x<=b; x+=h)
Chart1->Series[0]->AddXY(x,f(x));
}
//--------------------- Копировать в буфер ----------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Chart1->CopyToClipboardMetafile(True);
}
//--------------------- Построить график в Image ---------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
int xmax, ymax, xt, yt, y0, x0;
double hx,hy,x;
Image1->Canvas->Pen->Color=clBlack; // Установка цвета пера
// Поиск координат правого нижнего угла холста Image
xmax = Image1->Width; ymax = Image1->Height;
// Закрашивание холста Image текущей белой кистью
Image1->Canvas->Rectangle(0,0,xmax,ymax);
// Поиск середины холста
y0=ymax/2; x0=xmax/2;
// Вычерчивание координатных линий
Image1->Canvas->MoveTo(0,y0);
Image1->Canvas->LineTo(xmax,y0);
Image1->Canvas->MoveTo(x0,0);
Image1->Canvas->LineTo(x0,ymax);
Image1->Canvas->Pen->Color=clRed; // Установка цвета пера
Image1->Canvas->Pen-> // Установка ширины пера
// Поиск шагов по х и у с масштабированием
hx=(b-a)/xmax; hy=(y_max-y_min)/ymax;
Image1->Canvas->MoveTo(ceil(x0+a/hx),ceil(y0-f(a)/hy));
for(x=a; x<=b; x+=h)
Image1->Canvas->LineTo(ceil(x0+x/hx),ceil(y0-f(x)/hy));
}
//------------------------------------------------------------
double fun0(double r) {
return sin(r);
}
double fun1(double r) {
return r*r;
}
double fun2(double r) {
return r*r*r;
}
9.3. Индивидуальные задания
Написать программу вывода графиков функции (лабораторная работа №3) Y(x) и ее разложения в ряд S(x) для аргумента x, изменяющегося от a до b с шагом h (вводятся с клавиатуры) с использованием компоненты С hart и графика функции Y(x) с использованием компоненты Image.
Приложение 1
Приложение 1. Операции и основные математические функции
1. Операции приведены в порядке убывания приоритета, операции с разными приоритетами разделены чертой.
Операция | Краткое описание | Использование | Выполне-ние |
Приложение 2. Описание общих структур файлов проекта
До тех пор пока вы не научились основным действиям, необходимым для изменения настроек и свойств элементов, входящих в проект, советуем не изменять имен файлов и других элементов, присвоенных им автоматически.
Внимание! Не изменять и не удалять, уже имеющиеся в указанных файлах тексты.
Общая структура файла текста программы Unit*.cpp
// Директивы препроцессора
#include <vcl.h> // Подключение файла библиотеки VCL
#pragma hdrstop // Установки компилятора
#include "Unit1.h" // Подключение заголовочного файла
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1; // Объявление объекта формы
//--------------------------- Вызов конструктора формы --------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
// Описания глобальных объектов Пользователя
// Набор функций-обработчиков, использующихся в проекте
Структура заголовочного файла Unit*.h
// Директивы препроцессора
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
# include < Forms. hpp>
// Объявление класса формы
class TForm1 : public TForm
{
Окончание прил. 2
// Компоненты, размещенные на форме
__published: // IDE-managed Components
TLabel *Label1;
TEdit *Edit1;
TMemo *Memo1;
TButton *Button1;
private: // User declarations
// Объявления функций, типов переменных, доступных только в данном модуле
public: // User declarations
// Объявления функций, типов и переменных, доступных в проекте
__fastcall TForm1(TComponent* Owner);
};
extern PACKAGE TForm1 *Form1;
// Объявления элементов, которые не включаются в данный класс
#endif
Общая структура файла проекта Project*.cpp
// Директивы препроцессора
#include <vcl.h>
#pragma hdrstop
/* - директива #pragma служит для установки параметров компилятора. Эти установки могут быть определены и другим способом, – используя диалог Project Options. */
// Подключение файлов форм и файлов ресурсов
USEFORM(" Unit1. cpp", Form1);
USEFORM(" Unit2. cpp", Form2);
// Главная программа
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// Инициализация
Application-> Initialize();
// Создание объектов форм
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
// Выполнение программы
Application->Run();
}
ЛИТЕРАТУРА
1. Березин, Б. И. Начальный курс С и С++ / Б. И. Березин, С. Б. Березин. – М.: Диалог – МРТИ, 1999.
2. Демидович, Е. М. Основы алгоритмизации и программирования. Язык СИ / Е. М. Демидович. – Минск : Бестпринт, 2001.
3. Керниган, Б. Язык программирования СИ / Б. Керниган, Д. Ритчи. – М.: Финансы и статистика, 1992.
4. Касаткин, А. И. Профессиональное программирование на языке СИ: от Турбо-С до Borland С++ / А. И. Касаткин, А.Н. Вольвачев: Справочное пособие. Минск : Выш. шк., 1992.
5. Страуструп, Б. Язык программирования C++ / Б. Страуструп: 2-е изд.: В 2 т. – Киев: ДиаСофт, 1993.
6. Больски, М. Н. Язык программирования СИ / М. Н. Больски: Справочник. – М.: Радио и связь. 1988.
7. Архангельский, А. Я. Программирование в С++ Builder 6 / А. Я. Архангельский. – М.: ЗАО “Издательство БИНОМ”, 2002.
8. Юлин, В. А. Приглашение к СИ / В. А. Юлин, И. Р. Булатова. – Минск : Высш.шк., 1990.
9. Шилд, Г. Программирование на Borland С++ / Г. Шилд. – Минск : ПОПУРРИ, 1999.
10. Тимофеев, В. В. Программирование в среде С++ Builder 5 / В. В. Тимофеев. – М.: БИНОМ, 2000.
Св. план 2004, поз. 40
Учебное издание
Бусько Виталий Леонидович,
Карцев Виктор Тимофеевич,
Кривоносова Татьяна Михайловна,
Навроцкий Анатолий Александрович
Основы программирования в среде C++ Builder
Лабораторный практикум по курсу
«Основы алгоритмизации и программирования»
для студентов 1 – 2-го курсов БГУИР
В 2-х частях
Часть 1
Редактор Е. Н. Батурчик
____________________________________________________________________________
Подписано в печать. Формат 60x84 1/16 Бумага офсетная.
Печать ризографическая. Гарнитура «Times» Усл. печ. л.
Уч. изд. л. Тираж 500 экз. Заказ
____________________________________________________________________________
Издатель и полиграфическое исполнение:
Учреждение образования
«Белорусский государственный университет информатики и радиоэлектроники»
Лицензия ЛП №156 от 05.02.2001.
Лицензия ЛП №509 от 03.08.2001.
220013, Минск, П. Бровки, 6
* Синус гиперболический, а в следующей строке – косинус гиперболический.
СОДЕРЖАНИЕ
Лабораторная работа №1. Линейный вычислительный процесс.. 4
1.1. Общие теоретические сведения. 4
1.2. Создание оконного приложения. 8
1.3. Создание консольного приложения. 11
1.4. Пример выполнения задания. 12
1.5. Индивидуальные задания. 15
Лабораторная работа №2. Реализация разветвляющихся алгоритмов.. 17
2.1. Общие теоретические сведения. 17
2.2. Создание оконного приложения. 18
2.3. Пример выполнения задания. 19
2.4. Индивидуальные задания. 22
Лабораторная работа №3. Реализация циклических алгоритмов.. 24
3.1. Общие теоретические сведения. 24
3.2. Пример выполнения задания. 25
3.3. Индивидуальные задания. 27
Лабораторная работа №4. Функции пользователя.. 29
4.1. Краткие теоретические сведения. 29
4.2. Пример выполнения задания. 30
4.3. Индивидуальные задания. 32
Лабораторная работа №5. Обработка одномерных массивов.. 33
5.1. Общие теоретические сведения. 33
5.2. Создание оконного приложения. 33
5.3. Пример выполнения задания. 34
5.4. Индивидуальные задания. 37
Лабораторная работа №6. Обработка двухмерных динамических массивов.. 38
6.1. Краткие теоретические сведения. 38
6.2. Пример выполнения задания. 40
6.3. Индивидуальные задания. 43
Лабораторная работа №7. Использование строк.. 44
7.1. Общие теоретические сведения. 44
7.2. Создание оконного приложения. 44
7.3. Пример выполнения задания. 46
7.4. Индивидуальные задания. 48
Лабораторная работа №8. Обработка структур с использованием файлов.. 49
8.1. Теоретические сведения. 49
8.2. Создание оконного приложения. 51
8.3. Пример выполнения задания. 51
8.4. Индивидуальные задания. 58
Лабораторная работа №9. Построение графиков функций.. 60
9.1. Краткие теоретические сведения. 60
9.2. Пример создания оконного приложения. 61
9.3. Индивидуальные задания. 64
Приложение 1. Операции и основные математические функции.. 65
Приложение 2. Описание общих структур файлов проекта.. 67
ЛИТЕРАТУРА.. 69
Лабораторная работа №1. Линейный вычислительный процесс
Цель работы: изучить правила составления текстов программ, научиться реализовывать линейные алгоритмы, а также составлять каркас простейшей программы в среде C++ B uilder. Написать и отладить программу линейного алгоритма в консольном и(или) оконном приложении.
Дата: 2018-11-18, просмотров: 501.