Delphi-基础(常量集合数组[动态数组多维数组])

Posted rise-home

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi-基础(常量集合数组[动态数组多维数组])相关的知识,希望对你有一定的参考价值。

一、常量

  1、常量定义:一开始定义好的值,以后在程序的运行过程中不允许改变

1 const
2   Pi : Double = 3.141592;   //定义为常量
3   {常量的定义方式,可以不进行类型的声明,编译器会根据具体值决定常量的的类型}
4   Pi2 = 3.1415;

 

2、常量使用  

  枚举:常量集
  type
  枚举名=(标识符1,标识符2,标识符3,......)

 1 type
 2   {正常情况下,枚举类型的索引是从0开始}
 3   EColors = (RED,GREEN,BLUE);
 4   EWeek = (SUN=7,MON=1,TUE=2,WED=3,THU=4,FRI=5,SAT=6);
 5 var
 6   Color : EColors;
 7   Week : EWeek;
 8 
 9 begin
10   Color := EColors.RED;
11   Week := EWeek.SUN;
12   Writeln(Ord(Color),,,Ord(Week));
13   REDln;
14 end.

 

二、子界

  使用:为了防治出现越界
  注意事项:
  1、子界要求上界和下界必须是有序的数据类型 整数、字符、枚举
  2、子界的上界大于或者等于下界

  格式:type 子界

 1 {定义格式}
 2 type
 3   {枚举}
 4   EColors = (RED,GREEN,BLUE);
 5   {子界}
 6   TSubBoundNumber = 1..10;
 7   TSubBoundChar = a..z;
 8 
 9 
10 begin
11   Writeln(Low(TSubBoundNumber)); //下界
12   Writeln(High(TSubBoundChar));  //上界
13   REDln;
14 end.

 

打印出闰年还是平年,每个月的天数和所属季节

技术图片
 1 {打印出闰年还是平年,每个月的天数和所属季节}
 2 type
 3   {子界}
 4   TSubBoundMonths = 1..12;
 5   {枚举}
 6   ESeason = (Spring,Summer,Autumn,Winter);
 7 
 8 var
 9   Season : ESeason;
10   Month : TSubBoundMonths;
11   User_Year:Integer;
12   Is_Leap_Year:Boolean;
13   User_Month : Integer;
14 
15 procedure SubBound();
16 begin
17   Writeln(请输入一个年份:);
18   REDln(User_Year);
19   {默认为闰年}
20   Is_Leap_Year := True;
21   while Is_Leap_Year do
22   begin
23     if (User_Year mod 4) = 0 then begin
24     if not((User_Year mod 100) = 0) then begin
25       Writeln(闰年,User_Year);
26       Is_Leap_Year := False;
27     end;
28   end;
29   if (User_Year mod 400) = 0 then begin
30     Writeln(闰年,User_Year);
31     Is_Leap_Year := False;
32   end
33   else begin
34     Is_Leap_Year := False;
35     Writeln(平年,User_Year)
36 
37   end;
38   end;
39 
40 end;
41 procedure Months();
42 begin
43   {季节}
44 Writeln(请输入一个月份:);
45 REDln(User_Month);
46 begin
47   if (User_Month >= Low(TSubBoundMonths)) and (User_Month <= High(TSubBoundMonths)) then
48     if (User_Month >= 1) and (User_Month <= 3) then begin
49       Writeln(当前季节为春季);
50       case User_Month of
51         1 : begin
52               Writeln(31天);
53             end;
54         2 : begin
55               if Is_Leap_Year then  begin
56               Writeln(29天);
57               end else begin
58                 Writeln(28天);
59               end;
60             end;
61         3 : begin
62               Writeln(31天);
63             end;
64       end;
65     end;
66 
67 end;
68 end;
69 
70 begin
71 //  Writeln(Low(TSubBoundNumber)); //下界
72 //  Writeln(High(TSubBoundChar));  //上界
73 
74   SubBound();
75   Months();
76   REDln;
77 end.
View Code

 

三、集合

集合是由具有某些共同特征的元素结构的一个整体。在pascal中,一个集合是由一有序类型的一组数据元素组成,者一有序类型成为该集合的而基本类型。

 

集合定义:

1 type
2 <类型名称>=set of<基类型>;

 

声明集合的变量(可使用集合类型的名称来声明,也直接利用集合类型的本身来声明)

1 Var
2 Vset1:set1;
3 Vset2:set of byte;

 

注意:
1、一个集合类型的所有成员必须是同一有序类型且最多包含256个成员。
2、集合类型具有唯一性,即同一集合类型中不允许包含相同的成员。
3、集合类型成员具有无序性,其中的成员没有序数。无法向枚举型一样用序数标识集合成员。
4、集合类型的值域由BaseType 的值域决定。

 

集合定义方式

1 {定义方式}
2 type  {type主要作用是让用户可以自定义类型}
3   TMySet = set of Char;
4   TMySet1 = set of a..z;
5 var
6   TMySet2 : set of  a..z;

 

集合示例

技术图片
 1 uses
 2   System.SysUtils,System.TypInfo;
 3 
 4 type
 5   {定义一个枚举}
 6   TColors = (RED,GREEN,BLUE);
 7 type
 8   TSetColors = set of TColors;
 9 var
10   sc : TSetColors;
11   indexs : Integer;
12 procedure set_test1;
13 begin
14   for indexs := Ord(Low(TColors)) to Ord(High(TColors)) do begin
15 
16     Writeln(GetEnumName(TypeInfo(TColors),indexs)) //显示枚举内信息
17   end;
18 
19 end;
20 begin
21   {遍历集合元素:无序的}
22   set_test1();
23   Readln;
24 end.
View Code

 

四、数组

数组:按照一定编号存放了一堆类型相同数据的容器

定义
array[indexType1, ..., indexTypen] of baseType;

注意事项
1、数组在使用之前必须要声明长度(下标、元素总数)

技术图片
 1 type   {定义变量}
 2   MyArray = array[0..4] of Char;
 3 var   {变量声明}
 4   NameArray : MyArray;
 5   Indexs : Integer;
 6 
 7 {静态数组元素遍历}
 8 procedure MyProc;
 9 begin
10   NameArray[0] := a;
11   NameArray[1] := b;
12   NameArray[2] := c;
13   NameArray[3] := d;
14   for Indexs := Low(NameArray) to High(NameArray) do begin
15       Writeln(NameArray[Indexs]);  //屏幕输出
16   end;
17 
18 end;
19 
20 type
21   TMyFlexibleArray = array[0..4] of Char;
22 var
23   TMyArray : TMyFlexibleArray;
24   Elem : Char;  //与数组类型保持一致
25 procedure MyProc1;
26 begin
27   TMyArray[0] := a;
28   TMyArray[1] := b;
29   TMyArray[2] := c;
30   TMyArray[3] := d;
31   for Elem in TMyArray do   //取数组里面的元素
32   begin
33     Writeln(Elem); //输出数组中的具体元素
34   end;
35   Writeln(Length(TMyArray)); //取数组最大可用数(可用元素)
36 
37 end;
38 
39 begin
40 //  MyProc();
41   MyProc1();
42   Readln;
43 end.
View Code

 

五、动态数组

技术图片
 1 {动态数组}
 2 type
 3   StringArray = array of string;
 4 var
 5   NArray : StringArray;
 6   NameArray1 : StringArray;
 7   Indexs1 : Integer;
 8   Elem1 : string;
 9 
10 procedure Dynamic_MyProc1;
11 begin
12   SetLength(NArray,20); //设置长度,并未创建元素
13 
14   NameArray1 := StringArray.Create(xiaoqian,xiaoming);  //创建数组,设置长度
15   NameArray1 := [xiaoming,xiaoyang,xioaogang];  ////创建数组,设置长度
16 //  Writeln(Length(NArray),‘,‘,Low(NArray));
17   Writeln(Length(NameArray1),,,Low(NameArray1));
18   {遍历1数组 for to }
19   for Indexs1 := Low(NameArray1) to High(NameArray1) do  begin
20     Writeln(NameArray1[Indexs1]);
21   end;
22   {遍历2数组 for in}
23   for Elem1 in NameArray1 do
24   begin
25     Writeln(Elem1);
26   end;
27 end;
28 
29 begin
30 
31   Dynamic_MyProc1();
32   Readln;
33 end.
View Code
技术图片
 1 {动态数组2}
 2 type
 3   StringArray1 = array of string;
 4 var
 5   NameArray2 : StringArray1;
 6   AddressArray : StringArray1;
 7   DataArray : StringArray1;
 8   DataArray1: StringArray1;
 9   Name : string;
10   Indexs2 :Integer;
11   NameArray3 : StringArray1;
12 
13 procedure Dynamic_MyProc2;
14 begin
15   NameArray2 := [北京,南京,天津];
16   AddressArray := [林志玲,萧蔷];
17   {Concat 连接连个数组}
18   DataArray := Concat(NameArray2,AddressArray);
19 
20   {拷贝数组,High(DataArray1),Copy含头不含尾}
21   for Name in DataArray do begin
22 //    Writeln(Name)     //北京 南京 天津 林志玲 萧蔷
23   end;
24 
25   DataArray1 := Copy(DataArray,Low(DataArray),High(DataArray));
26   for Indexs2 := Low(DataArray1) to Length(DataArray1) do begin
27 //    Writeln(DataArray1[Indexs2])     //北京 南京 天津 林志玲 萧蔷
28   end;
29 
30   {Insert插入}
31    NameArray3 := [11,22];   //等待插入的数据
32   Insert(NameArray3,DataArray,10);
33   for Name in DataArray do begin
34 //    Writeln(Name)     //北京 南京 天津 林志玲 萧蔷  11 22
35   end;
36 
37   {Delete删除}
38    Delete(DataArray,Length(DataArray)-2,Length(DataArray));
39   for Name in DataArray do begin
40       Writeln(Name)     //北京 南京 天津 林志玲 萧蔷
41   end;
42 
43 end;
44 
45 begin
46 
47   Dynamic_MyProc2();
48   Readln;
49 end.
View Code

 

六、多维数组

技术图片
 1 {多维数组:1、静态多维数组 2、动态多维数组}
 2 type
 3 {声明一个动态的二位数组}
 4   TStringDynamicArray2 = array of array of string;
 5 {声明一个静态二维数组}
 6   TStringStaticArray3 = array[0..3] of array[0..2] of string;
 7 var
 8   TDynamicNameArray : TStringDynamicArray2;
 9   TStaticArray : TStringStaticArray3;
10   I,J : Integer;
11 {初始化动态二位数组}
12 procedure TStringDynamic_Array2;
13 begin
14   TDynamicNameArray := [[张三,李四,王五],[成都,重庆,西安]];
15   {遍历二维数组}
16   for I := Low(TDynamicNameArray) to High(TDynamicNameArray) do begin
17     for J := Low(TDynamicNameArray[I]) to High(TDynamicNameArray[I]) do begin
18       Writeln(TDynamicNameArray[I][J]);
19     end;
20 
21   end;
22 
23   Writeln(TDynamicNameArray[0][1]);
24 end;
25 
26 {初始化静态二位数组}
27 procedure TStringStatic_Array3;
28 begin
29   TStaticArray[0][0] := 开心麻花;
30    for I := Low(TStaticArray) to High(TStaticArray) do begin
31     for J := Low(TStaticArray[I]) to High(TStaticArray[I]) do begin
32       Writeln(TStaticArray[I][J]);
33     end;
34 
35   end;
36 end;
37 
38 begin
39 //  TStringDynamic_Array2();
40   TStringStatic_Array3();
41   Readln;
42 end.
View Code

 

七、基础练习

技术图片
  1 type
  2   {定义一个学生的信息的记录类型}
  3   TStudent = record
  4     Id: string; //学号
  5     Name: string; //姓名
  6   end;
  7 
  8 {数组存储信息}
  9 TStudentList = array of TStudent;
 10 var
 11   Student: TStudent;
 12   Studentlist : TStudentList;
 13 
 14 {查看菜单}
 15 procedure ShowMemo();
 16 begin
 17   Writeln(‘‘);
 18   Writeln(*****Memo*****);
 19   Writeln(1、增加);
 20   Writeln(2、查询);
 21   Writeln(3、修改);
 22   Writeln(4、删除);
 23   Writeln(‘‘);
 24 end;
 25 
 26 {添加用户信息}
 27 procedure AddStudent();
 28 var
 29   UserName : string;
 30   ArrayLength : Integer;
 31   Uuid:TGUID;   //生成一个唯一标识
 32 begin
 33   Writeln(您选择了增加功能,请输入学生姓名);
 34   Readln(UserName);
 35   Student.Name := UserName;
 36   ArrayLength := Length(Studentlist);
 37   CreateGUID(Uuid);
 38   Student.Id := GUIDToString(Uuid);
 39 //  Writeln(GUIDToString(Uuid));   //输出Uuid 信息
 40 
 41   Insert(Student,Studentlist,ArrayLength-1); //添加
 42   if (Length(Studentlist)>ArrayLength) then begin
 43     Writeln(添加成功!);   //输出Uuid 信息
 44   end else begin
 45     Writeln(添加失败);
 46   end;
 47 
 48 end;
 49 
 50 {查询用户信息}
 51 procedure SelectStudent();
 52 var
 53   Student1 : TStudent;
 54 begin
 55   Writeln(您选择了查询功能,查询结果如下:);
 56   for Student1 in Studentlist do begin
 57     with Student1 do begin
 58       Writeln(姓名:,Name,#$09,编号:,Id);
 59     end;
 60   end;
 61 end;
 62 
 63 {删除用户信息}
 64  procedure DeleteStudent();
 65 var
 66 Student2 : TStudent;
 67 DelUserName : string;
 68 IsTrue : string;
 69 Indexs : Integer;
 70 ArrayLength : Integer;
 71 begin
 72   Writeln(您选择了删除功能,请输出删除名字);
 73   Readln(DelUserName);
 74   Indexs := 0;
 75   {获取删除之前的数据总和}
 76   ArrayLength := Length(Studentlist);
 77   for Student2 in Studentlist do begin
 78     with Student2 do begin
 79       if (DelUserName=Name) then begin
 80         {删除操作需要谨慎,需要用户二次确认}
 81         Writeln(您确认删除,Name,,,Id,信息吗?Y/N);
 82         Readln(IsTrue);
 83         if (IsTrue = Y) then begin
 84           Delete(Studentlist,Indexs,1);
 85         {删除后,比对元素总数,判断是否成功}
 86           if (Length(Studentlist) > ArrayLength) then begin
 87             Writeln(删除成功);
 88           end
 89           else begin
 90             Writeln(删除!);
 91           end;
 92         end;
 93         Exit;
 94       end;
 95     end;
 96     Inc(Indexs);  //每次增加1
 97   end;
 98 end;
 99 
100 {更新/修改}
101 procedure UpdateUser();
102 var
103   Uname : string;
104   I : Integer;
105   IsExist : Boolean;
106 begin
107   IsExist := False; {默认不存在这条信息}
108   Writeln(您选择了修改功能,请输出需要的用户姓名:);
109   Readln(Uname);
110   {遍历数组,查询需要修改的数据}
111   for I := Low(Studentlist) to High(Studentlist) do begin
112     with Studentlist[I] do begin
113       if (Uname = Name) then begin
114         Writeln(请输出新的名字);
115         Readln(Uname); //重新给Uanme 赋值
116         Name := Uname;
117         IsExist := True;
118         Break;
119       end;
120     end;
121   end;
122   if (IsExist = False) then begin
123   Writeln(此信息不存在);
124   end;
125 end;
126 
127 {用户选择功能}
128 procedure UserChoose();
129 var
130   UserChooseIndex: Integer;
131 begin
132   Writeln(请输入你的功能选项:);
133   {获取用户输入编号}
134   Readln(UserChooseIndex);
135   {判断用户输入编号}
136   case UserChooseIndex of
137     1:
138       begin
139         AddStudent();
140       end;
141     2:
142       begin
143         SelectStudent();
144       end;
145     3:
146       begin
147         UpdateUser();
148       end;
149     4:
150       begin
151         DeleteStudent();
152       end;
153 
154   else
155     begin
156       Writeln(请输出正确的功能编号);
157     end;
158   end;
159 end;
160 
161 begin
162 {初始化学生信息列表}
163 Studentlist := [];
164 {无限循环}
165   while True do
166   begin
167     ShowMemo();
168     UserChoose();
169   end;
170   Readln;
171 end.
View Code

 

以上是关于Delphi-基础(常量集合数组[动态数组多维数组])的主要内容,如果未能解决你的问题,请参考以下文章

delphi中枚举类型和子界,数组,集合的详解以及类型说明

Java基础 | 深入理解多维数组

Java数组声明创建和使用以及多维数组Arrays类稀疏数组

delphi 常量数组赋值给变量数组

DELPHI 中如何定义这个静态二维数组常量

带键的VBA多维数组? [关闭]