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

appleyk 2012-09-27 06:21:15
如题:
3. 已知文件 int.txt,记录某班级某门课的学生成绩,每行记录一条信息,格式为:
姓名+空格+成绩+回车换行
示例
张三 86 王五 93
李四 79 张三 86
......... .............
王五 93 李四 79
............ .......

In.txt out.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:面试不可怕,一定要淡定蛋定!!!
...全文
633 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
乔飞翔 2013-07-07
  • 打赏
  • 举报
回复
谢谢楼上的正解!
lin51616780 2012-09-28
  • 打赏
  • 举报
回复
fscanf完爆
zhaoZero41 2012-09-28
  • 打赏
  • 举报
回复
有规定必须要用C写么?用C++的fstream+getline+vector+泛型算法,感觉这道题目应该很容易
冷月清晖 2012-09-28
  • 打赏
  • 举报
回复
杭州大华还是不错的。
appleyk 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
楼主强大 华为今年开始校招了吗 想去华为
[/Quote]

貌似开始了,只是没有接到笔试通知,漫长的等待啊。具体应该十一长假结束后,笔试面试会全面展开吧。

我也去华为,它们对基础要求很高的。 祝福你和我吧!
appleyk 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
C/C++ code


#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……
[/Quote]

好一个链表法,好一个scanf,好一个fprintf。哇咔咔
appleyk 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
strtok确实可行,不过似乎真的没有scanf族的函数好用……
另外,涉及到了文件,是不是意味着内存可能不够用?
如果是这样的话,就需要使用外排序了……
[/Quote]
嗯嗯,学习了。
xhao014 2012-09-28
  • 打赏
  • 举报
回复
LZ强大。 注重思想最重要。
子谋 2012-09-28
  • 打赏
  • 举报
回复
strtok确实可行,不过似乎真的没有scanf族的函数好用……
另外,涉及到了文件,是不是意味着内存可能不够用?
如果是这样的话,就需要使用外排序了……
SKATE11 2012-09-27
  • 打赏
  • 举报
回复
楼主强大 华为今年开始校招了吗 想去华为
hello_world000 2012-09-27
  • 打赏
  • 举报
回复

#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;
}
appleyk 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
楼主辛苦了
[/Quote]

你也辛苦了!
sublimepan 2012-09-27
  • 打赏
  • 举报
回复
楼主辛苦了
appleyk 2012-09-27
  • 打赏
  • 举报
回复
头文件#include <Windows.h> 是针对取当前debug目录下运行的.exe的那个方法GetModuleFileNameA而添加的引用, 如果.exe的路径都能取出来,那么在debug下面的in.txt和out.txt的路径无非就是路径的截取和字符串拼接了。 如果不想麻烦,"C:/in.txt" "C:/out.txt" 也行。不过路径定死了,可不是什么好事噢。
appleyk 2012-09-27
  • 打赏
  • 举报
回复
#include <Windows.h>
#include <stdio.h>
#include <string.h>

typedef struct _tagGradeInfo
{
char strName[10];//名字
int nGrade;//成绩

}GRADEINFO , *LPGRADEINFO;

enum
{
FILE_ERROR,
FILE_SUCCESS,

};

const char *strFile1 = "in.txt";
const char *strFile2 = "out.txt";
char strPath_in[260] ={0};
char strPath_out[260] ={0};

int fsort( const char*fin, const char * fout);


int main()
{
//先获取当前项目debug下面的in.txt和out.txt文本文件

char *pstr = NULL;
GetModuleFileNameA(NULL , strPath_in , 260);
pstr=strrchr(strPath_in , '\\');//从字符串的右边开始找
*pstr = '\0';//截断
strcat(strPath_in , "\\in.txt");
pstr = NULL;

GetModuleFileNameA(NULL , strPath_out , 260);
pstr=strrchr(strPath_out , '\\');//从字符串的右边开始找
*pstr = '\0';//截断
strcat(strPath_out , "\\out.txt");

//成绩排序整理
int nRes = fsort(strPath_in , strPath_out);

if(nRes > 0)
{
printf("The programa is over!");
}
getchar();
return 0;
}

int fsort(const char *fin, const char *fout)
{

FILE *pRead = NULL ,*pWrite = NULL;
int nCount ;
GRADEINFO pGradeInfo[100];//先定死 100个学生

char buff[128] = {0} ;
char stoken[2] =" ";//空格分割符标记
char *p = NULL ;//保存分割后的内容

pRead=fopen(fin , "r"); //读
pWrite = fopen(fout , "w");//写

nCount = 0;//记录学生数
memset(pGradeInfo , 0 , sizeof(pGradeInfo));//清空结构体数据

while(!feof(pRead))//如果文件没有结束
{
if(fgets(buff ,128 , pRead) == NULL)//读第一行数据
{
printf("read error !\n");
return FILE_ERROR ;
}

p = strtok(buff , stoken);//第一次分割出来姓名
strcpy(pGradeInfo[nCount].strName , p);

p = strtok(NULL , stoken);//再分一次分离成绩
pGradeInfo[nCount].nGrade = atoi(p);

nCount++ ;
}

printf("读出in.txt文件成功:\n\n");
for(int i = 0 ; i < nCount ; i++)//输出
{
printf("Name: %s Grade: %d\n\n" , pGradeInfo[i].strName , pGradeInfo[i].nGrade);

}
//冒泡排序
for(int i= 0 ; i < 10 ; i++)
{
for(int j = i + 1 ; j < 10 ;j++)
{
if(pGradeInfo[i].nGrade < pGradeInfo[j].nGrade)
{
GRADEINFO pData ;//临时结构体变量
pData = pGradeInfo[i];//保存下成绩低的结构体
pGradeInfo[i] = pGradeInfo[j];//小的自动往后走,大的往前走
pGradeInfo[j] = pData;

}
}

}
printf("\t------------------------------------------------\t\n\n");
for(int i = 0 ; i < nCount ; i++)//输出
{
printf("Name: %s Grade: %d\n\n" , pGradeInfo[i].strName , pGradeInfo[i].nGrade);

}

//将排序完的数据写入out.txt文件
int i = 0;

while(i < nCount)
{
if(pWrite)
{
char buff[3] = {0} ;
fputs(pGradeInfo[i].strName , pWrite);//写入名字
fputs(" " ,pWrite);//空格隔开
itoa(pGradeInfo[i].nGrade ,buff ,10);//int to char*
fputs(buff , pWrite);//写入成绩
fputs("\r\n" , pWrite);//写入换行符

}
i++ ;
}

printf("写入out.txt文件成功!\n\n");
return FILE_SUCCESS;
}

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧