读书人

大华一道面试题(搜索了百度谷歌无果

发布时间: 2013-10-21 17:03:30 作者: rapoo

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

读书人网 >C++

热点推荐