《The C Programming Language》答案(第一章)

《The C Programming Language》答案(第一章)

P1

#include <stdio.h>
main()
{
  printf("hello, world\n");
}

P2

warning: unknown escape sequence: '\c'

P3

#include <stdio.h>
main()
{
  float fahr,celsius;
  float lower,upper,step;
  lower = 0;
  upper = 300;
  step = 20;
  fahr = lower;
  printf("fahr celsius\n");
  while(fahr<=upper){
    celsius = (5.0/9.0)*(fahr-32.0);
    printf("%3.0f %6.1f\n",fahr,celsius);
    fahr = fahr+step;
  }
}

P4

#include <stdio.h>
main()
{
  float fahr,celsius;
  float lower,upper,step;
  lower = 0;
  upper = 300;
  step = 20;
  celsius = lower;
  printf("celsius fahr\n");
  while(celsius<=upper){
    //celsius = (5.0/9.0)*(fahr-32.0);
    fahr=(9.0/5.0)*celsius+32.0;
    printf("%3.0f %6.1f\n",celsius,fahr);
    celsius = celsius+step;
  }
}

P5

#include <stdio.h>
main()
{
  float fahr,celsius;
  float lower,upper,step;
  lower = 0;
  upper = 300;
  step = 20;
  fahr = upper;
  printf("fahr celsius\n");
  for(fahr;fahr>=lower;fahr-=step){
    celsius = (5.0/9.0)*(fahr-32.0);
    //fahr=(9.0/5.0)*celsius+32.0;
    printf("%3.0f %6.1f\n",fahr,celsius);
    //celsius = celsius+step;
  }
}

P6

#include <stdio.h>
//the answer is 1
main()
{
  printf("%d\n",getchar()!=EOF);
}

P7

#include <stdio.h>
//the answer is -1
main()
{
  printf("%d\n",EOF);
}

P8

#include <stdio.h>
//press ctrl+Z in windows, ctrl+D in Linux
main()
{
  int tmp,emptyCount,tableCount,lineCount;
  emptyCount=0;
  tableCount=0;
  lineCount=0;
  while(1){
    tmp=getchar();
    if(tmp==EOF)
      break;
    if(tmp==' ')
      ++emptyCount;
    if(tmp=='\t')
      ++tableCount;
    if(tmp=='\n')
      ++lineCount;
  }
  printf("Empties: %d\nTables: %d\nLines: %d\n",emptyCount,tableCount,lineCount);
}

P9

#include <stdio.h>
//ctrl+Z in windows, ctrl+D in Linux to end the input
main(void)
{
    int c, blank_flag;
    blank_flag = 0;
    while (1){
      c = getchar();
      if(c==EOF)
        break;
      if (c == ' ') {
          if (!blank_flag) {
              blank_flag = 1;
              putchar(c);
          }
      } else {
          blank_flag = 0;
          putchar(c);
      }
    }
}

P10

#include <stdio.h>
//ctrl+Z in windows, ctrl+D in Linux to end the input.
main(void)
{
    int c;
    while (1){
      c = getchar();
      if(c==EOF)
        break;
      if (c == '\t')
          printf("\\t");
      else if (c == '\b')
          printf("\\b");
      else if (c == '\\')
          printf("\\\\");
      else
          printf("%c", c);
    }
}

P11

行首空格,空行

P12

#include <stdio.h>
//ctrl+Z in windows, ctrl+D in Linux to end the input
int main(void)
{
    int c, lineflag;
    lineflag = 0;
    while (1){
      c = getchar();
      if(c==EOF)
        break;
      if (c == ' ' || c == '\t' || c == '\n') {
          if (!lineflag) {
              putchar('\n');
              lineflag = 1;
          }
      } else {
          putchar(c);
          lineflag = 0;
      }
    }
    return 0;
}

P13

#include <stdio.h>

#define MAX_LENGTH 15
#define IN_WORD 1
#define OUT_WORD 0

int main(void)
{
    int c, word_in_flag;
    int word_length[MAX_LENGTH + 1];
    int l;
    int i, j;
    unsigned int max_count;
    for (i = 0; i <= MAX_LENGTH; ++i)
        word_length[i] = 0;
    word_in_flag = OUT_WORD;
    while (1) {
        c = getchar();
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            if (word_in_flag == OUT_WORD) {
                l = 0;
                word_in_flag = IN_WORD;
            }
            ++l;
        } else {
            if (word_in_flag == IN_WORD) {
                if (l <= MAX_LENGTH)
                    ++word_length[l - 1];
                else
                    ++word_length[MAX_LENGTH];
                word_in_flag = OUT_WORD;
            }
            if (c == EOF)
                break;
        }
    }
//horizon
    for (i = 0; i <= MAX_LENGTH; ++i) {
        if (i != MAX_LENGTH)
            printf("     %2d | ", i + 1);
        else
            printf("    >%2d | ", MAX_LENGTH);
        for (j = 0; j < word_length[i]; ++j)
            putchar('+');
        putchar('\n');
    }
//vertical
    max_count = 0;
    for (i = 0; i <= MAX_LENGTH; ++i)
        if (word_length[i] > max_count)
            max_count = word_length[i];
    for (i = 0; i < max_count; ++i) {
        printf("  %2u | ", max_count - i);
        for (j = 0; j <= MAX_LENGTH; ++j)
            if (word_length[j] >= max_count - i)
                printf("  +");
            else
                printf("   ");
        printf("\n");
    }
    printf(" ------");
    for (i = 0; i <= MAX_LENGTH; ++i)
        printf("---");
    printf("--\n");
    printf("       ");
    for (i = 0; i < MAX_LENGTH;)
        printf(" %2u", ++i);
    printf(" >%2u", MAX_LENGTH);
    printf("\n");
    return 0;
}

P14

#include <stdio.h>
#define NUM_CHARS 128
#define IN_WORD 1
#define OUT_WORD 0
//ctrl+Z in windows, ctrl+D in Linux to finish input
int main(void)
{
    int c;
    int char_frequencies[NUM_CHARS + 1];
    int i;
    for (i = 0; i <= NUM_CHARS; ++i)
        char_frequencies[i] = 0;
    while ((c = getchar()) != EOF)
        ++char_frequencies[c];
    printf("\n ASCII | Count\n");
    for (i = 0; i <= NUM_CHARS; ++i) 
        if (char_frequencies[i] > 0)
            printf(" %5d : %5d\n", i, char_frequencies[i]);
    return 0;
}

P15

P16

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int get_line(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
int main(void)
{
    int len; /* current line length */
    int max; /* maximum length seen so far */
    char line[MAXLINE]; /* current input line */
    char longest[MAXLINE]; /* longest line saved here */
    max = 0;
    while ((len = get_line(line, MAXLINE)) > 0)
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    if (max > 0) {
        printf("The longest line is:\n");
        printf("%s\n", longest);
        printf("The length of it is %d.\n", max);
    }
    return 0;
}
/* get_line: read a line into s, return length */
int get_line(char s[], int lim)
{
    int c, i, l;
    for (i = 0, l = 0; (c = getchar()) != EOF && c != '\n'; ++i) {
        if (i < lim - 1)
            s[l++] = c;
    }
    if (c == '\n') {
        if (l < lim - 1)
            s[l++] = c;
        ++i;
    }   
    s[l] = '\0';
    return i;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
    int i;
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

P17

#include <stdio.h>
#define MAXLINE 1000
#define MAXLENGTH 10
int get_line(char s[],int lim){
  int c,i,l;
  for(i=0,l=0;(c=getchar())!=EOF&&c!='\n';++i){
    if(i<lim-1)
      s[l++]=c;
  }
  if(c=='\n')
    if(l<lim-1)
      s[l++]=c;
  s[l]='\0';
  return l;
}
int main(){
  int len;
  char line[MAXLINE];
  while((len=get_line(line,MAXLINE))>0)
    if(len>MAXLENGTH)
      printf("%s\n",line);
  return 0;
}

P18

#include <stdio.h>
#define MAXLINE 1000
#define MAXLENGTH 10
int get_line(char s[],int lim){
  int c,i,l;
  for(i=0,l=0;(c=getchar())!=EOF&&c!='\n';++i){
    if(i<lim-1)
      s[l++]=c;
  }
  if(c=='\n')
    if(l<lim-1)
      s[l++]=c;
  s[l]='\0';
  return l;
}
int main(){
  int len;
  char line[MAXLINE];
  while((len=get_line(line,MAXLINE))>0){
    if(len==1&&line[0]=='\n')
      continue;
    printf("%s\n",line);
  }
  return 0;
}

P19

#include <stdio.h>
#define MAXLINE 1000
#define MAXLENGTH 10
int get_line(char s[],int lim){
  int c,i,l;
  for(i=0,l=0;(c=getchar())!=EOF&&c!='\n';++i){
    if(i<lim-1)
      s[l++]=c;
  }
  if(c=='\n')
    if(l<lim-1)
      s[l++]=c;
  s[l]='\0';
  return l;
}
int reverse(char s[]){
  int i,j;
  int tmp;
  for(j=0;s[j]!='\0';++j)
    ;
  --j;
  if(s[j-1]=='\n')
    --j;
  for(i=0;i<j;++i,--j){
    tmp = s[i];
    s[i] = s[j];
    s[j] = tmp;
  }
}
int main(){
  int len;
  char line[MAXLINE];
  while((len=get_line(line,MAXLINE))>0){
    reverse(line);
    printf("%s\n",line);
  }
  return 0;
}

P20

#include <stdio.h>
#define MAXLINE 1000
#define TAB_WIDTH 4
int getchars(char s[],int lim){
  int c,i,l;
  for(i=0,l=0;(c=getchar())!=EOF&&c!='\n';++i)
    if(i<lim-1)
      s[l++]=c;
    s[l] = '\0';
    return l;
}
void detab(char s1[],char s2[],int tabwidth){
  int i,j,l,c,blanks;
  i=0;
  l=0;
  while((c=s1[i++])!='\0'){
    if(c=='\t'){
      blanks = tabwidth-1%tabwidth;
      for(j=0;j<blanks;++j)
        s2[l++]=' ';
    }else{
      s2[l++]=c;
    }
  }
  s2[l]='\0';
}
int main(){
  char s1[MAXLINE];
  char s2[MAXLINE];
  while(getchars(s1,MAXLINE)==0)
    ;
  detab(s1,s2,TAB_WIDTH);
  printf("%s\n",s2);
  return 0;
}

P21

#include <stdio.h>
#define MAXLINE 1000
#define TAB_WIDTH 8
int getchars(char s[],int lim){
  int c,i,l;
  for(i=0,l=0;(c=getchar())!=EOF&&c!='\n';++i)
    if(i<lim-1)
      s[l++]=c;
    s[l] = '\0';
    return l;
}
void entab(char s1[],char s2[],int w){
  int i,j,l,c,blanks;
  int blanksenough;
  i=0;
  l=0;
  while((c=s1[i])!='\0'){
    if(c==' '){
      blanksenough = 1;
      blanks = w-i%w;
      for(j=1;j<blanks;++j)
        if(s1[i+j]!=' '){
          blanksenough = 0;
          break;
        }
      if(blanksenough){
        s2[l++]='\t';
        i+=blanks-1;
      }else{
        s2[l++]=c;
      }
    }else{
      s2[l++]=c;
    }
    ++i;
  }
  s2[1] = '\0';
}
int main(){
  char s1[MAXLINE];
  char s2[MAXLINE];
  while(getchars(s1,MAXLINE)==0)
    ;
  entab(s1,s2,TAB_WIDTH);
  printf("%s\n",s2);
  return 0;
}

P22

#include <stdio.h>
#define MAXLINE 1000
#define TAB_WIDTH 8
#define LINE_WIDTH 10
int getchars(char s[],int lim){
  int c,i,l;
  for(i=0,l=0;(c=getchar())!=EOF&&c!='\n';++i)
    if(i<lim-1)
      s[l++]=c;
    s[l] = '\0';
    return l;
}
void fold(char s1[],char s2[],int linewidth,int tabwidth){
  int i,l,c,k,w;
  w=0;
  k=-1;
  i=l=0;
  while((c=s1[i])!='\0'){
    if(c==' '){
      if(w+1==linewidth){
        s2[l++]='\n';
        w=0;
        i=k;
      }else{
        s2[l++]=' ';
        ++w;
      }
    }else if(c=='\t'){
      if(w+tabwidth-w%tabwidth>=linewidth){
        s2[l++]='\n';
        w=0;
        i=k;
      }else{
        s2[l++]='\t';
        w+=tabwidth;
      }
    }else{
      s2[l++]=c;
      if(w+1==linewidth){
        s2[l++]='\n';
        w=0;
      }else{
        k=i;
        ++w;
      }
    }
    ++i;
  }
  s2[l++]='\0';
}
int main(){
  char s1[MAXLINE];
  char s2[MAXLINE];
  while(getchars(s1,MAXLINE)==0)
    ;
  fold(s1,s2,LINE_WIDTH,TAB_WIDTH);
  printf("%s\n",s2);
  return 0;
}

P23

#include <stdio.h>
#define MAXLENGTH 5000
//ctrl+Z in windows, ctrl+D in Linux to end the input
int _getline(char s[], int max)
{
    int c, i, l;
    for (i = 0, l = 0; (c = getchar()) != EOF; ++i)
        if (i < max - 1)
            s[l++] = c;
    s[l] = '\0';
    return l;
}
int main(void)
{
    int len, i;
    char s[MAXLENGTH];
    while ((len = _getline(s, MAXLENGTH)) > 0) {
        i = 0;
        while (s[i] != '\0') {
            if (s[i] == '/' && s[i+1] == '/') {
                i += 2;
                while (s[i] != '\n' && s[i] != '\0')
                    ++i;
            } else if (s[i] == '/' && s[i+1] == '*') {
                i += 2;
                while (s[i] != '\0' && s[i+1] != '\0' && (s[i] != '*' || s[i+1] != '/'))
                    ++i;
                if (s[i] != '\0' && s[i+1] == '\0')
                    ++i;
                if (s[i] == '*')
                    i += 2;
            } else if (s[i] == '\"') {
                putchar('\"');
                ++i;
                while (s[i] != '\0' && (s[i-1] == '\\' || s[i] != '\"'))
                    putchar(s[i++]);
            } else {
                putchar(s[i++]);
            }
        }
    }    
    return 0;
}

P24

太长不写,括号匹配可以用栈实现。

第一章 完

发布了123 篇原创文章 · 获赞 76 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/swy_swy_swy/article/details/105334981