1.1.1 变量和常量定义
- PASCAL-S源程序
```pascal
program test(input, output);
const a=1; //整型常量定义
b=2.0; //浮点型常量定义
c=’c’; //字符型常量定义
var d,dd,ddd:integer; //整型变量定义
f,ff,fff:char; //字符型变量定义 g,gg,ggg:boolean; //boolean型变量定义 h,hh,hhh:array[1..3] of integer; //整型数组定义 i,ii,iii:array[1..3, 4..9] of real; //浮点型数组定义 j,jj,jjj:array[1..3, 4..9, 10..18] of char; //字符型数组定义 k,kk,kkk:array[1..3, 4..9, 10..18, 19..30] of boolean; //布尔型数组定义 procedure pro; const a=1; //整型常量定义 b=2.0; //浮点型常量定义 c=’c’; //字符型常量定义 var d,dd,ddd:integer; //整型变量定义 e,ee,eee:real; //浮点型变量定义 f,ff,fff:char; //字符型变量定义 g,gg,ggg:boolean; //boolean型变量定义 h,hh,hhh:array[1..3] of integer; //整型数组定义 i,ii,iii:array[1..3, 4..9] of real; //浮点型数组定义 j,jj,jjj:array[1..3, 4..9, 10..18] of char; //字符型数组定义 k,kk,kkk:array[1..3, 4..9, 10..18, 19..30] of boolean; //布尔型数组定义 begine,ee,eee:real; //浮点型变量定义
end; begin
end.
- 预期结果
没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。<br />
- 输出的C程序
```cpp
//Head files
#include<stdbool.h>
//Overall constant definiton
const int a = 1;
const float b = 2.0;
const char c = 'c';
//Overall variable definition
int d;
int dd;
int ddd;
float e;
float ee;
float eee;
char f;
char ff;
char fff;
bool g;
bool gg;
bool ggg;
int h[3];
int hh[3];
int hhh[3];
float i[3][6];
float ii[3][6];
float iii[3][6];
char j[3][6][9];
char jj[3][6][9];
char jjj[3][6][9];
bool k[3][6][9][12];
bool kk[3][6][9][12];
bool kkk[3][6][9][12];
//Subprogram declaration
void test();
void pro();
//Main function
int main()
{
test();
return 0;
}
//Subprogram definition
void test()
{
}
void pro()
{
const int a = 1;
const float b = 2.0;
const char c = 'c';
int d;
int dd;
int ddd;
float e;
float ee;
float eee;
char f;
char ff;
char fff;
bool g;
bool gg;
bool ggg;
int h[3];
int hh[3];
int hhh[3];
float i[3][6];
float ii[3][6];
float iii[3][6];
char j[3][6][9];
char jj[3][6][9];
char jjj[3][6][9];
bool k[3][6][9][12];
bool kk[3][6][9][12];
bool kkk[3][6][9][12];
}
- 控制台输出及运行结果
- 结果分析
- 生成的C代码中,各种类型的常量定义均正确的加上了类型关键字,类型关键字的转化正确;
- 生成的C代码中,各种类型的变量定义正确;
- 生成的C代码中,各种类型的数组定义正确,各维大小正确;
1.1.2 程序声明
- PASCAL-S源程序 ```pascal program test(input,output); procedure pro(var a,b,c:integer; d:real; e,f:char; var g,h,i:boolean); begin
end; function fun(a:integer; var b,c,d:real; var e,f,g:boolean; h,i:char):real; begin fun:=1; end; begin
end.
- 预期结果
没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。<br />
- 输出的C程序
```cpp
//Head files
#include<stdbool.h>
//Overall constant definiton
//Overall variable definition
//Subprogram declaration
void test();
void pro(int *a, int *b, int *c, float d, char e, char f, bool *g, bool *h, bool *i);
float fun(int a, float *b, float *c, float *d, bool *e, bool *f, bool *g, char h, char i);
//Main function
int main()
{
test();
return 0;
}
//Subprogram definition
void test()
{
}
void pro(int *a, int *b, int *c, float d, char e, char f, bool *g, bool *h, bool *i)
{
}
float fun(int a, float *b, float *c, float *d, bool *e, bool *f, bool *g, char h, char i)
{
return (1);
}
- 控制台输出及运行结果
- 结果分析
- 编译成功,运行成功
- 生成的C代码中,子程序声明正确;
- 生成的C代码中,子程序定义的子程序头正确;
- 生成的C代码中,子程序声明和子程序头的参数的声明顺序与PASCAL-S源程序一致
- 生成的C代码中,子程序声明和子程序头的参数中,PASCAL-S源程序的引用参数成功的转化为了指针
1.1.3 数组定义与数组元素引用
- PASCAL-S源程序
program test(input,output); var i,j,k:integer; a:array[0..1, 2..3, 4..5] of integer; //数组定义 begin for i:=0 to 1 do for j:=2 to 3 do for k:=4 to 5 do read(a[i,j,k]); //三重循环,读入每一个数组元素,共8个 for i:=0 to 1 do for j:=2 to 3 do for k:=4 to 5 do writeln(a[i,j,k]) //三重循环,输出每一个数组元素,换行符分隔 end.
- 预期结果
没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。
//Overall constant definiton
//Overall variable definition int i; int j; int k; int a[2][2][2];
//Subprogram declaration void test();
//Main function int main() { test(); return 0; }
//Subprogram definition void test() { for(i = 0; i <= 1; i++) for(j = 2; j <= 3; j++) for(k = 4; k <= 5; k++) scanf(“%d”, &a[i][j - 2][k - 4]); for(i = 0; i <= 1; i++) for(j = 2; j <= 3; j++) for(k = 4; k <= 5; k++) printf(“%d\n”, a[i][j - 2][k - 4]); }
<br />
- 控制台输出及运行结果
![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918719356-06296379-1ae9-4ba0-8c03-846675f88af7.png#crop=0&crop=0&crop=1&crop=1&height=610&id=gSnv3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=610&originWidth=489&originalType=binary&ratio=1&rotation=0&showTitle=false&size=139198&status=done&style=none&title=&width=489)
- 结果分析
- 编译成功,运行成功
- 生成的C代码中,数组定义的各维大小正确
- 生成的C代码中,两个三重循环中,对数组元素的引用,下标表达式添加了正确的偏移量
- 输入的8个元素,按照原样输出,以换行符分隔
<a name="roQKo"></a>
### 1.1.4 返回值语句
- PASCAL-S源程序
```pascal
program test(input,output);
var b,c,d:integer;
procedure pro;
begin
exit;
end;
function fun(a:integer):char;
begin
if a<60 then
exit('l')
else
if a=60 then
fun:='m'
else
exit('h');
end;
function fun2(a:integer; var b,c,d:integer):integer;
begin
if a=0 then
fun2:=b+c+d
else
if a=1 then
fun2:=b*c*d
else
exit(-b-c-d);
end;
begin
read(b,c,d);
writeln(fun(b), ' ', fun(c), ' ', fun(d));
writeln(fun2(0, b, c, d),' ', fun2(1, b, c, d), ' ', fun2(2, b, c, d));
end.
- 预期结果
没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。
//Overall constant definiton
//Overall variable definition int b; int c; int d;
//Subprogram declaration void test(); void pro(); char fun(int a); int fun2(int a, int b, int c, int *d);
//Main function int main() { test(); return 0; }
//Subprogram definition void test() { scanf(“%d%d%d”, &b, &c, &d); printf(“%c%c%c%c%c\n”, fun(b), ‘ ‘, fun(c), ‘ ‘, fun(d)); printf(“%d%c%d%c%d\n”, fun2(0, &b, &c, &d), ‘ ‘, fun2(1, &b, &c, &d), ‘ ‘, fun2(2, &b, &c, &d)); }
void pro() { return; }
char fun(int a) { if(a < 60) return (‘l’); else if(a == 60) return (‘m’); else return (‘h’); }
int fun2(int a, int b, int c, int d) { if(a == 0) return (b + c + d); else if(a == 1) return (b c d); else return ( - b - c - d); }
<br />
- 控制台输出及运行结果
![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918734577-c07abbfd-6108-4932-bd08-63a4c8a57ed6.png#crop=0&crop=0&crop=1&crop=1&height=477&id=kxVrn&margin=%5Bobject%20Object%5D&name=image.png&originHeight=477&originWidth=477&originalType=binary&ratio=1&rotation=0&showTitle=false&size=126080&status=done&style=none&title=&width=477)
- 结果分析
- 编译成功,运行成功;
- 赋值形式的返回值语句正确的转化为了C程序中的return语句;
- exit带参数的返回值语句正确的转化为了C程序中的return语句;
- exit不带参数的返回语句正确的转化为了C程序中的return语句;
- 输出结果符合预设值
<a name="T960F"></a>
### 1.1.5 程序的无参调用
- PASCAL-S源程序
```pascal
program test(input,output);
var a:integer;
procedure pro;
begin
writeln(a);
end;
function fun:integer;
begin
fun:=100;
end;
begin
writeln(fun);
a:=fun mod 3;
pro;
end.
- 预期结果
没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。
//Overall constant definiton
//Overall variable definition int a;
//Subprogram declaration void test(); void pro(); int fun();
//Main function int main() { test(); return 0; }
//Subprogram definition void test() { printf(“%d\n”, fun()); a = fun() % 3; pro(); }
void pro() { printf(“%d\n”, a); }
int fun() { return (100); }
<br />
- 控制台输出及运行结果
![image.png](https://cdn.nlark.com/yuque/0/2021/png/3018011/1614918747866-00712714-87e2-4c96-be50-c94cb5e7ae82.png#crop=0&crop=0&crop=1&crop=1&height=465&id=kqT4X&margin=%5Bobject%20Object%5D&name=image.png&originHeight=465&originWidth=495&originalType=binary&ratio=1&rotation=0&showTitle=false&size=129664&status=done&style=none&title=&width=495)
- 结果分析
- 编译成功,运行成功
- 过程的无参调用正确的转化为了C代码,添加了一对括号
- 函数的无参调用正确的转化为了C代码,添加了一对括号
<br />
<a name="FF54y"></a>
### 1.1.6 各种语句混合与缩进
- PASCAL-S源程序
```pascal
program test(input, output);
var i:integer;
a:array[1..10] of integer;
procedure swap(var a,b:integer); //交换两个数的值
var tmp:integer;
begin
tmp:=a;
a:=b;
b:=tmp;
end;
procedure bubbleSort; //冒泡排序
var i,j:integer;
begin
for i:= 1 to 10 do //for语句
begin //compound语句
j:=i+1;
while j <= 10 do //while语句
begin //compound语句
if a[i]>a[j] then //if语句
swap(a[i],a[j]);
j:=j+1;
end
end;
end;
begin
i:=1;
repeat //repeat语句
begin //compound语句
read(a[i]);
i:=i+1
end
until i=11;
bubbleSort;
for i:= 1 to 10 do //for语句
write(a[i],' ');
writeln;
end.
- 预期结果
没有词法、语法、语义错误,正确生成的C程序,可以用C编译器正确编译,并正确运行,输出结果正确。
//Overall constant definiton
//Overall variable definition int i; int a[10];
//Subprogram declaration void test(); void swap(int a, int b); void bubblesort();
//Main function int main() { test(); return 0; }
//Subprogram definition void test() { i = 1; do { scanf(“%d”, &a[i - 1]); i = i + 1; } while(!(i == 11)); bubblesort(); for(i = 1; i <= 10; i++) printf(“%d%c”, a[i - 1], ‘ ‘); printf(“\n”); }
void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; }
void bubblesort()
{
int i;
int j;
for(i = 1; i <= 10; i++)
{
j = i + 1;
while(j <= 10)
{
if(a[i - 1] > a[j - 1])
swap(&a[i - 1], &a[j - 1]);
j = j + 1;
}
}
}
```
- 控制台输出及运行结果
- 结果分析
- 编译成功,运行成功
- if语句转化正确
- while语句转化正确
- for语句转化正确
- repeat语句转化正确,特别是条件表达式,需要取非
- compound语句转化正确
- 语句的缩进美观,且符合设计
- 输入的10个数正确的被排序,按照从小到大的顺序输出