大华一道面试题(搜索了百度谷歌,无果,索性自己来)
如题:
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强大。 注重思想最重要。