Borland C++ 语法摘要

本文详细介绍了C++ Builder中常用的抽象数据类型,包括TList、AnsiString、Set、DynamicArray和TStream类,以及系统函数、参数个数不定的函数等内容。同时提供了实例代码演示了如何使用这些数据类型和函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用抽象数据类型:
包括TList(链表)类、AnsiString类、Set(集合)类、DynamicArray(动态数组)类和 TStream(流)类。
 
TList类
实现了线性链表,可以存储任意类的对象。
虽然它是链表,但是它实际上是一个存放指针的数组,可以通过其 Items 属性象访问一个数组那样实现对 List对象的每一个元素的访问。
 
主要属性:
Capacity 容量
Count    长度
需要注意的是 Count 属性并不一定是 TList 对象中元素的个数,它也包含 Items 数组中的空指针的数目。如果要删除数组中的空指针,可以使用 List的Pack方法。
Items   通过此属性可以象数组那样访问链表中的元素。 
List    获取直接进入列表中元素数组的指针。
 
主要方法:
 
int __fastcall Add(void * Item);
需要注意的是,不管Items数组中有没有NULL元素,Add方法都只是在数组的末尾添加元素。
 
virtual void __fastcall Clear(void); 
清除链表中的所有元素。释放内存,并将Capacity清0.
 
void __fastcall Delete(int Index); 
提示:不会释放内存,也不会修改Capacity。
 
void __fastcall Exchange(int Index1, int Index2); 
交换两个元素的位置。
 
TList* __fastcall Expand(void); 
需要时(Count=Capacity)扩容到2的X次方倍。
 
int __fastcall IndexOf(void * Item);
查找元素。
 
void __fastcall Insert(int Index, void * Item);  
插入元素 到指定位置。
 
void __fastcall Move(int CurIndex, int NewIndex); 
移动元素 到指定位置。
 
void __fastcall Pack(void); 
删除Items列表中所有指针值为NULL的元素。 
此操作并不释放内存, 即只会改变Count。
 
int __fastcall Remove(void * Item); 
删除指定值的元素。
返回元素先前的位置。
 
Add方法和Remove方法的参数都是列表的元素对象。
示例:

TList *pList = new TList(); 

AnsiString TheObject = "This is an object." 

pList->Add(TheObject);

MessageDlg("列表中有 " + IntToStr(pList->Count) + "个元素", 

    mtInformation, TMsgDlgButtons() << mbOK, 0); 

pList->Remove(TheObject); 

delete pList;

pList=NULL;

 
typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2); 
void __fastcall Sort(TListSortCompare Compare); 
通过自定义的比较函数Compare来对列表中的元素进行排序。 
示例:

int __fastcall CompareNames(void *Item1, void *Item2) 

{ 

     return CompareText(((TComponent*)Item1)->Name, ((TComponent *)Item2)->Name); 

} 

void __fastcall TForm1::Button1Click(TObject *Sender) 

{ 

    List1->Sort(CompareText); 

}


2.1.2 AnsiString 类 
AnsiString是C++Builder中仿照Object Pascal语言中的长字符串类型设计的一个字符串类 siString类型。
本质上,AnsiString 仍然以’’作为字符串的结尾标志,只是在字符串的前面添加了几个字节的信息头。 
比较C++中提供的串类型,AnsiString 提供了更多实用、方便的方法。
 
赋值:=
连接:+、+=
比较:<、<=、==、>、>=、!=
字符索引:[] (注:串中字符索引从1开始)
 
char* __fastcall c_str() const;  
返回一个C/C++标准字符串指针。
 
AnsiString& __fastcall Delete(int index, int count);
删除index开始的count个字符。
提示:count可以超过剩余长度,则删除所有剩余。
 
static AnsiString __fastcall FormatFloat(const AnsiString& format,const long double& value); 
将value用format指定的格式转换为字符串形式。
 
示例:
Format string   1234      -1234      0.5        0   
#,##0.00        1,234.00  -1,234.00  0.50       0.00
0.000E+00       1.234E+03 -1.234E+03 5.000E-01  0.000E+00 
提示:
# 表示此位置可空缺。
0 表示此位置以0填充。
 
AnsiString& __fastcall Insert(const AnsiString& str, int index); 
插入。
 
static AnsiString __fastcall IntToHex(int value, int digits); 
Hex格式的串。
 
bool __fastcall IsEmpty() const;
判断空串。
 
int __fastcall Length() const; 
长度。
 
static AnsiString __fastcall LoadStr(HINSTANCE hInstance, int ident); 
static AnsiString __fastcall LoadStr(int ident); 
从指定句柄中读取标志为ident的字符资源。
如果没有指定句柄,则从当前模块(如可执行程序)中读取。
 
AnsiString __fastcall LowerCase() const; 
AnsiString __fastcall UpperCase() const; 
大小写转换。
 
int __fastcall Pos(const AnsiString& subStr) const; 
定位子串。
注意:无子串时返回0(因为 bc++串中字符索引从1开始).
 
AnsiString& __fastcall SetLength(int newLength); 
修改串的Length属性。
 
static AnsiString __fastcall StringOfChar(char ch, int count); 
字符重复成串。
 
AnsiString __fastcall SubString(int index, int count) const;  
截取子串。
 
double __fastcall ToDouble() const;
int __fastcall ToInt() const; 
int __fastcall ToIntDef(int defaultValue) const; 
ToInt 和 ToIntDef 方法都是将字符串转换为一个整型数,不同之处在于如果字符串没有可用的字符,前者会抛出一个异常,后者则会返回默认值defaultValue。
 
AnsiString __fastcall TrimLeft() const; 
AnsiString __fastcall TrimRight() const;
AnsiString __fastcall Trim() const;
截去首尾空格。

2.1.3 Set(集合)
Set<type, minval, maxval>是一个C++类模板,用来实现集合这个抽象数据类型。
 
  此模板使用时有三个参数,其中type用来指定集合元素的类型(如int、char、枚举变量等) ;
minval为集合元素的最小值,minval不能小于0;maxval为集合元素的最大值,它不能大于255。
对集合变量的声明并不会对它的值初始化,可以在声明变量之后使用<<操作符赋值,如下: 

Set <char, 'A', 'C'> s1; // 直接定义集体对象


s1 << 'A' << 'B' << 'C'; //初始化 


typedef Set <char, 'A','Z'> UPPERCASESet; // 使用typedef


UPPERCASESet s2; 

s2 << 'A' << 'B' << 'C';

 
Set常用方法:
 
Set& __fastcall Clear(); 
清空集合。
 
bool __fastcall Contains(const T el) const; 
查询集合对象中是否含有指定的元素el。
 
bool __fastcall Empty() const;
判断空集。
 
比较:==、!=
判断集合是否相等。
注意:只有类型和包含元素都相等的两个集体才相等。前面的例子中 s1!=s2, 虽然它们含有相同的元素。
 
operator +/*/- 
分别为集合之间的并集、交集、并集中交集的补集运算的运算符。 // 并、交、差集?
 
operator <</>> 
添加或删除元素。
 
集合示例:
如判断键盘事件和鼠标事件时,需要处理的Shift参数就是一个集合类型
typedef Set<Classes__1,ssShift,ssDouble>TShiftState。
 
2.1.4 DynamicArray(动态数组)
DynamicArray<type> ArrayName; 
这是一个模板类,它的元素可以为任意类型。
 
大小 Length。
索引 []。
比较和赋值:
赋值要使用 Copy/CopyRange 方法。
注意:不要在动态数据上使用 ==、=,那操作的对象是指针!
多维动态数组,如 

typedef DynamicArray< DynamicArray < AnsiString > > T2DStringArray;

T2DStringArray d2a;

d2a.Length = 3;

for(int i=0; i<d2a.Length; i++)

{

 d2a[i].Length = 4;

}


2.1.5 TStream(流)
流类用于进行各种存储媒介之间的数据操作。
TStream 类的几种派生类分别实现与某种特殊的存储媒介之间的数据交换,如磁盘数据、内存数据等。除了数据的读取、写入和复制之外, 在TStream类实例中还可以用Seek到流中的任意位置。 
TStream 是一个抽象类,其派生类有 TFileStream、TStringStream、TMemoryStream等。
 
属性:
Position 流文件当前指针的位置。以字节为单位。
Size     流文件大小。以字节为单位。
 
方法:
__int64 __fastcall CopyFrom(TStream* Source, __int64 Count);
__int64 __fastcall CopyFrom(TStream* Source, __int64 Count);  
从Source流文件中读取Count字节的内容到当前流文件中,函数返回值为实际拷贝的字节数。
 
示例:
将指定文件复制到工程所在目录。

void __fastcall TForm1::Button1Click(TObject *Sender)

{

 AnsiString NewFileName = ExtractFilePath(Application->ExeName)

    + ExtractFileName(Edit1->Text);

 AnsiString msg = Format("Copy %s to %s", ARRAYOFCONST((Edit1->Text, NewFileName)));

 if(MessageDlg(msg, mtInformation, mbOKCancel, 0) == mrOk)

 {

  TFileStream *OldFile = new TFileStream(Edit1->Text, fmOpenRead);

  try

  {

   TFileStream *NewFile = new TFileStream(NewFileName, fmCreate);

   try

   {

    NewFile->CopyFrom(OldFile, OldFile->Size);

   }

   __finally

   {

    FreeAndNil(NewFile);

   }

  }

  __finally

  {

   FreeAndNil(OldFile);

  }

 }

}

virtual int __fastcall Read(void *Buffer, int Count) = 0; 
  此方法用于从当前流文件的当前指针所在位置开始,读取Count字节的内容到Buffer内
存位置,返回值为实际读取的字节数。如果返回值小于 Count,则意味着还没有读够 Count
个字节的内容,指针位置已经到了流文件的末尾。其它的数据读取的方法,如ReadBuffer和
ReadComponent,都是通过对Read方法的调用来实现的。
 
virtual int __fastcall Seek ffset, (int O Word Origin); 
virtual __int64 __fastcall Seek(const __int64 Offset, TSeekOrigin Origin); 
读取流。
返回值为流文件中新的当前位置(Position 属性)。
Origin 参数的取值可以为 soFromBeginning(流文件的开始位置) 、soFromCurrent (流文件的当前位置)或soFromEnd(流文件的结尾位置) 。 
 
virtual int  fastcall Write(const void *Buffer, int Count) = 0; 
写入流。
返回值为写入的字节数。
所有其它的数据写入方法,如 WriteBuffer 和WriteComponent都是靠调用Write来实现的。
 
TMemoryStream 是 TStream 的派生类,它有两个比较重要的方法,SaveToStream 和
LoadFromStream,下面是它们的一个示例:

void __fastcall TForm1::Button1Click(TObject *Sender) 

{ 

 TMemoryStream* pms = new TMemoryStream(); 

 //将列表框的内容写入流文件


 ListBox1->Items->SaveToStream(pms); 

 //重置流文件的当前位置到文件的开头 


 pms->Position = 0;

 //将流文件的内容写入RichEdit组件 


 RichEdit1->Lines->LoadFromStream(pms);. 

 delete pms; 

}


2.2 函数 
2.2.1 系统函数
 
随机函数
 
extern PACKAGE Extended __fastcall RandG(Extended Mean, Extended StdDev); 
产生服从高斯分布的随机数
 
extern PACKAGE double __fastcall RandomFrom(const double *AValues, int AValues_Size); 
extern PACKAGE int __fastcall RandomFrom(const int *AValues, int AValues_Size); 
extern PACKAGE __int64 __fastcall RandomFrom(const __int64 *AValues, int AValues_Size);
RandomFrom 函数用于从一个数组中随即取得其元素.
 
extern PACKAGE int RandSeed; 
随机数种子.
extern PACKAGE void __fastcall Randomize(void);
初始化随机数产生器.
 
extern PACKAGE int __fastcall RandomRange(cost int AFrom, const int ATo);  
此函数返回一个从 AFrom 到 ATo(包含此值)的整数,如果 AFrom 大于 ATo,可以返回负数。
 
时间函数
 
void gettime(struct time *timep);
void settime(struct time *timep); 
获取/设置系统时间。
 
其中time结构
struct time { 
unsigned char ti_min; /* minutes */
unsigned char ti_hour; /* hours */ 
unsigned char ti_hund; /* hundredths of seconds */ 
unsigned char ti_sec; /* seconds */
};
 
clock_t clock(void);    typedef long clock_t;
示例:计算程序中某段代码的执行时间

#include <time.h>

#include <stdio.h>

#include <dos.h>

int main(void)

{ 

   clock_t start, end;

   start = clock(); 

   delay(2000);

   end = clock(); 

      printf("The time was: %fn", (end - start) / CLK_TCK); 

   return 0;

}

 
内联函数
对于频繁调用的简短函数,为了省去函数调用和返回的时间,在函数之前添加Inline声明它为内联。
inline char * X::func(void){return i;}   
此函数是定义类X中的成员函数func为Inline函数。
如果在类的定义中直接编写函数代码,则跟在函数前添加Inline标志的作用相同。
 
2.2.3 参数个数不定的函数 
可以使用va_arg、va_end、 和va_start三个宏来处理不定长的函数参数列表,它们定义在 stdarg.h 中。
void va_start(va_list ap, lastfix); 
type va_arg(va_list ap, type);
void va_end(va_list ap);
 示例:求所有入口参数的代数和

#include <stdio.h> 

#include <stdarg.h> 

/* calculate sum of a 0 terminated list */ 

void sum(char *msg, ...) 

{ 

   int total = 0; 

   a_list ap; 

   int arg;

   va_start(ap, msg);

   while((arg=va_arg(ap, int))!= 0)

        total += arg;

   

   // MessageDlg(AnsiString("sum is ")+total, mtInformation, TMsgDlgButtons()<<mbOK, 0);


}

void main()

{

 sum("The total of 1+2+3 is %dn", 1,2,3,0);

}


转载于:https://www.cnblogs.com/phyking/archive/2013/01/25/4456645.html

Borland C++3.1 神话般的经典开发工具 带有传奇色彩的BORLAND公司,见证了美国软件技术市场上波澜壮阔、激动人心的技术大战和产品大战,最为经典的成功范例就是Borland C++3.1! Borland是中国程序员最为景仰的公司之一,特别是对于资格老一点的程序员而言,他们学习编程的起步就是Borland. 以下是Borland c++入门指南中摘录的一些信息 Borlandc++适用于需要一个专业化、优化的编译器的C++和C程序员,它同时适用于A&T公司的C++2.1版和ANSIC的程序员。它快速而有效,据此用户可以创建包括Microsoft Windows应用程序在内的任何应用程序。 Borland C++3.0可以在DOS的环境下运行,更可以在Windows下运行,在Windows之下的Borland C工作环境更亲切,将使您开发程序更得心应手。 C++是一个面向对象(OOP)的程序设计语言.使用户能充分利用OOP的先进设计方法和省时效率高的特点,它是C语言的进一步发展,它是可移植的,所以用户可以很容易地将一个由C++编写的应用程序从—个系统移植到另一个系统。在任何地方,都可以用C++从事任何编程工作。 Borland C++特色 1. Borland C++3.0及3.1可供程序设计人员开发C++及c程序。其中的c++是依照AT&T2.1标准设计的,而C则是ANSI C。因此让您开发的程序兼容性高.移植性(Portable)也更强。 2.全局的优化(Global Optimization):为程序编译出最优的目的码,使执行时间减少,使目的码变小。 3.缩短编译时间:由于编译器及工具的使用,大大减少了编译时间。 4.集成开发可境:(即IDE,Integrated Development Environment),本产品提供一完整的工作平台(Platform),使程序的编写编译、调试、分析、运行相当完整且方便。 5.窗口程序开发:本产品可以开发出Microsoft Windows程序,还包括完整的工具程序:窗口资源编译器(Resource Compiler),在线帮助编译器(Help Compiler)及窗口资源工作程序(Resource Workshop)。 6. DPMI编译器:DPMI (DOS Protected Mode Interface)使编译器可以在DOS或Windows386的保护模式下运行,因此开发大型的程序不用担心内存不足。 7. Easywin:或将DOS程序直接转成Window。程序的功能,不需要改半行令。 8. WinSight:窗口信息跟踪程序,使我们看到程序Windows之间的联系息。 9.在线帮助,在IDE环境下,任何错误都可由在线帮助得到说明或者想要任何时间查询函数或其他说明,都可使用此项功能。 10.虚拟Run - time面向对象存储管理功能(VROOMM,Virtual Run-time Object-Oriented Memory Manager)。当程序设计人员选定目的码的覆盖功能后,VRAOOMM会处理一切事情,即使程序超过640K。 11.丰富的类库,本产品提供常用的数据结构,例如List, Queue, Qegue, Stack, Array. . 等。 12.丰富的函数库:本产品提供4, 5百个函数,可以说无所不包了。 1.2.1. Borland C++3.1新功能 1. 3.1版将Turbo C++ for Window。改名为Borland C++for Windows, 2. 3.1版配合Windows 3.1版,增加多媒体(Multi-Media)、笔(Pen)和MCI (Media Control Interface)之控制接口。 3. 新增Win Spector I具程序,此工具程序是当Windows程序发生General Protection Faults时,提供发生此错误的地方,及当时机器的状态。 4. 在Borland C++ for Window,提供最优化的选项。 5. 彩色语法高亮显示(Color Syntax Highlighting),在源程序中设置不同的显示的颜 色。可在DOS IDE内的Options I Environment I Colors I Edit及Windows IDE内的Options Environment I Highlight内设置。 6. 可利用参数(-3)或IDC内的Options I Compiler I Advanced Coded Generation 80368设置产生386的目的码。 7. 可在程序内控制最大打开文件数,在_NFILE. H内#DEFINE_NFILE_n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值