字符串替换&任务调度

题目1:编写一个字符串替换函数,函数名为StrReplace(char *strSrc,char *strFind,char *strReplace),strSrc为源字符串,strFind是待替换的字符串,strReplace为替换字符串。

例如:把“zhuzhiwen”中的“hu”替换为"guwenbing"。

#include <iostream>
#include <string.h>
using namespace std;

char *StrReplace(char *strSrc,char *strFind,char *strReplace)
{
    char *p=strSrc;
    int lensrc=strlen(strSrc);
    int lenfind=strlen(strFind);
    int lenrep=strlen(strReplace);
    int flag=0;
    char *nstr=new char[lensrc+lenrep+1];
    while(*p!='\0')
    {
        if(!strncmp(p,strFind,lenfind)) //在strSrc中找到相匹配的字符串
        {
            //char *nstr=new char[lensrc+lenrep+1];
            strncpy(nstr,strSrc,flag);
            strncpy(nstr+flag,strReplace,lenrep);
            strncpy(nstr+flag+lenrep,strSrc+flag+1,lensrc-flag-1);
            nstr[lensrc+lenrep-lenfind+1]='\0';
            break;
        }
        else
        {
            p++;
            flag++;
        }
    }
    delete []strSrc;
    strSrc=nstr;        //退出函数,则strSrc指向的仍为"zhuzhiwen",内存空间释放!!!!
    return strSrc;

}

int main()
{
    char *scr="zhuzhiwen";
    char *find="hu";
    char *rep="guwenbing";
    cout<<StrReplace(scr,find,rep);

    return 0;
}

总结:使用strncpy()函数中,不会将‘\0'一起拷贝到源字符串中,所以需要在最后加上'\0'


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

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

#include <iostream>

using namespace std;

int cal_score(int score[],int judge_type[],int n)
{
    float sc1=0,sc2=0;      //专家总分,大众总分
    float asc1=0,asc2=0;    //平均分
    int num1=0,num2=0;      //专家人数,大众人数
    int sum=0;
    for(int i=0;i<n;i++)
    {
        if(1==judge_type[i])
        {
            sc1+=score[i];
            num1++;
        }
        else if(2==judge_type[i])
        {
            sc2+=score[i];
            num2++;
        }
    }
    asc1=sc1/num1;
    if(num2)
    {
        asc2=sc2/num2;
        sum=asc1*0.6+asc2*0.4;
    }
    else
    {
        sum=asc1;
    }
    return sum;
}

int main()
{
    const int n=10;
    int score[n]={80,85,90,80,75,95,75,80,90,95};
    int judge_type[n]={1,2,1,1,2,2,1,1,2,1};
    cout<<cal_score(score,judge_type,n);
    return 0;
}



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

#include <iostream>

using namespace std;

void func(int input[],int output[],int n)
{
    int ma,temp,mid;
    int arr[n];
    for(int i=0;i<n;i++)
    {
        arr[i]=input[i];
        cout<<arr[i]<<' ';
    }
    cout<<endl;

    for(int i=0;i<n;i++)
    {
        ma=i;
        for(int j=i+1;j<n;j++)
        {
            if(arr[j]>arr[ma])
                ma=j;
        }
        temp=arr[ma];
        arr[ma]=arr[i];
        arr[i]=temp;
        //cout<<arr[i]<<' ';
    }
    if(n%2) //n是奇数
    {
        mid=n/2;
    }
    else    //n是偶数
    {
        mid=n/2;
    }
    output[mid]=arr[0];
    for(int i=mid-1,j=mid+1,k=0;k<n;i--,j++)
    {
        output[i]=arr[++k];
        output[j]=arr[++k];
    }
}

int main()
{
    const int n=6;
    int input[n]={0,1,2,3,4,5};
    int output[n];
    func(input,output,n);
    for(int i=0;i<n;i++)
        cout<<output[i]<<' ';
    return 0;
}

题目4:操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 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 coutsys=0,coutusr=0;
    int msys,musr,temp;
    for(int i=0;i<n;i++)
    {
        if(0<=task[i]&&task[i]<50)
        {
            system_task[coutsys++]=i;
        }
        else if(50<=task[i]&&task[i]<=255)
        {
            user_task[coutusr++]=i;
        }
        else
            cout<<"出现非法任务"<<task[i]<<endl;
    }
    //coutsys-=1; //系统任务个数
    //coutusr-=1; //用户任务个数
    for(int i=0;i<coutsys;i++)
    {
        msys=i;
        for(int j=i+1;j<coutsys;j++)
        {
            if(task[system_task[j]]<task[system_task[msys]])
                msys=j;
        }
        temp=system_task[i];
        system_task[i]=system_task[msys];
        system_task[msys]=temp;
    }
    system_task[coutsys]=-1;
    for(int i=0;i<coutusr;i++)
    {
        musr=i;
        for(int j=i+1;j<coutusr;j++)
        {
            if(task[user_task[j]]<task[user_task[musr]])
                musr=j;
        }
        temp=user_task[i];
        user_task[i]=user_task[musr];
        user_task[musr]=temp;
    }
    user_task[coutusr]=-1;

}
int main()
{
    const int n=9;
    int task[n]={0,30,155,1,80,300,170,40,99};
    int system_task[n];
    int user_task[n];
    scheduler(task,n,system_task,user_task);
    int i=0,j=0;
    while(system_task[i]!=-1)
        cout<<system_task[i++]<<' ';
    cout<<endl;
    while(user_task[j]!=-1)
        cout<<user_task[j++]<<' ';
    cout<<endl;
    return 0;
}


【欢迎读者交流批评指正~】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值