2010年华为软件校园招聘编程测类别:软件C语言编程题(共2题,第一题40分,第二题60分,共100分。
请上机编写程序,按题目要求提交文件。
[详见考试说明]本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。
1. 删除字符串中所有给定的子串(40分)问题描述:在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。
要求实现函数:int delete_sub_str(const char *str, const char *sub_str, char *result_str)【输入】str:输入的被操作字符串sub_str:需要查找并删除的特定子字符串【输出】result_str:在str字符串中删除所有sub_str子字符串后的结果【返回】删除的子字符串的个数注:I、子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。
比如:在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。
如果匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。
II、输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例输入:str = "abcde123abcd123"sub_str = "123"输出:result_str = "abcdeabcd"返回:2输入:str = "abcde123abcd123"sub_str = "1234"输出:result_str = "abcde123abcd123"返回:02. 高精度整数加法(60分)问题描述:在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,参与运算的操作数和结果必须在-231~231-1之间。
如果需要进行更大范围的十进制整数加法,需要使用特殊的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。
如下:9876543210 + 1234567890 = ?让字符串num1="9876543210",字符串num2="1234567890",结果保存在字符串result = "11111111100"。
-9876543210 + (-1234567890) = ?让字符串num1="-9876543210",字符串num2="-1234567890",结果保存在字符串result = "-11111111100"。
要求编程实现上述高精度的十进制加法。
要求实现函数:void add (const char *num1, const char *num2, char *result)【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:I、当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;II、输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;III、要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
示例输入:num1 = "580"num2 = "-50"输出:result = "530"输入:num1 = "580"num2 = "-600"输出:result = "-20"华为实习上机题input.txt文件中包含若干英语单词(由小写字母组成),读取全部单词,并将其按字典序输出到output.txt文件中.重复的单词只允许输出一次.单词最大长度不超过63个字符.1,程序编译后生成的可执行文件名称test.exe,命令行执行方式是test.exe input-file-name output-file-name,命令行的解析由程序框架处理,大家不要修改。
2,文件的读写由框架程序提供封装好的函数read_nextword()和write_word(),大家不需要去考虑读写文件的具体细节。
注意仔细阅读在numlib.h里面两个函数的注释,3,内存的申请、释放请使用封装好的函数pmalloc()和pfree(),大家不要直接使用系统的malloc()、free()和calloc()等,否则可能被判0分。
注意仔细阅读在numlib.h里面两个函数的注释。
4,当你发现处理中出现任何异常或者错误时,请调用log_record()记录日志,参数是你自己定的一个字符串。
但是大家千万不要调用exit()之类的函数直接结束程序运行,否则可能判0分。
5,main()函数已经编写完整,大家不用再修改。
大家要做的就是实现data_process()函数。
当然,你可以根据需要定制自己的数据结构、宏、其他处理函数等等。
l框架程序include "numlib.h"/* 此函数由考试者填写,参数是输入、输出文件的指针* 1、考试者不必处理文件指针的关闭,由主程序处理。
* 2、考试者不要直接调用exit()等退出程序* 3、读文件请使用read_nextword(),写文件请使用write_word(),注意返回值* 4、申请内存请调用pmalloc(),释放内存请调用pfree(),不要自己直接调用malloc/free* 5、当遇到任何异常时,请先调用log_record()记录异常,再作其他处理,不许调用EXIT()*//* 考试者可以自行定义数据结构、变量和函数等,并实现以下data_process函数即可*/typedef struct Node{char a[64];struct Node *next;}Node;void data_process(FILE *fpInput, FILE *fpOutput){char word[64];Node *head=NULL;Node *q=head;Node *t=NULL;Node *p;int i=0;while(SUCCESS_E==read_nextword(fpInput,word)) {if(head==NULL){p=(Node*)pmalloc(sizeof(Node));strcpy(p->a,word);p->next=NULL;head=p;}else{//printf("ddddd%d",strcmp(q->a,p->a));t=head;while(t&& (strcmp(t->a,word) <0 )){q=t;t=t->next;// printf("qa=%s,pa=%s",q->a,p->a);}if(t&&strcmp(t->a,word)==0)continue;p=(Node*)pmalloc(sizeof(Node));strcpy(p->a,word);p->next=NULL;if(t==head){p->next=t;head=p;}else{q->next=p;p->next=t;}}}q=head;while(q!=NULL){printf("node %s\n",q->a);write_word(fpOutput,q->a);p=q;q=q->next;pfree(p);}return;}/********************************************************************************************//* 读写文件的处理由主程序框架进行,考试人员只需要填写和实现data_process() 函数即可,不要修改以下程序文件,修改了可能得0分*/void main(int argc, char *argv[]){FILE *fpInput = NULL; /* 输入文件指针*/FILE *fpOutput = NULL; /* 输出文件指针*//* 命令行格式:test input.txt output.txt */if (argc < 3){printf("Error: too few parameters\r\n");printf("Usage: %s input-filename output-filename\r\n", argv[0]);return;}/* 打开输入文件读*/fpInput = fopen(argv[1], "r");if (NULL == fpInput){printf("Error: input file %s do not exist\r\n", argv[1]);return;}/* 打开输出文件写,没有则创建*/fpOutput = fopen(argv[2], "w+");if (NULL == fpOutput){fclose(fpInput);printf("Error: failed to open/create output file %s\r\n", argv[2]);return;}/* 调用前初始化处理*/if (-1 == Initialize()){fclose(fpInput);fclose(fpOutput);printf("Error: failed to initialize program\r\n");return;}/* 调用考试者写的函数,考试者不需要关闭文件指针,由主程序处理*/data_process(fpInput, fpOutput);/* 调用后的结束处理*/finished();fclose(fpInput);fclose(fpOutput);return;}参考答案:第一题(C):删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。