读书笔记之:C程序设计语言

第一章的一道练习题,开始无论如何都理解不了这道题的意思,直到用VS一步一步的调试着看:

???? 1-21:

编写程序entab,将空格串替换为最少数量的空格和制表符,但要保持单词之间的间隔不变。假设制表符终止位的位置为8(#define TABINC 8)。当使用一个制表符或者一个空格都可以到达下一个制表符终止位的时,选用哪一种替换字符较好?

例如:hello         world

  hello和world之间有9个空格,这个打印的时候,先打印出hello,然后遇到了第一个空格,此时pos = 6,且pos不在制表符终止位上,所以nb++;

  直到pos = 8 = TABINC时,令nb = 0,nt++,既是将hello后的三个空格换成一个tab。

  从pos = 9到pos = 15之间的六个空格,还是六个空格,不做改变。

  随后打印出world,程序结束。

 如:he  is    a          boy

  he后是一个tab,is后一个tab和两个空格,a后8个空格一个tab。

  当pos =3时,遇到第一个tab,令nb = 0,然后根据公式:pos = pos+(TABINC-(pos-1)%TABINC)-1得出pos=8,既是直接打印一个制表符,并跳到     TABINC处。

  接着打印出is。

  pos=11时遇到tab,由公式得出pos=16,跳到第二个TABINC处。

  打印完两个空格后遇到a,pos=19。

  a后打印了五个空格后到了第三个TABINC,于是nb = 0,nt++,此时pos=24。

  后边三个空格,打印完后pos=28,遇到\t,于是将之前积累的制表符和当前遇到的这个制表符打印出来。

  最后打印出boy,程序结束。

  

 1 #include <stdio.h>
 2 #define TABINC 8
 3 //将空格串替换成最少数量的制表符和空格,但要保持单词之间的间隔不变
 4 int main(int argc,char* argv[])
 5 {
 6     int c,nb,nt,pos;
 7
 8     nb = 0;
 9     nt = 0;
10     for(pos = 1;(c = getchar())!=EOF;++pos)
11     {
12         if(c == ‘ ‘)
13         {
14             if(pos % TABINC != 0)
15             {
16                 ++nb;
17             }else
18             {
19                 nb = 0;
20                 ++nt;
21             }
22         }else {
23             for (;nt>0;--nt) {
24                 putchar(‘\t‘);
25             }
26             if(c == ‘\t‘)
27                 nb = 0;
28             else
29                 for(;nb>0;--nb)
30                     putchar(‘ ‘);
31             putchar(c);
32             if(c == ‘\n‘)
33                 pos = 0;
34             else if (c == ‘\t‘) {
35                 pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
36             }
37
38         }
39     }
40 }

entab

程序主要是要将全部的空格找出。然后当pos递增到一个TABINC的倍数的时候,就把空格串替换成一个制表符。

遇到非空格字符时,程序先将遇到这个字符之前的所有空格和制表符打印出来后,再打印这个字符。

若当前字符是一个换行符,则注意重新将pos值设为1.

当遇到一个制表符时程序只需将此前积累的制表符和当前遇到的这个制表符打印出来。

如果只需一个空格就能到达下一个制表位,我们选择把他替换成一个制表符,因为这有助于避免特殊情况。

时间: 2024-11-13 08:13:18

读书笔记之:C程序设计语言的相关文章

读书笔记之:C语言深度剖析

读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中常见的考点,并且很多都是我们平常不注意的点,对于我们深入理解C语言确实很有帮助. 第1章关键字 1.register虽然寄存器的速度非常快,但是使用register修饰符也有些限制的:register变量必须是能被CPU寄存器所接受的类型.意味着register变量必须是一个单个的值,并且其长度应小于或等于整

读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺乏必要的绘图驱动程序,则浏览器即使支持了也没用   <canvas> var drawing = document.getElementById("drawing"); if( drawing.getContext ){ drawing.getContext("2d"

《30天自制操作系统》读书笔记(3) 引入C语言

这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是乱码, 而且代码的分隔用了两个Tab, 在这里要处理一下: :%s/;.*//g 删除所有的注释; :%s/\t\t/\t 把两个Tab替换为一个Tab; 要让作者的nas文件和asm文件拥有相同的语法规则, 在_vimrc文件的最后一行添加 au BufNewFile,BufRead *.nas

Machine Learning for hackers读书笔记(一)使用R语言

#使用数据:UFO数据 #读入数据,该文件以制表符分隔,因此使用read.delim,参数sep设置分隔符为\t #所有的read函数都把string读成factor类型,这个类型用于表示分类变量,因此将stringsAsFactors设置为False #header=F表示文件中并没有表头 #na.string='',表示把空元素设置为R中的特殊值NA,即将所有空元素读成NA ufo<-read.delim('ufo_awesome.tsv',sep='\t',stringsAsFactors

《R语言实战》读书笔记--第一章 R语言介绍

1.典型的数据分析过程可以总结为一下图形: 注意,在模型建立和验证的过程中,可能需要重新进行数据清理和模型建立. 2.R语言一般用 <- 作为赋值运算符,一般不用 = ,原因待考证.用->也可以. 3. age <- c(1,3,5,2,11,9,3,9,12,3) weight <- c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1) mean(weight) sd(weight) cor(age,weight) plot(age,weigh

笔记1_算法,程序设计,语言等_哈佛_计算机科学cs50_David J. Malan

1.从0开始计数,而不是1的原因 数字系统被简化为只有0与1的基本思想,无论0还是1都占据一个位数,都有和它相关的权数.自然,我们就从0开始计数.否则就浪费了一个比特位. 比特(BIT)是binary digit的简写,从0到1的数字,而bi表示2.所以就有两个数字,因此bit诞生了. ASCII码,可以表示键盘上的字符. 8个bit是一个byte,可以表达256个可能的字符,可以包含整个美式键盘中的字符,包括大小写字母和一连串标点.对于其他语言,当涉及更多字符时就会有其他的编码体系. 当敲击键

读书笔记 - js高级程序设计 - 第十章 DOM

文档元素 是文档的最外层元素,在Html页面中,文档元素始终都是<html>元素 在xml中,任何元素都可以是文档元素 Node类型 Node.ELEMENT_NODE 元素 Node.ATTRIBUTE_NODE 属性 Node.TEXT_NODE 文本元素 Node.CDATA_SECTION_NODE Node.ENTITY_REFERENCE_NODE Node.ENTITY_NODE Node.PROCESSING_INSTRUCTION_NODE; Node.COMMENT_NOD

读书笔记 - js高级程序设计 - 第八章 BOM

BOM的核心对象是window 它表示浏览器的一个实例,在浏览器中,window对象有双重角色,它既是通过js访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,这意味着在网页中定义的任何一个对象,变量 和 函数 都以window作为其Global函数 窗口关系和frame 每个frame都有自己的window对象,并且保存在frames集合中, 在frames集合中,可能通过数值索引 或者 框架名称来访问 相应的 window 对象 top 始终指向 最高层的 框架,也就

读书笔记 - js高级程序设计 - 第七章 函数表达式

闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者只在绝对必要时再考虑使用闭包 模块模式   增强的模块模式   特权方法 有权访问私有变量的公有方法叫做特权方法 块级作用域   实现单例的特权方法  

读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中 执行环境的销毁 某个执行环境中的所有代码执行完毕后 该环境被销毁 保存在其中的所有变量了函数定义也会随之销毁 作用域链中的对象 全局执行环境的变更对象始终都是作用域链中的最后一个对象 没有块级作用域 if 和 for 内的变量 外部也可以访问 标记清除 不同浏览器 只不过垃圾时间的长短不同 引