您的位置:首页 > 其它

华为机试题--任务调度问题

2014-08-02 17:13 281 查看
题目地址:http://www.cnblogs.com/Trony/archive/2012/10/01/2709959.html 华为机试题目

操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越 高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。

例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}

函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])

#include<iostream>
using namespace std;

void scheduler(int task[],int n,int system_task[],int user_task[])
{
	int k=0,q=0;
	int s1=0,s2=0;
	for(int i=0;i<n;i++)//此循环将数据分别送入 system_task数组和user_task数组,但是没有对数据的优先级进行排序
	{
		if(task[i]>255)
		{
			continue;
		}
		else if(task[i]<50)
		{
			system_task[k++]=i;
			s1=k;
		}
		else if(task[i]>=50&&task[i]<=255)
		{
			user_task[q++]=i;
			s2=q;
		}
	}

	system_task[s1]=-1;//将数据分别送入 system_task数组和user_task数组后,按照题目往后面加入'-1'
	system_task[s1+1]=0;
	user_task[s2]=-1;
	user_task[s2+1]=0;

	for(int i=0;i<s1-1;i++)//对system_task数组进行排序,
		for(int j=i+1;j<s1;j++)
		{
			int t;
			if(task[system_task[i]]>task[system_task[j]])//注意:system_task数组存放的就是task数组的下标,可以直接读取下标.
			{
				t=system_task[j];               //比较的是task值的大小,移动的是下标,
				system_task[j]=system_task[i];//将task值小的,下标往前移动,
				system_task[i]=t;
			}
		}
     
    for(int i=0;i<s2-1;i++)//相似原理
		for(int j=i+1;j<s2;j++)
		{
			int t;
			if(task[user_task[i]]>task[user_task[j]])
			{
				t=user_task[j];
				user_task[j]=user_task[i];
				user_task[i]=t;
			}
		}

}
int main()
{
	int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
	
	int n=sizeof(task)/sizeof(task[0]);
	
	int system_task[10]; 
	int user_task[10];

	scheduler(task,n,system_task,user_task);

	int i=0,j=0;

	cout<<"系统任务:";
	do
	{
		cout<<system_task[i]<<" ";
		i++;
	}while(*(system_task+i)!=0);
	cout<<endl;

	cout<<"用户任务:";
    do
	{
		cout<<user_task[j]<<" ";
		j++;
	}while(*(user_task+j)!=0);
	cout<<endl;

	system("pause");
	return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: