C/C++程序题(11-15)

11.

选秀节目打分

选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。

 函数接口   int cal_score(int score[], intjudge_type[], int n)

#include <iostream>
using namespace std;
int cal_score(int *score,int *judge_type,int n)
{
	int score1=0,score2=0,num=0,result;
	for(int i=0;i<n;i++)
	{
		if(judge_type[i]==1)
			score1+=score[i];
		else
		{
			score2+=score[i];
			num++;
		}
	}
	if(num==0)
		result=score1/n;
	else
		result=score1/(n-num)*0.6+score2/num*0.4;
	return result;
}
void main()
{
	int n;
	cin>>n;
	int *score=new int[n];
	int *judge_type=new int[n];
	for(int i=0;i<n;i++)
		cin>>score[i];
	for(int i=0;i<n;i++)
		cin>>judge_type[i];
	int result=cal_score(score,judge_type,n);
	cout<<result<<endl;
}




12.

数字排序

给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

 例如:input[] = {3, 6, 1, 9, 7}  output[] = {3, 7, 9, 6, 1}; 

 input[] = {3, 6, 1, 9, 7, 8}   output[] = {1, 6, 8, 9, 7, 3}

#include <iostream>
using namespace std;
void reorde(int *input,int *output,int n)
{
	int temp;
	for(int i=0;i<n;i++)//将input[]从大到小排序
	{
		for(int j=1;i+j<n;j++)
		{
			if(input[i]<input[i+j])
			{
				temp=input[i];
				input[i]=input[i+j];
				input[i+j]=temp;
			}
		}
	}
	int k=n/2;
	int m;
	if(k!=0) 
		m=k;
	else 
		m=k+1;
	if(k!=0)
	output[k]=input[0];
	for(int i=1,a=1;i<=m;i++)//这个循环很关键!
	{
		output[k-i]=input[a++];
		output[k+i]=input[a++];
	}
	
}

void main()
{
	int n;
	cin>>n;
	int *input=new int[n];
	int *output=new int[n];
	for(int i=0;i<n;i++)
		cin>>input[i];
	reorde(input,output,n);
	for(int i=0;i<n;i++)
		cout<<output[i]<<' ';
	delete []input;
	delete []output;
}
注:巧点在于一左一右为一循环。

#include <iostream>
using namespace std;

void fun(int n,int input[],int output[])
{
	for(int i=0;i<n-1;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(input[i]<input[j])
			{
				int temp=input[i];
				input[i]=input[j];
				input[j]=temp;
			}
		}
	}
	if(n%2==0)
	{
		int k=0;
		for(int i=0;i<n/2;i++)
		{
			output[n/2-1-i]=input[k++];
			output[n/2+i]=input[k++];
		}
	}
	if(n%2==1)
	{
		int k=1;
		output[n/2]=input[0];
		for(int i=1;i<=n/2;i++)
		{
			output[n/2-i]=input[k++];
			output[n/2+i]=input[k++];
		}
	}
}

void main()
{
	int n;
	cin>>n;
	int *input=new int[n];
	int *output=new int[n];
	for(int i=0;i<n;i++)
		cin>>input[i];
	fun(n,input,output);
	for(int i=0;i<n;i++)
		cout<<output[i]<<endl;
	
}




13.

操作系统任务调度问题。

操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 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 l=0,k=0,m;
	for(int i=0;i<n;i++)
	{
		if(task[i]<50)
		{
			system_task[l]=i;
			l++;
		}
		if(task[i]<=255&&task[i]>=50)
		{
			user_task[k]=i;
			k++;
		}
	}
	for(int i=0;i<l;i++)
	{
		for(int j=1;i+j<l;j++)
			if(task[system_task[i]]>task[system_task[i+j]])
			{
				m=system_task[i];
				system_task[i]=system_task[i+j];
				system_task[i+j]=m;
			}
	}

	for(int i=0;i<k;i++)
	{
		for(int j=1;i+j<k;j++)
			if(task[user_task[i]]>task[user_task[i+j]])//
			{                      //根据数组值所对应的相应指来来作为大小判断标准
				m=user_task[i];
				user_task[i]=user_task[i+j];
				user_task[i+j]=m;
			}
	}
	system_task[l]=-1;
	user_task[k]=-1;
}

void main()
{
	int n;
	cin>>n;
	int *task=new int[n];
	for(int i=0;i<n;i++)
		cin>>task[i];
	int *system_task=new int[n+1];
	int *user_task=new int[n+1];
	scheduler(task,n,system_task,user_task);
	int i=0,j=0;
	while(1)
	{
		cout<<system_task[i]<<' ';
		if(system_task[i]==-1) break;
		i++;
	}
	cout<<endl;
	while(1)
	{
		cout<<user_task[j]<<' ';
		if(user_task[j]==-1) break;
		j++;
	}
	delete []task;
	delete []system_task;
	delete []user_task;
}

注:关键点:数组大小的排序,根据间接性的大小判断标准来对数组元素进行相应排序。




14.

字符串替换

描述:编写一个字符串替换函数,如strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。

举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了:

ABCDEFGHIJKLMNOPQgggUVWXYZ  (如果用c语言呢?)

#include <iostream>
#include <string>
using namespace std;
void main()
{
	string strSrc,strFind,strReplace;
	cin>>strSrc>>strFind>>strReplace;
	int s=strFind.size();
	int n=strSrc.find(strFind);
	do{
		strSrc.erase(n,s);
	    strSrc.insert(n,strReplace);
		n=strSrc.find(strFind);
	}while(n>0);
	cout<<strSrc<<endl;
}
注:find()(4题)函数原型 size_t find (const string& str, size_t pos = 0);

string类的删除函数 erase()
iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置
iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置
string &erase(int pos = 0, int n = npos);//删除pos开始的n个字符,返回修改后的字符串

插入函数insert()函数的原型:

string &insert(int p0, const char *s);

string &insert(int p0, const char *s, int n);
string &insert(int p0,const string &s);
string &insert(int p0,const string &s, int pos, int n);
//在p0位置插入字符串s中pos开始的前n个字符

也可用replace()=erase()+insert()

//仅限于替换与被替换的字符串的长度一致的时候
#include<iostream>
#include<cstring>
using namespace std;

void replace(char *strSrc,char* strFind,char* strReplace)
{
	int m=strlen(strSrc);
	int n=strlen(strFind);
	char temp[20];
	for(int i=0;i<m;i++)
	{
		if(strSrc[i]==strFind[0])
		{
			strncpy(temp,&strSrc[i],n);
			if(strcmp(temp,strFind))//相等strcmp()返回0
			{
				for(int j=0;j<n;j++)
					strSrc[i++]=strReplace[j];
			}
		}
	}
	
}

void main()
{
	char strSrc[100],strFind[100],strReplace[100];
	cin.getline(strSrc,100);
	cin.getline(strFind,100);
	cin.getline(strReplace,100);
	replace(strSrc,strFind,strReplace);
	cout<<strSrc<<endl;
}




15.

数组排序

对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出数组第一位放奇数 若奇数和偶数不等长,则把剩下的直接放到数组中。

#include <iostream>
using namespace std;
void main()
{
	int n,p=0,q=0,temp;
	cin>>n;
	int *number=new int[n];
	int *out=new int[n];
	int *even=new int[n];
	int *odd=new int[n];
	for(int i=0;i<n;i++)
		cin>>number[i];
	for(int i=0;i<n;i++)
	{
		if(number[i]%2==0)
		{
			even[p]=number[i];
			p++;
		}
		else
		{
			odd[q]=number[i];
			q++;
		}
	}
	for(int i=0;i<p;i++)
	{
		for(int j=1;i+j<p;j++)
		{
			if(even[i]<even[i+j])
			{
				temp=even[i];
				even[i]=even[i+j];
				even[i+j]=temp;
			}
		}
	}
	for(int i=0;i<q;i++)
	{
		for(int j=1;i+j<q;j++)
		{
			if(odd[i]>odd[i+j])
			{
				temp=odd[i];
				odd[i]=odd[i+j];
				odd[i+j]=temp;
			}
		}
	}
	int k=0;
	for(int j=0;(j<p)&&(j<q);j++)
	{
		out[k++]=odd[j];
		out[k++]=even[j];
	}
	if(p>q)
	{
		for(int i=0;i<p-q;i++)
		{
			out[k+i]=even[q+i];
		}
	}
	if(p<q)
	{
		for(int i=0;i<q-p;i++)
		{
			out[k+i]=odd[p+i];
		}
	}
	for(int i=0;i<n;i++)
     	cout<<out[i]<<' ';
	delete []number;
	delete []out;
	delete []even;
	delete []odd;
}
注:分别存储偶数数字和奇数数字,并分别排序,再按说明赋值到out数组。


#include<iostream>
using namespace std;

void fun(int num[],int n,int out[])
{
	int k=0,l=0;
	int* even=new int[n];
	int* odd=new int[n];
	for(int i=0;i<n;i++)//奇偶分组
	{
		if(num[i]%2==0)
			even[k++]=num[i];
		else 
			odd[l++]=num[i];
	}

	for(int i=0;i<k-1;i++)//偶排序
	{
		for(int j=i+1;j<k;j++)
		{
			if(even[i]<even[j])
			{
				int temp=even[i];
				even[i]=even[j];
				even[j]=temp;
			}
		}
	}
	for(int i=0;i<l-1;i++)//奇排序
	{
		for(int j=i+1;j<l;j++)
		{
			if(odd[i]>odd[j])
			{
				int temp=odd[i];
				odd[i]=odd[j];
				odd[j]=temp;
			}
		}
	}

	int k1=0,l1=0,p=0;
	while(k!=k1||l!=l1)//穿插
	{
		if(l1!=l)
			out[p++]=odd[l1++];
		if(k1!=k)
			out[p++]=even[k1++];
	
	}
	delete []even;
	delete []odd;
	
}

void main()
{
	int n;
	cin>>n;
	int* num=new int[n];
	int* out=new int[n];
	for(int i=0;i<n;i++)
		cin>>num[i];
	fun(num,n,out);
	for(int i=0;i<n;i++)
		cout<<out[i]<<' ';
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值