大学的时间过得真快!
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
刚刚上完高等数学,走出丽泽楼的时候,猛然发现现在已经是星期三的下午,一个星期已经过半了。。。度过明天一天满满的课程,就又要放假三天,一个星期就这么过去了。。。好快。。。
真的没什么感觉,一个星期三分之二的课程就结束了,想想再过几个星期就要期中考试,我不禁感慨大学的时间过得真是快啊。高考完那两个月过得跟2年似的,而现在连人还没认识几个就已经过完一个多月了。。。哎,无怪乎人说大学时光很宝贵,过得这么快怎么能不宝贵呢?
该死的微软,又要打补丁,该死的网速,补丁下了2个多小时还没完。。。
中午收到卓越配送人员的短信,说书到了,于是乎我就跑去校名石拿到了我买的书,然后很随意地在学一食堂悠闲地吃完饭,走的时候戏谑地看着从励耘楼疯狂涌入学一食堂的boys and girls,我得意地笑~
卓越送书送的真是时候啊,昨天有课,明天有课,我还就今天没课,而明天那C语言正愁没事做呢,现在有书看了,哈哈,爽~
晚上还有食品营养学的选修课,我在考虑要不要走路去,恩,就这么定了,走路去好了~
输入缓冲区与C语言的流问题
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
今天发现一个问题,已经造成了溢出,需要用到传说中的fflush(stdin);来解决。先看下面的代码:
#include <stdio.h>
int main()
{
char s[10],s1[10],s2[10],s3[10];
scanf("%s",&s);
printf("%s\n",s);
scanf("%s%s%s",&s1,&s2,&s3);
printf("%s %s %s\n",s1,s2,s3);
system("pause");
return 0;
}
程序想达到这样一个目的:两次都输入Slyar is good!,第一次输出Slyar,第二次输出Slyar is good!。但是结果却不是我们期望看到的,而是:
Slyar is good!
Slyar
Slyar is good!
is good! Slyar
其中蓝色是我输入的部分,而红色是程序输出的结果,可以看到第二次程序没有输出Slyar is good!而是输出了is good! Slyar,我们来分析一下。
当我们输入Slyar is good!后,系统会把第一个空白当成结束,也就是输出Slyar,这没错。然后紧接着我们再次输入Slyar is good!,按照一般思维,应该是Slyar给了S1,is给了S2,good!给了S3,但是。。。
你看到的is good! Slyar中的is good!其实是第一次输入Slyar is good!后余留在缓冲区里的那部分!也就是说,当第一次系统截断Slyar以后,剩下的部分就留在了缓冲区,当你第二次输入后,系统就把缓冲区里的is good!分配给了S1和S2。这样,只有第三次输入的Slyar被分配给了S3,所以当我们打印S1、S2、S3时,会出现is good! Slyar
那么怎么解决这个问题呢?这就要用到fflush(stdin);了:stdin是默认的输入流文件,对应输入缓冲,而fflush(stdin);就可以清空整个输入缓冲区,本例中即把缓冲区内的is good!刷掉。所以,我们的代码应该这样写:
#include <stdio.h>
int main()
{
char s[10],s1[10],s2[10],s3[10];
scanf("%s",&s);
printf("%s\n",s);
fflush(stdin);
scanf("%s%s%s",&s1,&s2,&s3);
printf("%s %s %s\n",s1,s2,s3);
system("pause");
return 0;
}
编译运行,没问题!这点需要注意,否则极易造成溢出。
字符串大小写互转 XOR版 C语言实现
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
下午看异或运算符(XOR)时想到的这个东西,先说下作用:
当你输入"SLYar"的时候,程序会将其中的大写字母转换为小写字母,将其中的小写字母转换为大写字母,所以程序会输出"slyAR"。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
int i, len;
char str[100];
gets(str);
len=strlen(str);
for (i = 0; i < len; i++)
if (isalpha(str[i]))
{
str[i] ^= 32;
}
puts(str);
system("pause");
return 0;
}
其中用到了一个函数isalpha(),作用是判断参数是否为英文字母。当参数为英文字母a-z或A-Z时,返回非零值,否则返回零。这个函数用到的头文件是ctype.h。
下面解释核心部分 " str[i] ^= 32; "
我们知道同一个英文字母大小写的ASCII码相差32。假设我们现在有二个字母"S"和"s",大写"S"的ASCII码为83,小写"s"的ASCII码为115,我们将32、83、115的二进制码列出来。
83 1010011
32 0100000(最低位为第一位,只有第六位是1,其他位都是0)
115 1110011
我们来回顾一下异或运算符(XOR)的特点:
与0异或时,它的值不变。
与1异或时,它的值相反。
因此,对比上面的竖式,我们可以很清楚地看到,只要将英文字母ASCII码的第6位与1异或,其他位与0异或,即可实现英文字母的大小写互换。也就是让英文字母的ASCII码与32异或即可。
修改我的C/C++程序代码风格(SLYAR)
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
声明:我决定不更改自己的代码风格。(2008年10月15日)
今天看了《华为编程规范和范例》,决定修改我的代码风格,以使我的代码和国际接轨。。。
其实我蛮喜欢我自己原来的风格的,因为可以少打很多东西,新的风格需要很多空格,需要很多回车,需要很多括号。。。我是懒人,我本不想改。。。但是没办法,现在不改以后就不好改了,我知道我的代码不是只给我自己看,所以,我还是规范一些,修改我自己的风格吧。。。
《华为编程规范和范例》在Slyar的下载基地里有,hwprogram.doc,需要的可以自己下载。
列举一下我需要修改的风格:
1、相对独立的程序块之间、变量说明之后必须加空行。
以前变量之间我是加空行的,不过像if语句段这样的程序块,我是不加空行的,需要修改。
2、if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}
以前像if、for、do、while等语句的执行语句如果只有一行我就会省略{},需要修改。
3、程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
以前我习惯把"{"写在if、for等语句后面,需要修改。
4、在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。
(1) 逗号、分号只在后面加空格。
(2)比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。
(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。
(4)"->"、"."前后不加空格。
(5) if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。
5、注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
以前放上面注释了不加空行,需要修改。
6、注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
以前如果是默认优先级,就不加括号了,懒。。。需要修改。
7、尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。
8、不要一味追求紧凑的代码,因为紧凑的代码并不代表高效的机器码。
9、过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。
分配的内存不释放以及文件句柄不关闭,是较常见的错误,而且稍不注意就有可能发生。这类错误往往会引起很严重后果,且难以定位。
10、时刻注意表达式是否会上溢、下溢。
快速排序(QuickSort)算法 C语言实现
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
下午做题的时候用到了快速排序(QuickSort),只不过这次换成C语言实现。草草写了一个,感觉很乱,改。。。改完还乱。。。继续改。。。最后结果就是如下这个快速排序(QuickSort)算法的C语言实现。
void qsort(int s[], int l, int r)
{
int i, j, x;
if (l < r)
{
i = l;
j = r;
x = s[i];
while (i < j)
{
while(i < j && s[j] > x) j--;/* 从右向左找第一个小于x的数 */
if(i < j) s[i++] = s[j];
while(i < j && s[i] < x) i++;/* 从左向右找第一个大于x的数 */
if(i < j) s[j--] = s[i];
}
s[i] = x;
qsort(s, l, i-1);/* 递归调用 */
qsort(s, i+1, r);
}
}
我的这个算法实现是每次从数组头部取数字作为基准,看起来好理解一些,呵呵~我是这么认为的。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
快速排序(QuickSort)的最坏时间复杂度应为0(n2),最好时间复杂度为O(nlgn),平均时间复杂度为O(nlgn)。快速排序(QuickSort)在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为O(lgn),故递归后需栈空间为O(lgn)。最坏情况下,递归树的高度为O(n),所需的栈空间为O(n)。
搜索引擎转向代码,让新站IP数暴涨
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
假设你有网站A,以下代码可以使从域名访问网站A正常,而从百度、Google、雅虎搜索进入网站A的来源全部转向到http://www.slyar.com,使得后者的IP大大提升。
有兴趣的人可以自己试试。
<script>
var slyar=document.referrer
if(slyar.indexOf("baidu")>0)
self.location="http://www.slyar.com";
else if(slyar.indexOf("yahoo")>0)
self.location="http://www.slyar.com";
else if(slyar.indexOf("google")>0)
self.location="http://www.slyar.com";
</script>











