用C语言编程模拟交通路口(十字路口)红绿灯的控制功能
本系统的设计首先必须了解交通路灯的亮灭规律。设有一个十字路口,1、3为南,北
方向,2、4为东,西方向,初始态为4个路口的红灯全亮。之后,1、3路口的绿灯亮,
2、4路口的红灯亮,1、3路口方向通车。延迟一段时间后,1、3路口的绿灯熄灭,而1、
3路口的黄灯开始闪烁。闪烁若干次后,1、3路口的红灯亮,同时2、4路口的绿灯亮,2、
4路口方向开始通车。延迟一段时间后,2、4路口的绿灯熄灭,而黄灯开始闪烁。闪烁若
干次后,再切换到1、3路口方向。之后,重复上述过程。对于各组灯的亮灭,我们运用的
是8255A的输入输出功能。
编程高手帮个忙,数据结构大作业. 交通咨询模拟 要求:建立一个模拟的交通网络(用有向网来表示)
/*在TC2和VC6下都可以顺利运行。
做了一个下午。一定要用我这个噢。
#include/*库文件包含*/
#include/*用于字符串操作*/
#include/*用于exit函数*/
/**************************************************************************
intcheck(char*c)
输入参数:
char*c:输入的字符串
返回参数:
0:字符串中有不符合规定的字符
1:字符串字符符合规定,没有不符合规定的字符.
检查字符串中有否除了0-9,+,-,*,/,(,),之外的其他字符,
如果有,则返回0,表示出现错误。
若没有,则返回1,表式字符串符合规定。
**************************************************************************/
intcheck(char*c)
intk=0;
while(*c!=\0)
if((*c>=0&&*c<=9)||*c==+||
*c==-||*c==*||*c==/||
*c==.||*c==(||*c==))
printf("inputerror,therehavethecharnotthemathexpressionchar!\n");
return0;
if(*c==()
elseif(*c==))
if(k!=0)
printf("inputerror,thereisnothavecorrectbracket()!\n");
return0;
return1;
/**************************************************************************
voidmove(char*f,double*s,intp)
输入参数:
char*f:运算符数组
double*s:数值数组
intp:当前运算符数组位置。
返回参数:
将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算。
传入值p若为3
则当前符号的数组位置为3.
f[3]=f[3+1].......f[len-2]=f[len-1]f[len-1]=\0;
s[i]=s[i+1].......s[len-1]=s[len]因为数值比运算符多一个。
***************************************************************************/
voidmove(char*f,double*s,intp)
inti=0,len=strlen(f);
for(i=p;i
{/*即把乘和除号的位置用后面的加和减号填充*/
f[i]=f[i+1];
s[i]=s[i+1];
s[i]=s[i+1];
f[len-1]=\0;
/**************************************************************************
doubleconvnum(char*c)
输入参数:
char*c:由数字和小数点组成的字符,用以转换成double型的数值。
返回参数:
num:返回转换好的值。
将输入的字符串先将其小数点以前的部分复制到temp[]数组中,
若有小数点,则将小数点之后的数值,也就是小数部分先进行计算,值存入num中
计算完成后,再对整数部分进行计算,值加上小数部分的值,存入num中。
***************************************************************************/
doubleconvnum(char*c)
doublenum=0.0;
doublea=1.0;
inti=0,p=0,len=0;
chartemp[100];
inttempi=0;
intstart=0;
intf=1;/*正负符号指示器,若为1则为正数,为-1,此数为负数*/
len=strlen?;
if(c[0]==-)
start=1;
f=-1;
for(i=start;i
if(c[i]==.)
break;
temp[tempi++]=c[i];/*将整数部分复制到temp[]中*/
temp[tempi]=\0;
if(p!=0)
for(i=p+1;i
if(c[i]==.)/*如果有多余的小数点,则表示输入错误*/
printf("thereismorethatonedot.innumber!error!\n");
exit(0);
a=a*0.1;
num+=(a*(c[i]-48));
a=1.0;
len=strlen(temp);/*计算整数部分*/
for(i=len-1;i>=0;i--)
num=num+(a*(temp[i]-48));
a*=10;
num=num*f;
returnnum;
/**************************************************************************
doublegood(char*c)
输入参数:
char*c:即将进行运算的字符串型数学表达式。如3.5+(2*3/5)
返回参数:
s[0]:计算结果将放入s[0]中
将输入的字符串中的数字分别调用convnum(char*c)函数进行数值变换,再将其依
次存入doulbes[i]中,将加减乘除运算符依次存入字符串符号数组charf[i]中,
然后如果遇到括号,则将括号内的字符串存入另一字符数组中,然后用此
good(char*c)递归函数进行递归运算。然后根据先乘除,后加减的顺序对已
存入数组的数值根据存入字符串符号数组的运算符进行运算。结果存入s[0]中。
返回最终结果。
***************************************************************************/
doublegood(char*c)/*可递归函数*/
{/*取得数值字符串,并调用convnum转换成double*/
charg[100],number[30];/*g,保存当前的表达式串,number保存一个数的所有字符*/
charf[80];/*保存所有的符号的堆栈*/
intfi=0;/*保存符号的位置指针*/
doubles[80];/*保存当前所有的数的一个堆栈*/
intsi=0;/*保存数字位置指针*/
intk=0;/*若k=1则表示有一对括号*/
intnum=0,i=0;/*num保存新括号内的字符数,i保存number里的字符位置*/
intcc=0;/*乘除符号数量*/
intjj=0;/*加减符号数量*/
while(*c!=\0)/*当p==1和k==0时,表示已经把括号里的内容全部复制到g[100]中了*/
num=0;
switch(*c)
case+:/*当前字符为+-乘除时则表示*/
case-:
case*:
case/:
f[fi++]=*c;
if(*c==*||*c==/)
cc++;
jj++;
if(*(c-1)!=))
number[i]=\0;
i=0;/*完成一个数字的复制,其位置指针i=0*/
s[si++]=convnum(number);
break;
case(:/*有括号,则将当前括号作用范围内的全部字符保存,作为*/
k++;/*一个新的字符表达式进行递归调用good函数计算。*/
while(k>0)
g[num]=*c;
num++;
if(*c==))
elseif(*c==()
g[num-1]=\0;
num=0;/*完成一个括号内容的复制,其位置指针num=0*/
s[si++]=good(g);
break;
default:
number[i++]=*c;
if(*(c+1)==\0)
{number[i]=\0;
s[si++]=convnum(number);
break;
f[fi]=\0;
while(cc>0)
switch(f[i])
case*:cc--;
s[i+1]=s[i]*s[i+1];
move(f,s,i);
break;
case/:cc--;
s[i+1]=s[i]/(float)s[i+1];
move(f,s,i);
break;
default:
break;
while(jj>0)
switch(f[i])
case+:s[i+1]=s[i]+s[i+1];
jj--;
move(f,s,i);
break;
case-:s[i+1]=s[i]-s[i+1];
jj--;
move(f,s,i);
break;
default:
printf("operatorerror!");
break;
returns[0];
voidmain()
charstr[100];
doublesum=0;
intp=1;
while(1)
printf("enterexpression:enterexitendofprogram\n");
scanf("%s",str);
p=strcmp(str,"exit");
if(p==0)
break;
p=check(str);
if(p==0)
continue;
sum=good(str);
printf("%s=%f",str,sum);
printf("\n");
printf("goodbye!\n");
enterexpression:enterexitendofprogram
3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6(输入)
3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6=384.266667
enterexpression:enterexitendofprogram
china(输入)
inputerror,therehavethecharnotthemathexpressionchar!
enterexpression:enterexitendofprogram
exit(输入)
goodbye!
抱歉,你可能没有看我清的问题啊,你写的程序完全答非所问啊