Основы C

Конструкции Си, базовые типы данных языка программирования. Идентификаторы и типизированные константы. Область видимости и время жизни переменных. Функции преобразования символьных строк. Функции, работающие со строками. Разработка визуальных компонент.

Рубрика Программирование, компьютеры и кибернетика
Вид методичка
Язык русский
Дата добавления 06.07.2009
Размер файла 400,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Основные методы MchSprite.

Метод SprRun (Point (X1, Y1), Point (X2,Y2), t) -делает спрайт видимым при движении из одной позиции (X1, Y1) в другую (X2, Y2) в течении того или иного времени (t).

Пример: (MChSprite1->SprRun(

Point (MChSpriteBgr1->ClientWidth, 0),

Point (0, MChSpriteBgr1->ClientHeight), 3);

Метод SprShowOn (); делает спрайт видимым в текущей позиции.

Метод SprCruise (-1); делает спрайт видимым и его движение задается функцией пользователя SprPosFunc;

Метод SprMoveTo (Point (X, Y); делает спрайт видимым в позиции X, Y.

Пример:

MChSprite6->SprMoveTo (Point (int ((Form1->MChSpriteBgr1->ClientWidth)/2), int((Form1->MChSpriteBgr1->ClientHeight)/2)));

Метод SprShowAt(Point(X,Y); - делает спрайт видимым в точке X,Y.

Метод SprHide - делает спрайт невидимым;

Метод SprStop - останавливает спрайт;

Метод SprGoTo (Point(X,Y),t); - делает спрайт видимым и перемещает в течении t секунд из текущей позиции в позицию X, Y.

Метод SprGo (Point (X1, Y1), Point (X2, Y2), t); - делает спрайт видимым при движении из одной позиции (X1, Y1) в другую (X2, Y2) в течении того или иного времени (t).

Рассмотрим пример использования спрайтов. На форме расположены 6 спрайтов и 4 кнопки.

В зависимости от нажатия той или иной кнопки происходят события - летит ракета, сверхновая звезда сталкивается с Солнцем и происходит взрыв и т.д.

Листинг программы:

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#include <math.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma link "MChSpBg"

#pragma link "MChSprt"

#pragma resource "*.dfm"

TForm1 *Form1;

bool CollideFlip,Exploding;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//----------------------------------------------------------------------

void __fastcall NoCollide(TDateTime AtTime)

{

if (CollideFlip) MessageBeep(MB_OK);

CollideFlip=False;

}

//----------------------------------------------------------------------

void __fastcall OnCollide(TMChSprite *SprCollided ,TDateTime AtTime)

{

if (SprCollided==Form1->MChSprite2)

{

// MessageBeep(MB_ICONASTERISK);

if (! CollideFlip)

{

MessageBeep(MB_ICONASTERISK);

CollideFlip=True;

}

if (Form1->MChSprite4->SprNextPos.x<int((Form1->MChSpriteBgr1->ClientWidth)/2))

{

if (Form1->MChSprite4->SprIndex<Form1->MChSprite3->SprIndex)

Form1->MChSpriteBgr1->BgrSprIndexExchangeZ(Form1->MChSprite4->SprIndex,

Form1->MChSprite3->SprIndex);

}

else

{

if (Form1->MChSprite4->SprIndex>Form1->MChSprite3->SprIndex)

Form1->MChSpriteBgr1->BgrSprIndexExchangeZ(Form1->MChSprite4->SprIndex,

Form1->MChSprite3->SprIndex);

}

}

}

//--------------------------------------------------------------------

void __fastcall OnExplosion(TMChSprite *SprCollided ,TDateTime AtTime)

{

if (Exploding)

{

// SprCollided->SprStop;

// SprCollided->SprHide;

}

if ((! Exploding) && (SprCollided==Form1->MChSprite1))

{

Exploding=True;

Form1->MChSprite2->SprColliding=true;

Form1->MChSprite5->SprColliding=true;

Form1->MChSprite6->SprCruise(20);

}

}

//---------------------------------------------------------------------

TPoint __fastcall Sprite6PosFunc(TDateTime AtTime)

{

Form1->MChSprite6->SprSetScale(1.25*(AtTime-Form1->MChSprite6->SprTimeStarted)

*24.0*60.0*60.0*5.0);

// if ((AtTime-Form1->MChSprite6->SprTimeStarted)*24.0*60.0*60.0>17.0)

// Form1->MChSprite6->SprHide;

return(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

int((Form1->MChSpriteBgr1->ClientHeight)/2)));

}

//-----------------------------------------------------------------------

TPoint __fastcall Sprite4PosFunc(TDateTime AtTime)

{

double x,y,alpha;

alpha =2*3.14*(AtTime-Form1->MChSprite3->SprTimeStarted)*24.0*60.0+(90.0+0.0)/180.0*3.14;

x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

(Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

y= Form1->MChSpriteBgr1->ClientHeight /2.0 +

- (Form1->MChSpriteBgr1->ClientWidth /3.0)*sin(alpha);

Form1->MChSprite4->SprSetScale(1-0.9*sin(alpha));

return(Point(int(x),int(y)));

}

//-----------------------------------------------------------------------

TPoint __fastcall Sprite3PosFunc(TDateTime AtTime)

{

double x,y,alpha;

alpha=-2*3.14*(AtTime-Form1->MChSprite3->SprTimeStarted)*24.0*60.0+(90.0-180.0)/180*3.14;

x= Form1->MChSpriteBgr1->ClientWidth /2.0 +

(Form1->MChSpriteBgr1->ClientWidth /3.0)*cos(alpha);

y= Form1->MChSpriteBgr1->ClientHeight *0.5 +

-(Form1->MChSpriteBgr1->ClientWidth *0.55)*sin(alpha);

if (x>=(Form1->MChSpriteBgr1->ClientWidth)/2)

Form1->MChSprite3->SprSetScaleX( (1-1.0*sin(alpha)));

else Form1->MChSprite3->SprSetScaleX(-(1-1.0*sin(alpha)));

if (y<(Form1->MChSpriteBgr1->ClientHeight)/2)

Form1->MChSprite3->SprSetScaleY( (1-1.0*sin(alpha)));

else Form1->MChSprite2->SprSetScaleY(-(1-1.0*sin(alpha)));

return(Point(int(x),int(y)));

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Exploding=false;

MChSprite2->SprShowAt(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

int((Form1->MChSpriteBgr1->ClientHeight)/2)));

MChSprite3->SprPosFunc=Sprite3PosFunc;

MChSprite4->SprPosFunc=Sprite4PosFunc;

MChSprite6->SprPosFunc=Sprite6PosFunc;

MChSprite6->SprHideAfter=true;

MChSprite6->SprOnCollide=OnExplosion;

MChSprite4->SprOnCollide=OnCollide;

MChSprite4->SprNoCollide=NoCollide;

MChSprite3->SprCruise(-1);

MChSprite4->SprCruise(-1);

MChSprite6->SprMoveTo(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

int((Form1->MChSpriteBgr1->ClientHeight)/2)));

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Exploding=false;

MChSprite6->SprSetScale(0.2);

MChSprite6->SprMoveTo(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

int((Form1->MChSpriteBgr1->ClientHeight)/2)));

Form1->MChSprite1->SprColliding=true;

Form1->MChSprite6->SprColliding=true;

Form1->MChSprite1->SprGo( Point(Form1->MChSpriteBgr1->ClientWidth,0),

Point(int(Form1->MChSpriteBgr1->ClientWidth/2),

int(Form1->MChSpriteBgr1->ClientHeight/2)), 5 );

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

MChSprite5->SprColliding=False;

MChSprite5->SprHideAfter=True;

MChSprite5->SprGo(Point(Form1->MChSpriteBgr1->ClientWidth,

Form1->MChSpriteBgr1->ClientHeight),

Point(0,0), 20);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Exploding=false;

MChSprite1->SprColliding=false;

MChSprite2->SprColliding=false;

MChSprite5->SprColliding=false;

MChSprite6->SprColliding=false;

MChSprite6->SprHide();

MChSprite5->SprHideAfter=true;

MChSprite2->SprShowAt(Point(int((Form1->MChSpriteBgr1->ClientWidth)/2),

int((Form1->MChSpriteBgr1->ClientHeight)/2)));

MChSprite3->SprCruise(-1);

MChSprite4->SprCruise(-1);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

Используя рассмотренный пример, можно изучить практически все свойства спрайтов.

4.11 Объектная технология OLE2

Фирма Microsoft включила в систему Windows 95 подсистему внедрения и связывания объектов. В общем виде OLE2 позволяет пользователю получить доступ к объектам разработанных систем в приложении, с которым он работает. Например, работая в Word, можно вызвать таблицу Excel, обработать определенным образом данные, а результат запомнить в Word. Кроме этого автоматизация OLE2 позволяет программисту включать в свои программы разработанные компоненты, например Word.

Основа OLE2 - Com -компонентная модель объекта (Component Object Model), которая предусматримает модульность и совместитмость во взаимодействии между компонентами, написанными на разных языках. Соm определяет двоичный интерфейс, независимый от языка программирования, который может вступать в коммуникацию с другими компонентами, ничего не зная о них. Объекты, ориентированные на внешнее использование и доступные только из программы называются автоматными объектами OLE. Рассмотрим пример программы, которая вызывает Word, создает новый файл и записывает в Word содержимое компонента Edit.

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include <OleAuto.hpp> //подключение средств автоматизации OLE

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Variant V;

try {

V = CreateOleObject("Word.Basic");

}

catch(...){

ShowMessage("Не могу запусть Word");

throw;

Close();

}

V.OleProcedure("AppShow");

V.OleProcedure("FileNew");

V.OleProcedure("Insert", Edit1->Text);

}

//---------------------------------------------------------------------------

Рассмотрим как работает програмы.

Прежде всего необходимо указать в программе команду подключения средств, отвечающей за автоматизацию OLE #include <OleAuto.hpp>.

Далее по команде V = CreateOleObject ("Word.Basic"); вызываем Word, делаем приложение видимым по команде V.OleProcedure ("File New"); создаем новый документ по команде V.OleProcedure ("File New"). Команда V.OleProcedure ("Insert", Edit1->Text); текст из редактора Edit и записывает в Word).

Как видно, в программе используются средства обработки исключений

try {

V = CreateOleObject("Word.Basic");

}

catch(...){

ShowMessage("Не могу запусть Word");

throw;

Close();

которые в случае ошибки закрывают программу.

Кроме рассмотренного примера для автоматизации OLE существуют стандартные объекты OCX, которые похожи на визуальные компоненты C++Builder, но на самом деле являются самостоятельными объектами.

Объекты OCX могут быть включены в программу не только на C++Builder, но и Delphi. Но в отличии от компонент C++Builder - они не включаются в код программы, поэтому при распространении программного обеспечения, использующего компоненты OCX необходимо распространять и сами компоненты OCX.

4.12 Библиотеки DLL

DLL (Dinamic Link Library) - динамически присоединяемая библиотека, используется для хранения функций и ресурсов отдельно от исполняемого файла. Обычно в программах статистической сборки функции, ресурсы, процедуры и т.д. компонуются в исполняемом файле, использование же DLL позволяет наиболее часто используемые процедуры, функции или ресурсы хранить в DLL и загружать их из DLL по мере необходимости - это динамическое присоединение.

Обычно DLL не загружается в память пока это не необходимо, но будучи загружена, она делает доступными функции, процедуры или ресурсы для любой программы и для любых языков программирования, которые могут работать с DLL.

Рассмотрим пример создания DLL, коорая кодирует строку. Кодировка происходит путем сдвигов кода символа на еденицу вправо.

Для создания библиотеки SUM.DLL необходимо выполнить шаги:

1.Запустить C++ Builder. и выполнить File|New и выбрать пиктограмму DLL.

2.Набрать код:

//Генерирует C++Builder

#include <vcl\vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

// Important note about DLL memory management:

//

// If your DLL exports any functions that pass String objects (or structs/

// classes containing nested Strings) as parameter or function results,

// you will need to add the library BCBMM.LIB to both the DLL project and any

// EXE projects that use the DLL. This will change the DLL and its calling

// EXE's to use the BCBMM.DLL as their memory manager. In these cases,

// the file BCBMM.DLL should be deployed along with your DLL.

//

// To avoid using BCBMM.DLL, pass string information using "char *" or

// ShortString parameters.

//---------------------------------------------------------------------------

USERES("sum.res");

//---------------------------------------------------------------------------

void ViewForm();

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)

{

return 1;

}

//Набираемый код

#include "sum.h"

//---------------------------------------------------------------------------

char FileName[256];

void SayHello()

{

GetModuleFileName( NULL,FileName, sizeof (FileName) );

MessageBox ( NULL, FileName, "Hello from:", MB_OK );

}

int Sum(int a,int b)

{

return a + b;

}

char* Codec(char *eptr)

{

int x,l;

char ch;

l = strlen(eptr);

if(eptr[l-1] != '`') {

for(x=0; x<l;x++) {

ch = eptr[x];

ch = (char)((int)ch + 1);

eptr[x] = ch;

}

eptr[l] = '`';

eptr[l+1] = '\0';

} else {

for(x=0; x<l-1;x++) {

ch = eptr[x];

ch = (char)((int)ch - 1);

eptr[x] = ch;

}

eptr[l-1] = '\0';

}

return eptr;

}

void InvokeYesNoDialog()

{

ViewForm();

}

//---------------------------------------------------------------------

void ViewForm()

{

TForm *FpForm = new TForm(Application);

FpForm->Left = 10;

FpForm->Top = 10;

FpForm->Width = 200;

FpForm->Height = 200;

FpForm->Visible = true;

TPanel *FpPanel = new TPanel(FpForm);

FpPanel->Parent = FpForm;

FpPanel->Left = 2;

FpPanel->Top = 2;

FpPanel->Width = 198;

FpPanel->Height = 198;

FpPanel->Visible = true;

MessageBox ( NULL,"If YES clicked < OK >", "You finished ?", MB_OK );

if(FpPanel) {

delete FpPanel;

if(FpForm)

delete FpForm;

}

}

3.Сохранить проект в каталоге под именем sum.mak

4.Выбрать Options|Project...|Directories/Conditionals

5.В поле Conditionals набрать: __BUILDING_THE_DLL

6.В каталоге где находится проект создать файл sum.h со следующим кодом:

#ifdef __BUILDING_THE_DLL

#define __EXPORT_TYPE __export

#else

#define __EXPORT_TYPE __import

#endif

void __EXPORT_TYPE SayHello();

int __EXPORT_TYPE Sum(int a,int b);

char* __EXPORT_TYPE Codec(char *eptr); //<------------------

void __EXPORT_TYPE InvokeYesNoDialog();

7.Откомпилировать командой Project|BuildAll. В результате компиляции получим sum.DLL.

8.Скопировать sum.DLL в каталог ..\BIN C++ Builder-а

9.Набрать в командной строке implib.exe -w sum sum.dll

10.В результате получим файл sum.lib который будет подключен к выполняемому проекту

11.Скопировать sum.lib в каталог с проектом.

Рассмотрим пример вызова DLL из программы. В программе имеются визуальные компоненты:Edit (для ввода строки), Button1 (шифровка-дешифровка строки), Button2 - выход из программы. Программа работает следующим образом - после запуска вводится строка и нажимается кнопка Button1 - в результате строка шифруется, далее снова нажимается кнопка Button1 - строка дешифруется.

//---------------------------------------------------------------------------

#ifndef projcodH

#define projcodH

//---------------------------------------------------------------------------

#include <vcl\Classes.hpp>

#include <vcl\Controls.hpp>

#include <vcl\StdCtrls.hpp>

#include <vcl\Forms.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TEdit *Edit1;

TButton *Button1;

TButton *Button2;

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "projcod.h"

//---------------------------------------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

#include "sum.h" //<<--------------ВНИМАНИЕ-----

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

char* szMyStr = new char [StrLen(Edit1->Text.c_str())+2];

*szMyStr = 0;

StrLCat(szMyStr, Edit1->Text.c_str(), StrLen(Edit1->Text.c_str()));

Edit1->Text = Codec(szMyStr); //<----------------

delete [] szMyStr;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Application->Terminate();

}

//---------------------------------------------------------------------------

К исполняемому файлу (код которого приведен выше) подключить sum.lib выполнив команду:

Project\Add to Project\.....sum.lib

Запустить проект на компиляцию и выполнение.

Возможен вызов DLL из DLL, или вызов DLL из другого языка программирования.

4.13 Разработка визуальных компонент

C++ Builder позволяет расширять библиотеку VCL собственными компонентами.

Рассмотрим на примере разработку визуальной компоненты, которая позволяет перемножать два числа, если их значение не превышает 100.

Прежде всего отметим, что разрабатываемая компонента TMul потомок Tcomponent. Расположим ее на странице Samples библиотеки VCL.

Разрабатывемый компонент содержит свойства методы и события.

Свойства используются для задания определенных атрибутов (полей данных) и инициализации некоторых действий.

Методы - это процедуры и функции, которые делают класс общедоступным.

События используются для расширения компонентов в случае, когда возникают события (например, щелчок мыши).

Разрабатываемый компонент имеет два свойства типа int (Val1 - первый сомножитель, Val2- второй сомножитель) один метод DoMult (перемножает сомножители) и событие TooBig (вызывет обработчик событий, когда один из сомножителей больше 100).

При вызове метода, два значения в свойствах перемножаются и результат становится значением третьего свойства (Res).

Событие TooBig реализуется, если хотя бы одно из чисел больше 100.

Рассмотрим этапы построения TMul.

1.Создадим модуль, используя раздел Component/ New Главного меню.

В закладке Component Wizard указываем Calss Name: - TMul, Ancestor type: - Tcomponent, Pallette Page: - Samples. В результате будет сгенерирован код, который включает стандартную оболочку объявления класса TMul, и поцедуру регистрации класса. Далее модуль сохраняется под именем Mul.cpp. В результате будет созданы файлы: Mul.cpp и Mul.h.

2.Добавление свойств к компоненту. Открываем файл Mul.h и записываем код.

В разделе private определим свойства FVal1, FVal2 - доступные в процессе проектирования и в процессе выполнения и свойство Res -доступное в процессе выполнения. Также описываем событие TooBig, для определения которого используется тип TnitifyEvent - обобщенный указатель на функцию, которая передает один параметр типа Tcomponent - this.

class TMul : public TComponent

{

private:

int FVal1;

int FVal2;

int FRes ;

TNotifyEvent FTooBig;

Далее определим свойства (__property): Res в разделе public, т.к. оно доступно во время выполнения и свойства Val1 и Val2 в разделе __published, т.к. они доступны во время проектирования. Определяем прямой доступ для чтения и записи (read,write) значений переменных в разделе __published

Для переменной FRes прямой доступ не нужен,т.к. свойство Res предназначено только для чтения.

class TMul : public TComponent

{

private:

int FVal1;

int FVal2;

int FRes ;

TNotifyEvent FTooBig;

protected:

public:

__fastcall TMul(TComponent* Owner);

void __fastcall DoMult(void);

//свойство для получения результата

__property int Res = { read=FRes, write=FRes };

__published:

//первый операнд

__property int Val1 = { read=FVal1, write=FVal1, default = 1 };

//второй операнд

__property int Val2 = { read=FVal2, write=FVal2, default = 1 };

//событие

__property TNotifyEvent TooBig = { read=FTooBig, write=FTooBig};

};

Далее загружаем файл Mul.cpp и добавляем код.

3.Добавление конструктора.

Для создания представителя класса вызывается конструктор. Конструктор также:

устанавливает значения по умолчанию для переменных класса;

отвечает за динамическое распределение памяти и получение ресурсов, необходимых классу;

вызывается при добавлении компонента к форме во время проектирования или во время выполнения.

__fastcall TMul::TMul(TComponent* Owner)

: TComponent(Owner)

{

FVal1 = 1;

FVal2 = 1;

}

4.Добавление метода.

Для добавления метода необходимо написать код:

void __fastcall TMul::DoMult(void)

{

if((Val1 < 100) && (Val2 < 100))

Res = FVal1 * FVal2;

else

if (FTooBig) TooBig(this);

}

5.Добавление событие.

Событие предоставляет программисту задать специальный код, исполняемый когда что-то происходит. В нашем случае добавляется событие

TooBig, которое запускается когда значение Val1 или Val2 больше 100.

Обработка события осуществляется в строке:

if (FTooBig) TooBig(this);

Если нашем случае FtooBig=TRUE то происходит обработка события.

Листинг файла Mul.h

//---------------------------------------------------------------------------

#ifndef mulH

#define mulH

//---------------------------------------------------------------------------

#include <vcl\SysUtils.hpp>

#include <vcl\Controls.hpp>

#include <vcl\Classes.hpp>

#include <vcl\Forms.hpp>

//---------------------------------------------------------------------------

class TMul : public TComponent

{

private:

int FVal1;

int FVal2;

int FRes ;

TNotifyEvent FTooBig;

protected:

public:

__fastcall TMul(TComponent* Owner);

void __fastcall DoMult(void);

__property int Res = { read=FRes, write=FRes };

__published:

__property int Val1 = { read=FVal1, write=FVal1, default = 1 };

__property int Val2 = { read=FVal2, write=FVal2, default = 1 };

__property TNotifyEvent TooBig = { read=FTooBig, write=FTooBig};

};

//---------------------------------------------------------------------------

#endif

Листинг файла Mul.cpp:

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "mul.h"

//---------------------------------------------------------------------------

static inline TMul *ValidCtrCheck()

{

return new TMul(NULL);

}

//---------------------------------------------------------------------------

__fastcall TMul::TMul(TComponent* Owner)

: TComponent(Owner)

{

FVal1 = 1;

FVal2 = 1;

}

//---------------------------------------------------------------------------

namespace Mul

{

void __fastcall Register()

{

TComponentClass classes[1] = {__classid(TMul)};

RegisterComponents("Samples", classes, 0);

}

}

//---------------------------------------------------------------------------

void __fastcall TMul::DoMult(void)

{

if((Val1 < 100) && (Val2 < 100))

Res = FVal1 * FVal2;

else

if (FTooBig) TooBig(this);

}

//---------------------------------------------------------------------------

Далее компонент необходимо оттранслировать и включить в библиотеку компонент.

Для включения компонента в библиотеку необходимо:

в главном меню выбрать Component/Install;

в появившемся окне Install Components выбрать опцию Add;

зайти в папку где находится компонента, выбрать файл Mul.cpp и щелкнуть мышью по кнопке OK.

Компонента установится на странице Samples.

Для тестирования компонента используем программу.

На форму поместим три компоненты Edit, три Label, Button и Mul.

Щелкнем по кнопке Button и запишем код.

Mul1->Val1 = StrToInt(EdVal1->Text);

Mul1->Val2 = StrToInt(EdVal2->Text);

Mul1->DoMult();

EdRes->Text = IntToStr(Mul1->Res);

Далее щелкаем мышью справа от события TooBig сомпонеты Mul и записываем код:

Form1->Caption="Переполнение";

Общий вид программы:

//---------------------------------------------------------------------------

#pragma link "mul"

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Mul1->Val1 = StrToInt(EdVal1->Text);

Mul1->Val2 = StrToInt(EdVal2->Text);

Mul1->DoMult();

EdRes->Text = IntToStr(Mul1->Res);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Mul1TooBig(TObject *Sender)

{

Form1->Caption="Переполнение";

}

//---------------------------------------------------------------------------

Далее программу можно выполнить.

Кроме рассмотренного примера возможна модификация существующих визуальных компонент и получение новых компонент на базе существующих.

4.14 Введение в программирование CGI

Важнейшей особенностью web-сервера является возможность получения информации от пользователя и обработка ее с помощью CGI(общий шлюзовый интерфейс). CGI - компонент программного обеспечения, который:

позволяет писать сценарии и создавать на их основе управляемые пользователем интерактивные приложения;

обеспечивает возможность взаимодействовать с другими программами сервера;

имеет средства динамического создания Web-страниц на основе информации пользователя;

может вызвать внешнюю программу и передать в нее пользовательские данные.

В конечном итоге пользователь, не будучи ограничен в рамках заранее написанных документов, используя CGI сценарий может создать круг приложений, которые ему необходимы для получения информации.

Программе CGI необходимо извлечь информацию, обработать ее и сообщить ответ. Рассмотрим простой пример - создание виртуального документа:

Запускаем C++Builder. В главном меню выбираем File/New и в открывшейся таблице New Items выбираем Console App.

Удаляем все, что находится в открывшемся окне и записываем код:

//Пример CGI

#include <vcl\vcl.h>

#pragma hdrstop

char S[] = "ПРИВЕТ<P>\n";

void main(void)

{

setvbuf(stdout, NULL, _IONBF, 0);

printf("\nContent-type: text/html\n\n");

printf("<html>\n");

printf("<body>\n");

printf(S);

printf("</body>\n");

printf("</html>\n");

}

Запоминаем программу и запускаем на трансляцию. После этого помещаем выполняемый файл (например Prim.exe) на Web-сервер в раздел CGI.

Запускаем броузер и вызывем программу из раздела CGI.

Во время выполнения программа посылает свою информацию на стандартный вывод, как поток данных, состоящий из двух частей:

- заголовок в котором описан формат возвращаемых данных

printf("\nContent-type: text/html\n\n"); - текст формата HTML;

тело выходных данных - данные в формате HTML.

Сервер возвращает результаты выполнения CGI-программы броузеру.

Для Web-сервера неважен язык, на котором написана программа.

4.15 Программирование баз данных

Особенностью разработки доступа к базам данных при помощи C++Builder является полностью объектный визуальный подход. Вторая особенность заключается в том, что доступ к разным базам данных (dBase, Paradox, Oracle и другим) происходит совершенно унифицированно. Эта дает определенные преимущества по сравнению с таким мощным средством разработки баз данных как Visual FoxPro.

Интерфейсом между приложением и базами данных служит BDE - Borland Database Engine, т.е Механизм База данных Borland. Он позволяет не только осуществлять доступ к локальным базам данных, но и осуществлять доступ к данным по типу клиент-сервер. Одной из особенностей C++Builder является то,что доступ к базам данных осуществляется одинаково как на стадии разработки, так и на стадии исполнения.

Для разработки используется трех ступенчатая модель. Каждой ступени соответствует своя компонента (класс).

TDBGrid - отображает в окне область редактирования (по типу команды Browse (Grid) в FoxPro)

TdataSource - служит интерфейсом между TDBEdit и нижней компонентой.

TTable - содержит все записи таблици.

На более низком уровне работают драйвера BDE, осуществляющие непосредственный обмен с хранимыми данными.

Расмотрим более подробно описанные выше компоненты.

Источник данных (TDataSource).

Основные свойства.

AutoEdit - разрешает или запрещает редактирование записей (False или True).

DataSet - определяет имя конкретного набора данных, таблицы или запроса. Например Table1. Можно переключаться с одного набора данных на другой непосредственно во время выполнения программы.

Name - определяет название данной компоненты. Например DataSource.

С данной компонентой связаны три события OnDataChange, OnStateChange, OnUpdateData.

Таблица (TTable).

Основные свойства.

Active - разрешает или запрещает просмотр данных.

DatabaseName - псевдоним базы данных и путь к каталогу, где база данных содержится.

Name - псевдоним таблицы.

TableName - конкретное имя таблицы (в указанном каталоге).

Exclusive - разрешает или запрещает другому приложению обращаться к таблице.

IndexFiles - выбор индексного файла для таблицы.

IndexName - правило сортировки данных в индексе.

Filter - установка фильтра.

MasterFields и MasterSource - для образования связей между двумя таблицами.

Для данной компоненты определены стандартные методы используемые другими системами управления баз данных: Locate, Lookup, Append, Insert, Next, MoveBye и другие.

Отображение данных (TDBGrid).

Некоторые свойства.

DataSource - совпадает со свойством Name компоненты TDataSource. В результате имеем следующую связку:

TDBGrid TDataSource TTable

-----------------------------------------------------------------------------------------

DataSource <--> Name-DataSet <--> Name -DatabaseName-TableName

Такая связка обеспечит в окне редактирования появления записей таблицы имеющей имя TableName (см.ниже).

Другие свойства данной компоненты тривиальны - они определяют положение окна редактирования, цветовую гамму, размера окна, шрифты и т.п.

Еще одна компонента часто используется в связи с работой с базами данных.

Запросы (Tquery).

Данная компонента понадобится вам, если у вас возникнет необходимость пользоваться командами SQL-языка.

Основные свойства.

Active - разрешает или запрещает просмотр данных.

DatabaseName - содержит псевдоним базы данных или полный путь к каталогу, где эта база данных находится.

SQL - используется для ввода команды SQL. Синтаксис этих команд является стандартом и с ним можно познакомиться в любом руководстве по СУБД (например FoxPro).

RequestLive - разрешает или запрещает BDE возращать набор данных в любом случае.

Приступаем теперь к разбору конкретного примера. Пример очень прост. При запуске программы появляется форма. На форме имеется окно редактирования таблицы, кнопка "Выход", кнопка "Добавить", кнопка "Удалить". Таблица содержит данные о людях: ФИО, выданная сумма, дата выдачи. У вас будет имется возможность редактировать таблицу, добавлять и удалять записи. При запуске программа проверяет наличие таблицы в указанном каталоге и при необходимости создает и индексирует эту таблицу.

Поместим на форму три кнопки, TDBGrid (для просмотра таблицы), TTable, TDataSource.. Пусть наша таблица будет находится в каталоге c:\baza\ и будет иметь имя 'proba' Заполним свойства трех компонент основных компонент:

TTable :

DatabaseName=c:\baza\

Name=Table1

TableType=ttDBase

TableName=proba

IndexName=proba

TDataSource:

DataSet=Table1

Name=DataSource1

TDBGrid:

DataSource=DataSource1

Все остальные свойства можно оставить по умолчанию и менять по ходу работы над программой.

Приведем текст модуля Unit1.cpp содержащего основные исполняемые функции.

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma link "Grids"

#pragma resource "*.dfm"

TForm1 *Form1;

char * baza="proba.dbf";

char * baza1="proba";

//---------------------------------------------------------------------------

//Конструктор

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

HANDLE handle;

//пытаемся открыть таблицу как обычный файл

handle=CreateFile(baza,

GENERIC_READ,

FILE_SHARE_WRITE,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_ARCHIVE,

NULL);

if(handle!=INVALID_HANDLE_VALUE)

{

//файл есть и закроем

CloseHandle(handle);

} else

{

//файла нет

//создаем таблицу

Table1->FieldDefs->Clear();

Table1->FieldDefs->Add("Name", ftString, 20, true);

Table1->FieldDefs->Add("Zarpl", ftFloat, 0, true);

Table1->FieldDefs->Add("Data", ftDate, 0, true);

//теперь создаем индексный файл

Table1->IndexDefs->Clear();

TIndexOptions MyIndexOptions;

MyIndexOptions << ixPrimary << ixUnique;

Table1->IndexDefs->Add(baza1, "Data", MyIndexOptions);

Table1->CreateTable();

}

//здесь открыть таблицу

Table1->Active = true;

//активизировать индекс

Table1->OpenIndexFile("proba.MDX");

}

//----------------------------------------------

//Деструктор

__fastcall TForm1::~TForm1()

{

//закрыть таблицу

Table1->Active = false;

}

//---------------------------------------------------------------------------

//выход

void __fastcall TForm1::Button1Click(TObject *Sender)

{

//метод Close закрывает форму и вызывает деструктор

Close();

}

//---------------------------------------------------------------------------

//кнопка "добавить запись"

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Table1->Append();

}

//---------------------------------------------------------------------------

//кнопка "удалить запись"

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Table1->Delete();

}

Прокоментируем вышеприведенный текст.

Отметим одну интересную возможность C++Builder. Он может одновременно работать как с библиотекой объектов с которой мы до сих пор работали так и непосредственно с функциями API. В нашей программе мы демонстрируем эту возможность: в конструкторе пытаемся открыть файл (функция CreateFile). Если открытие не удается, выполняется часть кода создающий таблицу и индексный файл. Ниже представлено окно работы нашей программы.

4.16 ПАКЕТЫ

Существенную роль в разработке приложений на языке C++Builder 3 и выше играют пакеты(packages), которые представляют собой библиотеки динамической компоновки, содержащие компоненты C++Builder из библиотеки визуальных компонент(VCL).

Применение пакетов позволяет умсеньшить размеры исполняемых (.EXE- файлов, однако в таком случае вместе с программой необходимо распространять эти библиотеки.

Существует несколько видов пакетов- выделим из них пакеты времени выполнения(ПВВ). Пакеты данного вида используются: когда приложение выполняется.

ПВВ могут связываться статически и динамически. При статическом связывании образуется выполняемый файл, для которого не нужны библиотеки с расширением (.BPL). Связывание в пакет динамически ведет к тому, что библиотеки .BPL должны распространяться с приложением.

В C++Builder 3 и выше в меню Project/Options/Packages есть опция Build with runtime packages. Если флажок возле этой опции установлен, то приложение необходимо распространять вместе с библиотеками .BPL, если флажок не установлен, то получается полностью скомпилированный выполняемы файл.

Динамическое связывание применяется при конструировании приложений, состоящих из большого количества выполняемых файлов.

Заключение

В представленном учебном пособии были рассмотрены некоторые вопросы программирования на языке С++ и C++Builder.

Для углубленного изучения языка программирования Си необходимо изучить литературу, приведенную ниже.

Литература:

1. Уэйт М., Прата С., Мартин Д. Язык Си. Руководство для начинающих. - М.: Мир, 1988.- 512 с.

2. Страуструп Б. Язык программирования СИ++. - М.: Радио и связь,1991.-352с.

3. Бруно Бабэ Просто и ясно о BORLAND С++.-М.:БИНОМ,1995.-400с. 4.Бочков С.О., Субботин Д.М. Язык программирования Си для персонального компьютера. -М.: Радио и связь,1990.-384с.

5. Ричард Вайнер, Льюс Пинсон С++ изнутри. - Киев: ДиаСофт,1993.-304с.

6. Лукас П. С++ под рукой. - Киев:ДиаСофт, 1993.-176с.

7. Стефан Дьюхарст, Кэти Старк Программирование на С++.- Киев: ДиаСофт, 1993.-272с.

8. Белецкий Я. Турбо Си++: Новая разработка. - М.: Машиностроение, 1994. -400с.

9. Том Сван. Программирование для WINDOWS в BORLAND C++.-М.:БИНОМ, 1995.-400с

10. Шилд Г. Программирование на С и С++ для WINDOWS 95.-К.:Торгово- издательское бюро BHV, 1996.-400с.

11. Круглински Дэвид. Основы Visual C++.-М.:Русская Редакция ТОО Channel Trading Ltd, 1997.-696с.

12. Шилдт Герберт. MFC: основы программирования. - К.: Издательская группа BHV, 1997.-560с.

13. Д. Кнут. Искусство программирования для ЭВМ. Т. 3. Сортировка и поиск. - М.: Мир, 1978.

14. Б. Керниган, Д. Ритчи. Язык программирования Си. - М.: Финансы и статистика, 1992.

15. Р.Андерсон. Доказательство правильности программ. М.: Мир, 1984.

16. Шилд Герберт. Самоучитель С++.-BHV.-С.-Петербург.,1997.-512с.

17. Шамис В.А. Borland C++ Builder. Программирование на С+ без проблем М.: Нолидж, 1997.-266с.

18. Елманова Н.З., Кошель С.П. Введение в Borland C++ Builder.-М.: Диалог. - МИФИ, 1997.-272с.

19. Рейсдорф К. Освой самостоятельно Borland C++Builder. М.: БИНОМ, 1998.-702с.

20. Рамодин Д. Создание приложений в среде Borland C++Builder, Мир ПК №10,11,12-1997г.

21. Калверт Чарльз C++Builder. Энциклопедия пользователя.

22.Оузьер Д., Гробман С., Батсон С. Delphi2. Освой самостоятельно.- М.:Восточная Книжная Компания,1997.-624с.

23. Пирогов В.Ю. Программирование на языке ассемблера для операционных систем MS DOS и Windows, 1999, -550c.

24. Калверт Чарльз и др. Borland C++Builder 3.Самоучитель.-К:ДиаСофт, 1999.-272с.

25. Московские олимпиады по программированию,М.-1988.-208с.

ПРИЛОЖЕНИЕ N1

Задача N1.

Определить, какая из точек плоскости A(x1,y1), B(x2,y2), C(x3,y3)

расположена ближе к началу координат.

#include<stdio.h>

#include<conio.h>

#include<math.h>

int main(void)

{

char *n[30];

int x1,y1,x2,y2,x3,y3,p1,p2,p3,k;

clrscr();

printf("Введите координаты первой точки\n");

printf("x1=",&x1);

scanf("%d",&x1);

printf("y1=",&y1);

scanf("%d",&y1);

printf("Введите координаты второй точки\n");

printf("x2=",x2);

scanf("%d",&x2);

printf("y2=",y2);

scanf("%d",&y2);

printf("Введите координаты третьей точки\n");

printf("x3=",x3);

scanf("%d",&x3);

printf("y3=",y3);

scanf("%d",&y3);

p1=sqrt(x1*x1+y1*y1);

p2=sqrt(x2*x2+y2*y2);

p3=sqrt(x3*x3+y3*y3);

k=p1; *n="первая";

if(k>p2) { k=p2;*n="вторая"; }

if(k>p3) { k=p3;*n="третья"; }

printf("%s точка ближе всех к началу координат \n",*n);

getch();

return(0);

}

Задача N2.

Можно ли раменять 25 рублей 9 купюрами достоинством в 1, 3 и 5

рублей?

#include<stdio.h>

int main(void)

{

int x,y,s,z;

s=0;

for(x=1;x<=10;x++)

{

for(y=1;y<=10;y++)

{

for(z=1;z<=10;z++)

{

if (( x+3*y+5*z==25) & (x+y+z==9))

{

printf("Можно %d-1p, %d-3p, %d-5p\n",x,y,z);

s=1;

}

}

}

}

if (s==0) {

printf("25 рублей нельзя разменять 9 купюрами в 1р,3p,5p");}

return(0);

}

Задача N3.

Определить в одномерном числовом массиве число соседств из двух чисел разного знака.

#include<stdio.h>

int main(void)

{

int i,j,s,n,a[10];

printf("Введите эл-ты массива \n");

for (i=1;i<=10;++i)

scanf("%d",&a[i]);

s=0;

for (i=1;i<=9;++i)

{

if (a[i]* a[i+1]<0) s=s+1;

}

printf ("Число эл-тов разного знака =%d \n",s);

}

Задача N4.

Определить, является ли одномерный числовой массив упорядоченным по убыванию.

#include<stdio.h>

#include<dos.h>

int main(void)

{

int i,j=0,n=10,s=0;

int a[10];

printf("Введите элементы массива\n");

for (i=1;i<=n;++i)

{scanf("%d",&a[i]);}

for (i=1;i<=n-1;++i)

{

if (a[i]<a[i+1]) s=1;}

if (s==1) {printf ("Массив не упорядочен по убыванию \n");}

else {printf ("Массив упорядочен по убыванию \n");}

}

Задача N5.

Найти сумму чисел, обратных квадратам первых 100 натуральных чисел.

#include<stdio.h>

#include<dos.h>

int main(void)

{

float i,s=0;

printf ("-----------------------------\n");

for (i=1;i<=100;i++)

{ s=s+1/(i*i);}

printf ("Сумма чисел равна %f\n",s);

delay(5000);

}

Задача N6.

Дана точка А с координатами x,y. Определить в каком квадранте

координатной оси она расположена.

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

int main(void)

{

char xs[10],ys[10];

int x,y;

clrscr();

printf ("Введите координаты т.А \n");

gets(xs); gets(ys);

x=atoi(xs); y=atoi(ys);

if (x==0) printf ("Точка на оси Х\n");

if (y==0) printf ("Точка на оси Y\n");

if (x>0 && y>0) printf ("Точка А в 1-й четверти \n");

if (x<0 && y>0) printf ("Точка А в 2-й четверти \n");

if (x<0 && y<0) printf ("Точка А в 3-й четверти \n");

if (x>0 && y<0) printf ("Точка А в 4-й четверти \n");

getch();

}

Задача N7.

Вы забрели в сад, в котором три калитки и решили пройти через них не пропустив ни одной.

Набрав некоторое количество яблок, вы отдали половину всех яблок и еще поляблока человеку у первой калитки, половину того что осталось и еще поляблока человеку у второй калитки, а половину всех оставшихся яблок и еще поляблока человеку у третей калитки и при этом не разрезали ни одного яблока.

Сколько яблок вы должны набрать в саду чтоб вынести X яблок?

#include<stdio.h>

int main(void)

{

int k,n,i,x;

printf("\n Задача про яблоки .\n");

printf("Введите количество яблок,которое нужно вынести\n");

scanf("%d",&k);

n=k;

for (i=1;i<=3;i++)

{

x=2*k+1;

k=x;

}

printf("%d нужно взять\n",k);

return(0);

}

Задача N8.

Написать программу вычисления числа сочетаний из m по n(формула m!\n!*(m-n)! при m>=n).

#include<stdio.h>

int main(void)

{

int i,m,n;

float f1=1,f2=1,f3=1,c;

printf ("Введите m: ");

scanf ("%d",&m);

for (i=1;i<=m;++i) { f1=f1*i; }

printf ("Введите n: ");

scanf ("%d",&n);

for (i=1;i<=n;++i) { f2=f2*i; }

if (m>=n)

{ for (i=1;i<=m-n;++i) { f3=f3*i; }

c=f1/(f2*f3);

printf ("c=%f \n",c); }

else printf (" m должно быть больше, либо равно n! \n");

}

Задача N9.

Слова и фразы, переходящие в себя при "аккустическом" отображении называются палиндромами.

Написать программу определяющую является слово палиндром или нет.

#include<stdio.h>

#include<conio.h>

#include<string.h>

int main(void)

{

char A[80],B[80];

int i,L;

clrscr();

printf ("Введите слово A: "); scanf ("%s",&A);

L=strlen(A);

for (i=0;i<=L;++i) B[i]=A[L-i-1];

B[L]='\0';

i=strcmpi(A,B);

if (i==0)

printf ("Слово-полиндром \n");

else printf ("Слово-не полиндром \n");

getch();

}

Задача N10.

Определить находится ли точка M(x,y) внутри верхней части единичного круга с центром в начале координат.

#include<stdio.h>

int main(void)

{

float x,y,z;

printf("Введите координаты точки\n");

scanf("%f",&x);

scanf("%f",&y);

z=x*x+y*y;

printf("%f %f\n",z,y);

if ((z<=1)&&(y>0))

printf("Точка принадлежит верхней части единичного круга\n");

else

printf("Точка не принадлежит верхней части единичного круга\n");

return(0);

}

Задача N11.

Составить программу для решения квадратного уравнения

Ax^2+Bx+C=0.

#include<stdio.h>

#include<math.h>

#include<dos.h>

int main(void)

{ int i,d,a,b,c;

float x1,x2;

printf("\n Решение квадратного уравнения\n");

printf("Ведите коэффициенты уравнения a,b,c\n");

printf("a=");scanf("%d",&a);

printf("b=");scanf("%d",&b);

printf("c="); scanf("%d",&c);

d=b*b-4*a*c;

printf("d=%d\n",d);

if(d<0) printf("корней нет\n");

else

{

if(d>0)

{ x1=(-b+sqrt(d))/2*a;

x2=(-b-sqrt(d))/2*a;

printf("корни уравнения x1=%f x2=%f\n",x1,x2);}

else

{ x1=(-b)/(2*a);

printf("корень уравнения x1=%f \n",x1);

}

}

delay(5000);

return(0);

}

Задача N12.

Составить программу, позволяющую узнать войдет ли открытка размерами A,B в конверт размерами X,Y.

#include<stdio.h>

#include<dos.h>

int main()

{ int t,a,b,x,y;

printf("Введите размер a открытки :\n");

scanf("%d",&a);

printf("Введите размер b открытки:\n");

scanf("%d",&b);

printf("Введите размер x конверта :\n");

scanf("%d",&x);

printf("Введите размер y конверта :\n");

scanf("%d",&y);

if(b>a) {t=a;a=b;b=t;}

if(y>x) {t=x;x=y;y=t;}

if ((x>=a) &(y>=b))

printf("Открытка войдет в конверт .\n");

else

printf("Открытка не войдет в конверт .\n");

delay(3500);

return 0;

}

Задача N13.

Существует ли четырехзначное натуральное число, куб суммы цифр которого равен ему самому?

#include <stdio.h>

#include <math.h>

#include<conio.h>

int main(void)

{

int j1,j2,j3,j4;

float p,t,q=3;

for(j1=1;j1<=9;j1++)

{

for(j2=1;j2<=9;j2++)

{

for(j3=1;j3<=9;j3++)

{

for(j4=1;j4<=9;j4++)

{

p=(j1*1000+j2*100+j3*10+j4);

t=pow((j1+j2+j3+j4),q);

if (p==t)

{

printf("Четырехзначное число, равное кубу суммы своих цифр\n");

printf("%f\n",p);

}

}

}

}

}

getch();

return(0);

}

Задача N14.

Пара носков стоит 1.05 руб. связка -12 пар стоит 10.25 руб. а коробка - 12 связок стоит 114 руб. Составить программу, которая по числу N пар носков вычисляет числа n1, n2, n3 коробок, связок и пар носков, которые следует купить.

Пояснение - вместо 11 пар носков покупать связку - это дешевле.

Оптимальная покупка без излишков находится следующим образом:

n1=n\144 : m=n-n1*144

n2=m\12 : n3=m-n2*12

Удешевить ее можно лишь двумя способами - либо взять лишнюю связку и не брать пар, либо лишнюю коробку и не брать ни связок, ни пар. Если n3*1.05>10.25, то надо взять лишнюю связку:

n2=n2+1 : n3=0

Если для получившейся покупки (старой или изменившейся) бу-

дет n2*10.25+n3*1,05>114.00, то надо сделать

n1=n1+1 : n2=0 : n3=0

Это решение пригодно для любых цен (при которых коробка дешевле, чем 12 связок, а связка - чем 12 пар).

#include <stdio.h>

int main(void)

{

int n1,n2,n3,n,m;

scanf("%d",&n);

n1=n/144;

m=n%144;

n2=m/12;

n3=m%12;

if (n3*105>1025) {n2++;n3=0;}

if (n2*1025+n3*105>11400){n1++;n2=n3=0;}

printf("Для покупки %d пар надо купить %d кор.,%d св.%d пар \n",n,n1,n2,n3);

}

Задача N15.

Имеется k селений. Если в селении i расположить пункт скорой помощи, то поездка по вызову в селение j займет время a[i,i]+a[i,j], где 1<=i,j<k,i не равно j. Найти номер селения i, поездка от которого в самое отдаленное(по времени) селение занимала бы минимальное время. Массив a[1:k,1:k] задан, в нем все a[i,j]>0;и a[i,j] м.б. не равно a[j,i].

Сформулируем эту задачу следующим образом. В каждой строке i массива A выберем максимальное среди чисел A[i, j] (j не равно i) и сложим его с A[i, i]. Найти i, при котором соответствующая сумма будет минимальна.

#include <stdio.h>

#define K 20

main()

{int i,j,k,i1,s,t,a[K][K];

scanf("%d",&k);

for (i=0;i<k;i++)

for(j=0;j<k;j++) scanf("%d" ,&a[i][j]);

for (i=0;i<k;i++)

{for (s=0,j=0;j<k;j++)

if(j!=i && s<a[i][j]) s=a[i][j];

s+=a[i][i];

if (i==0 || s<t) {i1=i; t=s;}

}

printf("%d\n" ,i);

}

Задача N16.

Даны два упорядоченных массива a[1]<=a[2]<=...<=a[m] и

b[1]<=b[2]<=...<=b[n]. Образовать из них упорядоченный массив

c[1]<=c[2]<=...c[m+n].

Эта задача принципиально должна быть выполнена за m+n действий. Возьмем из A и B по первому элементу. Меньший из них занесем в С и заменим следующим из его же массива. Снова выберем меньший из двух, занесем в С и т.д.

После каждого сравнения в С добавляется элемент - значит, сравнений будет меньше, чем m+n. Нужно только позаботиться о том, чтобы программа работала верно и при исчерпании одного из массивов.

#include <stdio.h>

#define mm 100

#define nn 100

main()

{ int m,n,i,j,k,a[mm],b[nn],c[mm+nn];

scanf("%d %d",&m,&n);

for (i=0;i<m;i++) scanf("%d",&a[i]);

for(j=0;j<n;j++) scanf("%d",&b[j]);

for(k=i=j=0;k<m+n; k++)

{if (i>=m) c[k]=b[j++];

else if (j>=n) c[k]=a[i++];

else if (a[i]>b[j]) c[k]=b[j++];

else c[k]=a[i++];

}

for (k=0;k<m+n; k++)

printf("%4d%c",c[k],(k+1)%10==0 || k==m+n-1?'\n':' ');

}

Задача N17.

На квадратном клетчатом листе бумаги размерами 100х100 нарисовано несколько прямоугольников: каждый из прямоугольников состоит из некоторого числа целых клеток, причем различные прямоугольники не накладываются и не соприкасаются друг с другом.

Написать программу, которая сосчитает и напечатает число прямоугольников.

Эта задача решается следующим образом - прямоугольников столько, сколько их северо-западных углов (иначе говоря - верхних левых). Остается только не запутаться в случае, когда угол стоит у границы.

#include <stdio.h>

#define mm 20

#define nn 20

main()

{ int m,n,j,i,s,a[mm][nn];

scanf("%d %d",&m,&n);

for(i=0; i<=m;i++)

for (j=0;j<n; j++)

if (a[i][j]=i*j) scanf("%d" ,&a[i][j]);

for (s=0,i=1;i<=m; i++)

for (j=1;j<=n; j++)

if (a[i][j] && !(a[i-1][j]+a[i][j-1])) s++;

printf ("%d\n",s);

}


Подобные документы

  • Определение понятия подпрограммы и функции. Примеры стековых кадров. Параметры и возвращаемое значение функции. Переменное число принимаемых параметров. Время жизни и область видимости переменных. Ограничения на функции с переменным числом параметров.

    презентация [83,4 K], добавлен 19.10.2014

  • Ознакомление со структурой, комментариями, переменными и типами данных, константами, перечислениями, преобразованием типов языка программирования высокого уровня С++. Ключевые понятия языка, идентификаторы, ключевые слова, функции, операторы, выражения.

    контрольная работа [31,2 K], добавлен 12.12.2009

  • Переменные и операции языка СИ: используемые символы, константы, идентификаторы и ключевые слова. Использование комментариев в тексте программы. Типы данных и их объявление. Приоритеты операций и порядок вычислений. Функции, переменные, макроподстановки.

    учебное пособие [135,0 K], добавлен 17.02.2012

  • Основы языка программирвоания C++. Элементы управления в Microsoft Visual C++. Алгоритмические конструкции языка программирования Visual C++ и базовые элементы управления. Глобальные константы и переменные. Управление программой с помощью клавиатуры.

    курсовая работа [1,7 M], добавлен 08.04.2015

  • История создания и применение языка Basic. Стандартные математические и строковые функции. Операции и выражения языка. Блоки данных и подпрограммы. Операторы управления, цикла, ввода-вывода и преобразования информации. Константы, переменные, массивы.

    контрольная работа [2,3 M], добавлен 04.05.2015

  • Изучение общей структуры языка программирования Delphi: главные и дополнительные составные части среды программирования. Синтаксис и семантика языка программирования Delphi: алфавит языка, элементарные конструкции, переменные, константы и операторы.

    курсовая работа [738,1 K], добавлен 17.05.2010

  • Задачи, решаемые языком программирования. Типизированные и нетипизированные константы. Целочисленные типы, обозначающие множества целых чисел в различных диапазонах. Указатели - специальные объекты в программах на языках Си++. Пример виртуальной функции.

    контрольная работа [164,2 K], добавлен 30.12.2010

  • Общие сведения о функциях, их структура. Области видимости и классы памяти переменных в функциях. Классификация видов памяти, выделяемой под переменные и константы. Примеры объявления глобальных и локальных переменных. Обращение к функции и ее прототип.

    презентация [64,6 K], добавлен 09.12.2013

  • Лингвистическая концепция языка Паскаль. Интегрированная инструментальная оболочка. Основы построения программ на ТП 7.0. Алфавит языка и специфика использования символов. Простые типы данных: константы и переменные. Циклические конструкции и операции.

    курсовая работа [284,6 K], добавлен 02.07.2011

  • Организация типов данных. Записи, оператор присоединения. Множества, операции над ними. Строки, стандартные процедуры и функции, работающие со строками. Совместимость типов. Явное и неявное преобразование типов. Многомерные массивы. Операции отношения.

    презентация [30,8 K], добавлен 13.10.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.