科创园

科创园地,分享技术知识,为科技助力发展,贡献一己之力。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C程序设计语言学习笔记(4)

Posted on 2012-06-02 22:56  科创园  阅读(513)  评论(0编辑  收藏  举报

还记得基础(一)中提到了一点代码的简化吗??将多个连续的空格用一个空格代替的程序第二个版本。 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 }