《C程序设计语言》-第3章-习题

  由于第3章第一题网上有很多种非常优秀的解法,我就不贴出来了,大家不妨自己探索。

  练习3-2 编写一个函数escape(s,t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可见字符分别转换成‘\n‘、‘\t‘等相应的可见的转义字符序列。要求使用switch语句。再编写一个具有相反功能的函数,在复制过程将转义字符序列转换成实际字符。

先解释一下两个run函数和两个escape分别实现上述两个功能:

 1 #include <stdio.h>
 2
 3 void escape(char s[], char t[]);
 4 void escape2(char s[], char t[]);
 5
 6 void runEscape() {
 7     char testT[100] = "Hello,\ni am a\nGOOD\tBOY\t!!!!\n";
 8     char testS[100] = "Bye,\t littal Max!\n";
 9
10     printf("T:%sS:%s", testT, testS);
11     escape(testS, testT);
12     printf("Now,");
13     printf("T:%sS:%s", testT, testS);
14 }
15 void runEscape2() {
16     char testS[100] = "Hello,\ni am a\nGOOD\tBOY\t!!!!\n";
17     char testT[100] = "Bye,\t littal Max!\n";
18
19     printf("T:%sS:%s", testT, testS);
20     escape2(testS, testT);
21     printf("Now,");
22     printf("T:%sS:%s", testT, testS);
23 }
24 void escape(char s[], char t[]) {
25     int i = 0;
26     int j = 0;
27
28     while (t[i] != ‘\0‘) {
29         switch (t[i])
30         {
31         case ‘\t‘:
32             s[j++] = ‘\\‘;s[j++] = ‘t‘;
33             break;
34         case ‘\n‘:
35             s[j++] = ‘\\‘; s[j++] = ‘n‘;
36             break;
37         default:
38             s[j++] = t[i];
39             break;
40         }
41
42         i++;
43     }
44     s[j] = ‘\0‘;
45 }
46 void escape2(char s[], char t[]) {
47     int i = 0;
48     int j = 0;
49
50     while (t[i] != ‘\0‘) {
51         if (t[i]==‘\\‘)
52         {
53             switch (t[i+1])
54             {
55             case ‘t‘:
56                 s[j++] = ‘\t‘; i++;
57                 break;
58             case ‘n‘:
59                 s[j++] = ‘\n‘; i++;
60                 break;
61             default:
62                 s[j++] = t[i];
63                 break;
64             }
65         }
66         else
67             s[j++] = t[i];
68         i++;
69     }
70     s[j] = ‘\0‘;
71 }

  练习3-3 编写函数expand(s1,s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价多的完整列表abc...xyz。该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与-a-z等类似情况。作为前导和尾随的-字符原样排印。

 1 #include <stdio.h>
 2
 3 void expand(char s1[], char s2[]);
 4
 5 void runExpand() {
 6     char testS[100] = "0-9\na-z\nA-Z\na-b-c\na-a\na-Z\n";
 7     char testT[100] = "Bye, littal Tester!\n";
 8
 9     printf("T:%sS:%s", testT, testS);
10     expand(testS, testT);
11     printf("\nNow,\n");
12     printf("T:%sS:%s", testT, testS);
13 }
14
15
16 void expand(char s1[], char s2[]) {
17     int i = 0;
18     int j = 0;
19
20     while (s1[i] != ‘\0‘) {
21         if (s1[i] == ‘-‘&&s1[i + 1] != ‘\0‘ && i > 0) {
22             char head = s1[i - 1];
23             char tail = s1[i + 1];
24
25             if (‘a‘ <= head&&head <= ‘z‘&&head < tail
26                 &&‘a‘ <= tail&&tail <= ‘z‘) {
27                 for (; head + 1 <= tail;) {
28                     s2[j++] = head + 1;
29                     head++;
30                 }
31             }
32             else if (‘A‘ <= head&&head <= ‘Z‘&&head < tail
33                 &&‘A‘ <= tail&&tail <= ‘Z‘) {
34                 for (; head + 1 < tail;) {
35                     s2[j++] = head + 1;
36                     head++;
37                 }
38             }
39             else if (‘0‘ <= head&&head <= ‘9‘&&head < tail
40                 &&‘0‘ <= tail&&tail <= ‘9‘) {
41                 for (; head + 1 < tail;) {
42                     s2[j++] = head + 1;
43                     head++;
44                 }
45             }
46             else
47                 s2[j++] = ‘-‘;
48         }
49         else
50             s2[j++] = s1[i];
51
52         i++;
53     }
54 }

  练习3-4 在数的对二补码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-2字长-1的情况。请解释原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。

解释的原因我写在注释代码里面了~~

#include <stdio.h>

void reverse(char s[]);
void itoa(int n, char s[]);

void runItoa() {
    int testn = -1987654321;
    char test[100];

    itoa(testn, test);
    printf("test:%s", test);
}
/*不能正确处理最大负数的原因在于其二进制数形式为10000...如果
对其进行n=-n运算,n将变成0,这显然是不符合我们期望的。因此我
们可以进行检测,如果它是这个特殊的最大负数则将其变为无符号数。*/

void itoa(int n, char s[]) {
    int i, sign;
    sign = n;

    if (((unsigned)sign << 1) == 0)
        n = (unsigned)n;
    else if (sign < 0)
        n = -n;
    i = 0;
    do {
        s[i++] = n % 10 + ‘0‘;
    } while ((n /= 10) > 0);
    if (sign < 0)
        s[i++] = ‘-‘;
    s[i] = ‘\0‘;
    reverse(s);
}

void reverse(char s[]) {
    int i = 0;
    int j = 0;
    char c[1000];

    while (s[i] != ‘\0‘)
        c[i] = s[i++];
    while (i > 0)
        s[j++] = c[--i];
    s[j] = ‘\0‘;
}

  练习3-5 编写函数itob(n,s,b)将整数n转换为以b为底的数。 并将转换结果以字符的形式保存到字符串s中。

#include <stdio.h>

void reverse(char s[]);
void itob(int n, char s[], int);

void runItob() {
    int testn = 1987654321;
    char test[100];

    itob(testn, test, 10);
    printf("test:%s", test);
}

void itob(int n, char s[], int b) {
    int i = 0;

    do {
        s[i++] = n % b + ‘0‘;
    } while ((n /= b) > 0);
    s[i] = ‘\0‘;

    reverse(s);
}

练习3-6  修改itoa函数,使得该函数可以接收三个参数。第三个参数为最小字段宽度。为了保证转换后结果至少具有第三个参数指定的最小宽度,必要时在结果左边填充一定的空格。

 1 #include <stdio.h>
 2
 3 void reverse(char s[]);
 4 void itoa2(int n, char s[], int width);
 5
 6 void runItoa2() {
 7     int testn = -1987654321;
 8     char test[100];
 9
10     itoa2(testn, test,20);
11     printf("test:%send\n", test);
12 }
13
14 void itoa2(int n, char s[], int width) {
15     int i, sign;
16     sign = n;
17
18     if (((unsigned)sign << 1) == 0)
19         n = (unsigned)n;
20     else if (sign < 0)
21         n = -n;
22     i = 0;
23     do {
24         s[i++] = n % 10 + ‘0‘;
25     } while ((n /= 10) > 0);
26     if (sign < 0)
27         s[i++] = ‘-‘;
28     while (width - i > 0) {
29         s[i++] = ‘ ‘;
30     }
31     s[i] = ‘\0‘;
32     reverse(s);
33 }
时间: 2024-12-12 17:21:35

《C程序设计语言》-第3章-习题的相关文章

《C程序设计语言》读书笔记----习题1-21

题目就不写了,大概意思就是:尽量用制表符'\t'替换掉字符串中的空格. 同学们需要注意的是,打印一个制表符'\t',其所占长度不是固定的. 这里要理解“制表符”和“制表符终止位”.“制表符”的作用是使得光标移动到下一个“制表符终止位”上.举个例子,假设制表符终止位是4.8.12.16......已经已经输入了10个字符,然后按一下Tab键,那么光标会移动到位置12上,同学们新建一个文本文档试一下就了解了. 这个题目看似简单,但是写一个简单.清晰的程序还是需要花一点脑筋的. /* 这个程序看似简单

《C程序设计语言》读书笔记----习题1-20

练习1-20:编写程序detab,将输入中的制表符替换成适当数目的空格,使得空格充满到下一个制表符终止位的地方,.假设制表符终止位的位置时固定的,比如每隔n列就会出现一个终止位. 这里要理解“制表符”和“制表符终止位”.“制表符”的作用是使得光标移动到下一个“制表符终止位”上.举个例子,假设制表符终止位是4.8.12.16......已经已经输入了10个字符,然后按一下Tab键,那么光标会移动到位置12上,同学们新建一个文本文档试一下就了解了. 代码如下: 1 #include<stdio.h>

C语言程序设计 第3版 课后习题答案 苏小红 王宇颖 孙志岗 版 实验题答案 高等教育出版社 课后答案 解析 第3章 课后答案

C语言程序设计 第3版 课后习题答案  苏小红 王宇颖 孙志岗  实验题答案 高等教育出版社 课后答案 解析 第3章 课后答案 C语言程序设计 苏小红 王宇颖 孙志岗 版 习题3 课后习题答案 前辅文第1章 为什么要学C 语言 课后习题答案1.1 引言1.2 游戏?黑客和C 语言1.3 C 语言,不老的传说1.4 C 语言的爱与恨1.5 C 语言教给我们的事1.6 什么是“编程”1.7 本章小结习题1第2章 C 数据类型 课后答案2.1 常量与变量2.1.1 常量2.1.2 变量2.2 简单的屏

c程序设计语言第一章2

练习1.13编写一个程序,打印输入中单词长度的直方图.水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAXHIST 15//定义直方图的最大值 4 #define MAXWORD 11//定义单词的最大字符数 5 #define IN 1 6 #define OUT 0 7 int main() 8 { 9 int nc;//单词所含的字符数 10 int maxv

c程序设计语言第一章5

练习1.20请编写程序d e t a b??将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止的地方.假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define TABBLANK 8//tab 增加的尺寸 4 int main() 5 { 6 int c; 7 int nb=0;//记录空格数目 8 int pos=1;//记录当前所在位置 9 whi

《C程序设计语言(第2版&#183;新版)》第0章 引言

从这篇开始,按照我的理解,整理Kernigham和Ritchie的<C程序设计语言(第2版·新版)>. 0.1 C C很适合用来编写编译器和操作系统,被称作“系统编程语言”:BCPL语言-->B语言-->C语言: 数据类型:基本(字符,多种长度整型和浮点型):派生(指针,数组,结构,联合):表达式:运算符+操作数,总可以作为语句:指针:提供与具体机器无关的地址算术运算: 控制流结构:语句组,条件判断(if-else),多路选择(switch),终止测试在顶部的循环(while, f

程序员教程-3章-程序设计语言基础知识

这一章难度颇大,好好学也学不到什么,随便写点东西吧 目录结构 3.1 程序设计语言概述 3.1.1 程序设计语言的基本概念 1 低级语言和高级语言 2 编译程序和解释程序 3 程序设计语言的定义 3.1.2 程序设计语言的分类和特点 1 程序设计语言发展概述 2 程序设计范型 3.1.3 程序设计语言的基本成分 1 程序设计语言的数据成分 2 程序设计语言的运算成分 3 程序设计语言的控制成分 4 函数 3.2 语言处理程序基础 3.2.1 汇编程序基础 1 汇编语言 2 汇编程序 3.2.2

计算机二级教程python第一章 程序设计语言

一.程序设计语言 (一)程序设计语言概述 1.什么是程序设计? 程序设计是计算机能能够理解和识别的用户操作的一种交互体:按照特定的规则组织计算机指令,使计算机能够独立自行进行各项运算处理. 2.程序语言的发展 机器语言.汇编语言.高级语言: 其中机器语言和汇编语言是直接操作计算机硬件的编程语言,高级语言是用来表达计算机语法逻辑.接近自然语言,高级语言与计算机的硬件无关,高级语言是计算机程序设计语言. 3.程序设计语言的特点 语法精密.定义准确:自然语言不严密,存在二义性,有可能计算机识别不出来.

【软考】【软件设计师】【知识模块】【第2章:程序设计语言基础知识】

程序设计语言基础知识 2.1 程序设计语言概述 2.1.1  程序设计语言基本概念 低级语言,面向机器的语言,如汇编语言.机器语言: 特性:进行程序设计效率低,程序的可读性差,难以修改.维护,优势是运行速度特别快: 高级语言,面向各类应用的程序设计语言.如C.C++ .Java.Python.Delphi .Pascal.Php 语言处理程序:负责将高级语言翻译成计算机能理解的0和1的程序: 语言之间的翻译基本方式: 汇编.解释.编译: 汇编:对使用汇编语言写成的源程序进行翻译成目标程序(机器可

对于《C程序设计语言》的一点理解

想必学C语言的人大都看过这一经典书籍.对于我来说,处于不同学习层次,阅读这本书的感觉是不一样的,每次阅读都会有一番新的感悟.第一次阅读时先读的英文版,读的很困难,主要是记录不会的单词:第二遍就顺利多了,但是对于其中的内容缺乏较深入的了解:第三遍就直接买了机械工业出版社出版的中文版,尝试读了一遍,但是对于后面几章特别是指针部分几乎读不下去:然后就开始做上面的练习,主要是做了前6章的练习,这其中费了不少时间和精力,还有一部分练习没有做. 对了,需要对这一分类下的博文做出几点说明. ①笔记中所说的[教