七月 26th, 2010
If you're new here, you may want to subscribe to my RSS feed. Thanks for visiting!
写在前面的话:请允许我把B教封楼作为暑假的结束。
在这样一个炎热的夏天,在这样一个飞满苍蝇的小教室里,暑假在悄悄地一点一点流淌。对我来说,它好像才刚刚开始,但也即将结束。
28号,我将再次离校,这一去,最早要到8月7号才能回来。然后呢?据说10号B教就要封楼。所以,我的暑假也就这一两天的光景了。
近期的生活就是一段高度压缩了的时间与空间,每天的同一时刻,你都在做着同样的事。每天的同一时刻,你也见证着同样的事。连续三天中午在清真食府碰到前来吃鱼香炒饼的程同学,连续三天晚饭时刻在三餐看到热衷于调侃“成哥”的孙同学。认识的,不认识的,熟的,不熟的,B教-三餐-清真-水房,就这么一群人,就这么几个地点,你天天都可以看见他们,有些人甚至一天可以看见数次。生活在瞬间萎缩。我喜欢这种感觉。
我还得再说一遍,遗憾的是,这样的生活对我来说就要结束了。
我会带着一包考研用书离开,我想我会把他们背上火车。
在hebtu,在装有空调的机房里,我同样可以掏出陈文灯的复习指南,翻开张剑的真题解析,但我找不回在这里挥汗如雨的感觉了,我也没有机会赶苍蝇了,坐在我身边的也不会是熟悉的他们和陌生的他们。我也不会在每个早上的七点排在一队人身后,等待我的馒头夹菜与加糖豆浆。我真的喜欢吃这些,虽然这样的生活才过了三天而已。
真的,这个暑假好短。

(附图:classroom of hebtu 摄于2010:07:22 21:33:41)
四月 16th, 2010
真的要地震吗?不知道。
好久不写blog了,其实一直都想写,但是没挤出时间。
最近天灾人祸可真不少,大旱、矿难、坠机,这两天又闹地震。今天上午有同学说河北要地震,要我做好准备。。甭管震不震,今天跑到blog上露个头吧。万一震了这也算再给这个世界留下一些扯淡的文字。
现在的生活单纯的要命,就是自习。这就是单任务的生活啊。我问自己:你有多久没写过程序了?你还是一个计算机专业的学生吗?(这里欣然接受广大同学们的无情鄙视)
我的好友yang同学说,他现在不能写程序,因为他一写就要连着写好几天,而且还吃不了饭。这是真的,他太热爱编程了,一旦开工那就停不下来了,经常一天只吃一顿饭。
我现在都不知道自己想做个什么东西。以前总觉得自己这也不会那也不熟,感觉要学要练得东西简直太多了,可现在呢?貌似没感觉了。都是自习惹的祸啊。
时间强迫症越来越严重了。每天紧紧张张的忙活着,不敢有一丝懈怠,因为我受不了悠闲之后内心深深的自责。
现在养成了早起的习惯,因为一旦睡过头,我会难过一整天。
以往习惯在周末熬夜看片,现在也不敢了,因为周六周日的上午不想废掉。
每天唯一的娱乐就是听听相声(数次听着听着就在教室笑出声来),听听歌。晚上回来也没心思再干点啥了,查查邮件翻翻twitter翻翻GR到十二点二十左右关电脑,然后换到itouch上又是一阵折腾,十二点四十左右入睡。
其实晚上回来该写点程序做点东西的,但是总感觉脑子累,不想动脑。
只能把写程序当做正式的事来做,而不是日常的休闲和娱乐————我的境界还差的太远太远。
复习照计划进行。有时一想觉得自己的计划是不是有点太庞大,要是完不成怎么办。时不时听到“某某某已经复习到哪了”的消息,开始还总觉得着急,现在也没感觉了。有自己的节奏就可以了,干好自己的事,其他的别管也别想。
最后推荐一个歌唱组合,The Weepies,以及专辑《Say I Am You》,verycd上有下载。尤其推荐《Take It From Me》和《Gotta Have You》这两首歌,那感觉真是清新无比。感谢豆瓣电台让我找到了这么贴心的歌。

PS:哦,差点忘了说。前天算是经历了一个不够艳的“艳遇”吧。。现在想想只能说自习室的位置太宝贵了,无他。
PPS:没记错的话这个周末我校参加省网络技术大赛的同学们就要上战场了吧?感谢大家在参赛之余还能想起来有我这个人,由于个人原因我没能和你们一起奋斗……这里祝大家好运~~
三月 18th, 2010
一
前天一时兴起,想在itouch上跑个helloworld看看,于是就去苹果官网下载iPhone sdk。由于安装文件太大(3.05GB)而我这里网速不好,根本下不下来。后来找了实验室的同学帮忙下载。那哥们也真狠,直接用浏览器开下,啥下载工具也没用……囧
整个安装过程感觉很快,安装完毕后,照着<link>所说的进行了相关配置(否则要向苹果支付99刀才可进行真机调试)。用Interface Builder胡乱拖了几个控件上去,把编译环境调成iPhone Device-3.1.2|Release,然后Build and Go,不一会儿这个helloworld就传到itouch上了。
有图有真相:

关于编译环境的设置:




有一种想学Objective-C的冲动,不过可能没有时间。
二
最近做了做英语真题阅读。下面是目前的经验总结:
只要耐下心仔细读,文章和题目都能看懂,十五分钟左右就可以做完一篇,但是正确率并不高(目前徘徊在60%~65%)。原因在于题目的选项比较难,很多选项都比较类似,纠结半天不知道如何取舍。另外就是高度精神集中做完题后感觉脑子很累,总想歇会儿……这要是考试可不就菜了么。
以往我们做四六级题目,总是不仔细看文章(原因是没有时间细看),而是先看选项中的关键词,然后在原文进行查找。一般只要是原词,这个选项就是正确答案。然而在考研英语阅读中,出现文中原词的选项绝大多数都是错误的,或者与问题不相关,或者偷换概念,正确的都是些用近义词替换掉原词的选项。这也对词汇方面提出了更高的要求。
三
今天得知本学期我的跨专业选修课–新闻网页制作被老师调到了周五下午前两节。这不搞笑么,周五下午是曾哥的课,课程冲突啊。这不明摆着不让我们去上选修课啊,老师您也太体恤民情了吧。
PS:
昨天早上宿管阿姨说宿舍能上教育网了,昨天下午铁通又说宿舍可以接光纤了。
怎么回事?仿佛一夜之间进入了双线接入的小康社会。
教育网这两天免费试用,目前只是有线,还说过一段就会开通无线(莫非我所搜到的Chinamobile_Jmdx_HSI、Chinamobile_Jmdx_CERNET就是干这个用的?)。杯具的是网口藏在重达一顿(此数据有待考证)的柜子的后面时,而柜子紧贴着墙……看来是没法试用了。。
最后,推荐一篇好文:致装逼者
三月 14th, 2010
还是三道题。粗略地测试了一下,貌似没有大问题。
贴上来。
2008年的复试上机题目:
1.素数
输入一个整数,要求输出所有从1到这个整数之间个位为1的素数,如果没有则输出-1(30分)(水题吗)
#include <stdio.h>
#include <math.h>
bool judge(int n)
{
bool flag=true;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
flag=false;
break;
}
}
return flag;
}
void main()
{
int n;
scanf("%d",&n);
if(n<=11)
{
printf("%d",-1);
}
else
{
for(int i=11;i<n;i=i+10)
{
if(judge(i))
{
printf("%d ",i);
}
}
}
} |
2.旋转矩阵
任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0、90、180、270),如果不是,输出-1。
要求先输入矩阵阶数,然后输入两个矩阵,每行两个数之间可以用任意个空格分隔。行之间用回车分隔,两个矩阵间用任意的回车分隔。(60分)
#include <stdio.h>
void printMatrix(int** a,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("%s","\n");
}
}
void initMatrix(int** a,int n)
{
for(int i=0;i<n;i++)
{
a[i]=new int [n];
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
}
bool zero(int** a,int** b,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]==b[i][j])
continue;
else
return false;
}
}
return true;
}
bool ninety(int** a,int** b,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]==b[j][n-1-i])
continue;
else
return false;
}
}
return true;
}
bool reverse(int** a,int** b,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]==b[n-1-i][n-1-j])
continue;
else
return false;
}
}
return true;
}
bool counterninety(int** a,int** b,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]==b[n-1-j][i])
continue;
else
return false;
}
}
return true;
}
void main()
{
int m=0,n=0;
scanf("%d",&n);
scanf("%d",&m);
int** m1=new int* [n];
int** m2=new int* [m];
initMatrix(m1,n);
initMatrix(m2,m);
if(m!=n)
{
printf("%d",-1);
}
else if(zero(m1,m2,n))
{
printf("%d",0);
}
else if(ninety(m1,m2,n))
{
printf("%d",90);
}
else if(reverse(m1,m2,n))
{
printf("%d",180);
}
else if(counterninety(m1,m2,n))
{
printf("%d",270);
}
else
{
printf("%d",-1);
}
} |
3.字符串匹配
从string.in中读入数据,然后用户输入一个短字符串。要求查找string.in中和短字符串的所有匹配,输出行号、匹配字符串到string.out文件中。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。(60分)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//认为[]只能匹配一个字符
char getNewStarter(char *t,int j)
{
while(t[j]!=']')
j++;
return t[j+1];
}
bool find(char *s,char *t,int start,int& end)
{
int i=start,j=0;
end=start;
while(t[j]&&s[i])
{
if(tolower(s[i])==tolower(t[j]))
{
i++;
j++;
}
else if(t[j]=='[')
{
if(tolower(s[i])==tolower(getNewStarter(t,j)))//fanjunishere fan[89]jun和[89]fanjun
{
while(t[j]!=']')
j++;
i++;
j=j+2;
}
else if(getNewStarter(t,j)=='\0')//fanjunishere fanjun[89]
{
end=i;
return true;
}
else{//普通情况
bool flag=false;
do
{
j++;
if(tolower(t[j])==tolower(s[i]))
{
flag=true;
}
}while(t[j]!=']');
if(!flag)
{
return false;
}
else
{
i++;
j++;
}
}
}
else
{
return false;
}
}
if(t[j]=='\0'||t[j]=='[')//doyouknowfanjun fanjun[89]
{
end=i;
return true;
}
else
{
return false;
}
}
void main()
{
char input[50];
scanf("%s",input);
FILE *fp1,*fp2;
if ((fp1=fopen("string.in","r"))==NULL)
{
printf("cannot open file\n");
return;
}
fp2=fopen("string.out","w");
char buff[50];
int line=1;
while(fgets(buff,50,fp1)>0)
{
for(unsigned int i=0;i<strlen(buff);i++)
{
int end;
if(find(buff,input,i,end))
{
fprintf(fp2,"%d ",line);
for(int j=i;j<end;j++)
fprintf(fp2,"%c",buff[j]);
fprintf(fp2,"%s","\n");
}
}
line++;
}
} |
总结一下,字符串是重点。
三月 11th, 2010
今天上午逃掉了选修课,意外的找到了几道北航复试的上机题,特地拿来做一做。
感觉还是有些棘手,发现自己对C/C++十分不熟,尤其是文件的操作,在Google了一阵子之后才搞定之。要知道,考试的时候是没有Google可以用的。。
下面把题和我的解答贴上来。
2009年的复试上机题目:
1 给出立方根的逼近迭代方程 y(n+1) = y(n)*2/3 + x/(3*y(n)*y(n)),其中y0=x.求给定的x经过n次迭代后立方根的值
要求:double精度,保留小数点后面六位。(送分题)
输入:x n
输出:迭代n次后的立方根
sample
input: 3000000 28
output:144.224957
#include <stdio.h>
void main()
{
int n;
double x;
scanf("%lf",&x);
scanf("%d",&n);
double y0=x;
int i;
double y;
for(i=0;i<n;i++)
{
y=y0*2/3+x/(3*y0*y0);
y0=y;
}
printf("%lf",y);
} |
2 数组排序
输入一个数组的值,求出各个值从小到大排序后的次序。
输入:输入的第一个数为数组的长度,后面的数为数组中的值,以空格分割
输出:各输入的值按从小到大排列的次序。
sample
input:
4
-3 75 12 -3
output:
1 3 2 1
#include <iostream>
using namespace std;
struct Node
{
int data;
int seq;
Node *next;
};
void printLinkList(Node *p)
{
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
}
int main()
{
int n;
int i,j;
Node *head,*p,*t;
cin>>n;
Node **list=new Node* [n];
head=new Node();//头结点
head->next=NULL;
t=head;
for(i=0;i<n;i++)//读入数据
{
p=new Node();
cin>>p->data;
p->next=NULL;
t->next=p;
t=p;
list[i]=t;
}
for(i=0;i<n-1;i++)//排序
{
for(j=1;j<n-i;j++)
{
if(list[j-1]->data>list[j]->data)
{
Node *temp=list[j-1];
list[j-1]=list[j];
list[j]=temp;
}
}
}
int record;
for(i=0;i<n;i++)//计算次序
{
if(i==0)
{
list[i]->seq=1;
}
else if(list[i]->data==list[i-1]->data)
{
list[i]->seq=list[i-1]->seq;
}
else if(list[i]->data>list[i-1]->data)
{
list[i]->seq=list[i-1]->seq+1;
}
if(list[i]==head->next)
{
record=i;
}
}
p=list[record];
while(p)//输出
{
cout<<p->seq<<" ";
p=p->next;
}
return 0;
} |
3 字符串的查找删除
给定文件filein.txt 按要求输出fileout.txt。
输入: 无空格的字符串
输出: 将filein.txt删除输入的字符串(不区分大小写),输出至fileout.txt
sample
输入:in
输出:将filein.txt 中的In、IN、iN、in删除,每行中的空格全部提前至行首,输出至fileout.txt
filein.txt中的值为:
#include
int main()
{
printf(" Hi ");
}
输出的fileout.txt为
#clude
tma()
{
prtf("Hi");
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void del(char str[],int delPos,int len)
{
int n=strlen(str);
int i;
for(i=delPos;i<n-len;i++)
{
str[i]=str[i+len];
}
str[i]='\0';
}
bool find(char *s,char *t,int start)
{
int n=strlen(t)+start;
for(int i=start;i<n;i++)
{
if(tolower(s[i])==tolower(t[i-start]))
continue;
else
break;
}
if(i==n)
return true;
else
return false;
}
void main()
{
char toDel[20];
scanf("%s",&toDel);
unsigned nDel=strlen(toDel);
FILE *fp1,*fp2;
if ((fp1=fopen("filein.txt","r"))==NULL)
{
printf("cannot open file\n");
return;
}
fp2=fopen("fileout.txt","w");
char buff[50];
while(fgets(buff,50,fp1)>0)
{
int *pos=new int [strlen(buff)];
int *posType=new int [strlen(buff)];
unsigned int p=0;
unsigned int i,k;
unsigned int nSpace=0;
for(i=0;i<strlen(buff);i++)
{
if(buff[i]==' ')
{
nSpace++;
pos[p]=i;
posType[p]=0;
p++;
}
else if(find(buff,toDel,i))
{ pos[p]=i;
posType[p]=1;
p++;
}
}
unsigned hasdel=0;
for(k=0;k<p;k++)
{
if(posType[k]==0)
{
del(buff,pos[k]-hasdel,1);
hasdel++;
}
else
{
del(buff,pos[k]-hasdel,nDel);
hasdel=hasdel+nDel;
}
}
if(nSpace>0)
{
for(k=0;k<nSpace;k++)
{
fprintf(fp2,"%s"," ");
}
}
fprintf(fp2,"%s",buff);
}
fclose(fp1);
fclose(fp2);
} |
关于第二题我得说明一下。个人感觉这个题需要一定的技巧。虽然思路很简单,但是用最笨的方法无疑很低效。因此我是这样处理的:
首先将原数据存在一个链表中,然后把链表各个节点的地址存在一个数组中,这样就把链式结构“转化”为顺序结构。然后根据节点的数值域(data)对这个一位数组进行从小到大的排序,根据递增的顺序很容易填充每个节点的次序域(seq)。这个数组标志着链表中各个节点的地址,注意这些节点的内容并没有变化,变化的只是他们在数组中的顺序。在数组中找到链表的第一个节点,根据其指针域就可依次找到后继节点,这样访问就比单纯的查询要高效。
大家应该还有比我这好的多的方法,欢迎指教。