还记得基础(一)中提到了一点代码的简化吗??将多个连续的空格用一个空格代替的程序第二个版本。 flag = (c != ' ');
由于本人的c语言水平有限,还谈不上能分析代码的优化功能,目前就以简化来分析自己c语言心得。
这篇只是简单的介绍一下可以用简洁的语言来实现功能,锻炼我们的c语言思维能力。
先看一个病毒程序,哈哈哈!!!也算是自己近期学习c语言的一个小成就吧,嘻嘻!是很简单哦~~~~~,不过提醒尽量要在自己的电脑测试,呵呵~~~~不要干坏事哦
1 #include <stdio.h> 2 int main() 3 { 4 while(1) 5 { 6 printf("a,\a\n");//报警的转义符\a 7 } 8 return 0; 9 }
好了,编译执行试试看吧!!!肯定会有人不信啦~~~~~
够简单吧!!!!!
下面我们来看看我们如何实现简化我们的代码。
编写程序计算
Formula: Celsius=(5/9)(Fahrenheit -32)
1 #include <stdio.h> 2 int main() 3 { 4 float fahr,cles; 5 float lower=0; 6 float upper=300; 7 float step=20; 8 printf("C F\n\n"); 9 /*while 实现 10 fahr = lower; 11 while(fahr<=upper) 12 { 13 cles = (5.0/9.0)*(fahr-32); 14 printf("%3.1f %6.1f\n",cles,fahr); 15 fahr +=step; 16 }*/ 17 18 //用for实现 19 for(fahr=0;fahr<=upper;fahr+step) 20 { 21 cles = (5.0/9.0)*(fahr-32); 22 printf("%3.1f %6.1f\n",cles,fahr); 23 fahr +=step; 24 } 25 return 0; 26 }
我们看到,用for或者while循环可以轻松实现功能,那么有没有更简洁的写法呢??思考后:
1 float fahr; 2 printf("C F\n"); 3 for(fahr=0;fahr<=300;fahr=fahr+20) 4 printf("%3.1f %6.1f\n",(5.0/9.0)*(fahr-32),fahr); 5 return 0;
通过for循环实现了一个简化后的功能。这里我们需要理解for的“三部曲”(初始化,条件判断,执行)。
以后我们会看到c语言的三种控制流:顺序,选择,循环。
从c语言的基本语法、基本数据类型、数组、函数、控制流等,我们可以写一些规模较大的程序了。。。。附上一个练习:
c语言之绘制直方图:
编写一个程序,打印输入单词长度的直方图
/*
思路:将单词长度分别为1、2、3、、、放入到一个数组中。并初始化为0;
先统计出每个单词的长度以及每个长度的单词出现的次数。然后用双重循环分别扫描x轴和y轴绘制直方图
*/
View Code
1 #include <stdio.h> 2 #define MAXWORDLEN 10 /*定义单词的最大长度*/ 3 #define IN 1 /*在单词中*/ 4 #define OUT 0 /*在单词外*/ 5 6 /**/ 7 int main() 8 { 9 while(1){ 10 int i,c,wordlen,overflow,thisval,thisidx,maxval; 11 wordlen=0; 12 overflow=thisval=thisidx=maxval=0; 13 int state; //判断输入的新字符是在单词中还是单词外 14 int flag=1;//判断 是否完成一个单词的输入(如果去掉这个标志,当出现多个回车符时会出错) 15 state = OUT; 16 int lenArr[MAXWORDLEN]; //存放每个单词长度的数字,最大为宏定义10 17 for(i=0;i<MAXWORDLEN;i++) 18 lenArr[i]=0; //给每个单词长度初始化为0 19 20 while((c=getchar())!=EOF) 21 { 22 /*统计长度为1-10的单词个数,让*/ 23 if(c==' '||c=='\t'||c=='\n') 24 { 25 state = OUT; 26 if(wordlen<=MAXWORDLEN) 27 { 28 if(wordlen>0) 29 { 30 if(flag==1) 31 { 32 flag=0; 33 thisval = ++lenArr[wordlen-1]; 34 if(thisval>maxval) 35 { 36 maxval=thisval; 37 } 38 } 39 40 } 41 } 42 /*统计长度为大于10的单词个数*/ 43 else 44 { 45 thisval = ++lenArr[MAXWORDLEN]; 46 if(thisval>maxval) 47 { 48 maxval=thisval; 49 } 50 } 51 } 52 /*如果遇到了在单词外,即遇到空格*/ 53 else if(state==OUT) 54 { 55 flag=1; 56 state =IN; 57 wordlen=1; 58 } 59 /*没遇到空格,又在单词里面,让单词的长度自增*/ 60 else 61 { 62 ++wordlen; 63 } 64 } 65 /*分别扫描x和y,绘制直方图*/ 66 for(thisval=maxval;thisval>0;thisval--) 67 { 68 printf("%4d|",thisval); 69 for(thisidx=0;thisidx<=MAXWORDLEN;thisidx++) 70 { 71 if(lenArr[thisidx]>=thisval) 72 { 73 printf("* "); 74 75 } 76 else 77 { 78 printf(" "); 79 80 } 81 } 82 printf("\n"); 83 84 } 85 86 printf(" +"); 87 for(thisval=0;thisval<=MAXWORDLEN;thisval++) 88 { 89 printf("---"); 90 91 } 92 printf("\n "); 93 94 95 for(thisval=0;thisval<MAXWORDLEN;thisval++) 96 { 97 printf("%2d ",thisval+1); 98 99 } 100 printf(">%d\n",MAXWORDLEN); 101 } 102 return 0; 103 }
自从看到一个命令在我的手下,蹦的一下------------我就笑了