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;
}
数字排序
给定一个数组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]<<' ';
}