#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define N 1000
typedef struct TICKET
{
char num[10]
char hour[3]
char min[3]
char from[10]
char to[10]
float hours
int max
int now
}CLASS
int class_num=0
CLASS records[N]
int system_time()
void NewMessage()
void ShowTable1()
void ShowTable2(int i)
void Display()
void add()
void save()
void load()
void search()
void change()
void quit()
void Ticketorder()
void Ticketdelete()
int menu_select()
int whether(int)
void find(char s1[],char s2[])
void deletemessage()
int findnum(char s1[])
void get(int,int)
char *menu[]={"*****************欢迎使用车票管理系统*****************",
"\n*******************MENU功能菜单***********************",
"\n 1. 录入班次 ",
"\n 2. 显示所有班次 ",
"\n 3. 查询班次 ",
"\n 4. 增加班次 ",
"\n 5. 售票 ",
"\n 6. 退票 ",
"\n 7. 修改班次 ",
"\n 8. 删除班次 ",
"\n 9. 退出 "}
/**主函数**/
void main()
{
system("cls")
while(1)
{
switch(menu_select())
{
case 1: NewMessage()break
case 2: Display()break
case 3: search()break
case 4: add()break
case 5: Ticketorder()break
case 6: Ticketdelete()break
case 7: change()break
case 8: deletemessage()break
case 9: quit()break
}
}
}
/**菜单函数**/
int menu_select()
{
char s[5]
int c,i
system("cls")
for(i=0i<11i++)
{
printf("%s",menu[i]))
}
i=0
printf("\n")
printf("******************************************************")
printf("\n请选择(1-9):")
scanf("%s",s)
c=atoi(s)
while(i<0||i>9)
{
printf("\n")
printf("******************************************************")
printf("\n请选择(1-9):")
scanf("%s",s)
c=atoi(s)
}
return c
}
void NewMessage()
{
int i=0,j=5,h
char s[5]
FILE *fp
system("cls")
if((fp=fopen("d:number.dat","rb"))!=NULL)
{
printf("车票信息已经存在请选择增加功能!\n")
printf("任意输入则返回菜单\n")
scanf("%s",s)
i=1//通过是1
}
if(i==0)
{
system("cls")
printf("请输入要录入班次总数:\n")
scanf("%d",&class_num)
system("cls")
for(i=0i<class_numi++)
{
system("cls")
printf("请输入第%d个班次信息:\n",i+1)
h=-1
for(h!=i)
{
printf("请输入班次:")
scanf("%s",records[i].num)
for(h=0h<ih++)
if(strcmp(records[h].num,records[i].num)==0)
//判断字符串比较是否相等,, 待比较的字符串
{
printf("输入错误!该班次已存在!\n")
break
}
}
get(i,j)
j=5
}
save()
}
}
void Display() //显示所有函数
{
int i,j
system("cls")//刷屏
load() // 调用按班次查询函数
ShowTable1() //线框调用1,,,不用每次输
for(i=0,j=0i<class_numi++,j+=2)/////按班次顺序输出
{
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n")
if(whether(i))
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,
records[i].min, records[i].from,records[i].to,records[i].hours,
records[i].max,records[i].now)
else
printf("|%10s| 已发车 |%10s|%10s|%8.1f|%8d|%8d|",records[i].num,
records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now)
}
ShowTable2(j) //线框调用2
printf("\n按任意键继续....\n")
getch() /////从控制台读取一个字符,但不显示在屏幕上
}
/**打印表头**/
void ShowTable1()
{
int i=2
system("cls")
printf("**************************车票信息系统**********************************\n")
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n")
printf("\n| 班次 | 发车时间 | 起点站 | 终点站 |行车时间|额定载量| 已售票 |\n")
}
void ShowTable2(int i)
{
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n")
}
void search()
{
int i
char s1[10]={'\0'},s2[10]={'\0'}
system("cls")
printf("1. 按班次查询\n")
printf("2. 按终点站查询\n")
printf("3. 退出\n")
printf("请选择(1-3):\n")
scanf("%d",&i)
load()
switch(i)
{
case 1: printf("请输入要查询的班次:")
scanf("%s",s1)
find(s1,s2)
break
case 2: printf("请输入要查询终点站:")
scanf("%s",s2)
find(s1,s2)
break
case 3: break
default : printf("输入错误!\n")
break
}
printf("按任意键继续....\n")
getch()
}
void find(char s1[],char s2[])
{
int i,h=0,m
ShowTable1()
if(s2[0]=='\0')
m=1
else m=0
for(i=0i<class_numi++)
if(strcmp(s1,records[i].num)==0||strcmp(s2,records[i].to)==0)
{
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n")
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,records[i].min,
records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now)
h+=1
if(m==1)
break
}
ShowTable2(h)
if(h==0)
printf("要查找的班次不存在!\n")
}
/**增加函数**/
void add()
{
int i,j=5
load()
system("cls")
printf("1. 增加班次")
printf("2. 返回\n")
printf("请选择(1-2)\n")
scanf("%d",&i)
if(i==1)
{
system("cls")//刷屏
printf("1. 请输入要增加的班次:")
scanf("%s",records[class_num].num)
for(i=0i<class_numi++)
if(strcmp(records[class_num].num,records[i].num)==0)
//判断字符串比较是否相等,待比较的字符串,判断车次没重复
{
printf("输入错误!\n")
getch() /////从控制台读取一个字符,但不显示在屏幕上
break
}
if(i==class_num)
{
get(i,j) ////修改及增加班次*
class_num++ ///使班次数加1
save() //调用保存函数
}
}
}
/**售票函数**/
void Ticketorder()//*售票函数
{
int i
char num[10]
system("cls")//刷屏
printf("1. 售票\n")
printf("2. 返回\n")
printf("请选择(1-2):\n")
scanf("%d",&i)
if(i==1)
{
load() // 加载函数
search() //查找函数
printf("请输入要订票的班次(若无请输入0):")
scanf("%s",num)
for(i=0i<class_numi++)
if(strcmp(num,records[i].num)==0)//判断字符串比较是否相等,, 待比较的字符串
if(records[i].max>records[i].now&&whether(i)==1)
//判断时间是否超出函数并且没超出最大客量
{
records[i].now++ ///使已售票加1
printf("通向%s班次为%s的票订票成功!\n",records[i].to,records[i].num)
save()//调用保存函数
getch() /////从控制台读取一个字符,但不显示在屏幕上
break
}
else
{
printf("该班次已满或已发出!\n")
getch() /////从控制台读取一个字符,但不显示在屏幕上
}
}
}
/**退票函数**/
void Ticketdelete() //删除函数*
{
int i
char num[10]
system("cls")//刷屏
printf("1. 退票\n")
printf("2. 返回\n")
printf("请选择(1-2)\n:")
scanf("%d",&i)
if(i==1)
{
system("cls")//刷屏
load() // 调用按班次查询函数
printf("请输入要退票的班次:\n")
scanf("%s",num)
i=findnum(num) //调用班次查询函数
if(strcmp(num,records[i].num)==0) //判断字符串比较是否相等 待比较的字符串
if(whether(i)) //判断时间是否超出函数***
{
printf("确定(Y/N)?")
scanf("%s",num)
if(num[0]=='y'||num[0]=='Y')
{
records[i].now-- //使已售票减1
printf("退票成功!\n")
save()//调用保存函数
getch() //从控制台读取一个字符,但不显示在屏幕上
}
}
else
{
printf("该班车已发出,无法退票!\n")
getch() /////从控制台读取一个字符,但不显示在屏幕上
}
if(i==class_num)
{ printf("输入错误!\n")
getch() /////从控制台读取一个字符,但不显示在屏幕上
}
}
}
字数超了。。。。
唉,虽然没分,还是告诉你吧。当TICKETS=1时,线程1可能执行到了if(tickets>0)时时间片到期,然后是线程2,线程2执行到if(tickets>0)时时间片到期,然后线程3执行到if(tickets>0)时时间片到期.....
最后一个线程到期后从线程1开始向下执行,
System.out.println(Thread.currentThread().getName()+"sell tickets:"+tickets)
tickets--
然后线程2执行
System.out.println(Thread.currentThread().getName()+"sell tickets:"+tickets)
tickets--
然后线程3
System.out.println(Thread.currentThread().getName()+"sell tickets:"+tickets)
tickets--
而所有的线程都是用TICKETS这一个变量,自然就会出现错误的结果。
这个结果的出现可以模拟。
在synchronized(str) 里加一句 if(ticket >0) //判断是否有余票,没有余票还卖什么?也就是这样:
package socket
public class Test
{
public static void main(String [] args)
{
TestThread tt=new TestThread()
new Thread(tt).start()
new Thread(tt).start()
new Thread(tt).start()
new Thread(tt).start()
}
}
class TestThread implements Runnable
{
int ticket=10
String str=" "
public void run()
{
while(ticket>0)
{
synchronized(str)
{
if(ticket >0 ) {
System.out.println(Thread.currentThread().getName()+":ticket "+ticket+" is saling")
ticket--
}
}
}
}
}
你的while循环只是超出票数的循环,在同步里面还要有判断是否有票的条件.因为里面同步的时候除了一个线程在执行外,其它几个都在等待,而此时并没有跳出循环,当然会出现负数了.
当然把while判断放到同步代码里面去也可以.不过这样就没有超出票数的判断了,实际应用中应该有个超出票数的判断.. 例如 :for(int i=0i<100i++)//同步检测 只有5张票,显示100张,实际上卖出的还是5张..用来检测同步是否正确...
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)