《从问题到程序》
第一章
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\n", 7, 1*2*3*4*5*6*7);
return 0;
}
整形常量是指形式为整常数的常量,以上1234567是整形常量的运算,结果也是整形常量,所以不能以%f格式输出,如果改为1.0234567就可以,因为此时有一个1.0是浮点型常量(包含小数点的实数),所有常量均会被转换成double型的来运算。所以可以用%f输出。
2.如果程序里要用标准库里的数学函数,程序前面要另写一行: #include 什么才是标准库里的数学函数?什么时候需要调用这个头文件?
数学函数库,一些数学计算的公式的具体实现是放在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 ? '\n' : ' ');使程序能在输出 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 ? '\n' : ' '); }
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.效能分析工具
有抽样和代码注入两种分析方法
抽样:具有不需要改动程序,运行较快,很快找到瓶颈,但是不能得到精确的数据,也不能准确表示代码中的调用关系树等特点。
代码注入:具有可以精确测量程序中各个数据,但是运行时间大大加长,还会产生很大的数据文件,增加了数据分析的时间。
一般的做法是先用抽样的方法找到效能瓶颈所在,然后对待定的模块用代码注入的方法进行详细分析。
《深入理解计算机系统》
由于基础较差加上此书过厚,快速阅读感觉什么也看不懂,打算每周一章章的去学习。