大四还是常常在控制台下面写程序,面试时面试官问做过什么项目觉得没话说啊

ww884203 2012-09-27 10:55:22
如题,先说一下我不是大学就那么混过去的那种,应该说那些知识掌握得还算可以的,不过大学几年我就一直学C/C++的语法,数据结构和算法以及操作系统、网络等基础知识,从没做过什么大型项目,尤其是GUI的那种,写得最复杂的程序也就写了一周不到,没有那种做了好几个月的,更没有那种和别人合作一起做的真正意义的项目,因此如果面试官问 你做了什么项目的时候,觉得完全没话说啊~~~

我写过一个小东西是关于差异化代码覆盖率的,就是指定两个目录,作为一个程序的新旧版本目录,然后比对两个目录下代码不同的部分,再根据新版本的覆盖率信息,计算提取出更改后的代码的覆盖情况。这程序也就写了一周不到,差不多是一半的LINUX SHELL和一半的C++,这能算一个项目么?

或者把那种用PHP写的XXX管理系统说一下?这种管理系统真心做得挺水的,就是数据库的增删查改,生成几个SQL语句执行一下而已,完全没有技术含量。。。。

别的关于那些基础技术知识的考察觉得都还好,不太担心,就担心这个问题不知道怎么答,求教一下,面试官问这个问题的时候怎么回答比较好呢?

附带一下我最近一段时间写的小程序,大家参考一下我的编码习惯和风格之类的,看看怎么样。。。

第一个程序是简单的集合的交集、并集、差集操作,就是打开两个文件读取里面的数据,如果按照数字来读就可以支持x,y的格式,提取x-y之间的数,或者按照字符串来读,完成操作然后输出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>


#define MAXLINE 128

#define PASTE(ARG) set_##ARG(left.begin(),left.end(),right.begin(),right.end(),inserter(output,output.begin()))

#define ARG_NOT_CORRECT 1
#define INPUT_NOT_VAILD 2
#define FILE_ISNOT_EXIST 4
#define DIGIT_NOT_VAILD 8


using namespace std;

void help()
{
cout << "Usage:setalgorithm infile_1 infile_2 style mode\n";
cout << "infile:file contains data in the set, only one digit or a continuous group digit each line.\n";
cout << " you can get range from a to b by the way \"a,b\" in the digit mode\n";
cout << " or treat data as normal string in the string mode\n";
cout << "style:fill this block with 'u' to get the union ,'i' to get the intersection , and 'd' to get the difference.\n";
cout << "mode: 's' to set string mode and 'd' to set digit mode\n";
}

void read_string_from_file(set<string> & data , FILE * fp)
{
data.clear();
char buffer[MAXLINE];
while(fgets(buffer , MAXLINE , fp))
{
buffer[strlen(buffer)-1] = '\0';
data.insert(string(buffer));
}
}

void read_digit_from_file(set<int> & data , FILE * fp)
{
data.clear();
char buffer[MAXLINE];
char * point;
while(fgets(buffer , MAXLINE , fp))
{
point = strchr(buffer,',');
if(NULL == point)
{
data.insert(atoi(buffer));
}
else
{
*point = '\0';
int lowerbound = atoi(buffer);
int upperbound = atoi(point+1);
if(lowerbound > upperbound)
{
exit(DIGIT_NOT_VAILD);
}
while(lowerbound <= upperbound)
{
data.insert(lowerbound++);
}
}
}
}

template <typename T>
void travel_set(T & output)
{
typename T::iterator iter;
for(iter= output.begin() ; iter != output.end() ; ++iter)
{
cout << *iter << endl;
}
}

template <typename T>
void getresult(T & left , T & right , T & output , char option)
{
switch(option)
{
case 'u':
{
PASTE(union);
break;
}
case 'i':
{
PASTE(intersection);
break;
}
case 'd':
{
PASTE(difference);
break;
}
}
travel_set(output);
}

void digit_algorithm(FILE * lfp , FILE * rfp , char option)
{
set<int> left , right , output;
read_digit_from_file(left , lfp);
read_digit_from_file(right , rfp);
getresult(left , right , output , option);
}

void string_algorithm(FILE * lfp , FILE * rfp , char option)
{
set<string> left , right , output;
read_string_from_file(left , lfp);
read_string_from_file(right , rfp);
getresult(left , right , output , option);
}

int main(int argc , char ** argv)
{
if(argc != 5)
{
help();
exit(ARG_NOT_CORRECT);
}
char option = argv[3][0];
if(option != 'u' && option != 'd' && option != 'i')
{
help();
exit(INPUT_NOT_VAILD);
}
char mode = argv[4][0];
if(mode != 's' && mode != 'd')
{
help();
exit(INPUT_NOT_VAILD);
}
FILE * lfp , * rfp;
if( (lfp = fopen(argv[1] , "r")) == NULL )
{
cerr << "can't open file:" << argv[1] << endl;
exit(FILE_ISNOT_EXIST);
}
if( (rfp = fopen(argv[2] , "r")) == NULL )
{
cerr << "can't open file:" << argv[2] << endl;
exit(FILE_ISNOT_EXIST);
}
if( mode == 's' )
{
string_algorithm(lfp , rfp , option);
}
else if( mode == 'd' )
{
digit_algorithm(lfp , rfp , option);
}
fclose(lfp);
fclose(rfp);
return 0;
}



第二个程序是最近玩数独的时候,觉得做不出来,所以写了一个用来解数独的算法,由于是写给自己用的,输入输出和排错之类的没太讲究,程序也很简单,思路就是回溯遍历:

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

using namespace std;

struct Trip
{
int _row , _col , _digit;
};

char _maintable[10][10];

bool checkrow(int lineno , int digit)
{
digit += '0';
for(int iter = 1 ; iter != 10 ; ++iter)
{
if(_maintable[lineno][iter] == digit)
{
return false;
}
}
return true;
}

bool checkcol(int lineno , int digit)
{
digit += '0';
for(int iter = 1 ; iter != 10 ; ++iter)
{
if(_maintable[iter][lineno] == digit)
{
return false;
}
}
return true;
}

bool checkblock(int row , int col , int digit)
{
digit += '0';
int rowindex = (row-1)/3 * 3 + 1;
int colindex = (col-1)/3 * 3 + 1;
for(int r = rowindex ; r != rowindex + 3 ; ++r)
{
for(int c = colindex ; c != colindex + 3 ; ++c)
{
if(row == r && col == c)
{
continue;
}
if(_maintable[r][c] == digit)
{
return false;
}
}
}
return true;
}

inline bool checkvaild(int row , int col , int digit)
{
return checkrow(row , digit) && checkcol(col , digit) && checkblock(row , col ,digit);
}

void read_matrix()
{
for(int row = 1 ; row != 10 ; ++row)
{
fflush(stdin);
for(int col = 1 ; col != 10 ; ++col)
{
scanf("%c",&_maintable[row][col]);
}
}
}

void count(vector<Trip> & data)
{
Trip temp;
for(int row = 1 ; row != 10 ; ++row)
{
for(int col = 1 ; col != 10 ; ++col)
{
if(_maintable[row][col] == '0')
{
temp._row = row;
temp._col = col;
temp._digit = 0;
data.push_back(temp);
}
}
}
}

void output()
{
for(int row = 1 ; row != 10 ; ++row)
{
for(int col = 1 ;col != 10 ; ++col)
{
printf("%c ",_maintable[row][col]);
}
printf("\n");
}
}

void output_debug(vector<Trip> & data)
{
int n = data.size();
for(int iter = 0 ; iter != n ; ++iter)
{
printf("%d %d %d\n",data[iter]._row , data[iter]._col , data[iter]._digit);
}
}

bool travel(vector<Trip> & data)
{
int n = data.size();
int iter = 0 ;
int row , col , digit;
while(iter != n)
{
if(iter < 0)
{
return false;
}

row = data[iter]._row;
col = data[iter]._col;
digit = data[iter]._digit;
while(1)
{
digit++;
if(digit == 10)
{
data[iter]._digit = 0;
_maintable[row][col]='0';
iter--;
break;
}
if(checkvaild(row,col,digit))
{
data[iter]._digit = digit;
_maintable[row][col] = digit+'0';
iter++;
break;
}
}
}
return true;
}

bool finalcheck()
{
int digit;
for(int iter = 1 ; iter != 10 ; ++iter)
{
digit = _maintable[iter][1];
if( ! checkvaild(iter , 1 ,digit) )
{
return false;
}
}
return true;
}

int main()
{
vector<Trip> data;
bool is_vaild;
read_matrix();
count(data);
is_vaild = travel(data);
if(is_vaild)
{
if(finalcheck())
{
output();
}
else
{
printf("输入有误\n");
}
}
else
{
printf("无解\n");
}
system("pause");
return 0;
}

...全文
404 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww884203 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

写控制台程序不丢人啊,大型服务器程序不都是控制台程序。关键是你对操作系统、编译器、语言机理、常用数据结构这些有没有更多的理解,还有就是拿这些基础知识去解决一些实际的应用问题。比如你上面举了个集合操作的例子,光是操作那种简单而无实际代表性的数据应该很无聊吧,你可以试下用这个数据结构去解决一下图的连通区域标记这个问题,这在游戏地图寻路里是个必备的基础操作。
[/Quote]
谢谢,其实这个程序也不是“操作那种简单而无实际代表性的数据”,而是解决一个问题的时候需要用很多集合操作,所以写一个这样的代码然后通过脚本反复调用来解决问题。。。
另外你说的图的连通区域标记,这个问题我还不是特别了解,是把图的子连通区域都提取出来么?
Emiyasstar__ 2012-09-28
  • 打赏
  • 举报
回复
gui有什么好的,我前一阵用MFC用的快吐血了。。。。
赵4老师 2012-09-28
  • 打赏
  • 举报
回复
理论上来说,凡是GUI能完成的工作改用脚本都能完成,反之则不一定。
参考
http://www.autohotkey.com
http://www.nirsoft.net
另外楼主参考下面
#include <algorithm>
#include <iostream>
#include <functional>
#include <cstring>
using namespace std;
int main() {
char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;
char *Vowels = "aeiou" ;
char *AlphaNum = "0123456789abcdef" ;
char result[45] ;
char *last ;

int lenA = strlen(Alphabet) ;
int lenV = strlen(Vowels ) ;
int lenAN = strlen(AlphaNum) ;

cout << "Alphabet = " << Alphabet << endl ;
cout << "Vowels = " << Vowels << endl ;
cout << "AlphaNum = " << AlphaNum << endl ;

cout << "\nusing non-predicate versions" << endl ;

//non-predicate set_difference
last = set_difference(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result) ;
*last = 0 ;
cout << "set_difference(Alphabet, AlphaNum) = " << result << endl ;

//non-predicate set_intersection
last = set_intersection(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result) ;
*last = 0 ;
cout << "set_intersection(Alphabet, AlphaNum) = " << result << endl ;

//non-predicate set_symmetric_difference
last = set_symmetric_difference(Alphabet, Alphabet+lenA,
Vowels , Vowels +lenV,
result) ;
*last = 0 ;
cout << "set_symmetric_difference(Alphabet, Vowels) = " << result << endl ;

//non-predicate set_union
last = set_union(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result) ;
*last = 0 ;
cout << "set_union(Alphabet, AlphaNum) = " << result << endl ;

cout << "\nusing predicate versions" << endl ;

//predicate set_difference
last = set_difference(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result , less<char>()) ;
*last = 0 ;
cout << "set_difference(Alphabet, AlphaNum) = " << result << endl ;

//predicate set_intersection
last = set_intersection(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result , less<char>()) ;
*last = 0 ;
cout << "set_intersection(Alphabet, AlphaNum) = " << result << endl ;

//predicate set_symmetric_difference
last = set_symmetric_difference(Alphabet, Alphabet+lenA,
Vowels , Vowels +lenV,
result , less<char>()) ;
*last = 0 ;
cout << "set_symmetric_difference(Alphabet, Vowels) = " << result << endl ;

//predicate set_union
last = set_union(Alphabet, Alphabet+lenA,
AlphaNum, AlphaNum+lenAN,
result , less<char>()) ;
*last = 0 ;
cout << "set_union(Alphabet, AlphaNum) = " << result << endl ;

return 0 ;
}
叁叁玖玖 2012-09-28
  • 打赏
  • 举报
回复
LZ 能这样已经很好了!
常如意 2012-09-28
  • 打赏
  • 举报
回复
能做到楼主这样的应届生不多,楼主别太忧虑,你已经比别人有优势了
赵4老师 2012-09-28
  • 打赏
  • 举报
回复
理论上来说,凡是GUI能完成的工作改用脚本都能完成,反之则不一定。
参考

http://www.nirsoft.net/utils/nircmd.html

http://www.autohotkey.com
FancyMouse 2012-09-28
  • 打赏
  • 举报
回复
>我写过一个小东西是关于差异化代码覆盖率的,就是指定两个目录,作为一个程序的新旧版本目录,然后比对两个目录下代码不同的部分,再根据新版本的覆盖率信息,计算提取出更改后的代码的覆盖情况。这程序也就写了一周不到,差不多是一半的LINUX SHELL和一半的C++,这能算一个项目么?

我觉得没问题。

>附带一下我最近一段时间写的小程序,大家参考一下我的编码习惯和风格之类的,看看怎么样。。。

目测可以了。真的到公司里肯定要被公司的代码风格所调教。你现在能写成现在这个样子,到时候适应新风格没问题的。
  • 打赏
  • 举报
回复
应届生没项目很正常
浪2013 2012-09-28
  • 打赏
  • 举报
回复
今年的就业就是这样,用人公司一个比一个挑,要是去年,他敢这样挑吗?
ww884203 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

gui有什么好的,我前一阵用MFC用的快吐血了。。。。
[/Quote]
GUI就是这样的,以前我也学过一阵子MFC和QT,当时写的时候觉得就是几个控件拖来拖去,真没意思,也没深入学。但是写程序的时候,尤其是在WINDOWS下面写的时候老是在控制台下面写总觉得很纠结。。。LINUX下面写还好一点
另外也谢谢上面的朋友的回复!
ww884203 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

理论上来说,凡是GUI能完成的工作改用脚本都能完成,反之则不一定。
参考
http://www.autohotkey.com
http://www.nirsoft.net
另外楼主参考下面
C/C++ code
#include <algorithm>
#include <iostream>
#include <functional>
#include <cstring>
using……
[/Quote]
谢谢~不过下面的参考的,没太明白赵先生的意思。。。是展示用set完成集合操作的四个函数以及传递仿函数的用法吗?
Gloveing 2012-09-27
  • 打赏
  • 举报
回复
应届生,能这样已经算好了。。
dengyejing 2012-09-27
  • 打赏
  • 举报
回复
写控制台程序不丢人啊,大型服务器程序不都是控制台程序。关键是你对操作系统、编译器、语言机理、常用数据结构这些有没有更多的理解,还有就是拿这些基础知识去解决一些实际的应用问题。比如你上面举了个集合操作的例子,光是操作那种简单而无实际代表性的数据应该很无聊吧,你可以试下用这个数据结构去解决一下图的连通区域标记这个问题,这在游戏地图寻路里是个必备的基础操作。
fzamygsd 2012-09-27
  • 打赏
  • 举报
回复
楼主还是比较强的了
BlackGhost 2012-09-27
  • 打赏
  • 举报
回复
应届生,哪来的经验,有经验说出来也被人鄙视,大牛除外

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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