《C程序设计语言》习题解<一>

回想一下,学习C语言的时间也有差不多2年了,写过的代码也有5~6万行,主要是在做ACM的练习积累的.C语言的书看了不少,不过都不是很系统,只是没有一本是完整看完了,所以写出来的代码可能不是很符合标准.前些天在亚马逊上买了Brian W.Kernighan和Dennis M.Ritchie的《C程序设计语言(第二版)》和《C程序设计语言》习题解答,这两本书非常通俗易懂,实用性比较强,可以当作手册放在手边,书里的代码也写的真的很漂亮.

在计算机发展的历史上,没有哪一种程序设计语言像C语言这样应用如此广泛.《C程序设计语言》是C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的一本介绍C语言的权威经典著作.我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本.原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础.人们熟知程序"hello world"就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课.

学习编程语言最好的方法就是用它写代码.现在下定决心,要系统的整理学习一下C语言,梳理一下以前学习的死角.我觉得现在开始把书里的习题完整的做一遍,"远大的目标”即将开始......

//练习1-1 在你自己的系统中运行"hello world"程序.
//再有一去掉程序中的部分内容,看看惠得到什么出错信息(书中第3页)
#include<stdio.h>
 
int main()
{
  printf("hello world!\n");
  return 0;
}
//练习1-3 修改温度转换程序,使之能在转换表的顶部打印一个标题.(书中第8页)
#include<stdio.h>
 
int main()
{
  printf("\t温度转换程序\n");
  float fahr,celsius;
  int lower,upper,step;
  lower = 0;
  upper = 300;
  step = 20;
  fahr = lower;
  while (fahr <= upper) {
      celsius = (5.0/9.0) * (fahr-32.0);
      printf("\t%3.0f %6.1f\n",fahr,celsius);
      fahr = fahr + step;
  }
  return 0;
}
//练习1-4 编写一个程序打印摄氏温度转换维相应华氏温度的转换表.(书中第8页)
#include<stdio.h>
 
int main()
{
  float fahr,celsius;
  int lower,upper,step;
  lower = 0;
  upper = 100;
  step = 10;
  celsius = lower;
  while (celsius <= upper) {
      fahr = (9.0/5.0) * celsius + 32.0;
      printf("\t%6.1f %3.0f\n",celsius,fahr);
      celsius += step;
  }
  return 0;
}
//练习1-5 修改温度转换程序,要求以逆序(即按照从300度到0度的顺序)打印温度转换表(书中第9页)
#include<stdio.h>
 
int main()
{
  float fahr,celsius;
  int lower,upper,step;
  lower = 0;
  upper = 300;
  step = 20;
  fahr = upper;
  while (fahr >= lower){
      celsius = (5.0/9.0) * (fahr-32);
      printf("\t%3.0f %6.1f\n",fahr,celsius);
      fahr -= step;
  }
  return 0;
}
//练习1-6 验证表达式getchar()!=EOF的值是0还是1(书中第11页)
#include<stdio.h>
 
int main()
{
  int c;
  while(c = (getchar() != EOF)) printf("%d\n",c);//连同最后的换行,会多出一个1
  printf("%d\n",getchar() != EOF);
  return 0;
}
//练习1-7 编写一个打印EOF值的程序(书中第11页)
#include<stdio.h>
 
int main()
{
  printf("%d\n",EOF);
  return 0;
}
//练习1-8 编写一个统计空格,制表符,换行符个数的程序.(书中第13页)
#include<stdio.h>
 
int main()
{
  int nspace,ntab,nline;
  char c;
  nspace = ntab = nline = 0;
  while ((c = getchar()) != EOF) {
      if (c == ' ') ++nspace;
      else if (c == '\t') ++ntab;
      else if (c == '\n') ++nline;
  }
  printf("space:%d\n",nspace);
  printf("tab:%d\n",ntab);
  printf("line:%d\n",nline);
  return 0;
}
//练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替(书中第13页)
#include<stdio.h>
#define BLANK ' '
int main()
{
  char c,last_c = 'a';
  while ((c = getchar()) != EOF) {
      if (c != BLANK) putchar(c);
      else {
          if (last_c != BLANK) {
              putchar(c);
          }
      }
      last_c = c;
  }
  return 0;
}
//练习1-10 编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,把回退符替换为\b,
//把反斜杠替换为\\.这样可以把制表符和回退符以可见的方式显示出来.(书中第13页)
#include<stdio.h>
 
int main()
{
  char c;
  while ((c=getchar())!=EOF) {
      if (c == '\t')
        printf("\\t");
      else if (c == '\b')
        printf("\\b");
      else if (c == '\\')
        printf("\\\\");
      else
        putchar(c);
  }
  return 0;
}
//练习1-12 编写一个程序,以每行一个单词的形式打印其输入(书中第15页)
 
#include<stdio.h>
#define IN 0
#define OUT 1
 
int main()
{
  char c;
  int STATE=OUT;
  while ((c = getchar()) != EOF) {
      if (c == '\t' || c == ' ' || c== '\n') {
          putchar('\n');
          STATE = OUT;
      }
      else if (STATE == OUT) {
          putchar(c);
          STATE = IN;
      }
      else
        putchar(c);
  }
  return 0;
}

先写到这里,一次写太多会腻.

最后我不得不说一下关于谭浩强教授的《C程序设计》,在很长一段时间里我一直都以为这两本书的书名是一样的.真是惭愧.

谭浩强教授的《C程序设计》我也读过(当然没有完整看完了),网络上对于这本书的评论普遍不是很好,当然有些人是人云亦云了,也许他跟本没读过.但我觉得以我们的水平没有权力也没资格对谭老先生的这本书说三道四,更不能忘记谭老先生对我国计算机普及所做的贡献.虽然书中有不少地方不符合规范.但我敢说这本书是国内出的最好的C语言入门教材,国外的教材总会夹杂很多计算机基础理论,初学者并不是很理解.在没有提及深奥的计算基础理论的情况下,写出让人懂得C语言的书,是值得肯定的.我个人觉得如果完全没有学习过C语言,从谭老先生的这本《C程序设计》开始是很不错的,有了一定基础后再来阅读《C程序设计语言》.

» 本博客采用署名 2.5 中国大陆许可协议进行许可,本文版权归作者所有,欢迎转载,但必须在明显位置给出原文连接。
anyShare分享到:

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>