大榕树——让我们共成长!
大榕树 myDrs.org
您的位置:大榕树 \ 编程       |  Logo语言   |  Pascal语言   |  信息学奥赛   |  高考保送    |  HTML版本
|  Pascal语言>>Pascal入门>>Pascal编程基础         本站全文搜索: 友情提示:

Pascal编程基础
http://www.mydrs.org  7/1/2001  大榕树


重要提示:最基本的问题请先买一本书看,这里我只是强调一些重要的东西。

1 重要基础知识强调
预备知识:
结构化程序设计的基本概念
程序构成
输入/输出
变量,数据类型
运算:算术运算,逻辑运算,表达式
选择结构:IF和CASE
循环结构:FOR,WHILE和UNTIL
字符及字符串:+, 函数和存储方式
数组,多维数组
文件操作
子程序,过程和函数,参数和返回值,变量的作用域
PASCAL特殊类型:子界,枚举和集合类型
记录
指针
递归


一些提示:

1.结构化程序设计的基本概念
请不要用GOTO。
一个死循环的例子是:
while true do;

输入/输出
几点提示:
1.输入如果很复杂,可以考虑作为字符串输入,再处理这个字符串
2.文件大的时候注意一次尽量读较多的字节,这样会比较快的。
请建立一个1M的文件自己比较:
var
f:text;
c:char;
s:string;

(以下文件均已打开)
while not eof(f) do
read(f,c);


while not eof(f) do
read(f,s);

变量,数据类型
记住,使用全局变量要小心!因为作用域宽,任何地方都有可能改变它们。
在使用数组的时候要尤其小心。建议打开范围检查来检测是否有下标超界。
变量的类型是一个难点。应该记住重要的类型(如integer,longint,string,real)
占用的字节数和表示的数的范围。前者用来计算空间是否足够,后者考虑
范围是否可能超过。
注意常见的数据类型表示的范围和占用字节数。

下面介绍extended类型。
是一种实型,但有效位数比较多,可以作为大整数存储,可以避免一些高精度运算。
如:
{$N+}
var
e:extended;
begin
e:=123456789123456789.0
writeln(e:0:0);
end.
{$N+}是必须的。
e:=xxx.0的".0"是必须的,因为e是实数。
writeln(e:0:0)是输出e的整数部分
一个extended占用10个字节。


运算:算术运算,逻辑运算,表达式

注意优先级,如果拿不准,请加括号。
还有一点,是逻辑运算的计算问题,默认方式是从左往右计算,到可以确定值时停止。如:
if a and b and c then ...
则一旦发现b=false立刻停止计算,所以如果c的计算可能导致错误,将不会被发现。
改变这种情况可以用{$B+}

选择结构:IF和CASE
IF有一个需要注意的地方,是与ELSE的匹配问题。如果拿不准,请在每一个IF,ELSE处用begin ... end

循环结构:FOR,WHILE和UNTIL
有一个地方,有关FOR的,不同的编译器可能产生不同的代码!例如:
i:=0;
for i:=a to b do
halt;
writeln(i);

如果a=3, b=2
那么有的编译器输出3,有的输出0。请大家不要写这样的程序。


字符及字符串:+, 函数和存储方式
注意string的长度默认是255,不要超出了。
长度储存在s[0]。
看下面的代码:
s:='';
s[1]:='a';
s[2]:='b';
writeln(s);
程序输出空串。知道为什么吗?原因刚刚已经说了。长度在s[0]。所以...

数组,多维数组
数组定义时下标可以多样,如:
array[char] of integer;
array['A'..'Z'] of integer;
array[-5..5] of integer;
注意下标不要越界,否则变量无辜改变,或者死机。用{$R+}可以让系统通知这一错误。

文件操作
注意要关闭文件。

子程序,过程和函数,参数和返回值,变量的作用域
子程序的使用是很重要的,注意一个子程序尽量做一个独立的工作,尽量少用
全局变量。测试的时候也便于充分的测试每一个子程序。
注意变量的作用域,尽量避免用全局变量。

PASCAL特殊类型:子界,枚举和集合类型
要多用子界类型,因为可以利用它来检查是否越界,更快的查出错误。

指针
慎用!
一般在以下情况用得多:
特定的数据结构:树,图的邻接表,链表
大数组等占空间较多的数据结构
如:
type
ptype=^arrtype;
arrtype=array[1..400] of byte;
var
a:array[1..400] of ptype;
定义了一个400*400的数组。
但必须先:
for i:=1 to 400 do new(a);
这样引用:a[i]^[j];
记得把指针初始化为nil,使用之前要先new


1.2 文件I/O

层次稍高一点的竞赛都是采取文件作为测试数据的载体。理由很简单:
大数据从键盘输入很麻烦。本站的编程题目几乎全部采用文件输入/输出(I/O=输入/输出),
因此掌握文件输入/输出是必要的。

文件输入的步骤如下:(以PASCAL的文本文件为例)
1.定义文件变量:
var
f:text;

2.assign(f,'1add1.in');
3.reset(f);
4.输入的时候read语句的第一个参数是'f',即
readln(f,s);
5.关闭输入文件.
close(f)

输出类似,举一个例子:

var
f:text;
name:string;
begin
assign(f,'name.txt');
reset(f);
readln(f,name);
close(f);

assign(f,'hello.txt');
rewrite(f);
writeln(f,'Hello,',name,'!');
close(f);
end.

程序从文件name.txt读一个名字s(字符串),输出hello,s到文件hello.txt

如果文件name.txt的内容是
LiuRujia

则程序运行后文件hello.txt的内容是
Hello,LiuRujia!

还有一种方式,叫二进制读/写方式,这里不讲。

3 PASCAL和TP的IDE
*常用数据类型:
名称 大小 范围 最大数常量
Shortint 1b -128~127
Integer 2b -32768~32767 MaxInt
Longint 4b -2147483648~2147483647 MaxLongint
Byte 1b 0~255
Word 2b 0~65535
总结:一般根据变量的取值范围确定最合适的类型。
例一:
整数N满足N<=10^9, 则:N : Longint;
坐标(X,Y)满足-100<=X,Y<=100, 则:X,Y:Shortint;
例二:
B:longint;
则:A*B div A有可能溢出。A div A * B不可能溢出。

实数
Real (11-12) 6b
Single (7-8) 4b
Double (15-16) 8b
*Extended (19-20) 10b 需要在协处理器($N+)
Comp (19-20) 8b
注:一般用Real,当要求特别精度时可以用Double,用Extended和Comp可以作高精度“整数”
例一:
N是整数,N<=10^18, 则 N:Extended; 但N div 5是非法的,因为N是实数。可以用N/5代替。
输出时:writeln(n:0:0);

*boolean: 单字节,最低位为0时false,为1是TRUE
集合:一个字节8个元素。

控制流语句:
Break 退出循环
Continue 继续循环
Exit 退出当前过程
Halt 退出整个程序;

存储机制:
Code Segment 代码段。你的程序代码就放在里面
*Stack Segment 堆栈段。子程序调用/返回地址,局部变量。递归很多的程序需要注意堆栈可能会不够(就是溢出)
Constant Segment 常量段
Data Segment 数据段,保存全局变量
Heap 动态内存。你new的时候申请的内存就是来自于堆的。速度慢一点。可以用writeln(maxavail)输出可用堆空间。

文件缓冲 SetTextBuf
你看看tp的帮助吧。可以加快文件读取的速度。

位操作
掩码,$01,$02,$04,$08,$10,$20,$40,$80
访问: a and bits[i]
clear a:=a and ($ff-mask[i])
set a:=a or mask[i];
取反:a:=a xor mask[i];
shl,shr也很有用。例如2的N次方就可以用1 shl N来计算。

**编译开关
插入:^OO
*R- range check - 调试的时候开,正式运行的时候关(因为影响速度)
*S- stack overflow check - 递归调用太多,局部变量过多,会导致堆栈空间不够。
I- I/O check
Q- arithmetic

(D+,L+,Y+) debug related
(G+,X+,N+) keep them enabled

胡乱说了这么多,肯定没有说清楚。大家有什么建议请EMAIL我。


作 者:SRbGa
来 源:OIBH
共有4715位读者阅读过此文

  • 上篇文章程序设计起步
  • 下篇文章编程基本能力和技巧

  • 发送邮件
    保存页面 打印文章 HTML版本 发表评论

    □- 近期热门文章 □- 相关文章
    1. NOIP2006竞赛大纲 [8306]
    2. 七类高中生具有保送资格 [5910]
    3. NOI2006获奖选手名单 [4955]
    4. 关于举办NOIP2006模拟赛的通告 [4106]
    5. Turbo Pascal各语句运行速... [3594]
    6. Turbo王者归来新Delphi免费... [3181]
    7. IOI2006我国4名选手全部获得金... [2945]
    8. 关于APIO2007与IOI2007... [2763]
    9. noip倒计时 by 枯叶蝴蝶 [2683]
    10. 朱泽园:思想上的金牌更重要 [2168]
    Pascal解题步骤和比赛技巧
    编程基本能力和技巧
    Pascal编程基础
    程序设计起步
     

    关于本站 | 合作伙伴 | 联系方式
    大榕树 版权所有 ©1999-2006 www.myDrs.org 闽ICP备05000721号