欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 12:46:12
一、常量 1、常量定义:一开始定义好的值,以后在程序的运行过程中不允许改变 1 const 2 Pi : Double = 3.141592; //定义为常量 3 {常量的定义方式,可以不进行类型的声明,编译器会根据具体值决定常量的的类型} 4 Pi2 = 3.1415; 2、常量使用 枚举:常量集 ......

一、常量

  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.

 

三、集合

集合是由具有某些共同特征的元素结构的一个整体。在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.

 

四、数组

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

定义
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.

 

五、动态数组

 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.
 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.

 

六、多维数组

 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.

 

七、基础练习

  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.