1.1.1 write/writeln语句

  • PASCAL-S源程序
    1. program test(input,output);
    2. const a=1; //整型常量
    3. b=3.0; //浮点型常量
    4. c='c'; //字符型常量
    5. blank=' '; //空格
    6. var d:integer; //整型变量
    7. e:real; //浮点型变量
    8. f:char; //字符型变量
    9. g:boolean; //布尔型变量
    10. begin
    11. d:=6;
    12. e:=6.0;
    13. f:='f';
    14. g:=2>1;//不支持true常量,所以这么写
    15. writeln(a,blank,b,blank,c,blank,1,blank,1.0,blank,'y');
    16. write(a,blank,b,blank,c,blank,1,blank,1.0,blank,'y');
    17. writeln;
    18. writeln(g);
    19. writeln(a+b,blank,a*b,blank,g,blank,a>b,blank,c,blank,d,blank,e,blank,d<>e);
    20. end.
  • 预期结果

没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。

  • 输出的C程序 ```cpp //Head files

    include

    include

//Overall constant definiton const int a = 1; const float b = 3.0; const char c = ‘c’; const char blank = ‘ ‘;

//Overall variable definition int d; float e; char f; bool g;

//Subprogram declaration void test();

//Main function int main() { test(); return 0; }

//Subprogram definition void test() { d = 6; e = 6.0; f = ‘f’; g = 2 > 1; printf(“%d%c%f%c%c%c%d%c%f%c%c\n”, a, blank, b, blank, c, blank, 1, blank, 1.0, blank, ‘y’); printf(“%d%c%f%c%c%c%d%c%f%c%c”, a, blank, b, blank, c, blank, 1, blank, 1.0, blank, ‘y’); printf(“\n”); { if(g) printf(“true”); else printf(“false”); } printf(“\n”); printf(“%d%c%f%c”, a, blank, b, blank); { if(g) printf(“true”); else printf(“false”); } printf(“%c”, blank); { if(a > b) printf(“true”); else printf(“false”); } printf(“%c%c%c%d%c%f%c”, blank, c, blank, d, blank, e, blank); { if(d != e) printf(“true”); else printf(“false”); } printf(“\n”); }

 <br /> 

- 控制台输出及运行结果

![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918572994-97c064fd-c014-4b8a-9762-4a80f7b06dcf.png#crop=0&crop=0&crop=1&crop=1&height=501&id=qxfea&margin=%5Bobject%20Object%5D&name=image.png&originHeight=501&originWidth=544&originalType=binary&ratio=1&rotation=0&showTitle=false&size=164687&status=done&style=none&title=&width=544)

- 结果分析
   - 编译成功,运行成功
   - 生成的C代码中,writeln不带参数地调用,转化为printf("\n");
   - 生成的C代码中,输出bool类型时,会转化为用大括号括起来的if判断语句
   - 生成的C代码中,不同格式的表达式正确对应到不同的格式控制符
   - 运行后,成功输出所有预设的值
<a name="ukJNU"></a>
### 1.1.2       read语句

- PASCAL-S源程序
```pascal
program test(input,output);
var  a,i:integer; //整型变量
     b:real; //浮点型变量
     c:char; //字符型变量
     d:array[1..6] of integer; //数组
procedure pro(var a:integer);
begin
   read(a);
end;
begin
   read(c,a); //读取字符和整数
   for i:=1 to 6 do
       pro(d[i]); //循环加调用程序读取6个整数
   read(b); //读取浮点数

   writeln(c,' ',a); //输出字符和整数
   for i:=1 to 6 do //输出6个整数,空格分隔
       write(d[i],' '); 
   writeln; //输出换行
   writeln(b); //输出浮点数
end.
  • 预期结果

没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。

  • 输出的C程序 ```cpp //Head files

    include

    include

//Overall constant definiton

//Overall variable definition int a; int i; float b; char c; int d[6];

//Subprogram declaration void test(); void pro(int *a);

//Main function int main() { test(); return 0; }

//Subprogram definition void test() { scanf(“%c%d”, &c, &a); for(i = 1; i <= 6; i++) pro(&d[i - 1]); scanf(“%f”, &b); printf(“%c%c%d\n”, c, ‘ ‘, a); for(i = 1; i <= 6; i++) printf(“%d%c”, d[i - 1], ‘ ‘); printf(“\n”); printf(“%f\n”, b); }

void pro(int *a) { scanf(“%d”, a); }

 <br /> 

- 控制台输出及运行结果

![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918591940-d0a5dea9-3e1e-4a6c-a1a5-5a73750a1101.png#crop=0&crop=0&crop=1&crop=1&height=547&id=Yzib0&margin=%5Bobject%20Object%5D&name=image.png&originHeight=547&originWidth=506&originalType=binary&ratio=1&rotation=0&showTitle=false&size=143454&status=done&style=none&title=&width=506)

- 结果分析
   - 编译成功,运行成功
   - 生成的C代码中,不同格式的表达式正确对应到不同的格式控制符
   - 生成的C代码中,读取到普通变量时,正确添加了取地址符
   - 生成的C代码中,读取到引用(指针)参数时,不需要添加取地址符,因为指针本身就已经代表地址了
   - 运行后,正确读取所有值,并原样输出所有值

 <br /> <br /> 
<a name="K9sSe"></a>
### 1.1.3       头文件
<a name="onZWu"></a>
#### 1.1.3.1  不带输入输出语句

- PASCAL-S源程序
```pascal
program test(input,output);
var a,b:integer;
begin
   a:=3*b;
end.
  • 预期结果

没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。

  • 输出的C程序 ```cpp //Head files

    include

//Overall constant definiton

//Overall variable definition int a; int b;

//Subprogram declaration void test();

//Main function int main() { test(); return 0; }

//Subprogram definition void test() { a = 3 * b; }

 <br /> 

- 控制台输出及运行结果

![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918605767-4e231b2d-b886-4fef-b667-74a419f36d11.png#crop=0&crop=0&crop=1&crop=1&height=410&id=jfhfw&margin=%5Bobject%20Object%5D&name=image.png&originHeight=410&originWidth=474&originalType=binary&ratio=1&rotation=0&showTitle=false&size=132236&status=done&style=none&title=&width=474)

- 结果分析
   - 编译成功,运行成功
   - 输出的C代码中,头文件只包含stdbool.h
<a name="7sp2g"></a>
#### 1.1.3.2  带输入输出语句

- PASCAL-S源程序
```pascal
program test(input,output);
var a,b:integer;
begin
   read(b);
   a:=3*b;
   writeln(a);
end.
  • 预期结果

没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。

  • 输出的C程序 ```cpp //Head files

    include

    include

//Overall constant definiton

//Overall variable definition int a; int b;

//Subprogram declaration void test();

//Main function int main() { test(); return 0; }

//Subprogram definition void test() { scanf(“%d”, &b); a = 3 * b; printf(“%d\n”, a); }

 <br /> 

- 控制台输出及运行结果

![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918619147-0aef8940-2070-4b30-8a82-a801442e0712.png#crop=0&crop=0&crop=1&crop=1&height=453&id=cUZyo&margin=%5Bobject%20Object%5D&name=image.png&originHeight=453&originWidth=484&originalType=binary&ratio=1&rotation=0&showTitle=false&size=128327&status=done&style=none&title=&width=484)

- 结果分析
   - 编译成功,运行成功
   - 输出的C代码中,头文件不仅包含stdbool.h,还包含stdio.h
<a name="tZV2k"></a>
#### 1.1.3.3  对比分析
由于boolean类型是pascal所支持的基本类型,所以无论PASCAL-S源程序是否用到了boolean类型变量,输出的C代码中头文件都要包含stdbool.h,而stdio.h需要根据PASCAL-S源程序是否用到read、write、writeln调用。
<a name="Nx3eQ"></a>
### 1.1.4       运算符和表达式

- PASCAL-S源程序
```pascal
program test(input,output);
const a=3;
     b=1.0;
     c='c';
var d,e,f:integer;
   g,h,i:real;
   j,k,l:char;
   m,n,o:boolean;
function fun(a:integer):integer;
begin
   exit(a+1);
end;
begin
   d:=5; e:=10;
   g:=0.25; h:=0.5;
   j:='a'; k:='b';

   f:= d mod (e div fun(d)); //涉及mod、div和函数调用的复杂表达式
   writeln(f); //类型为integer

   g:= --d + e / d * ( - b); //涉及加减乘除、取相反数、加括号的复杂表达式
   writeln(g); //类型为real

   o:= ( ( f mod e ) <> d ) or ( a > b); //涉及<>、or的复杂表达式
   writeln(o); //类型为boolean

   m:= not not ( ( d + e ) = f ); //涉及取非、=的复杂表达式
   writeln(m); //类型为boolean

   n:= ( g * e < f ) and ( (f mod e) >= d ); //涉及and、<、>=、mode的复杂表达式
   writeln(n); //类型为boolean

   writeln( j <= c); //比较char的大小关系

   writeln( m > n); //比较boolean的大小关系
end.
  • 预期结果

没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。

  • 输出的C程序 ```cpp //Head files

    include

    include

//Overall constant definiton const int a = 3; const float b = 1.0; const char c = ‘c’;

//Overall variable definition int d; int e; int f; float g; float h; float i; char j; char k; char l; bool m; bool n; bool o;

//Subprogram declaration void test(); int fun(int a);

//Main function int main() { test(); return 0; }

//Subprogram definition void test() { d = 5; e = 10; g = 0.25; h = 0.5; j = ‘a’; k = ‘b’; f = d % (e / fun(d)); printf(“%d\n”, f); g = - ( - d) + e / d ( - b); printf(“%f\n”, g); o = ((f % e) != d) || (a > b); { if(o) printf(“true”); else printf(“false”); } printf(“\n”); m = ! ( ! ((d + e) == f)); { if(m) printf(“true”); else printf(“false”); } printf(“\n”); n = (g e < f) && ((f % e) >= d); { if(n) printf(“true”); else printf(“false”); } printf(“\n”); { if(j <= c) printf(“true”); else printf(“false”); } printf(“\n”); { if(m > n) printf(“true”); else printf(“false”); } printf(“\n”); }

int fun(int a) { return (a + 1); }

 <br /> <br /> 

- 控制台输出及运行结果

![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918633677-9692cf03-1cff-4602-8f87-390ef5c2ba95.png#crop=0&crop=0&crop=1&crop=1&height=578&id=MmPhm&margin=%5Bobject%20Object%5D&name=image.png&originHeight=578&originWidth=485&originalType=binary&ratio=1&rotation=0&showTitle=false&size=140460&status=done&style=none&title=&width=485)

- 结果分析
   - 生成的C代码中,各种运算符均转化正确
   - 生成的C代码中,对于a:=--b这种连着的单目运算符,添加了括号,更加易读
   - 生成的C代码中,对于不同类型的表达式,输出格式控制符正确
   - bool类型表达式的输出转化为了if-else语句
   - 输出结果符合预设值


<a name="5X4r0"></a>
### 1.1.5       引用参数与指针

- PASCAL-S源程序
```pascal
program test(input, output);
var ans:integer;
{
   求斐波那契数列值的过程,利用引用参数保存结果;
   n表示求第n项斐波那契数列值;
   fib(0)=1, fib(1)=1, ……, fib(n)=fib(n-1)+fib(n-2);
}
procedure fib(n:integer;var res:integer);
var tmp1,tmp2:integer;
begin
   if n=0 then
       res:=1
   else
       if n=1 then
            res:=1
       else
       begin
            fib(n-1,tmp1);
            fib(n-2,tmp2);
            res:=tmp1+tmp2;
       end;
end;
{
   自己编写的输出函数,可以实现输出n次out值;
   递归调用自身,n每次减1;
   out值采用的是引用参数;
}
procedure mywrite(n:integer; var out:integer);
begin
   if n=0 then
       exit
   else
   begin
       writeln(out);
       mywrite(n-1, out);
   end;
end;

begin
   fib(10, ans); //ans=fib(10)
   mywrite(3, ans); //输出ans 3次
end.
  • 预期结果

没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。

  • 输出的C程序 ```cpp //Head files

    include

    include

//Overall constant definiton

//Overall variable definition int ans;

//Subprogram declaration void test(); void fib(int n, int res); void mywrite(int n, int out);

//Main function int main() { test(); return 0; }

//Subprogram definition void test() { fib(10, &ans); mywrite(3, &ans); }

void fib(int n, int res) { int tmp1; int tmp2; if(n == 0) res = 1; else if(n == 1) res = 1; else { fib(n - 1, &tmp1); fib(n - 2, &tmp2); res = tmp1 + tmp2; } }

void mywrite(int n, int out) { if(n == 0) return; else { printf(“%d\n”, out); mywrite(n - 1, out); } } ```

  • 控制台输出及运行结果

image.png

  • 结果分析
    • 编译成功,运行成功
    • PASCAL-S源程序中普通变量作为引用形参对应的实参调用时,在生成的C代码中加上&取地址符
    • PASCAL-S源程序中引用参数作为引用形参对应的实参调用时,在生成的C代码中无需前置任何符号,因为引用参数对应到C代码中已经是指针了,所以调用时,传本身就已经是地址了。
    • PASCAL-S源程序中,用到引用参数的地方(除了2中的情况),在生成的C代码中,都需加上前置的”*”,表示解引用
    • 成功输出fib(10)=89 三次