1、选秀节目打分,分为专家评委和大众评委,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<stdio.h>
#include<string.h>
#include<iostream.h>
#include<conio.h>
#defineN 5
intcal_score(int score[], int judge_type[], int n)
{
int expert=0;
int dazhong=0;
int zongfen=0;
int i;
int number=0;
for(i=0;i<N;i++)
{
if(judge_type[i]==1)
{
expert=expert+score[i];
number++;
}
else dazhong=dazhong+score[i];
}
if(number==N)
{
zongfen=(int)(expert/N);
}
else
{
expert=(int)(expert/number);
dazhong=(int)(dazhong/(N-number));
zongfen=int(0.6*expert+0.4*dazhong);
}
return zongfen;
}
intmain()
{
int score[N];
int judge_type[N];
int numberlast=0;
int i;
printf("please input the %dscore:\n",N);
for(i=0;i<N;i++)
scanf("%d",&score[i]);
printf("please input thelevel(1:expert,2:dazhong)\n");
for(i=0;i<N;i++)
scanf("%d",&judge_type[i]);
numberlast=cal_score(score,judge_type,N);
printf("the last score is%d\n",numberlast);
return 0;
}
2、给定一个数组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}
函数接口 void sort(int input[[, int n, int output[])
#include<stdio.h>
#include<string.h>
#include<conio.h>
void sort(intinput[], int n, int output[])
{
int i,j;
int k=1;
int temp;
int med;
for(i=0;i<n;i++)
for(j=0;j<n-i;j++)
if(input[j]>input[j+1])
{temp=input[j];input[j]=input[j+1];input[j+1]=temp;}
if(n%2!=0)
{
for(i=0;i<n;i++)
printf("%2d",input[i]);
printf("\n");
med=(n-1)/2;
output[med]=input[n-1];
for(i=1;i<=med;i++)
{
output[med-i]=input[n-1-k];
output[med+i]=input[n-2-k];
k=k+2;
}
}
else
{
for(i=0;i<n;i++)
printf("%2d",input[i]);
printf("\n");
med=n/2;
output[med]=input[n-1];
for(i=1;i<=med-1;i++)
{
output[med-i]=input[n-1-k];
output[med+i]=input[n-2-k];
k=k+2;
}
output[0]=input[0];
}
for(i=0;i<n;i++)
printf("%2d",output[i]);
printf("\n");
}
int main()
{
int a[6]={3,6,1,9,7,8};
int b[6]={0};
for(int i=0;i<6;i++)
printf("%2d",a[i]);
printf("\n");
sort(a,6,b);
return 0;
}
3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 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<stdio.h>
#include<string.h>
#include<malloc.h>
#include<iostream.h>
voidscheduler1(int task[], int n, int system_task[], int user_task[])
{
int i;
int j=0;
int *p,*pp,*p_user,*pp_user;
int index=0;
int count,count2;
int min=0;
int k=0;
p=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
p[i]=0;
pp=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
pp[i]=0;
p_user=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
p_user[i]=0;
pp_user=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
pp_user[i]=0;
for(i=0;i<n;i++)
{
if(task[i]<50)
{
{
system_task[j]=task[i];
pp[j]=i;
j++;
}
count=j;
}
else if(task[i]<=255)
{
{
user_task[k]=task[i];
pp_user[k]=i;
k++;
}
count2=k;
}
else task[i]=task[i];
}
for(i=0;i<count;i++)
printf("%3d",system_task[i]);
printf("\n");
for(i=0;i<count;i++)
{
min=system_task[0];
for(j=1;j<count;j++)
{
if(system_task[j]<min)
{
min=system_task[j];
p[i]=j;
}
}
system_task[p[i]]=51;
}
pp[count]=-1;
for(i=0;i<count;i++)
printf("%3d",pp[p[i]]);
printf("%3d\n",pp[count]);
/***********************************************************/
for(i=0;i<count2;i++)
printf("%4d",user_task[i]);
printf("\n");
for(i=0;i<count2;i++)
{
min=user_task[0];
for(j=1;j<count2;j++)
{
if(user_task[j]<min)
{
min=user_task[j];
p_user[i]=j;
}
}
user_task[p_user[i]]=256;
}
pp_user[count2]=-1;
for(i=0;i<count2;i++)
printf("%4d",pp_user[p_user[i]]);
printf("%3d\n",pp_user[count2]);
}
int main()
{
int task[9]={0, 30, 155, 1, 80, 300,170,40, 99};
int system_task[9]={0};
int user_task[9]={0};
scheduler1(task,9,system_task,user_task);
return 0;
}
第三题的这种做法的排序的过程有点看不懂,下面贴出来我自己的做法,用的是常见的冒泡法排序的修改版,没有用指针用的是数组,这点不太好,
#include <stdio.h> #include <malloc.h> #include <assert.h> int schedule(int task[],int n,int system_task[],int user_task[]); int schedule(int task[],int n,int system_task[],int user_task[]) { int i=0,j=0,temp=0; int a=0,b=0,c=0,d=0; for(i;i<n;i++) { if(task[i]<50) { system_task[a]=i; a++; } else if(task[i]>=50&&task[i]<=255) { user_task[b]=i; b++; } else { //nothing } } for(i=0;i<n;i++) { printf("%d ",system_task[i]); } printf("\n"); for(i=0;i<n;i++) { printf("%d ",user_task[i]); } //重新排序 for(i=n-1;i>=0;i--) { if(system_task[i]!=0)
{ c=i+1; break; } } for(i=n-1;i>=0;i--) { if(user_task[i]!=0) { d=i+1; break; } } int *p=(int *)malloc(sizeof(int)*(c+1)); int *q=(int *)malloc(sizeof(int)*(d+1)); assert(p!=NULL); assert(q!=NULL); for(i=0;i<c;i++) { p[i]=system_task[i]; } p[c]=-1; for(i=0;i<d;i++) { q[i]=user_task[i]; } q[d]=-1; for(i=0;i<c;i++)
for(j=i;j<c;j++) { if(task[system_task[i]]>task[system_task[j]]) { temp=task[system_task[i]]; task[system_task[i]]=task[system_task[j]]; task[system_task[j]]=temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } } for(i=0;i<d;i++) { for(j=i;j<d;j++) { if(task[user_task[i]]>task[user_task[j]]) { temp=task[user_task[i]]; task[user_task[i]]=task[user_task[j]]; task[user_task[j]]=temp; temp=q[i]; q[i]=q[j]; q[j]=temp; } } } printf("\nresult:\n"); for(i=0;i<=c;i++) { printf("%d ",p[i]); } printf("\n"); for(i=0;i<=d;i++){ printf("%d ",q[i]); } return 0; } int main() { int task[]={0,30,155,1,80,300,170,40,99}; int system_task[9]={0}; int user_task[9]={0}; schedule(task,9,system_task,user_task); return 0; }
4.问题描述:我国手机号码标准格式为:国家码+手机号码 ,例如8613912345678。特点如下
1,长度为13位
2。以86开头
3。号码的每一位都是数字
请实现手机号码合法性判断函数(无须关注手机号码的真实性)
1。如果手机号码合法 返回0
2。如果手机号码长度不合法 返回1
3。如果手机号码中包含非数字的字符,返回2
4。如果手机号码不是以86打头的,返回3
注意:以上优先级依次降低,也就是说如果长度不合法,则直接返回2,无须继续判断
代码如下:
#include.....
#include <assert.h> #include <string.h> int check_phone(char *p); int check_phone(char *p) { int num; int i; num=strlen(p); printf("%d\n",num); if(num==13) { for(i=0;i<strlen(p);i++) { if(*(p+i)>='0'&&*(p+i)<='9'){} else return 2; } if((*p=='8')&&(*(p+1)=='6')) { return 0; } else return 3; } else return 1; } int main() { char *p=(char *)malloc(sizeof(char)*13); assert(p!=NULL); printf("please enter the phone number:\n"); scanf("%s",p); //printf("%d",strlen(p)); printf("%d\n",check_phone(p)); return 0; }