代码很长(是操作系统关于模拟先来先服务算法的),所以我事先说一下问题的所在看一下图片
等下请各位大神看下gets()函数,第一次循环能用,第二次就不行了。。。代码中就有一个...这个问题是在让我无语了很久,DEBUG也没有找出头绪
#include<stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<string.h>
struct fcfs_member
{
char Process_name[10]; //进程名
int Arrival_time; //到达时间
int Service_time; //服务时间
int Start_time; //开始执行时间
int Completion_time; //完成时间
int Turnaround_time; //周转时间
float Weighted_turnover_time; //带权周转时间
};
void main()
{
int system(const char *string); //声明清屏函数
struct fcfs_member FCFS_member[4];
printf("下面为一个实例,如果仅测试程序,可按下面数据进行输入\n");
printf("进程名 到达时间 服务时间 开始执行时间 完成时间\n");
printf(" A 0 1 0 1\n");
printf(" B 1 100 1 1\n");
printf(" C 2 1 101 102\n");
printf(" D 3 100 102 202\n\n");
printf("请输入四组数据!连续输入对应数据以空格分隔\n\n");
//------------------------导入数据,并进行排序-----------------------------
int i, j;
for(i=0; i<4; i++)
{
printf("第%d组\n", i+1);
printf("进程名:");
gets(FCFS_member[i].Process_name);
printf("\n到达时间 服务时间 开始执行时间 完成时间\n");
scanf("%d %d %d %d", &FCFS_member[i].Arrival_time,
&FCFS_member[i].Service_time,
&FCFS_member[i].Start_time,
&FCFS_member[i].Completion_time);
//计算周转时间和带权周转时间
FCFS_member[i].Turnaround_time = FCFS_member[i].Completion_time - FCFS_member[i].Arrival_time;
FCFS_member[i].Weighted_turnover_time = (float)FCFS_member[i].Turnaround_time / (float)FCFS_member[i].Service_time;
}
int flag = 1; //标记排序,避免多次循环判断,提高效率
for(i=0; i<3 && flag == 1; i++)
{
flag = 0;
for(j=0; j<4-i; j++)
{
if(FCFS_member[j].Arrival_time > FCFS_member[j+1].Arrival_time)
{
char temp_string[10];
//交换进程名
strcpy(temp_string, FCFS_member[j].Process_name);
strcpy(FCFS_member[j].Process_name,
FCFS_member[j+1].Process_name);
strcpy(FCFS_member[j+1].Process_name, temp_string);
//交换到达时间
FCFS_member[j].Arrival_time = FCFS_member[j].Arrival_time ^ FCFS_member[j+1].Arrival_time;
FCFS_member[j+1].Arrival_time = FCFS_member[j+1].Arrival_time ^ FCFS_member[j].Arrival_time;
FCFS_member[j].Arrival_time = FCFS_member[j].Arrival_time ^ FCFS_member[j+1].Arrival_time;
//交换服务时间
FCFS_member[j].Service_time = FCFS_member[j].Service_time ^ FCFS_member[j+1].Service_time;
FCFS_member[j+1].Service_time = FCFS_member[j+1].Service_time ^ FCFS_member[j].Service_time;
FCFS_member[j].Service_time = FCFS_member[j].Service_time ^ FCFS_member[j+1].Service_time;
//交换开始执行时间
FCFS_member[j].Start_time = FCFS_member[j].Start_time ^ FCFS_member[j+1].Start_time;
FCFS_member[j+1].Start_time = FCFS_member[j+1].Start_time ^ FCFS_member[j].Start_time;
FCFS_member[j].Start_time = FCFS_member[j].Start_time ^ FCFS_member[j+1].Start_time;
//交换完成时间
FCFS_member[j].Completion_time = FCFS_member[j].Completion_time ^ FCFS_member[j+1].Completion_time;
FCFS_member[j+1].Completion_time = FCFS_member[j+1].Completion_time ^ FCFS_member[j].Completion_time;
FCFS_member[j].Completion_time = FCFS_member[j].Completion_time ^ FCFS_member[j+1].Completion_time;
//交换周转时间
FCFS_member[j].Turnaround_time = FCFS_member[j].Turnaround_time ^ FCFS_member[j+1].Turnaround_time;
FCFS_member[j+1].Turnaround_time = FCFS_member[j+1].Turnaround_time ^ FCFS_member[j].Turnaround_time;
FCFS_member[j].Turnaround_time = FCFS_member[j].Turnaround_time ^ FCFS_member[j+1].Turnaround_time;
//交换带权周转时间
float temp;
temp = FCFS_member[j].Weighted_turnover_time;
FCFS_member[j].Weighted_turnover_time = FCFS_member[j+1].Weighted_turnover_time;
FCFS_member[j+1].Weighted_turnover_time = temp;
}
}
}
//----------------执行阶段---------------------------------
printf("进程名 到达时间 服务时间 开始执行时间 完成时间 周转时间 带权周转时间\n");
for(i=0; i<4; i++)
{
for(j=0; j<FCFS_member[i].Service_time; j++)
{
printf("%10s %5d %5d", FCFS_member[i].Process_name,
FCFS_member[i].Arrival_time,
j);
Sleep(500); //延迟计数时间
printf("%5d %5d %5d %5.3f\n", FCFS_member[i].Start_time,
FCFS_member[i].Completion_time,
FCFS_member[i].Turnaround_time,
FCFS_member[i].Weighted_turnover_time);
Sleep(500); //延迟计数时间
system("cls"); //清屏
}
}
}