1.选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type == 1,表示专家评委,judge_type == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。
函数接口
int cal_score(int score[], int judge_type[], int n)
- #include <stdio.h>
- #include <stdlib.h>
- int cal_score(int score[], int judge_type[], int n);
- int
- main(int argc, char *argv[])
- {
- int total_score;
- int n = 8;
- int data[] = { 95, 92, 87, 90, 85, 88, 82, 85 };
- int type[] = { 1, 2, 2, 1, 2, 2, 1, 2 };
-
- total_score = cal_score(data, type, n);
- printf("total_score is : %d\n", total_score);
-
- return 0;
- }
- /*
- *打分函数:总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4
- */
- int
- cal_score(int score[], int judge_type[], int n)
- {
- int sum_expert = 0;
- int sum_common = 0;
- int count_expert = 0;
- int count_common = 0;
- int avg_expert, avg_common;
- int final_score;
- int i;
-
- for(i = 0; i < n; i++){
- if(judge_type[i] == 1){
- sum_expert += score[i];
- count_expert++;
- } else if(judge_type[i] == 2){
- sum_common += score[i];
- count_common++;
- } else {
- printf("Error type!");
- }
- }
-
- avg_expert = sum_expert / count_expert;
- avg_common = sum_common / count_common;
- final_score = avg_expert * 0.6 + avg_common * 0.4;
-
- return final_score;
- }
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 <stdlib.h>
- void sort(int input[], int n, int output[]);
- int
- main(int argc, char *argv[])
- {
- int i;
- int n = 10;
- int input[] = { 3, 6, 1, 9, 7, 10, 12, 15, 18, 19 };
- int output[n];
-
- printf("input is :\n");
- for(i = 0; i < n; i++){
- printf("%d ", input[i]);
- }
- printf("\n");
-
- sort(input, n, output);
-
- printf("output is :\n");
- for(i = 0; i < n; i++){
- printf("%d ", output[i]);
- }
- printf("\n");
-
- return 0;
- }
- /*
- *先把input数组的数从大到小排列,再按照要求放到output数组中。
- */
- void
- sort(int input[], int n, int output[])
- {
- int i, j, tmp;
- int *max_ptr;
- int *fill_ptr = input;
-
- for(j = 0; j < n; j++){
- tmp = *fill_ptr;
- max_ptr = fill_ptr;
- for(i = j; i < n; i++){
- if(input[i] > tmp){
- tmp = input[i];
- max_ptr = &input[i];
- }
- }
- if(max_ptr != fill_ptr){
- tmp = *fill_ptr;
- *fill_ptr = *max_ptr;
- *max_ptr = tmp;
- }
- fill_ptr++;
- }
-
- int *left, *right;
-
- if(n % 2){
- output[n/2] = input[0];
- left = &output[n/2 - 1];
- right = &output[n/2 + 1];
-
- for(i = 1; i < n; i++){
- if(i % 2){
- *left = input[i];
- left--;
- } else {
- *right = input[i];
- right++;
- }
- }
- } else {
- left = &output[n/2 - 1];
- right = &output[n/2];
-
- for(i = 0; i < n; i++){
- if(!(i % 2)){
- *left = input[i];
- left--;
- } else {
- *right = input[i];
- right++;
- }
- }
- }
-
- }
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 <stdlib.h>
- #define DEBUG 0
- void scheduler(int task[], int n, int system_task[], int user_task[]);
- int
- main(int argc, char *argv[])
- {
- int n, i, j;
- int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
- n = sizeof(task) / sizeof(int);
- int system_task[n];
- int user_task[n];
- scheduler(task, n, system_task, user_task);
- printf("\ntask[] is :\n");
- for(i = 0; i < n; i++){
- printf("%d ", task[i]);
- }
-
- printf("\n\nsystem_task[] is :\n");
- for(i = 0; i < n && system_task[i] != -1; i++){
- printf("%d ", system_task[i]);
- }
- printf("%d",system_task[i]);
-
- printf("\n\nuser_task[] is :\n");
- for(i = 0; i < n && user_task[i] != -1; i++){
- printf("%d ", user_task[i]);
- }
- printf("%d", user_task[i]);
- printf("\n");
- }
- /*
- *scheduler处理函数
- */
- void
- scheduler(int task[], int n, int system_task[],int user_task[])
- {
- int i, j, min_val;
- int min_in_task_ptr;
- int *fill_ptr;
- int *task_ptr[n];
- int **tmp_ptr_ptr;
- for(i = 0; i < n; i++){
- task_ptr[i] = &task[i];
- }
- /*将task_ptr[]从小到大的排列*/
- for(i = 0; i < n; i++){
- min_val = *task_ptr[i];
- min_in_task_ptr = i;
- fill_ptr = task_ptr[i];
- /*寻找task_ptr后面的最小值和它的指针*/
- for(j = i; j < n; j++){
- if(*task_ptr[j] < min_val){
- min_val = *task_ptr[j];
- min_in_task_ptr = j;
- }
- }
- #if DEBUG
- printf("min_val:%d min_ptr:%d ", min_val, *task_ptr[min_in_task_ptr]);
- printf("min_ptr-task:%d\n", min_in_task_ptr);
- #endif
- /*交换指针*/
- task_ptr[i] = task_ptr[min_in_task_ptr];
- /*min_ptr-task怎么和我期望的有差距呢?
- * 哦,task数组中的数据顺序没有变化。
- * */
- //task_ptr[i] = task_ptr[min_ptr - task];
- task_ptr[min_in_task_ptr] = fill_ptr;
- #if DEBUG
- printf("%d\ttask_ptr[] is :", i);
- for(j = 0; j < n; j++){
- printf("%d ", *task_ptr[j]);
- }
- printf("\n");
- #endif
- }
- int count_sys = 0;
- int count_user = 0;
- for(i = 0; i < n; i++){
- if(*task_ptr[i] < 50){
- system_task[count_sys] = task_ptr[i] - task;
- count_sys++;
- } else if(*task_ptr[i] > 255){
- printf("%d", *task_ptr[i]);
- } else {
- user_task[count_user] = task_ptr[i] - task;
- count_user++;
- }
- }
- system_task[count_sys] = -1;
- user_task[count_user] = -1;
- }
总结:
看到一个师弟对这个三道题目的评价“其实就是逻辑思维,根本不涉及库函数算法神马的。。。”
嗯,对于我来说,着重练习的是逻辑思维,GDB调试。
编这三个练习的时候我感觉到比华为杯2012西南赛区初赛题目要顺手一些。特别是对于调试也“身”有体会了。看了《GDB调试程序[陈皓]》后,感觉原来GDB还不错。同时,也喜欢上了在程序中加上条件编译,这样调试程序就更方便了。目前我的调试前后的时间各占了一半,我还会做得更好的。
喜欢GDB的打印数组 p *task_ptr[0]@9 。开始对这个的理解错误,运行结果让我匪夷所思。原来
p task_ptr[0]@9 才是打印排了序的指针。但显示的是指针,不容易阅读。此时,我想起了条件编译,感觉不错。
在第三个练习中,用了指针数组,用得还不太熟悉。(暂且忽略解决方法的好坏~)尽管看书的时候,指针的应用都能理解,但和自己动手相比差别还是大。
阅读(873) | 评论(1) | 转发(0) |