The C Program Language 第二版 专题(·1)

来源:互联网 发布:linux安装vmware tools 编辑:程序博客网 时间:2024/05/07 00:25

接下来的所有The C Program Language 第二版 课后习题 以及所有读书心得都会保存在这里。

希望对想我一样的新手有帮助;也欢迎高手们指正。

我会慢慢的往上传的,评论后也是可以修改的。

练习1-1   在你自己的系统中运行“hello, world”程序。再有意去掉程序中的部分
内容,看看会得到什么出错信息。

 //即使是这么小的程序有时候也会出问题,搞懂这道题我明白了一件事:不要自以为是,要认真。

#include <stdio.h>
void main()
{
     printf("hello,world!\n");
     getchar();
}    
总结:首先编译时报错,因为main根本不应该 返回void ,这是在论坛发帖子时某高手指出了。

个人认为1-2没太大意义,所以没做

练习1-3 修改温度转换程序,使之能在转换表的顶部打印一个标题

#include <stdio.h>

/* 当fahr是0、20、40,...,300时,分别打印华氏温度与
摄氏温度的对照表,华氏温度对摄氏温度转换公式为:
     C为摄氏温度  F为华氏温度   C=5/9(F-32)       */
 
void main()
{
     float   fahr,celsius;
     float    lower,upper,step; 
     
     lower=0;            /*  lower 是下限   */
     upper=300;          /*  upper是上限    */
     step=20;            /*  step是步长     */
    
     fahr=lower;
     printf("\t\t      华氏温度--摄氏温度\n\n");
     while(fahr<=upper)
          {celsius=5*(fahr-32)/9;   /*这里不完全按照公式是因为
                              5/9的到的结果是0,所有结果都会是0*/
           printf("\t\t\t%3.0f\t%6.2f\n",fahr,celsius);
           fahr=fahr+step;
          }
          getchar();
}

//练习1-3 主要是打程序,没太大难度,不怎么需要解释,主要可以加些练习格式改动-使看上去更规范

练习1-4 编写一个程序打印摄氏温度转换为相应华氏温度的转换表。

#include <stdio.h>

/* 当fahr是0、20、40,...,300时,分别打印华氏温度与
摄氏温度的对照表,华氏温度对摄氏温度转换公式为:
     C为摄氏温度  F为华氏温度   C=5/9(F-32)       */
 
void main()
{
     float   fahr,celsius;
     float    lower,upper,step; 
     
     lower=0;            /*  lower 是下限   */
     upper=300;          /*  upper是上限    */
     step=20;            /*  step是步长     */
    
     celsius=lower;
     printf("\t\t      摄氏温度--华氏温度\n\n");
     while(celsius<=upper)
          {fahr=celsius*9/5+32;      /*这里不完全按照公式是因为
                                                          5/9的到的结果是0,所有结果都会是0*/
           printf("\t\t\t%3.0f\t%6.2f\n",celsius,fahr);
           celsius=celsius+step;
          }
          getchar();
}

//怎么说呢,这个还是挺有意思的,主要是照着公式写换算那部分需要注意 类型转换方面的事,不懂没关系,看到后面类型转换就可以知道什么意思了,这里不懂可以跳过,

也可以自己改变下看看结果

 

练习1-5 修改温度转换程序,要求以逆序(即按照从300 度到0 度的顺序)打印温
度转换表。

#include <stdio.h>

/* 当fahr是0、20、40,...,300时,分别打印华氏温度与
摄氏温度的对照表,华氏温度对摄氏温度转换公式为:
     C为摄氏温度  F为华氏温度   C=5/9(F-32)       */
    
#define lower 0.00     /*  lower 是下限   */
#define upper 300.00   /*  upper是上限    */
#define step 20        /*  step是步长     */

void main()
{
     float   fahr,celsius; 
     printf("\t\t      摄氏温度--华氏温度\n\n");
     for(celsius=upper;celsius>=lower;celsius=celsius-step)
         /*这里不完全按照公式是因为5/9的到的结果是0,
           所有结果都会是0*/
           printf("\t\t\t%3.0f\t%6.0f\n",celsius,celsius*9/5+32);
          
          getchar();
}

另::1-5节书上的程序,好奇想验证点东西

/*getchar与putchar读写输入输出联系,主要看看 打一个字符是马上输出一个还是 打很多字符后一起输出,-
输入到哪里(或者说输入什么字符转去输出)?    结果是:输入N多字符后+回车后,转去输出N多字符(N的字符数目相同)*/
#include <stdio.h>
/* copy input to output;1st version*/
int main()
{  int c;
 
   c=getchar();
    while(c!=EOF){
          putchar(c);
          c=getchar();
}     
}

//只要有一定的C基础,应该没难度,呵呵,倒是书里面的1-5节源程序有点意思

练习1-6 验证表达式getchar() != EOF的值是0还是1。

这个是1-6练习的答案,以前发过帖子:
http://topic.csdn.net/u/20110123/13/2d36178d-4b17-4d57-b76c-a9f9566ce401.html

#include <stdio.h>
/* 将每一个输入的字符直接输出显示*/
int main()
{  int c;
    printf("(getchar()!=EOF)=%d\n",c=getchar()!=EOF);
    scanf("%d",&c);
}

//写着程序倒没什么难度,可是郁闷的是编译总是通不过,后来在论坛上提问来着,最后才发现又是我自己粗心,将文件存成.CPP的C++文件了,所以程序总报错

····························11年07月04日21:04,今天就写到这里了,前面的都是以前写完成很长时间的程序。      北京的天儿真热,早点洗洗睡吧。··················································

 

练习1-21    编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词
之间的间隔不变。假设制表符终止位的位置与练习1-20 的detab程序的情况相同。当使用一
个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪一种替换字符比较好?

 跨度有点大

#include <stdio.h>
#define N 10
#define TABbit  8
void entab(int spN,int chN);

main()
{ int i,j,chN;
  char c;
      i=j=chN=0;
 while((c=getchar())!=EOF)
      {
       if(chN%N==0&&!i&&!j&&chN) printf("\\");     //防止entab()返回后而chN%N==0时,每计数一个空白符 
                                                                                   //就会输出一个‘\‘,没有i==0和j==0时就会出现这种情况
       if(c==' '|| c=='\t')
          if(c==' ') i++;
             else     j++;
         else if(i==0&&j==0)
                { printf("%c",c);chN++;}
                else {entab(i+j*TABbit,chN);chN+=i+j*TABbit;
                      printf("%c",c); chN++;i=j=0;}
      
       if(!(c-'\n')) chN=0;         
      }
}
 
void entab(int spN,int chN)
{
 int s=0;                                                               // s计数连续空格数,直到达到TABbit个空格,这时输出 'tab'
                                                   
 while(spN--)                                                    //最开始用--spN 时结果总是错误的
      {if(!(++s%TABbit))
          {printf("ItisaTAB");s=0;}                        //'tab'看不出来结果是TAB还是空格,用8个字符'ItisaTAB'表示 'tab'
       if(!(++chN%N)&&chN)
          {if(s>0) for(;s>0;--s) printf(" ");            //达到制表符终止位,将小于TABbit个空格输出,--s使s 值 置0,
                                                                          //表示到制表符终止位,重新计数 s
          printf("\\");
          }
       }   
 if(s) for(;s>0;s--) printf(" ");                  //当传来的spN小于TABbit时,而chN+spN的数目没有跨过制表符终止位时,就输出s个空格;
                                                                 // 或chN+spN的 数目跨过了制表符终止位时,输出制表符终止位后面没有处理的空格数。
                                                                //总之,上面while语句没处理完的空格,根据s的个数输出空格。
}

这个程序折磨我好几天,必须贴上来解恨

原创粉丝点击