1.1.1 write/writeln语句
- PASCAL-S源程序
program test(input,output);
const a=1; //整型常量
b=3.0; //浮点型常量
c='c'; //字符型常量
blank=' '; //空格
var d:integer; //整型变量
e:real; //浮点型变量
f:char; //字符型变量
g:boolean; //布尔型变量
begin
d:=6;
e:=6.0;
f:='f';
g:=2>1;//不支持true常量,所以这么写
writeln(a,blank,b,blank,c,blank,1,blank,1.0,blank,'y');
write(a,blank,b,blank,c,blank,1,blank,1.0,blank,'y');
writeln;
writeln(g);
writeln(a+b,blank,a*b,blank,g,blank,a>b,blank,c,blank,d,blank,e,blank,d<>e);
end.
- 预期结果
没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。
//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 />
- 控制台输出及运行结果

- 结果分析
- 编译成功,运行成功
- 生成的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编译器正确编译,并正确运行,输出结果正确。
//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 />
- 控制台输出及运行结果

- 结果分析
- 编译成功,运行成功
- 生成的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编译器正确编译,并正确运行,输出结果正确。
//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 />
- 控制台输出及运行结果

- 结果分析
- 编译成功,运行成功
- 输出的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编译器正确编译,并正确运行,输出结果正确。
//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 />
- 控制台输出及运行结果

- 结果分析
- 编译成功,运行成功
- 输出的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编译器正确编译,并正确运行,输出结果正确。
//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 />
- 控制台输出及运行结果

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