PL0源代码(C语言版)

PL0源代码(C语言版)
PL0源代码(C语言版)

/*PL/0 编译系统C版本头文件pl0.h*/

# define norw 13 //a number of reserved word /*关键字个数*/

# define txmax 100 //length of identifier table /*名字表容量*/

# define nmax 14 //max number of digits in numbers /*number的最大位数*/

# define al 10 //length of identifier /*符号的最大长度*/

# define amax 2047 //maximum address /*地址上界*/

# define levmax 3 //max depth of block nesting /*最大允许过程嵌套声明层数[0,lexmax]*/

# define cxmax 200 //size of code array /*最多的虚拟机代码数*/

/*符号*/

enum symbol{

nul, ident, number, plus, minus,

times, slash, oddsym, eql, neq, //slash斜线

lss, leq, gtr, geq, lparen, //leq :less than or equal to; gtr: great than;lparen:left parenthesis

rparen, comma, semicolon,period, becomes,//comma逗号semicolon分号period句号becomes赋值号

beginsym, endsym, ifsym, thensym, whilesym,

writesym, readsym, dosym, callsym, constsym,

varsym, procsym,

};

#define symnum 32

/*-------------*/

enum object{ //object为三种标识符的类型

constant,

variable,

procedur,

};

/*--------------*/

enum fct{ //fct类型分别标识类PCODE的各条指令

lit, opr, lod, sto, cal, inte, jmp, jpc, //书本P23

};

#define fctnum 8

/*--------------*/

struct instruction //指令

{

enum fct f; //功能码

int l; //层次差

int a; //P23

};

FILE * fas; //输出名字表

FILE * fa; //输出虚拟机代码

FILE * fa1; //输出源文件及其各行对应的首地址

FILE * fa2; //输出结果

bool tableswitch; //显示名字表与否

bool listswitch; //显示虚拟机代码与否

char ch; //获取字符的缓冲区,getch使用

enum symbol sym; //当前符号

char id[al+1]; //当前ident,多出一个字节用于存放0

int num; //当前number

int cc,ll; //getch使用的计数器,cc表示当前字符(ch)的位置

int cx; //虚拟机代码指针,取值范围[0,cxmax-1]

char line[81]; //读取行缓冲区

char a[al+1]; //临时符号,多出的一个字节用于存放0

struct instruction code[cxmax]; //存放虚拟机代码的数组

char word[norw][al]; //保留字

enum symbol wsym[norw]; //保留字对应的符号值

enum symbol ssym[256]; //单字符的符号值

char mnemonic[fctnum][5]; //虚拟机代码指令名称

bool declbegsys[symnum]; //表示声明开始的符号集合,declaring begin symbol set bool statbegsys[symnum]; //表示语句开始的符号集, statement

bool facbegsys[symnum]; //表示因子开始的符号集合,factor

/*------------------------------*/

struct tablestruct

{

char name[al]; /*名字*/

enum object kind; /*类型:const,var,array or procedure*/ int val; /*数值,仅const使用*/

int level; /*所处层,仅const不使用*/

int adr; /*地址,仅const不使用*/

int size; /*需要分配的数据区空间,仅procedure使用*/

};

struct tablestruct table[txmax]; /*名字表*/

FILE * fin; //fin文本文件用于指向输入的源程序文件

FILE* fout; //fout文本文件用于指向输出的文件

char fname[al];

int err; /*错误计数器*/

/*当函数中会发生fatal error时,返回-1告知调用它的函数,最终退出程序*/

#define getsymdo if(-1==getsym())return -1

#define getchdo if(-1==getch())return -1

#define testdo(a,b,c) if(-1==test(a,b,c))return -1

#define gendo(a,b,c) if(-1==gen(a,b,c))return -1

#define expressiondo(a,b,c) if(-1==expression(a,b,c))return -1

#define factordo(a,b,c) if(-1==factor(a,b,c))return -1

#define termdo(a,b,c) if(-1==term(a,b,c))return -1

#define conditiondo(a,b,c) if(-1==condition(a,b,c))return -1

#define statementdo(a,b,c) if(-1==statement(a,b,c))return -1

#define constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1 #define vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1 void error(int n);

int getsym();

int getch();

void init();

int gen(enum fct x,int y,int z);

int test(bool*s1,bool*s2,int n);

int inset(int e,bool*s);

int addset(bool*sr,bool*s1,bool*s2,int n);

int subset(bool*sr,bool*s1,bool*s2,int n);

int mulset(bool*sr,bool*s1,bool*s2,int n);

int block(int lev,int tx,bool* fsys);

void interpret();

int factor(bool* fsys,int* ptx,int lev);

int term(bool*fsys,int*ptx,int lev);

int condition(bool*fsys,int*ptx,int lev);

int expression(bool*fsys,int*ptx,int lev);

int statement(bool*fsys,int*ptx,int lev);

void listcode(int cx0);

int vardeclaration(int* ptx,int lev, int* pdx);

int constdeclaration(int* ptx,int lev, int* pdx);

int position(char* idt,int tx);

void enter(enum object k,int* ptx,int lev,int* pdx);

int base(int l,int* s,int b);

//A.2 C 版本

/*编译和运行环境:

*1Visual C++6.0,VisualC++.NET and Visual C++.NET 2003

*WinNT, Win 200, WinXP and Win2003

*2 gcc version 3.3.2 20031022(Red Hat Linux 3.3.2-1)

*Redhat Fedora core 1

*Intel 32 platform

*使用方法:

*运行后输入PL/0 源程序文件名

*回答是否输出虚拟机代码

*回答是否输出名字表

*fa.tmp 输出虚拟机代码

*fa1.tmp 输出源文件及其各行对应的首地址

*fa2.tmp 输出结果

*fas.tmp 输出名字表

*/

#include

#include"pl0.h"

#include"string.h"

/*解释执行时使用的栈*/

#define stacksize 500

int main()

{

bool nxtlev[symnum];

printf("Input pl/0 file ?");

scanf("%s",fname); /*输入文件名*/

fin=fopen(fname,"r"); //返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中

if(fin)

{

printf("List object code ?(Y/N)"); /*是否输出虚拟机代码*/

scanf("%s",fname);

listswitch=(fname[0]=='y'||fname[0]=='Y');

printf("List symbol table ? (Y/N)"); /*是否输出名字表*/

scanf("%s",fname);

tableswitch=(fname[0]=='y'||fname[0]=='Y');

fa1=fopen("fa1.tmp","w");

fprintf(fa1,"Iput pl/0 file ?");

fprintf(fa1,"%s\n", fname);

init(); /*初始化*/

err=0; //错误计数器置0

cc=cx=ll=0;

ch=' ';

if(-1!=getsym())

{

fa=fopen("fa.tmp","w");

fas=fopen("fas.tmp","w");

addset(nxtlev,declbegsys,statbegsys,symnum);

nxtlev[period]=true;

if(-1==block(0,0,nxtlev)) /*调用编译程序*/

{

fclose(fa);

fclose(fa1);

fclose(fas);

fclose(fin);

printf("\n");

return 0;

}

fclose(fa);

fclose(fa1);

fclose(fas);

if(sym!=period)

{

error(9);

}

if(err==0)

{

fa2=fopen("fa2.tmp", "w");

interpret();

fclose(fa2);

}

else

{

printf("Errors in pl/0 program");

}

}

fclose(fin);

}

else

{

printf("Can't open file! \n");

}

printf("\n");

return 0;

}

/*

*初始化

*/

void init()

{

int i;

for(i=0;i<=255;i++)

{

ssym[i]=nul; //ssym:单字符的符号值}

ssym['+']=plus;

ssym['-']=minus;

ssym['*']=times;

ssym['/']=slash;

ssym['(']=lparen;

ssym[')']=rparen;

ssym['=']=eql;

ssym[',']=comma;

ssym['.']=period;

ssym['#']=neq;

ssym[';']=semicolon;

/*设置保留字名字,按照字母顺序,便于折半查找*/ strcpy(&(word[0][0]),"begin");

strcpy(&(word[1][0]),"call");

strcpy(&(word[2][0]),"const");

strcpy(&(word[3][0]),"do");

strcpy(&(word[4][0]),"end");

strcpy(&(word[5][0]),"if");

strcpy(&(word[6][0]),"odd");

strcpy(&(word[7][0]),"procedure");

strcpy(&(word[8][0]),"read");

strcpy(&(word[9][0]),"then");

strcpy(&(word[10][0]),"var");

strcpy(&(word[11][0]),"while");

strcpy(&(word[12][0]),"write");

/*设置保留字符号*/

wsym[0]=beginsym;

wsym[1]=callsym;

wsym[2]=constsym;

wsym[3]=dosym;

wsym[4]=endsym;

wsym[5]=ifsym;

wsym[6]=oddsym;

wsym[7]=procsym;

wsym[8]=readsym;

.

wsym[9]=thensym;

wsym[10]=varsym;

wsym[11]=whilesym;

wsym[12]=writesym;

/*设置指令名称*/

strcpy(&(mnemonic[lit][0]),"lit");

strcpy(&(mnemonic[opr][0]),"opr");

strcpy(&(mnemonic[lod][0]),"lod");

strcpy(&(mnemonic[sto][0]),"sto");

strcpy(&(mnemonic[cal][0]),"cal");

strcpy(&(mnemonic[inte][0]),"int");

strcpy(&(mnemonic[jmp][0]),"jmp");

strcpy(&(mnemonic[jpc][0]),"jpc");

/*设置符号集*/

for(i=0;i

{

declbegsys[i]=false;

statbegsys[i]=false;

facbegsys[i]=false;

}

/*设置声明开始符号集*/

declbegsys[constsym]=true;

declbegsys[varsym]=true;

declbegsys[procsym]=true;

/*设置语句开始符号集*/

statbegsys[beginsym]=true;

statbegsys[callsym]=true;

statbegsys[ifsym]=true;

statbegsys[whilesym]=true;

/*设置因子开始符号集*/

facbegsys[ident]=true;

facbegsys[number]=true;

facbegsys[lparen]=true;

}

/*

*用数组实现集合的集合运算

*/

int inset(int e,bool* s)

{

return s[e];

}

int addset(bool* sr,bool* s1,bool* s2,int n)

{

int i;

for(i=0;i

{

sr[i]=s1[i]||s2[i];

}

return 0;

}

int subset(bool* sr,bool* s1,bool* s2,int n)

{

int i;

for(i=0;i

{

sr[i]=s1[i]&&(!s2[i]);

}

return 0;

}

int mulset(bool* sr,bool* s1,bool* s2,int n)

{

int i;

for(i=0;i

{

sr[i]=s1[i]&&s2[i];

}

return 0;

}

/*

*出错处理,打印出错位置和错误编码

*/

void error(int n)

{

char space[81];

memset(space,32,81); printf("-------%c\n",ch);

space[cc-1]=0;//出错时当前符号已经读完,所以cc-1

printf("****%s!%d\n",space,n);

err++;

}

/*

* 漏掉空格,读取一个字符

*

* 每次读一行,存入line缓冲区,line被getsym取空后再读一行*

* 被函数getsym调用

*/

int getch()

{

if(cc==ll)

{

if(feof(fin)) //如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。

{

printf("program incomplete");

return -1;

}

ll=0;

cc=0;

printf("%d ",cx );

fprintf(fa1,"%d ",cx);

ch=' ';

while(ch!=10)

{

//fscanf(fin,"%c",&ch)

if(EOF==fscanf(fin,"%c",&ch))

{

line[ll]=0;

break;

}

printf("%c",ch);

fprintf(fa1,"%c",ch);

line[ll]=ch;

ll++;

}

printf("\n");

fprintf(fa1,"\n");

}

ch=line[cc];

cc++;

return 0;

}

/*词法分析,获取一个符号流程图P19

*/

int getsym()

{

int i,j,k;

while( ch==' '||ch==10||ch==9) //忽略空格、换行、TAB

{

getchdo; //getchdo :if(-1==getch())return -1 }

if(ch>='a'&&ch<='z')

{

k=0;

do{

if(k

{

a[k]=ch;

k++;

}

getchdo;

}while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');

a[k]=0;

strcpy(id,a);

i=0;

j=norw-1;

do{

k=(i+j)/2;

if(strcmp(id,word[k])<=0)

{

j=k-1;

}

if(strcmp(id,word[k])>=0)

{

i=k+1;

}

}while(i<=j);

if(i-1>j)

{

sym=wsym[k];

}

else

{

sym=ident;

}

}

else

{

if(ch>='0'&&ch<='9')

{

k=0;

num=0;

sym=number;

do{

num=10*num+ch-'0';

k++;

getchdo;

}while(ch>='0'&&ch<='9'); /*获取数字的值*/

k--;

if(k>nmax)

{

error(30);

}

}

else

{

if(ch==':') /*检测赋值符号*/

{

getchdo;

if(ch=='=')

{

sym=becomes;

getchdo;

}

else

{

sym=nul; /*不能识别的符号*/ }

}

else

{

if(ch=='<') /*检测小于或小于等于符号*/

{

getchdo;

if(ch=='=')

{

sym=leq;

getchdo;

}

else

{

sym=lss;

}

}

else

{

if(ch=='>') /*检测大于或大于等于符号*/

{

getchdo;

if(ch=='=')

{

sym=geq;

getchdo;

}

else

{

sym=gtr;

}

}

else

{

sym=ssym[ch];/* 当符号不满足上述条件时,全部按照单字符号处理*/

//getchdo;

//richard

if(sym!=period)

{

getchdo;

}

//end richard

}

}

}

}

}

return 0;

}

/*

*生成虚拟机代码

*

*x:instruction.f;

*y:instruction.l;

*z:instruction.a;

*/

int gen(enum fct x,int y,int z)

{

if(cx>=cxmax)

{

printf("Program too long"); /*程序过长*/

return -1;

}

code[cx].f=x;

code[cx].l=y;

code[cx].a=z;

cx++;

return 0;

}

/*

*测试当前符号是否合法

*

*在某一部分(如一条语句,一个表达式)将要结束时时我们希望下一个符号属于某集合*(该部分的后跟符号)test 负责这项检测,并且负责当检测不通过时的补救措施

*程序在需要检测时指定当前需要的符号集合和补救用的集合(如之前未完成部分的后跟*符号),以及不通过时的错误号

*

*S1:我们需要的符号

*s2:如果不是我们需要的,则需要一个补救用的集合

*n:错误号

*/

int test(bool* s1,bool* s2,int n)

{

if(! inset(sym,s1))

{

error(n);

/*当检测不通过时,不停获取符号,直到它属于需要的集合或补救的集合*/

while((! inset(sym,s1))&&(! inset(sym,s2)))

{

getsymdo;

}

}

return 0;

}

/*

*编译程序主体

*

*lev:当前分程序所在层

*tx:名字表当前尾指针

*fsys:当前模块后跟符号集合

*/

int block(int lev,int tx,bool* fsys)

{

int i;

int dx; /*名字分配到的相对地址*/

int tx0; /*保留初始tx*/

int cx0; /*保留初始cx*/

bool nxtlev[symnum]; /*在下级函数的参数中,符号集合均为值参,但由于使用数组

实现,传递进来的是指针,为防止下级函数改变上级函数的

集合,开辟新的空间传递给下级函数*/ dx=3;

tx0=tx; /*记录本层名字的初始位置*/

table[tx].adr=cx;

gendo(jmp,0,0);

if(lev > levmax)

{

error(32);

}

do{

if(sym==constsym) /*收到常量声明符号,开始处理常量声明*/

{

getsymdo;

do{

constdeclarationdo(&tx,lev,&dx); /*dx的值会被constdeclaration改变,使用

指针*/

while(sym==comma)

{

getsymdo;

constdeclarationdo(&tx,lev,&dx);

}

if(sym==semicolon)

{

getsymdo;

}

else

{

error(5); /*漏掉了逗号或者分号*/

}

}while(sym==ident);

}

if(sym==varsym)/*收到变量声名符号,开始处理变量声名*/

{

getsymdo;

do{

vardeclarationdo(&tx,lev,&dx);

while(sym==comma)

{

getsymdo;

vardeclarationdo(&tx,lev,&dx);

}

if(sym==semicolon)

{

getsymdo;

}

else

{

error(5);

}

}while(sym==ident);

}

while(sym==procsym)/*收到过程声名符号,开始处理过程声名*/ {

getsymdo;

if(sym==ident)

{

enter(procedur,&tx,lev,&dx);/*记录过程名字*/

getsymdo;

}

else

{

error(4);/*procedure后应为标识符*/

}

if(sym==semicolon)

{

getsymdo;

}

else

{

error(5);/*漏掉了分号*/

}

memcpy(nxtlev,fsys,sizeof(bool)*symnum);

nxtlev[semicolon]=true;

if(-1==block(lev+1,tx,nxtlev))

{

return -1;/*递归调用*/

}

if(sym==semicolon)

{

getsymdo;

memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);

nxtlev[ident]=true;

nxtlev[procsym]=true;

testdo(nxtlev,fsys,6);

}

else

{

error(5); /*漏掉了分号*/

}

}

memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);

nxtlev[ident]=true;

nxtlev[period]=true;

testdo(nxtlev,declbegsys,7);

}while(inset(sym,declbegsys)); /*直到没有声明符号*/

code[table[tx0].adr].a=cx; /*开始生成当前过程代码*/

table[tx0].adr=cx; /*当前过程代码地址*/

table[tx0].size=dx; /*声明部分中每增加一条声明都会给dx增加1,声明部分已经结束,dx就是当前过程数据的size*/

cx0=cx;

gendo(inte,0,dx); /*生成分配内存代码*/

if(tableswitch) /*输出名字表*/

{

printf("TABLE:\n");

if(tx0+1>tx)

{

printf("NULL\n");

}

for(i=tx0+1;i<=tx;i++)

{

switch(table[i].kind)

{

case constant:

printf("%d const %s",i,table[i].name);

printf("val=%d\n",table[i].val);

fprintf(fas,"%d const %s",i,table[i].name);

fprintf(fas,"val=%d\n",table[i].val);

break;

case variable:

printf("%d var%s",i,table[i].name);

printf("lev=%d addr=%d\n",table[i].level,table[i].adr);

fprintf(fas,"%d var %s",i,table[i].name);

fprintf(fas,"lev=%d addr=%d\n",table[i].level,table[i].adr);

break;

case procedur:

printf("%d proc%s",i,table[i].name);

printf("lev=%d addr=%d size=%d\n",table[i].level,table[i].adr,table[i].size);

fprintf(fas,"%d proc%s",i,table[i].name);

fprintf(fas,"lev=%d adr=%d size=%d \n",table[i].level,table[i].adr,table[i].size);

break;

}

}

printf("\n");

}

/*语句后跟符号为分号或end*/

memcpy(nxtlev,fsys,sizeof(bool)*symnum);/*每个后跟符号集和都包含上层后跟符号集和,以便补救*/

nxtlev[semicolon]=true;

nxtlev[endsym]=true;

statementdo(nxtlev,&tx,lev);

gendo(opr,0,0); /*每个过程出口都要使用的释放数据段命令*/

memset(nxtlev,0,sizeof(bool)*symnum); /*分程序没有补救集合*/

test(fsys,nxtlev,8); /*检测后跟符号正确性*/

listcode(cx0); /*输出代码*/

return 0;

}

/*

*在名字表中加入一项

*

*k:名字种类const,var or procedure

*ptx:名字表尾指针的指针,为了可以改变名字表尾指针的数值

*lev:名字所在的层次,以后所有的lev都是这样

*pdx:为当前应分配的变量的相对地址,分配后要增加1

*/

void enter (enum object k,int *ptx,int lev, int *pdx)

{

(*ptx)++;

strcpy(table[(*ptx)].name,id); /*全局变量id中已存有当前名字的名字*/

table[(*ptx)].kind=k;

switch(k)

{

case constant: /*常量名字*/

if (num>amax)

{

error(31);

num=0;

}

table[(*ptx)].val=num;

break;

case variable: /*变量名字*/

table[(*ptx)].level=lev;

table[(*ptx)].adr=(*pdx);

(*pdx)++;

break; /*过程名字*/ case procedur:

table[(*ptx)].level=lev;

break;

}

}

/*

*查找名字的位置

*找到则返回在名字表中的位置,否则返回0

*

*idt: 要查找的名字

*tx::当前名字表尾指针

*/

int position(char * idt,int tx)

{

int i;

strcpy(table[0].name,idt);

i=tx;

while(strcmp(table[i].name,idt)!=0)

{

i--;

}

return i;

}

/*

*常量声明处理

*/

int constdeclaration(int * ptx,int lev,int * pdx)

{

if(sym==ident)

{

getsymdo;

if(sym==eql ||sym==becomes)

{

if(sym==becomes)

{

error(1); /*把=写出成了:=*/ }

getsymdo;

if(sym==number)

{

enter(constant,ptx,lev,pdx);

getsymdo;

}

else

{

error(2); /*常量说明=后应是数字*/ }

}

else

{

error(3); /*常量说明标识后应是=*/ }

}

else

{

error(4); /*const后应是标识*/ }

return 0;

}

/*

*

*/

int vardeclaration(int * ptx,int lev,int * pdx)

{

if(sym==ident)

{

enter(variable,ptx,lev,pdx);//填写名字表

getsymdo;

}

else

{

error(4);

}

return 0;

}

/*

*输入目标代码清单

*/

void listcode(int cx0)

{

int i;

if (listswitch)

{

for(i=cx0;i

{

printf("%d %s %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);

fprintf(fa,"%d %s %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);

}

}

}

/*

*语句处理

*/

int statement(bool* fsys,int * ptx,int lev)

{

int i,cx1,cx2;

bool nxtlev[symnum];

if(sym==ident)

{

i=position(id,*ptx);

if(i==0)

{

error(11);

}

else

{

if(table[i].kind!=variable)

{

error(12);

i=0;

}

else

{

getsymdo;

if(sym==becomes)

{

getsymdo;

}

else

{

error(13);

}

c语言课程设计机房机位预定系统绝对正确,附源代码

1 设计目的 机房机位预定系统 2 任务概述 20台机器,编号1到20,从早八点到晚八点。两小时一个时间段,每次可预定一个时间段。功能要求: (1)系统以菜单方式工作 (2)查询,根据输入时间,输出机位信息。 (3)机位预定,根据输入的时间查询是否有空机位,若有则预约,若无则提供最近的时间段,另:若用户在非空时间上机,则将用户信息列入等待列表。 (4)退出预定,根据输入的时间,机器号撤销该事件的预定! (5)查询是否有等待信息,若有则提供最优解决方案(等待时间尽量短),若无则显示提示信息。 ......... 3 模块划分 4 主要函数说明及其N-S图 1.主函数: int main() { Menu(); /*当前状态函数*/ } void Menu() /*主界面*/ { int n,w; do { puts("\t\t****************机房机位预约系统*******************\n"); puts("\t\t*************************菜单

***************************\n"); puts("\t\t\t 1.查询某时间段机位状态"); /*查询某时间段机位状态*/ puts("\t\t\t 2.预定空机位"); /*预定空机位*/ puts("\t\t\t 3.取消预订"); /*取消预订*/ puts("\t\t\t 4.查询等待信息"); /*查询等待信息*/ puts("\t\t\t 5.退出"); /*退出*/ puts("\t\t********************************************************\n"); printf("选择菜单号(1-5):"); scanf("%d",&n); if(n<1||n>5) {w=1;getchar();} else w=0; }while(w==1); switch(n) { case 1:Situation();break; case 2:Book();break; case 3:Cancel();break; case 4:SearchWaiting();break; case 5:exit(0);break; } getch(); } 2.机位查询: void Situation() { int time; printf("输在 (8-20)范围内的时间:"); scanf("%d",&time); if(time<8||time>20) {printf("\t时间输入错误!\n"); printf("输入在 (8-20)范围内的时间:"); scanf("%d",&time); } detail(time); /*函数调用*/ getchar(); Menu();} 3.机位预定:

编译原理(PL0编译程序源代码)

/*PL/0编译程序(C语言版) *编译和运行环境: *Visual C++6.0 *WinXP/7 *使用方法: *运行后输入PL/0源程序文件名 *回答是否将虚拟机代码写入文件 *回答是否将符号表写入文件 *执行成功会产生四个文件(词法分析结果.txt符号表.txt虚拟代码.txt源程序和地址.txt) */ #include #include"pl0.h" #include"string" #define stacksize 500//解释执行时使用的栈 int main(){ bool nxtlev[symnum]; printf("请输入源程序文件名:"); scanf("%s",fname); fin=fopen(fname,"r");//以只读方式打开pl0源程序文件 cifa=fopen("词法分析结果.txt","w"); fa1=fopen("源程序和地址.txt","w");//输出源文件及各行对应的首地址 fprintf(fa1,"输入pl0源程序文件名:"); fprintf(fa1,"%s\n",fname); if(fin){ printf("是否将虚拟机代码写入文件?(Y/N)");//是否输出虚拟机代码 scanf("%s",fname); listswitch=(fname[0]=='y'||fname[0]=='Y'); printf("是否将符号表写入文件?(Y/N)");//是否输出符号表scanf("%s",fname); tableswitch=(fname[0]=='y'||fname[0]=='Y'); init();//初始化 err=0; cc=cx=ll=0; ch=' '; if(-1!=getsym()){ fa=fopen("虚拟代码.txt","w"); fas=fopen("符号表.txt","w"); addset(nxtlev,declbegsys,statbegsys,symnum); nxtlev[period]=true; if(-1==block(0,0,nxtlev)){//调用编译程序 fclose(fa); fclose(fa1); fclose(fas); fclose(fin); return 0; } if(sym!=period){ error(9);//结尾丢失了句号 }

C语言课程设计报告——贪吃蛇源程序

C 语言课程设计(小游戏贪吃蛇的程序设计报告) 设计人: 班级: 201 年月号

目录一:概述 1:研究背景及意义 2:设计的任务与需要知识点3:具体完成设计内容 二:需求分析 1:功能需求 2:操作方法 三:总体设计 1:模块划分 2:数据结构设计 四:详细设计 1:主空摸块设计 2:绘制游戏界面 3:游戏的具体过程 4:游戏的结束处理 5:显示排行榜信息模块 五:程序的调试与测试1:动画与音乐同步 2:蛇的运行 3:终止程序 六:结论 七::结束语 八:程序清单 九:参考文献

一. 概述 本课程设计以软件工程方法为指导,采用了结构化,模块化的程序设计方法,以C语言技术为基础,使用Turbo C++3、0为主要开发工具,对贪吃蛇游戏进行了需求分析,总体设计,详细设计,最终完成系统的实现与测试。 1、1 研究的背景及意义 随着社会的发展,人们生活的节奏日益加快,越来越多的人加入了全球化的世界。人们不再拘泥与一小块天地,加班,出差成了现代人不可避免的公务。而此时一款可以随时随地娱乐的游戏成为了人们的需要。此次课程设计完成的贪吃蛇小游戏,正就是为了满足上述需求而设计出来的。贪吃蛇游戏虽小,却设计诸多的知识点。通过开发贪吃蛇游戏系统,可使读者初步了解使用软件工程的与那个发,技术与工具开发软件的过程,进一步掌握结构化,模块化的程序设计方法与步骤,进一步掌握总体数据结构设计,模块划分方法,掌握局部变量,全局变量,结构体,共用体,数组,指针,文件等数据结构的使用方法,掌握图形,声音,随机数等多种库函数的使用方法,学习动画,音乐,窗口,菜单,键盘等多项编程技术,进一步学会软件调试,测试,组装等软件测试方法,为后续课程的学习与将来实际软件开发打下坚实的基础。 1、2 设计的任务与需要的知识点 1、2、1 课程设计主要完成的任务 1)、通过编写“贪吃蛇游戏”程序,掌握结构化,模块块化程序设计的思想,培养解决实际问题的能力。 2) 有同步播放动画,声音效果。 3) 设计好数组元素与蛇,食物的对应关系。 4) 随机产生食物。 5) 有分数统计,排行榜,分数存储等功能。 通过此次课程设计,希望使读者能更深入的理解与掌握课程教学中的基本概念,培养读者应用基本技术解决实际问题的能力,从而进一步提高分析问题与解决问题的能力。 1、2、2需要掌握与运用的知识点 1、2、3本次课程设计需要掌握与运用如下的知识点: 1) 数组的应用。 2) 全局变量的使用。 3) 按键处理。 4)结构体的应用。 5)图形,音乐与动画的有关知识。 6)随即函数的使用。 7)文件的基本出操作。 8) 结构化,模块化的设计方法。

电动车控制器C语言源代码

电动车控制器C语言源代码 . #define _E_BIKE_W79E83X_C_ #include "intrins.h" #include "E_BIKE_W79E83X.H" #include"W79E834.h" /******************************************************************** ********* * 主函数 ******************************************************************** * *********/ void main(void) { Init(); // 初始化 Init_IO(); // 初始化端口 H_Sample(); // 霍尔信号采样 Phase_Change(); // 相位变换 AutoHelpEN(1,0x1AA,200); /* 第一个参数设定助力功能允许不否,1为允许,0为禁止 第二个参数设定助力力量(PWM占空比),数值围:0~0x355,数值越大,力量 越大 第三个参数设定助力时间,数值越大,时间越长 */

Keep_SpeedEN(1,0x20,6); /* 第一个参数设定定速巡航功能允许不否,1为允许,0为禁止第二个参数设定定速巡航最低速设置 . . 第三个参数设定在巡航点保持多长时间后才进入巡航 */ Current_Lim(0xB48); /* 过流保护上限值设定 0xB00对应限电流最大大约为2.6A 0xB80对应限流值最大大约为3.8A */ LowVoltage_Lim(0x9B0); /* 欠压保护下限值设定 电池电压为47.9V时ADC采样值为0xB6 ==> 0xB60 推算电池电压为41V时的采样值为0x9B ==> 0x9B0 推算电池电压为40V时的采样值为0x98 ==> 0x980 */ EABS_Set(1,1); /* 第一个参数为滑行充电功能使能,1为允许,0为禁止

音量控制M62446的驱动C程序

音量控制M62446的驱动C程序 音量控制M62446 m62446 pdf //------------------------------------------------------------------------- // M62446 drving routines, VER 1.0 // // COPYRIGHT (C) 2000, Enbia Technology Inc. // Target: 8031 // AUTHOR: STEVEN LUO // // Revision History: // 2001/1/5 - Original Version // //------------------------------------------------------------------------- #include #include #include #include extern BOOL PIN_M62446_LATCH; extern BOOL PIN_M62446_DATA; extern BOOL PIN_M62446_CLK; static idata WORD shadow_word00=0; static idata WORD shadow_word01=0; static idata WORD shadow_word10=0; static idata WORD shadow_word11=0; // for storing the control word status // static BOOL bM62446Muted; // Set when 62446 is muted static void Write_M62446_Word(WORD myword); //------------------------------------------------------------------------- // Name: Volume_Validate // Description: // Arguments: // Return value: none //------------------------------------------------------------------------- static BYTE Volume_Validate(char vol){ if(vol<0)vol=0; // negative, should be 0 else if(vol >80) vol=80; // >80, set to 80 return 80 - vol; // Down to Up } //------------------------------------------------------------------------- // Name: Mute_M62446 // Description: // Arguments: // Return value: none //------------------------------------------------------------------------- void Mute_M62446(void){

PL0编译器源程序分析

PL/0编译器源程序分析 PL/0语言是Pascal语言的一个子集,我们这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。 PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。 词法分析子程序分析: 词法分析子程序名为getsym,功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。(注意!语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。而不是在需要新单词时才调用getsym过程。)getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。getch过程中使用了行缓冲区技术以提高程序运行效率。 词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym置为ident,把这个单词存入id变量。查保留字表时使用了二分法查找以提高效率。如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym则成相应的类型。如果遇到不合法的字符,把sym置成nul。 语法分析子程序分析: 语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。语法分析主要由分程序分析过程(block)、常量定义分析过程(constdeclaration)、变量定义分析过程(vardeclaration)、语句分析过程(statement)、表达式处理过程(expression)、项处理过程(term)、因子处理过程(factor)和条件处理过程(condition)构成。这些过程在结构上构成一个嵌套的层次结构。除此之外,还有出错报告过程(error)、代码生成过程(gen)、测试单词合法性及出错恢复过程(test)、登录名字表过程(enter)、查询名字表函数(position)以及列出类PCODE代码过程(listcode)作过语法分析的辅助过程。 由PL/0的语法图可知:一个完整的PL/0程序是由分程序和句号构成的。因此,本编译程序在运行的时候,通过主程序中调用分程序处理过程block来分析分程序部分(分程序分析过程中还可能会递归调用block过程),然后,判断最后读入的符号是否为句号。如果是句号且分程序分析中未出错,则是一个合法的PL/0程序,可以运行生成的代码,否则就说明源PL/0程序是不合法的,输出出错提示即可。 下面按各语法单元分析PL/0编译程序的运行机制。 分程序处理过程:

C语言课程设计俄罗斯方块源代码

1、新建“.h”头文件,将“头文件” 代码粘贴至其中, 2、新建“.c”源文件,将“源代码” 代码粘贴到其中。 3、新建空白工程,将头文件和源代码 添加进去,调试使用。 //头文件 //1.自定义枚举类型,定义7种形态的游戏方块 typedef enum tetris_shape { ZShape=0, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape }shape; //2.函数声明 //(1)操作方块函数 int maxX();//取得当前方块的最大x坐标 int minX();//取得当前方块的最小x坐标 void turn_left();//当前方块逆时针旋转90度 void turn_right(); int out_of_table(); void transform(); int leftable(); int rightable(); int downable(); void move_left(); void move_right(); //(2)操作游戏桌面的函数 int add_to_table();

void remove_full(); //(3)控制游戏函数 void new_game(); void run_game(); void next_shape(); int random(int seed); //(4)绘图函数 void paint(); void draw_table(); //(5)其他功能函数 void key_down(WPARAM wParam); void resize(); void initialize(); void finalize(); //(6)回调函数,用来处理Windows消息 LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM); //源代码 //1.文件包含 #include #include #include #include"tetris.h" //2.常量定义 #define APP_NAME "TETRIS" #define APP_TITLE "Tetris Game" #define GAMEOVER "GAME OVER" #define SHAPE_COUNT 7 #define BLOCK_COUNT 4 #define MAX_SPEED 5 #define COLUMS 10 #define ROWS 20 #define RED RGB(255,0,0)

PL0源代码

/*PL/0 编译系统C版本头文件 */ # define norw 13 ET and Visual C++.NET 2003 *WinNT, Win 200, WinXP and Win2003 *2 gcc version (Red Hat Linux Fedora core 1 *Intel 32 platform *使用方法: *运行后输入PL/0 源程序文件名 *回答是否输出虚拟机代码 *回答是否输出名字表 * 输出虚拟机代码 * 输出源文件及其各行对应的首地址 * 输出结果 * 输出名字表 */ #include<> #include"" #include"" /*解释执行时使用的栈*/ #define stacksize 500 int main() { bool nxtlev[symnum]; printf("Input pl/0 file "); scanf("%s",fname); /*输入文件名*/ fin=fopen(fname,"r"); ]=period;

ssym[';']=semicolon; /*设置保留字名字,按照字母顺序,便于折半查找*/ strcpy(&(word[0][0]),"begin"); strcpy(&(word[1][0]),"call"); strcpy(&(word[2][0]),"const"); strcpy(&(word[3][0]),"do"); strcpy(&(word[4][0]),"end"); strcpy(&(word[5][0]),"if"); strcpy(&(word[6][0]),"odd"); strcpy(&(word[7][0]),"procedure"); strcpy(&(word[8][0]),"read"); strcpy(&(word[9][0]),"then"); strcpy(&(word[10][0]),"var"); strcpy(&(word[11][0]),"while"); strcpy(&(word[12][0]),"write"); /*设置保留字符号*/ wsym[0]=beginsym; wsym[1]=callsym; wsym[2]=constsym; wsym[3]=dosym; wsym[4]=endsym; wsym[5]=ifsym; wsym[6]=oddsym; wsym[7]=procsym; wsym[8]=readsym; wsym[9]=thensym;

c语言课程设计报告学生成绩信息管理系统源代码

实验报告 一、问题陈述及其需求分析 (一)问题陈述 学生信息管理系统是对学生信息的基本管理,其中包括以下及模块: (1)增加一个学生的信息(需输入要增加学生的所有信息); (2)统计本班学生总人数及男女生人数。 (3)分别按照学号查找学生的信息;若找到则输出该学生全部信息,否则输出查找不到的提示信息。 (4)按学号对所有学生信息排序,并输出结果; (5)删除一个学生的信息(需指定要删除学生的学号);同时显示删除后的结果。( 二) 功能需求分析 学生信息管理系统设计 学生信息包括:学号,姓名,性别,出生年月,电话 使之提供以下功能: 1、系统以菜单方式工作 2、建立链表并显示 3、插入新的学生信息 4、删除某学号的学生信息 5、查找某学号的学生信息 6、对学生信息排序 7、统计学生人数 8、输出学生信息 二总体设计 (一)模块 依据程序的数据结构,描述该程序的层次结构,如下图:

1、建立链表并显示 void createlist(struct stucode **r); 2、插入新的学生信息 void insert(struct stucode **r); 3、删除某学号的学生信息 void del(struct stucode **r); 4、查找某学号的学生信息 void search1(struct stucode *r); 5、对学生信息排序 void sort(struct stucode **r); 6、统计学生人数 void search2(struct stucode *r); 7、输出学生信息 void out(struct stucode *r); 1 建立链表并显示 2 添加学生信息 3 删除学生信息 息 4 按学号查找学生信 5 对学生信息排序 6统计学生人数 7输出学员信息 8 学生信息写入文件 0退出 main() 菜单函数

C语言课程设计---学生选课系统加源代码

C程序设计课程设计 题目:学生选课系统专业班级:通信工程1班姓名: 学号: 指导教师: 成绩:

摘要 学生选课系统是一个教育单位不可缺少的重要系统组成部分,它对于学校的决策者、管理者管理、查看课程来说都有至关重要,所以学生选课管理系统应该能够为广大学、师生提供充足的信息和快捷的课程选择过程,有助于学生选好每一门课程,此系统系统选课方便、快捷,用简单的界面来展示学生的选课信息,应用简单明了、存储量大、可靠性高、保密性好、寿命长、成本低等优点,可以极大的提高对学生信息管理的效率。利用C语言开发,实现了简单的学生课程信息的录入、修改、查询、删除等操作,并且能够利用文件系统长久的保留原始数据。

目录 一、需求分析 (1) 二、总体设计 (1) 三、详细设计 (2) 1、数据定义...................................................... 错误!未定义书签。 2、算法流程图 (2) 四、编码 (6) 五、调试 (7) 六、设计总结 (10) 致谢 (11) 参考文献 (12) 附录 (13)

一、需求分析 语言文字描述系统要做什么 数据结构可用结构体,包括课程和选修两个结构体,其中课程结构体成员结构体成员包括课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期。选修结构体成员包括学号,课程编号,该结构体的建立主要是为了查询某门课程学生选修情况。 二、总体设计 系统由哪几个功能模块构成,给出功能模块图。C 中模块化的工具是函数 根据上面的需求分析,可以将这个系统的设计分为如下七大模块: 选课模块、按学分查找模块、按编号查找模块、查看课程模块、查看选课情况模块、课程输入模块、完成选择模块。 菜单选择模块 录入学生信息 学生选课 系统信息查看及储存 退出系统 完成选择模块 学生信息 管 理 录入课程信息 课程 管理

C语言程序设计50例(经典收藏)

水仙花 #include void main() { int a,b,c,i; for( i=100;i<1000;i++) { a=i/100; b=i%100/10; c=i%10; if(a*a*a+b*b*b+c*c*c==i) { printf("\n"); } } } 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有

的排列后再去掉不满足条件的排列。 2.程序源代码: #include "stdio.h" #include "conio.h" main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) /*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } getch(); } 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按1 0%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码:

PL0语言编译器的中间代码生成

课程设计报告 ( 2016--2017年度第一学期) 名称:编译技术课程设计 题目:PL/0语言编译器的中间代码生成院系:控制与计算机工程 班级:信安1401 学号:1141290105 学生姓名:黄竞昶 指导教师:徐欢 设计周数:一周 成绩: 日期:2016年12 月29日

1 课程设计的目的和要求 1.1 课程设计的目的 本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术。 1.2 课程设计的要求 1、要求用递归子程序法/或预测分析法实现对表达式、各种说明语句、控制语句进行语法分析。 2、若语法正确,则用语法制导翻译法进行语义翻译:对说明语句,要求将说明的各符号记录到相应符号表中;对可执行语句,应产生出四元式中间代码并填写到三地址码表中; 3、若语法错误,要求指出出错性质和出错位置(行号)。出错处理应设计成一个出错处理子程序。 2 系统描述 PL/0的编译程序和目标程序的解释执行程序都是用JA V A语言书写的,因此PL/0语言可在配备JA V A语言的任何机器上实现。本次课设开发平台即为JA V A。用递归子程序法实现了对表达式、各种说明语句、控制语句进行语法的分析。其中,对各个变量符号保存到了符号表中。对可执行语句,转化成四元式中间代码进行输出。本程序中,通过出错处理子程序,也进行了语法的错误的记录,并且输出了出错的行号和出错原因。 该程序的输入是打开test文件,通过文件输入流读入,输出有生成的中间代码、符号表内容、错误分析三部分内容,分别用java界面控件显示出来。 2.1 文法的描述 在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。文法的描述多用BNF(巴克斯范式),而另一个重要的概念:正则表达式,也是文法的另一种形式。 PL/0文法的EBNF表示: <程序>::= <分程序>. <分程序>::= [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句> <常量说明部分>::= const<常量定义>{,<常量定义>};

中国地质大学C语言课程设计题目(附参考代码)

C语言课程设计题目 选题一(起评分100分) 高考招生录取程序 已知文本文件f1.txt中存放了某个省当年参加高考的1000个考生的数据(考号、姓名、性别和考试成绩),存放格式是每行存放一个考生的数据,每个数据之间用空格隔开。 假定当年该省的招生计划是:一类本科招生计划为10%;二类本科招生计划为15%;三类本科招生计划为20%;四类高职高专招生计划为25%。 请编写程序,实现以下功能: (1)划定各批次录取分数线,结果可屏幕显示,也可存入文件。 (2)能够统计各批次中男生,女生的录取比例。统计结果可屏幕显示,也可存入文件。 (3)确定每名学生的录取情况及录取批次。 (4)考生可以根据考号或姓名(支持重名)查询自己的成绩及录取情况; 说明: ①系统程序要有界面 ②存入文件的数据,每行存一种数据,每行之间的不同信息用空格分隔。 选题二(起评分85分) 《C语言课程设计与学习指导》第4章题目或第5章题目任选其一 成绩评定方式 平时考勤:20% 考试(即程序考核及检查):40% 实习报告:40% 违规违纪处理 出现以下6种情况中的任何一种,整个课程设计的成绩直接认定为不及格: 1.考勤抽查出现3次(含)不在的情况; 2.上机从事玩游戏、看电影等活动被抓住2次(含)的情况; 3.程序检查被认定为抄袭的情况; 4.实习报告被认定抄袭或雷同的情况; 5.不参加考试(即程序考核及检查)的情况 6.不交实习报告的情况。

C语言课程设计报告撰写要求 1 内容要求 整个报告由六个部分构成: ①课设题目 ②题目分析 ③设计思路 ④实现结果 ⑤课设总结 ⑥附录(源代码) 2 篇幅要求 ①-⑤合计不低于8页,⑥不低于8页。 篇幅没有上限要求,但原则上要求不超过25页。 标题字体字号格式:宋体,三号,加黑,单倍行距。 正文字体字号格式:宋体或Times New Roman,五号,单倍行距。 3 撰写要求 严谨出现抄袭。 严谨出现雷同。 报告出现抄袭或雷同的,整个课程设计成绩一律按不及格论处。 4 其它 封面格式附后。

一些比较简c语言程序源代码

/**返回的long型的最大值是startLongValue+count-1(产生一个随机数) * param needCount * param count * param startLongValue * return */ public static List randomNoRepeatLongArray(int needCount,int count,long startLongValue){ //这种情况会出现无限循环的 if(needCount>count) return null; Random random = new Random(); int[] ints = new int[count]; for(int i=0;i list = new ArrayList(); while(list.size() #include #include

(完整word版)PL0源代码(C语言版)

/*PL/0 编译系统C版本头文件pl0.h*/ # define norw 13 //a number of reserved word /*关键字个数*/ # define txmax 100 //length of identifier table /*名字表容量*/ # define nmax 14 //max number of digits in numbers /*number的最大位数*/ # define al 10 //length of identifier /*符号的最大长度*/ # define amax 2047 //maximum address /*地址上界*/ # define levmax 3 //max depth of block nesting /*最大允许过程嵌套声明层数[0,lexmax]*/ # define cxmax 200 //size of code array /*最多的虚拟机代码数*/ /*符号*/ enum symbol{ nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, //slash斜线 lss, leq, gtr, geq, lparen, //leq :less than or equal to; gtr: great than;lparen:left parenthesis rparen, comma, semicolon,period, becomes,//comma逗号semicolon分号period句号becomes赋值号 beginsym, endsym, ifsym, thensym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym, }; #define symnum 32 /*-------------*/ enum object{ //object为三种标识符的类型 constant, variable, procedur, }; /*--------------*/ enum fct{ //fct类型分别标识类PCODE的各条指令 lit, opr, lod, sto, cal, inte, jmp, jpc, //书本P23 }; #define fctnum 8 /*--------------*/ struct instruction //指令 { enum fct f; //功能码 int l; //层次差 int a; //P23 }; FILE * fas; //输出名字表

C语言课程设计――飞机订票系统源代码

#include//标准输入、输出头文件 #include//包含字符串函数处理头文件 #include//包含access函数的头文件 #define N 99//定义最多的航班数 #define PRINT "%d\t\t%s\t\t%s\t\t星期%s\t\t%d\n ",s[i].num,s[i].start,s[i].over,s[i].time,s[i].count//宏定义输出格式struct air//定义结构体数组{int num;//定义航班号 char start[20];//航班起始站 char over[20];//终点站 char time[10];//飞行时间 int count;//机票数量 }s[N]; int i,m=0;//定义全局变量 char ii[10]; void add();//函数声明增加航班信息函数 void print();//显示航班信息 void search();//查找航班信息 void dingpiao();//订票业务 void tuipiao();//退票 void read();//读取文件 void save();//保存文件

void output();//输出格式 void paixu();//航班排序 void chushihua();//系统初始化 void build();//建立数据文件 void paixu1();//按航班号从小到大排序 void paixu2();//从大到小 void main()//主函数{int j; chushihua();//系统初始化判断是否存在原始数据文件 printf("欢迎使用飞机订票系统\n");//打印出系统主界面 do{printf("============================================================= =================== "); printf(" 1.增加航班信息\n" "\t 2.浏览航班信息\n" "\t\t 3.查找航班信息(按航班号)\t\t╮(╯_╰)╭\n" "\t\t\t 4.航班排序(按航班号)\n" "\t\t\t\t 5.订票业务\n" "\to(︶︿︶)o\t\t\t

c语言课程设计报告会员卡计费系统源代码

#i n c l u d e//编译预处理指令,引入头文件 #include #include #include #define MAX 10 //自定义符号常量 #define MENU_MAIN_COUNT 7 //主菜单的选项个数 typedef struct member //定义结构体类型member,采用链式存储结构{ char name[MAX]; //姓名 char id[MAX]; //卡号 char sex[2]; //性别 int age; //年龄 float money; //余额 char tel[12]; //电话 struct member *next; //定义一个指针指向下一个会员信息 float cost; //消费金额 }mem; //定义结构体变量mem /*声明函数*/ void menu(); /*声明函数,声明菜单函数*/ void save(mem *p); //声明保存函数 mem *head=NULL; //头指针为NULL mem* get_last(mem *p) //取得链表最后一个元素的节点指针并返回该指针 { if(p->next == NULL) { return p; } else { get_last(p->next); } } void creat_member(mem *pNew) //输入信息操作,会员登记函数 { //创建一个新的会员 char s; printf("卡号:"); scanf("%s",pNew->id); //运用指针输

(完整word版)(整理)C语言入门经典案例及源代码.

循环控制输出图案 【程序1】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: #include "stdio.h" main() { int i,j,result; printf("\n"); for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/ } printf("\n");/*每一行后换行*/ } } 【程序2】 题目:要求输出国际象棋棋盘。 1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。 2.程序源代码: #include "stdio.h" main() { int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) if((i+j)%2==0) printf("%c%c",219,219); else printf(" "); printf("\n"); } } ============================================================== 【程序3】 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。 2.程序源代码: #include "stdio.h"

main() { int i,j; printf("\1\1\n");/*输出两个笑脸*/ for(i=1;i<11;i++) { for(j=1;j<=i;j++) printf("%c%c",219,219); printf("\n"); } } 【程序4】 题目:打印出如下图案(菱形) * *** ****** ******** ****** *** * 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。 2.程序源代码: main() { int i,j,k; for(i=0;i<=3;i++) { for(j=0;j<=2-i;j++) printf(" "); for(k=0;k<=2*i;k++) printf("*"); printf("\n"); } for(i=0;i<=2;i++) { for(j=0;j<=i;j++) printf(" "); for(k=0;k<=4-2*i;k++) printf("*"); printf("\n"); } }