The third day.战争才刚刚开始。
Fighting 是不变的主旋律。
今天周末,长沙的天时雨时晴,未外出,基本在实验室呆着。
接触的内容略多,慢慢做个总结。
先前不太明白Delphi和Pascal语言的关系,今天看书,有一句话算是解除了我的疑惑:Delphi是以Object Pascal语言为基础的可视化开发工具;
这关系就像eclipse和java一样。
Delphi开发的程序主要有3种:1、图形界面程序;2、控制台程序;3、服务器程序。
今天所有的编程练习都是控制台程序,所以在这里先对控制台程序做个解释。
控制台程序:指一些没有图形用户界面的32位Windows应用程序。和在DOS环境下运行的程序类似。截个图,方便弄懂,如下:
为了加深对控制台程序的理解,编一个小例子,如下:
program Project1; {$APPTYPE CONSOLE} //编译器指令,它告诉编译器这个程序是一个控制台程序。 //uses SysUtils; var str:string; begin { TODO -oUser -cConsole Main : Insert code here } writeln('您好,这是一个示范程序,请输入一行文字:'); //输出 readln(str); //输入 writeln('您输入的是:',str); readln; //锁定窗口,否则结果会很快消失 end.
接下来,针对具体问题,编写一些控制台程序。
1、简单的指针操作(最头疼的也是最有用的。)
program Project2; //指针实例工程 {$APPTYPE CONSOLE} //uses SysUtils; type PInt=^Integer; //定义指针类型 var I,K:Integer; PI:PInt; //整型指针 P:Pointer;// 无类型指针,可以指向任何数据类型,但要注意类型的转换 begin { TODO -oUser -cConsole Main : Insert code here } I:=3; K:=5; PI:=@K; //整型指针指向整型数据 writeln('K=',PI^); P:=@I; K:=Integer(P^); //无类型指针指向整型数据 writeln('K=',K); PI:=P; //指针之间赋值 writeln('PI^:',PI^); readln; end.
可以先试着自己写结果,再和运行的进行核对,后面的例子可同样这么做。
实际结果如下:
K=5
K=3
PI^:3
知识补充:指针是一个表示内存地址的变量。“@”运算符放在变量前面,获取的是变量的地址,并可以将地址赋值为相同数据类型的指针。把“^”运算符放在数据类型的前面,可以定义该类型的一个指针类型;放在一个指针的后面,可以获得该指针所指地址空间的内容。
2、函数调用
调用前先进行函数声明,格式如下:
function 函数名(<形式参数表>):<类型>;
begin
<语句>
end;
函数调用格式: <函数名>(<实参表>)
具体例子:
program FuntionDemo; {$APPTYPE CONSOLE} uses SysUtils; function Total(a,b:Integer):Integer; begin Total:=a+b; end; var a,b,c:Integer; begin { TODO -oUser -cConsole Main : Insert code here } try writeln('请输入a值:'); readln(a); writeln('请输入b值:'); readln(b); c:=Total(a,b); write('a和b的和为: '); writeln(c); readln; except writeln('输入内容有误!'); end; end.
请输入a值:
6
请输入b值:
9
a和b的和为: 15
3、选择语句的使用(if 和case)
(1)if语句的使用
格式:
<语句>;
<语句> //注意这里没有分号;
else
<语句>;
例子:
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var date:Integer; begin { TODO -oUser -cConsole Main : Insert code here } writeln('输入Date: '); readln(date); if(date>=1)and(date<=10) then writeln('上旬') else if (date>=11)and(date<=20) then writeln('中旬') else if (date>=21)and(date<=31) then writeln('中旬') else writeln('错误的日期'); readln; end.结果:
输入Date:
9
上旬
(2)Case的使用
格式:
case<表达式> of
<数值>:<语句>;
else
<语句>;
end;
实例:
program CaseDemo; {$APPTYPE CONSOLE} uses SysUtils; var S:char; begin { TODO -oUser -cConsole Main : Insert code here } readln(S); Case S of 'a'..'z','A'..'Z':writeln('字符'); '0'..'9':writeln('数字'); else writeln('其他'); end; readln; end.
a
字符
4、循环语句的使用(repeat、while、for)
(1)repeat的使用
格式: repeat
<语句>
until<条件表达式>
例子:
program RepeatDemo; {$APPTYPE CONSOLE} uses SysUtils; var I:Integer; begin { TODO -oUser -cConsole Main : Insert code here } I:=0; repeat I:=I+1; writeln(IntToStr(I)); //整型转化为字符型 until I>6; readln; end.
(2)while的使用
格式:
while<条件表达式> do
begin
<语句>
end;
例子:
program RepeatDemo; {$APPTYPE CONSOLE} uses SysUtils; var I:Integer; begin { TODO -oUser -cConsole Main : Insert code here } I:=0; while i<5 do begin writeln(IntToStr(I)); //整型转化为字符型 Inc(I); // 相当于I=I+1 end; readln; end.
(3)for的使用
格式:
for<条件表达式> do
begin
<语句>
end;
例子:
program RepeatDemo; {$APPTYPE CONSOLE} uses SysUtils; var I:Integer; begin { TODO -oUser -cConsole Main : Insert code here } I:=0; for I:=5 downto 1 do begin writeln(IntToStr(I)); //整型转化为字符型 end; readln; end.
5、Break和Continue
通过两个实例对比出break和continue的区别。
实例1(break):
program RepeatDemo; {$APPTYPE CONSOLE} uses SysUtils; var I:Integer; begin { TODO -oUser -cConsole Main : Insert code here } I:=0; for I:=10 downto 1 do begin if I=6 then break; writeln(IntToStr(I)); //整型转化为字符型 end; readln; end.
结果:
10
9
8
7
实例2(Continue):
program RepeatDemo; {$APPTYPE CONSOLE} uses SysUtils; var I:Integer; begin { TODO -oUser -cConsole Main : Insert code here } I:=0; for I:=10 downto 1 do begin if I=6 then continue; writeln(IntToStr(I)); //整型转化为字符型 end; readln; end.
10
9
8
7
5
4
3
2
1
6、函数参数的使用
program Project1; {$APPTYPE CONSOLE} uses SysUtils; //为了使用函数Format function OutputNum(number:double;n:integer=5):Boolean;//n默认为5 var Str:string; //浮点数显示输出的内容 begin { TODO -oUser -cConsole Main : Insert code here } if n<=-1 then begin Result:=False; Exit; end else begin Str:=Format('%*.*f',[10,n,number]);//设置显示的格式 Result:=True; writeln(Str); //显示数据 end; end; begin OutputNum(12.345);//n默认为5 OutputNum(123,3);//参数对数据类型进行升级 if OutputNum(123.456789,-3)=False then writeln('输出失败。'); Readln; end.
12.34500
123.000
输出失败。
知识补充:
解释这一句:Str:=Format('%*.*f',[10,n,number]); 返回number变量格式化后的字符。整数位为10位,小数后为n为。 7、通过例子,加深对数值参数、变量参数和常量参数的理解 实例1:数值参数在运行过程中只改变其形参的值,不改变其实参的值 <pre name="code" class="delphi">program ShucanDemo1; {$APPTYPE CONSOLE} uses SysUtils; procedure Calculate(CalNo:Integer); //数值参数、占内存,注意此处 begin CalNo:=CalNo*10; end; var Number,a:Integer; begin { TODO -oUser -cConsole Main : Insert code here } readln(Number); //6 Calculate(Number); writeln(IntToStr(Number)); //此处输出结果6 readln; end.
结果分析:
Number进入Calculate函数后,会把Number实参拷贝给形参CalNo,在此过程中CalNo增大10倍,但并未传递出来,所以说Number值并未改变。形参
和实参占用不同的内存地址,在过程或函数被调用是,将实参的值复制到形参占用的内存中。因此,在跳出过程或函数后,形参和实参的数值是不同的,但实参的值并不发生变化。
在被调用的参数表中的形参前加上保留字Var,则CalNo不在内存中占据一个位置,而是指向实参Number。当一个实参被传递时,任何对形参所作的改变都会反映到实参中,这是因为两个参数指向同一个地址。
-----------------------------------------------------------------------
加入指针,理解参数传递的过程,实例如下:
program AllcanshuDemo; {$APPTYPE CONSOLE} uses SysUtils; type PIngeger=^Integer; //定义指针类型 procedure P1(var N:Integer); //引用参数传递 begin { TODO -oUser -cConsole Main : Insert code here } N:=N+1; end; procedure P2(N:Integer); //普通参数传递 begin N:=N+2; end; procedure P3(PT:PInteger); //传递指针参数 begin PT^:=PT^+3; end; var i:Integer; begin i:=1; P1(i); //将i的值增加1 writeln('i:',i); P2(i); //希望将i加2,但没有实现 writeln('i:',i); P3(@i); //将i的值加3 writeln('i:',i); readln; end.
i:2
i:2
i:5
结果分析:
-----------------------------------------------------------------------------------------------------
补充一个概念:
有符号数和无符号数:针对二进制讲的。
有符号数用最高位作为符号位,“0”代表“+”,“1”代表“-”;其余数位用作数值位,代表数值。
比如:
0011 表示 +3;
1011 表示 -3。
无符号数全部二进制均代表数值,没有符号位。即第一个"0"或"1"不表示正负。
比如:
0011 表示 3;
1011 表示 11。
今天所学内容基本就这些,望共勉。
看到一本书出现的一句话:那些未能将我置之死地的事,会使我变得更有力。
机会往往伪装成困难,只有迎难而上,才能更接近成功。Fighting,next day ,go on .