PL0-C语言源代码

PL0-C语言源代码
PL0-C语言源代码

//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

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

#include"string.h"

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

#define stacksize 500

//typedef enum {

// false,

// true

//}bool;

# define norw 13 /*关键字个数*/

# define txmax 100 /*名字表容量*/

# define nmax 14 /*number的最大位数*/

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

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

# define levmax 3 /*最大允许过程嵌套声明层数[0,lexmax]*/ # define cxmax 200 /*最多的虚拟机代码数*/

/*符号*/

enum symbol{

nul, ident, number, plus, minus,

times, slash, oddsym, eql, neq,

lss, leq, gtr, geq, lparen,

rparen, comma, semicolon,period, becomes,

beginsym, endsym, ifsym, thensym, whilesym,

writesym, readsym, dosym, callsym, constsym,

varsym, procsym,

};

#define symnum 32

/*----名字表中的类型---------*/

enum object{

constant,

variable,

procedur,

};

/*------虚拟机代码--------*/

enum fct{

lit, opr, lod, sto, cal, inte, jmp, jpc,

};

#define fctnum 8

/*------虚拟机代码结构--------*/

struct instruction

{

enum fct f; /*虚拟机代码指令*/

int l; /*引用层与声明层的层次差*/

int a; /*根据f的不同而不同*/

};

FILE * fas; /*输出名字表*/

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

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

FILE * fa2; /*输出结果*/

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

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

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]; /*表示声明开始的符号集合*/ bool statbegsys[symnum]; /*表示语句开始的符号集合*/ bool facbegsys[symnum]; /*表示因子开始的符号集合*/

/*-----------名字表结构-------------------*/

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;

FILE* 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);

int main()

{

bool nxtlev[symnum];

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

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

fin=fopen(fname,"r");

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("fal.tmp","w");

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

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

init();

/*初始化*/

err=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;

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]),"inte");

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);

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))

{

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;

}

/*词法分析,获取一个符号

*/

int getsym()

{int i,j,k;

while( ch==' '||ch==10||ch==9)

{

getchdo ;

}

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);

}

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

expressiondo(nxtlev,ptx,lev);

if(i!=0)

{

gendo(sto,lev-table[i].level,table[i].adr);

}

}

}

}

else

{

if(sym==readsym)

{

getsymdo;

if(sym!=lparen)

{

error(34);

}

else

{

do{

getsymdo;

if(sym==ident)

{

c语言程序代码

1.要求在屏幕上输出下一行信息。 This is a c program. 程序: #include int main() { printf(“this is a c program.\n”); return 0; } 2.求两个整数之和。 程序: #include int main() { int a,b,sum; a=122; b=234; sum=a+b; printf(“sum is %d\n”,sum); return 0; } 3.求两个整数之间的较大者。

#include int main() { int max(int x,int y); int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("max=%d\n",c); return 0; } int max(int x,int y) { int z; if(x>y)z=x; else z=y; return(z); } 4.有人用温度计测量出华氏发表示的温度(如69°F),今要求把 她转换成以摄氏法表示的温度(如20℃)。 公式:c=5(f-32)/9. 其中f代表华氏温度,c代表摄氏温度。

#include int main() { float f,c; f=64.0; c=(5.0/9)*(f-32); printf("f=%f\nc=%f\n",f,c); return 0; } 5.计算存款利息。有1000元,想存一年。有一下三种方法可选: (1)活期:年利率为r1;(2)一年定期:年利率为r2;(3)存两次半年定期:年利率为r3。分别计算一年后按三种方法所得到的本息和。 程序: #include int main() { float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3; p1=p0*(1+r1); p2=p0*(1+r2);

C语言程序设计 入门源代码代码集合

#include <> void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c)); return 0;

} int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include <> int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5 #include <>

C语言程序设计-入门源代码代码集合

演示1 #include void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "stdio.h" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "stdio.h" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c));

return 0; } int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5

一些比较简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

C语言程序设计(医院信息管理系统)附源代码

专业设计报告 课程名称: C 语言程序设计 课题名称:医院信息管理系统 专业班别: 12本计算机科学与技术二班 姓名: 学号: 指导教师: 设计日期: 2012-5-25

教师评语:

成绩评定: 指导教师签名: 日期: 2012 年月日 课程设计题目医院信息管理程序 作者姓名: 同组成员: 摘要利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文件中,并且可以对文件中的病人信息进行读取与显示 1.专业设计目的

1、掌握链表的操作,包括链表节点的创建、释放还有链表的遍历 2、掌握对二进制文件的创建、增添等基本操作。 3、熟悉C语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式 2.设计基本要求( 1、使用结构体来存储病人的信息,结构体中包括病的id号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。 2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息 3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。 4、要求用四个源文件、、、 5、系统完成后应实现类似下面所示界面

3、算法分析 1、数据结构 设计链表中的一个节点存储一个病人的信息,使用下面的结构体类型定义:struct patient{ char id[10]; char name[10]; char casehist[200]; int cost[3]; int transfusion;

C语言程序设计医院信息管理系统附源代码样本

专业设计报告 课程名称: C 语言程序设计 课题名称: 医院信息管理系统 专业班别: 12本计算机科学与技术二班姓名: 学号: 指导教师: 设计日期: -5-25

教师评语: 成绩评定: 指导教师签名: 日期: 年月日 课程设计题目医院信息管理程序

作者姓名: 同组成员: 摘要利用结构体存储每个病人的信息和每种药品的信息, 并使用链表存储全部病人的信息; 能完成对医院内所有病人信息的注册、查询、删除和修改等操作, 同时又能对药房内库存的药品进行查询; 能够将链表中的病人信息保存在文件中, 而且能够对文件中的病人信息进行读取与显示1.专业设计目的 1、掌握链表的操作, 包括链表节点的创立、释放还有链表的遍历 2、掌握对二进制文件的创立、增添等基本操作。 3、熟悉C语言函数的使用方法, 学会模块化处理问题以及多个源文件的处理方式 2.设计基本要求( 1、使用结构体来存储病人的信息, 结构体中包括病的id号码、姓名、病历以及消费信息, 并用链表将所有病人信息整合。 2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息 3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。 4、要求用四个源文件main.c、link.c、find.c、save_load.c 5、系统完成后应实现类似下面所示界面

3、算法分析 1、数据结构 设计链表中的一个节点存储一个病人的信息, 使用下面的结构体类型定义: struct patient{ char id[10]; char name[10]; char casehist[200]; int cost[3]; int transfusion; int surgery; struct patient *next; };

运动会c语言源程序代码

#include #include #include #include #define n 2 #define m 1 #define w 1 #define null 0 typedefstruct { intitemnum; int top; int range[5]; int mark[5]; }itemnode; typedefstruct { intschoolnum; int score; intmscore; intwscore; itemnode c[m+w]; }headnode; headnode h[n]; voidinputinformation() { inti,j,k,s; for(i=0;i

scanf("%d",&h[i].c[j].itemnum); printf("*****取前3名or前5名:"); scanf("%d",&h[i].c[j].top); printf("*****获得几个名次:"); scanf("%d",&k); for(s=0;s<5;s++) h[i].c[j].range[s]=0, h[i].c[j].mark[s]=0; for(s=0;s

c语言动画程序源码

C语言动画程序 #include #include #include #include #define pi 3.1415926535 double ca3mm1(double m1,double m2); double ca3fm1(double cosine,double sine); double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang); double ca6fm2(double a4m ,double a4f,double a5m , double a5f); char inbox(int x,int y,int x1,int y1); char buf(); main() { double m=3.0; double xo=100.0,yo=200.0,a1=30.0,t1=pi; double xc=xo+m*a1,yc=yo; double a2=8.0,a3,a4=25.0,a5=30.0,a6=20.0,a7=35.0; double t2,t3,t4,t5,t6,t7; double xo1=xo+m*150,yo1=yo; double xc1=xo1-m*a1,yc1=yo1; double i,j,k; double l1; double n=116.1,nt; initscreen(); setfillstyle(SOLID_FILL,DARKGRAY); bar(0,0,640,480); mybutton(10,10,"BEGIN",1,0); mybutton(500,10,"EXIT",1,0); line(0,69,640,69); mouseinit(); changemousecross(); setmousexy(320,20); mouseshow(); setmousearea(0,0,640,60); do{ if(inbox(10,10,70,26)&&button()==1) {mousehide(); mybutton(10,10,"BEGIN",0,0); mouseshow(); mousehold(); mousehide(); mybutton(10,10,"BEGIN",1,7); mouseshow(); break; }

C语言程序设计(医院信息管理系统)附源代码

C语言程序设计(医院信息管理系统)附源代码

————————————————————————————————作者:————————————————————————————————日期:

专业设计报告 课程名称: C 语言程序设计课题名称:医院信息管理系统 专业班别:12本计算机科学与技术二班 姓名: 学号: 指导教师: 设计日期:2012-5-25

教师评语: 等级 优良中及格差项目 专业设计目的 设计基本要求 算法分析 源程序代码 源程序代码测试 设计总结 成绩评定: 指导教师签名: 日期:2012 年月日

课程设计题目医院信息管理程序 作者姓名: 同组成员: 摘要利用结构体存储每个病人的信息和每种药品的信息,并使用链表存储全部病人的信息;能完成对医院内所有病人信息的注册、查询、删除和修改等操作,同时又能对药房内库存的药品进行查询;可以将链表中的病人信息保存在文件中,并且可以对文件中的病人信息进行读取与显示 1.专业设计目的 1、掌握链表的操作,包括链表节点的创建、释放还有链表的遍历 2、掌握对二进制文件的创建、增添等基本操作。 3、熟悉C语言函数的使用方法,学会模块化处理问题以及多个源文件的处理方式 2.设计基本要求( 1、使用结构体来存储病人的信息,结构体中包括病的id号码、姓名、病历以及消费信息,并用链表将所有病人信息整合。 2、用文件来存储链表的信息以便下次再使用该程序时载入病人信息 3、能够实现病人信息的注册、病人信息的查询、病人消费统计、保存链表信息、载入链表信息、查询库存等几项功能。 4、要求用四个源文件main.c、link.c、find.c、save_load.c 5、系统完成后应实现类似下面所示界面

C语言动画程序源码

C语言动画程序 #include <> #include <> #include <> #include <> #define pi double ca3mm1(double m1,double m2); double ca3fm1(double cosine,double sine); double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang); double ca6fm2(double a4m ,double a4f,double a5m , double a5f); char inbox(int x,int y,int x1,int y1); char buf(); main() { double m=; double xo=,yo=,a1=,t1=pi; double xc=xo+m*a1,yc=yo; double a2=,a3,a4=,a5=,a6=,a7=; double t2,t3,t4,t5,t6,t7; double xo1=xo+m*150,yo1=yo; double xc1=xo1-m*a1,yc1=yo1; double i,j,k; double l1; double n=,nt; initscreen(); setfillstyle(SOLID_FILL,DARKGRAY); bar(0,0,640,480); mybutton(10,10,"BEGIN",1,0); mybutton(500,10,"EXIT",1,0); line(0,69,640,69); mouseinit(); changemousecross(); setmousexy(320,20); mouseshow(); setmousearea(0,0,640,60); do{ if(inbox(10,10,70,26)&&button()==1) {mousehide(); mybutton(10,10,"BEGIN",0,0); mouseshow(); mousehold(); mousehide(); mybutton(10,10,"BEGIN",1,7); mouseshow(); break; }

C语言编程项目源代码

常用的C语言编程实例-实训01 1.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?代码: #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.输入某年某月某日,判断这一天是这一年的第几天? 代码: #include "stdio.h" #include "conio.h" main() { int day,month,year,sum,leap; printf("\nplease input year,month,day\n"); scanf("%d,%d,%d",&year,&month,&day); switch(month) /*先计算某月以前月份的总天数*/ { case 1:sum=0;break; case 2:sum=31;break; case 3:sum=59;break; case 4:sum=90;break; case 5:sum=120;break; case 6:sum=151;break; case 7:sum=181;break; case 8:sum=212;break; case 9:sum=243;break; case 10:sum=273;break; case 11:sum=304;break; case 12:sum=334;break; default:printf("data error");break; }

c语言程序设计课程学籍管理系统源代码

附表1.程序源码 #include #include #include #include #define N 100 struct student { char num[13]; char name[18]; float math; float english; float cprogram; float circuit; float law; float pingjun; float score[5]; }; void mainprint(); void scoreprint(); void studentprint(); void scoreInput(); void scoreStat(); void studentStatus(); void bukao(); /*生成并打印补考通知单*/ void tuixue(); /*生成并打印退学通知单*/ void xinmingdan(); /*生成并打印新名单*/ void sortAnhao(); /*按学号排序*/ void jisuanPingjun(); /*计算平均分并排序*/ void tongjiFenshu(); /*统计分数段*/ void fenxi(); /*分析学生成绩,算出不及格门数*/\

void mynew(); /*创新功能*/ void outstudent(); void outdanke(); void teshutuixue(); void main() { char choose='\0',yes_no='\0'; do { system("color 4f"); system("cls"); mainprint(); printf(" "); choose=getche( ); switch(choose) { case'1':scoreInput();break; /*成绩录入*/ case'2':scoreStat();break; case'3':studentStatus();break; case'4':mynew();break; case'0':break; default:printf("\n %c是非法选项!\n"); break; } if(choose=='0') break; printf("\n 即将进入主菜单,要继续选择吗(Y/N)?\n"); do { yes_no=getche( ); }while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n'); }while(yes_no=='y'||yes_no=='Y'); } void mainprint() { printf(" |******************************************|\n"); printf(" | 欢迎使用学籍管理系统|\n"); printf(" |******************************************|\n"); printf(" | 请输入选项编号(0~4) |\n"); printf(" |------------------------------------------|\n"); printf(" | 1--录入成绩|\n"); printf(" | 2--统计成绩|\n"); printf(" | 3--处理学籍|\n"); printf(" | 4--创新功能|\n"); printf(" | 0-- 退出|\n");

经典C语言源代码

经典C语言源代码 1、(1)某年某月某日是星期几 #include

??{ ?case 1:printf(”Monday\n");break; ??case2:printf(”Tuesday\n");break; ??case 3:printf("Wednesday\n”); break; ?case 4:printf("Thursday\n"); break; ?case 5:printf("Friday\n"); break; ??case6:printf(”Saturday\n”); break; case 0:printf("Sunday\n"); break; ?} ?} ?return 0; } 1、(2)某年某月某日是第几天(一维数组) #include "stdio。h” void main(){ ?int i, flag, year, month, day, dayth; ?intmonth_day[] ={ 0,31,28,31,30,31,30,31,31,30,31,30,31};...文档交流仅供参考... ?printf("请输入年/月/日:\n"); ?scanf_s("%d/%d/%d",&year, &month, &day); dayth = day; ?flag = (year %400 == 0)|| (year % 4 == 0 && year % 100 != 0);...文档交流仅供参考...

经典C语言程序50例(1-50)

经典C语言程序50例(1-50) 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: 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); } } ============================================================== 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1;

经典C语言源代码

经典C语言源代码 1、(1)某年某月某日是星期几 #include int main() ( int year, month, day; while (scanf_s("%d%d%d”, &year, &month, &day) != EOF) ( if (month == 1 || month == 2)// 判断month 是否为1 或2 ( year--; month += 12; } int c = year / 100; int y = year - c * 100; int week = (c / 4) - 2 * c + (y + y / 4) + (13 * (month + 1) / 5) + day - 1; while (week<0) ( week += 7; } week %= 7; switch (week) ( case 1:printf("Monday\n"); break; case 2:printf("Tuesday\n"); break;

case 3:printf("Wednesday\n"); break; case 4:printf("Thursday\n"); break; case 5:printf("Friday\n"); break; case 6:printf("Saturday\n"); break; case 0:printf("Sunday\n"); break; } } return 0; } 1、(2)某年某月某日是第几天(一维数组) #include "stdio.h" void main() { int i, flag, year, month, day, dayth; int month_day口= { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; printf("请输入年/月/日:\n"); scanf_s("%d/%d/%d”, &year, &month, &day); dayth = day; flag = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0); if (flag) month_day[2] = 29; for (i = 1; i < month; i++) dayth = dayth + month_day[i];

C语言程序源代码

C语言程序源代码

C语言程序源代码 #include // 51寄存器定义 #include "intrins.h" #define control P1 //P1_0:A相,P1_1:B相,P1_2:C相,P1_3:D相 #define discode P0 //显示代码控制端口 #define uchar unsigned char //定义无符号型变量 #define uint unsigned int sbit en_dm=P3^0; //显示代码锁存控制 sbit en_wk=P3^1; //位控锁存控制 uchar code corotation[4]= {0x03,0x06,0x0c,0x09};//电机正转 uchar code rollback[4]={0x0c,0x06,0x03,0x09}; //电机反转 uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示字段uint code Levspeed[5]={500,400,300,200,100};//电机速度等级 uchar Hscan,speedcount;//Hscan行扫描,speedcount 速度等级计数 uint uu; //频率计数 uint step,setstep; //step:电机步伐计数,setstep:手动设置电机步伐 uint speed=500; //电机初始速度 uchar count; uchar flag[5]; uchar butcount; //按键次数 //**************************************** //flag[0] 正转标志 //flag[1] 反转标志 //flag[2] 加速标志 //flag[3] 减速标志 //flag[4] 设置标志 //**************************************** Delay1mS(unsigned int tt) //延时1ms “Delay1mS”延时子程序,用循环语句延时。 { unsigned char i; while(tt--) for(i=113;i>0;i--); } keyscan() //键盘扫描“keyscan”键盘扫描子程序,用于寻找是否有按键按下。 { P2=0xf0; //把oxfe赋值给P2口//将按键控制口置于未按键的状态.单片机输出//口假设不是按键按下状态. if(P2!=0xf0) //如果P2口的值不等于0xfe //检查是否有按键按下.如果有,处理{}内的事

C语言程序设计 入门源代码代码集合

#include void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "stdio.h" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "stdio.h" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c));

} int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5

c语言课程设计源代码

c语言课程设计源代码 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

学校运动会管理系统问题描述: (1) 初始化输入:N-参赛院系总数,M-男子竞赛项目数,W-女子竞赛项目数; (2) 各项目名次取法有如下几种: 取前5名:第1名得分 7,第2名得分 5,第3名得分3,第4名得分2,第5名得分 1; (3) 由程序提醒用户填写比赛结果,输入各项目获奖运动员的信息。 (4) 所有信息记录完毕后,用户可以查询各个院系或个人的比赛成绩,生成团体总分报表,查看参赛院系信息、获奖运动员、比赛项目信息等。 程序代码: #include<> #include<> #define N 3 #define M 3 #define W 3 char* n_number[3]={"1","院系2","院系3"}; char* m_number[3]={"1","男项2","男项3"}; char* w_number[3]={"女项1","女项2","女项3"}; int size=2; struct student { char num[10]; char name[20]; char xiangmu[20]; int score; char ximing[20]; }stu[100],temp; void input() um,&stu[i].name,&stu[i].xiangmu,&stu[i].score,&stu[i].ximing); iming,n_number[0])==0) iming); iming,n_number[h])==0) for(int s=0;s

C语言程序源代码_五子棋游戏

/* 五子棋 */ #include #include #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define SPACE 0x3920 #define BILI 20 #define JZ 4 #define JS 3 #define N 19 int box[N][N]; int step_x,step_y ; int key ; int flag=1 ; void draw_box(); void draw_cicle(int x,int y,int color); void change(); void judgewho(int x,int y); void judgekey(); int judgeresult(int x,int y); void attentoin(); void attention() { char ch ; window(1,1,80,25); textbackground(LIGHTBLUE); textcolor(YELLOW); clrscr(); gotoxy(15,2); printf("游戏操作规则:");

gotoxy(15,4); printf("Play Rules:"); gotoxy(15,6); printf("1、按左右上下方向键移动棋子"); gotoxy(15,8); printf("1. Press Left,Right,Up,Down Key to move Piece"); gotoxy(15,10); printf("2、按空格确定落棋子"); gotoxy(15,12); printf("2. Press Space to place the Piece"); gotoxy(15,14); printf("3、禁止在棋盘外按空格"); gotoxy(15,16); printf("3. DO NOT press Space outside of the chessboard"); gotoxy(15,18); printf("你是否接受上述的游戏规则(Y/N)"); gotoxy(15,20); printf("Do you accept the above Playing Rules? [Y/N]:"); while(1) { gotoxy(60,20); ch=getche(); if(ch=='Y'||ch=='y') break ; else if(ch=='N'||ch=='n') { window(1,1,80,25); textbackground(BLACK); textcolor(LIGHTGRAY); clrscr(); exit(0); } gotoxy(51,12); printf(" "); } } void draw_box() { int x1,x2,y1,y2 ; setbkcolor(LIGHTBLUE); setcolor(YELLOW); gotoxy(7,2); printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit."); for(x1=1,y1=1,y2=18;x1<=18;x1++)

相关主题
相关文档
最新文档