首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

大华一道面试题(搜索了百度谷歌,无果,索性自己来),该如何处理

2013-10-21 
大华一道面试题(搜索了百度谷歌,无果,索性自己来)本帖最后由 Appleyk 于 2012-09-27 18:24:50 编辑如题:3.

大华一道面试题(搜索了百度谷歌,无果,索性自己来)
本帖最后由 Appleyk 于 2012-09-27 18:24:50 编辑 如题:
3. 已知文件 int.txt,记录某班级某门课的学生成绩,每行记录一条信息,格式为:
姓名+空格+成绩+回车换行
示例
张三 86          王五 93
李四 79          张三 86
.........       .............
王五 93       李四 79
............     .......

In.txtout.txtf
实现对成绩从高到低排序,把结果输出到文件 out.txt ,函数声明如下,fin为输入文件,fout为输出文件,成功返回0,失败 -1;
-------------------------------------------------------------------
Int fsort( const char*fin, const char * fout);
思路:首先拿到这题你可能会第一时间想到FILE*文件指针操作,无非就是读和写操作,但是问题是,题目限制了文件的格式,如果只是单纯的读一行数据,fgets就可以做到,格式限制的前提下还要对每位童鞋的成绩进行排序,你妹啊,你直接考个排序不得了!真是麻烦。

好了,言归正传,尼玛,谁让咱是苦逼的程序员呢,不淡定不行啊!!!

把此题拆成四部分:

(1)数据部分 :由学生信息可知,也就两部分,姓名+成绩,好办,这不结构体轻松搞定
typedef struct _tagGradeInfo
{
char strName[10];//名字
int  nGrade;//成绩

}GRADEINFO;

(2)读数据:最恶心的一点就是那该死的" "空格符,有木有!!!怎么办怎么办???不用急,还记得函数strtok不

原型:
char *strtok
(
   char *strToken,//你要分割的数据部分
   const char *strDelimit //分隔符也,该死的" ",看我不收拾你..
);

函数功能:对一个字符串根据特定的分隔符,比如"!", "," , " "等进行匹配分割,且返回一个char*指针(这个结果就是你想要得到的那个数据,吼吼!)

剩下的就是数据的写入了,有人问,你还不知道学生数nCount等于多少呢,怎么写入数据,额,两种办法,一:把你定义的学生结构体信息数组,大小定死,比如100,就是图个方便。 二:如果不怕麻烦,可以先读一遍文件in.txt里的内容,判断!feof(pRead),然后nCount++(学生人数),既然是面试题,还是尽量投机取巧吧!

(3)成绩排序
如果你会排序中的任何一种排序,那么恭喜你,这部分对你来说小case,这里用楼主我最熟悉的冒泡排序法(大家鄙视我吧);

Code Part:

int a[10] = {2, 12, 24 , 7 , 34 ,45 ,10 ,6 ,26 ,38};

for(int i= 0 ; i < 10 ; i++)
{
   for(int j = i + 1 ; j < 10 ;j++)
   {
      if(a[i] < a[j])
  {
    int temp = 0;
temp = a[i];//保存下小的值
a[i] = a[j];//小的自动往后走,大的往前走
a[j] = temp;
  
  }
   }
}

(4)写数据:如果以上工作都做好了,那么往out.txt里写数据只需要注意几点就行了
//循环 每次先解决一行
<1>写入名字: strName
<2>写入空格:" "
<3>写入成绩:nGrade


<4>写入换行符:"\r\n"


啦啦啦,大功告成!!!

下面分享下代码,希望需要的童鞋不要只copy代码,编程最主要的还是思想,思路,思维。

PS:面试不可怕,一定要淡定蛋定!!! 
[解决办法]
楼主辛苦了
[解决办法]


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct node
{
    struct node *next;
    char name[10];
    int grade;
}node;

node *sort_list(node *head)
{
    node *pre = head;
    node *cur = head;
    
    if (NULL == head 
[解决办法]
 NULL == head->next)
    {
        return head;
    }
    
    cur = cur->next;
    while (cur != NULL)
    {
        if (cur->grade > pre->grade)
        {
            pre->next = cur->next;
            
            if (cur->grade >= head->grade)
            {
                cur->next = head;
                head = cur;
            }
            else
            {
                node *p;


                
                for (p = head; p != pre; p = p->next)
                {
                    if (p->next->grade <= cur->grade)
                    {
                        cur->next = p->next;
                        p->next = cur;
                        break;
                    }
                }
            }
            
            cur = pre->next;
        }
        else
        {
            pre = cur;
            cur = cur->next;
        }
    }
    
    return head;
}

void free_list(node *head)
{
    while (head != NULL)
    {
        node *tmp = head->next;
        free(head);
        head = tmp;
    }
}

int main()
{
    FILE *fp;
    node *head = NULL, *cur = NULL, *tmp = NULL;

    if (NULL == (fp = fopen("in.txt", "r")))
    {
        printf("file open error!");


        return -1;
    }

    while (1)
    {
        tmp = malloc(sizeof(node));
        tmp->next = NULL;
        if (2 == fscanf(fp, "%s%d", &tmp->name, &tmp->grade))
        {
            if (NULL == head)
            {
                head = tmp;
                cur = tmp;
            }
            else
            {
                cur->next = tmp;
                cur = tmp;
            }
        }
        else
        {
            free(tmp);
            break;
        }
    }
    fclose(fp);

    head = sort_list(head);
    
    do
    {
        if (NULL == (fp = fopen("out.txt", "w")))
        {
            printf("file open error!");
            break;
        }

        for (cur = head; cur != NULL; cur = cur->next)
        {
            fprintf(fp, "%s %d\n", cur->name, cur->grade);
        }


    } while (0);

    free_list(head);

    if (fp != NULL)
    {
        fclose(fp);
    }

    system("pause");
    return 0;
}


[解决办法]
杭州大华还是不错的。
[解决办法]
有规定必须要用C写么?用C++的fstream+getline+vector+泛型算法,感觉这道题目应该很容易
[解决办法]
LZ强大。   注重思想最重要。

热点排行