从问题到程序、文献管理与信息分析、构建之法、深入理解计算机系统

《从问题到程序》

第一章

1.这个部分的机器指令看不明白,将寄存器1的数据加到寄存器0原有数据上,这个原有数据是指第一行的数据还是第三行运算过的数据?

2.return 0到底是什么?它和return 1有什么区别?

return 0 代表程序正常退出,return 1代表程序异常退出!
使用return 语句可以返回一个变量内的值或一个指针,也可用return0,表示返回为空。
return 代表调到函数外,
return 0代表函数正常终止
return 1代表函数非正常终止
return 关键字的作用是返回程序流程的控制权!
其副作用是返回一个值。
例如int main(){}则必须返回一个值
return 0代表函数正常终止
ruturn 1代表函数非正常终止
被调函数 return 1只是给主调函数一个标志,说明他的执行过程遇到异常情况。
然后就返回主调函数来处理,继续执行。
这个异常情况是什么那?
这个异常情况是返回给控制台的,不在你编的程序的控制范围内,是给操作系统识别的,对你的程序无影响

第二章

1.请设法找出这 个程序里的错误:

#include <stdio.h> 
int main()
{     
printf("Factorial of %d is %f
", 7, 1*2*3*4*5*6*7);     
return 0; 
} 

整形常量是指形式为整常数的常量,以上1234567是整形常量的运算,结果也是整形常量,所以不能以%f格式输出,如果改为1.0234567就可以,因为此时有一个1.0是浮点型常量(包含小数点的实数),所有常量均会被转换成double型的来运算。所以可以用%f输出。

2.如果程序里要用标准库里的数学函数,程序前面要另写一行: #include <math.h> 什么才是标准库里的数学函数?什么时候需要调用这个头文件?

数学函数库,一些数学计算的公式的具体实现是放在math.h里,具体有:

1、 三角函数

double sin(double);正弦
double cos(double);余弦
double tan(double);正切

2 、反三角函数

double asin (double); 结果介于[-PI/2,PI/2]
double acos (double); 结果介于[0,PI]
double atan (double); 反正切(主值),结果介于[-PI/2,PI/2]
double atan2 (double,double); 反正切(整圆值),结果介于[-PI,PI]

3 、双曲三角函数

double sinh (double);
double cosh (double);
double tanh (double);

4 、指数与对数

double frexp(double value,int exp);这是一个将value值拆分成小数部分f和(以2为底的)指数部分exp,并返回小数部分f,即f2^exp。其中f取值在0.5~1.0范围或者0。
double ldexp(double x,int exp);这个函数刚好跟上面那个frexp函数功能相反,它的返回值是x*2^exp
double modf(double value,double *iptr);拆分value值,返回它的小数部分,iptr指向整数部分。
double log (double); 以e为底的对数
double log10 (double);以10为底的对数
double pow(double x,double y);计算x的y次幂
float powf(float x,float y); 功能与pow一致,只是输入与输出皆为单精度浮点数
double exp (double);求取自然数e的幂
double sqrt (double);开平方根

5 、取整

double ceil (double); 取上整,返回不比x小的最小整数
double floor (double); 取下整,返回不比x大的最大整数,即高斯函数[x]

6 、绝对值

int abs(int i); 求整型的绝对值
double fabs (double);求实型的绝对值
double cabs(struct complex znum);求复数的绝对值

7 、标准化浮点数

double frexp (double f,int *p); 标准化浮点数,f = x * 2^p,已知f求x,p (x介于[0.5,1])
double ldexp (double x,int p); 与frexp相反,已知x,p求f

8 、取整与取余

double modf (double,double*); 将参数的整数部分通过指针回传,返回小数部分
double fmod (double,double); 返回两参数相除的余数

9 、其他

double hypot(double x,double y);已知直角三角形两个直角边长度,求斜边长度
double ldexp(double x,int exponent);计算x*(2的exponent次幂)
double poly(double x,int degree,double coeffs []);计算多项式
int matherr(struct exception *e);数学错误计算处理程序
source: 《C & C++ Code Capsules》

3.本章中的有用程序模式

2.1:简单计算程序:

#include <stdio.h> 
int main() 
{  
printf("... ...", ...); /* 计算表达式写在这里 */     
return 0;
}

2.2:使用数学函数的简单计算程序采用如下模式:

#include <stdio.h> 
#include <math.h> 
int main() 
{     
printf("... ...", ...); /* 计算表达式写在这里 */     
return 0;
} 

第三章

1.void main()和int main(void)的区别

main后面的括号是参数表的意思,空括号则表示main没有参数。实际上main是程序的入口点,所有执行代码的起点。
1)区别是main()函数是否有返回值。
2)void定义的函数没有返回值,int定义的函数返回整型值。
3)void,字面意思是“无类型”,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明,有注释和限制程序的作用。

2.空语句的作用是什么?为什么要使用空语句?

我觉得空语句就是补全语句的作用,但是感觉可有可无,资料上说空语句有以下几个用途:
1)纯粹消耗CPU时间,起到延时的作用。
2)为了程序的结构清楚,可读性好,以后扩充新功能方便。有些公司的编码规范要求,对于if/else语句等,如果分支不配对的话,需要用空语句进行配对。
例如:
正常的这么做就行:

if(XXX)
{
XXXXX
}

但是编码规范要求,必须这么写

if(XXX)
{
XXXXX
}
else
{
;
}

3)对于某些大型的软件项目,特别是一些嵌入式项目,处于自动化测试的需要,要求必须进行语句(例如,if/else语句)的配对。

3.本章中的有用程序模式:

3.1:简单程序

#include <stdio.h> /* 如果需要用数学函数,这里还要写#include <math.h> */ 
int main () {     /* 若干变量定义(以及初始化) */     /* 若干计算和赋值语句 */     /* 若干输出语句 */     return 0; }

3.2:带函数定义的程序

#include … ……  /* 函数定义写在这里(可以有一个或几个) */ 
int main () {     …… /* 主程序体,这里通常包含对一些函数的调用 */     return 0; }

第四章

1.为什么浮点数运算有误差?

其根本原因是计算机所使用二进制01代码无法准确表示某些带小数位的十进制数据。2进制的浮点数表示有一个很大的问题——它并不可以精确表示所有实数。说得更准确一点,只有可以写成2a+2b+2^c+...这种形式并且精度不能太多的实数才可以用浮点数来精确表示。而大多数实数仅仅保存了一个四舍五入后的近似值而已。譬如,0.1在单精度浮点数中实际值为0.100000001490116119384765625,也就是说0.1叠加10遍的确是和1.0不等的。

第六章

1.下面代码中putchar(n % 6 == 5 ? ' ' : ' ');使程序能在输出 6个元素后换一行。 为什么是余数为5换行,而不是余数为6?

#include <stdio.h> 
int main () {     
long fib[30];     
int n; 
fib[0] = 1;     
fib[1] = 1;     
for (n = 2; n < 30; ++n)         
fib[n] = fib[n-1] + fib[n-2]; 
for (n = 29; n >= 0; --n) {         
printf("%d", fib[n]);         
putchar(n % 6 == 5 ? '
' : ' ');     } 
return 0; }

因为数组是从0开始计数的,而不是从1开始。

后面的因为c语言基础较差还没有去看。

《文献管理与信息分析》

1.输入网站www.google.com/ncr不会跳转到英文网页。

2.基本搜索命令:

1)AND
2)OR
3)- (去除一类的搜索)
4)+(强制搜索)
5)""(精确搜索)
6)~(相关搜索)

3.搜索高级命令:

1)filetype:ppt、pdf或者xsl等等格式搜索,例如:aptamer filetype:ppt
2)site:指定在特定的网站进行搜索,例如:罗绍峰 site:sciencenet.cn

4.google/baidu/bing/360的比较:

1)收录范围方面google最好,bing的英文也比百度好,百度搜索中文的功能最好,360收录结果偏少,但质量相对较高。
2)搜索命令方面google较多,然后是百度,然后是bing,最后是360

5.数据库的选择:百度或google搜索数据库导航

6.WOS数据库(Web of Science)

1)进入WEB OF KNOWLEDGE平台,里面包含了WOS数据库
2)逻辑算符:AND、OR、NOT
3)临近算符:NEAR/x(代表所衔接的两个词之间词语数量小于N,例如:canine NEAR/10 virus)、SAME(只在地址字段中检索,同时要求两个词在同一个地址字段中,例如:yale SAME hosp)
4)截词符:*表示截取零到多个字符、$表示截取零到一个、?表示截取一个字符。
5)scopus数据库和WOS数据库差不多,推荐使用WOS数据库

7.学术搜索引擎

google scholar 独特命令:author、出版物限制、site、filetype

8.中文数据库:CNKI、万方、维普、超星

9.RSS 同步世界最新资讯

10.endnote X7使用场景

1)调研某一个领域在endnote里把所有文章下载下来,浏览之后挑重要的文章阅读摘要或者全文阅读。
2)RSS浏览文章,觉得重要的下载到一个文件夹,让endnote自动去识别添加文献

11.文件管理软件:Total Commander

TC基本功能:定位、复制与移动、搜索、快速查看、文件的同步与比较、批量改名、压缩和解压等等。

12.快速定位核心文件:HistCite

功能:快速绘出一个领域的发展脉络,快速锁定某个领域的重要文献、科学家、机构,洞察某个领域最近进展,找出无指定关键词的重要文献。

时间紧凑,没有什么思考,以上是看视频时做的一些笔记。

《构建之法》

第二章

1.什么是单元测试?创建单元测试的主要步骤有哪些?

单元测试:能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证。
主要步骤:
1)设置数据(一个假想的正确的E-mail地址)
2)使用被测试类型的功能(用E-mail地址来创建一个User类的实体)
3)比较实际结果和预期的结果(Assert.IsTure(target != null);)

2.什么是回归测试?

回归测试:工程师们在新版本上运行所有已通过的测试用例,以验证有没有“退化”情况发生(例如:在3.1.5版本,模块A的编号为125的测试用例通过了,但是在新的版本3.1.6上,却失败了,这就是一个倒退),这个过程就是回归测试。

3.效能分析工具

有抽样和代码注入两种分析方法
抽样:具有不需要改动程序,运行较快,很快找到瓶颈,但是不能得到精确的数据,也不能准确表示代码中的调用关系树等特点。
代码注入:具有可以精确测量程序中各个数据,但是运行时间大大加长,还会产生很大的数据文件,增加了数据分析的时间。
一般的做法是先用抽样的方法找到效能瓶颈所在,然后对待定的模块用代码注入的方法进行详细分析。

《深入理解计算机系统》

由于基础较差加上此书过厚,快速阅读感觉什么也看不懂,打算每周一章章的去学习。

原文地址:https://www.cnblogs.com/9226ryf/p/7818495.html