开域语句

[复制链接]
发表于 2023-12-30 10:13:16 | 显示全部楼层 |阅读模式
开域语句
  在程序中对记录进行处理时,经常要引用同一记录中不同的域,每次都按6.4.1节所述的格式引用,非常乏味。为此Pascal提供了一个with语句,可以提供引用域的简单形式。 开域语句一般形式:
  with <记录变量名表> do
    <语句>
  功能:在do后的语句中使用with后的记录的域时, 只要直接写出域名即可,即可以省略图10.2.2中的记录变量名和"."。
  说明:①一般在with后只使用一个记录变量名。如:
       write("Inputyear:");
       readln(x.year);
       write("Inputmonth:");
       readln(x.month);
       write("Inputday:");
       readln(x.day);
      可以改写成:
       withx do
       begin
        write("Inputyear:");readln(year);
        write("Inputmonth:");readln(month);
        write("Inputday:");readln(day);
       end;
     ②设x,y是相同类型的记录变量,下列语句是非法的:
      withx,y do...;
     ③with后接若干个记录名时,应是嵌套的关系。如有记录说明:
      varx:record
        i:integer;
       y:record
         j:0..5;
         k:real;
        end;
       m:real
       end;
   可以使用:
    withx do
   begin
     read(i);
     with y do
       read(j,k);
     readln(m);
   end;
   或简写为:
   with x,y do
   readln(i,j,k,m);
9、字符、字符串类型的使用
(一)字符类型
 字符类型为由一个字符组成的字符常量或字符变量,字符常量定义:
  const 
    字符常量="字符";
 字符变量定义:
  Var
    字符变量:char;
 字符类型是一个有序类型, 字符的大小顺序按其ASCⅡ代码的大小而定,函数succ、pred、ord适用于字符类型,例如:
  后继函数:succ("a")="b"
  前继函数:pred("B")="A"
  序号函数:ord("A")=65
【例1】按字母表顺序和逆序每隔一个字母打印,即打印出:
     ac e g I k m o q s u w y
     zx r v t p n l j h f d b
程序如下:
 programex8_1;
 varletter:char;
 begin
  forletter:="a" to "z" do
   if(ord(letter)-ord("a"))mod 2=0 then write(letter:3);
  writeln;
  forletter:="z" downto "a" do
   if(ord(letter)-ord("z"))mod 2 =0 then write(letter:3);
  writeln;
 end.
分析:程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观。
(二)字符串类型
 字符串是由字符组成的有穷序列,字符串类型定义:
  type <字符串类型标识符>=string[n];
  var
    字符串变量:字符串类型标识符;
 其中:n是定义的字符串长度,必须是0~255之间的自然整数,第0号单元中存放串的实际长度,程序运行时由系统自动提供,第1~n号单元中存放串的字符,若将string[n]写成string,则默认n值为255。
 例如:type
     man=string[8];
     line=string;
    var
     name:man;
     screenline:line;
 另一种字符类型的定义方式为把类型说明的变量定义合并在一起。
 例如:VAR
     name:STRING[8];
     screenline:STRING;
 TurboPascal中,一个字符串中的字符可以通过其对应的下标灵活使用。
 例如:var
     name:string;
    begin
     readln(nsme);
     fori:=1 to ord(name[0]) do writeln(name);
    end.
 语句writeln(name)输出name串中第i个字符。
【例2】求输入英文句子单词的平均长度
 程序如下:
 programex8_2;
 var
  ch:string;
  s,count,j:integer;
 begin
  write("Thesentence is :");
  readln(ch);
  s:=0;
  count:=0;
  j:=0;
  repeat
   inc(j);
   ifnot (ch[j] in[":",",",";","""","!","?",".",""]) then inc(s);
   ifch[j] in[" ",".","!","?"] theninc(count);
  until(j=ord(ch[0]))or (ch[j] in [".","!","?"]);
  ifch[j]<>"." then writeln("It is not a sentence.")
  elsewriteln("Average length is ",s/count:10:4);
 end.
 分析:程序中,变量s用于存句子中英文字母的总数,变量count用于存放句子中单词的个数,ch[j]表示ch串中的第j个位置上的字符,ord(ch[0])为ch串的串长度。程序充分利用TurboPascal允许直接通过字符串下标得到串中的字符这一特点,使程序比较简捷。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表