1.1.1 变量和常量定义

  • PASCAL-S源程序 ```pascal program test(input, output); const a=1; //整型常量定义 b=2.0; //浮点型常量定义 c=’c’; //字符型常量定义 var d,dd,ddd:integer; //整型变量定义
    1. 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; //布尔型数组定义 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; //布尔型数组定义 begin

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];
}


  • 控制台输出及运行结果

image.png

  • 结果分析
    • 生成的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);
}


  • 控制台输出及运行结果

image.png

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

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

    include

    include

//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编译器正确编译,并正确运行,输出结果正确。

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

    include

    include

//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编译器正确编译,并正确运行,输出结果正确。

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

    include

    include

//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编译器正确编译,并正确运行,输出结果正确。

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

    include

    include

//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; } } } ```

  • 控制台输出及运行结果

image.png

  • 结果分析
    • 编译成功,运行成功
    • if语句转化正确
    • while语句转化正确
    • for语句转化正确
    • repeat语句转化正确,特别是条件表达式,需要取非
    • compound语句转化正确
    • 语句的缩进美观,且符合设计
    • 输入的10个数正确的被排序,按照从小到大的顺序输出