c++程序设计梳理(谭浩强)3-4章_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > c++程序设计梳理(谭浩强)3-4章

c++程序设计梳理(谭浩强)3-4章

 2014/11/7 8:12:09  为心中梦想挥剑的那一刹那  程序员俱乐部  我要评论(0)
  • 摘要:同学拿了58的offer,22万一年,内心多少有点不是滋味。自己享受着这么丁点的中兴薪酬,明显是学业不精的那一类。事实确实如此,可当现实摆在你面前多少有点惨目忍睹,故和女朋友吵了架。如此将内心的不爽发泄于自己的亲近之人实属万万不应该,极度幼稚的表现,还需多多修炼才行,要走的路很长,可能只身一人,可能万般荆棘,更可能千疮百孔,那也要硬着头皮打碎牙往肚子里咽,难啊!今天来总结谭浩强的第3到第4章Chapter3~Chapter4->程序设计初步1、程序=算法+数据结构。2、程序的组成
  • 标签:程序 c++ 设计

?同学拿了58的offer,22万一年,内心多少有点不是滋味。自己享受着这么丁点的中兴薪酬,明显是学业不精的那一类。事实确实如此,可当现实摆在你面前多少有点惨目忍睹,故和女朋友吵了架。如此将内心的不爽发泄于自己的亲近之人实属万万不应该,极度幼稚的表现,还需多多修炼才行,要走的路很长,可能只身一人,可能万般荆棘,更可能千疮百孔,那也要硬着头皮打碎牙往肚子里咽,难啊!
?今天来总结谭浩强的第3到第4章
Chapter 3~Chapter 4
->程序设计初步
1、程序=算法+数据结构。
2、程序的组成:预处理命令(#include与#define等)、声明部分(对函数与数据类型的声明以及对变量的定义) 、函数。
3、c++输出流格式控制符(使用io流控制符要包含#include<iomanip>头文件
dec?????????设置整数为十进制
hex?????????设置整数为十六进制
oct?????????设置整数为八进制
setbase(n)???????以c填充,可以为字符常量或变量
setfill(c)???????精度为n,fix与scientific时为小数点后n位
setw(n)????????设置字段宽为n
setiosflags(ios::fixed)????以固定小数位显示
setiosflags(ios::scientific)??以科学技术法显示
setiosflags(ios::left)????左对齐
setiosflags(ios::right)????右对齐
setiosflags(ios::skipws)???忽略前导空格
setiosflags(ios::uppercase)???以科学计数法与十六进制输出时字母大写
setiosflags(ios::showpos)???输出正数时加上“+”号
resetioflags()??????终止设置的输出格式状态
4、关系运算符的优先级问题:
</<=/>/>=高于==/!=
赋值运算符->关系运算符->算术运算符(由低到高)
5、c++中将bool值处理成数值

class="cpp" name="code">#include<iostream>
using namespace std;
int main(){
	bool flag = false;
	flag = 123;//将数值赋给布尔变量
	cout << flag << endl;//输出结果为1
	return 0;
}

(编译过程中出现警告:1>e:\experiment\c++project\test\c++_for_tanhaoqiang\main_file.cpp(5): warning
C4305: “=”: 从“int”到“bool”截断)
6、闰年表达式:(year%4==0&&year%100!=0)||year%100==0
7、位运算符的巧妙使用(就是&/|/^三个运算符,其中笔试中愿意出,我这总结在之后会一点点往上面加)

/*
交换两数,此方法可以运用到大数的问题上,因为使用的是异或位运算,所以当数值溢出时也可以运作
*/
#include<iostream>
using namespace std;
int main(){
	int a = 123123, b = 234234;
	cout << a << "," << b << endl;//交换前
	a = a^b;
	b = a^b;
	a = a^b;
	cout << a << "," << b << endl;//交换后
	return 0;
}

<!--EndFragment-->8、习题4:
编程序,用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和cout语句输出这两个字符,并思考如下
问题:
?(1)变量c1,c2应定义为字符变量还是整型变量?亦或者二者皆可?
?(2)若要求输出c1和c2值的ASCII码,应该如何处理?

/*
习题4
*/
#include<iostream>
using namespace std;
int main(){
	int c1, c2;
	c1 = getchar();
	c2 = getchar();
	putchar(c1); putchar(c2); putchar('\n');
	cout << (char)c1 << "," << (char)c2 << endl;
	return 0;
}

9、习题23:
用迭代法求平方根。求平方根公式为:

要求前后两次x的绝对值要小于10的-5次方。

?

/*
习题23
*/
#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double x1, x2, a;
	cin >> a;
	x1 = 1;
	x2 = a;
	while (abs(x1 - x2) >= 1e-5){
		x1 = x2;
		x2 = (x1 + a / x1) / 2;
	}
	cout << x1 << "," << x2 << endl;
	return 0;
}

10、习题25:
两个乒乓球队进行比赛,各出3人。甲队为A、B、C 3人,乙队为X、Y、Z 3人。已经抽签决定比赛名单。有人向队员打听比赛名单,A说他不合X比赛,C说他不合X、Z比赛,请编程序找出3对赛手名单。
?

/*
习题25
*/
#include<iostream>
using namespace std;
//思想主要是将i,j,z看做成A,B,C,将1,2,3看成是X,Y,Z,然后排列一下就行
int main(){
	int i, j, z;
	for (i = 0; i < 3; i++){
		for (j = 0; j < 3; j++){
			if (i != j){
				for (z = 0; z < 3; z++){
					if (z != i&&z != j){
						if (i != 0 && z != 0 && z != 2){
							cout << "A与" << char('X' + i) << "比" << endl;
							cout << "B与" << char('X' + j) << "比" << endl;
							cout << "C与" << char('X' + z) << "比" << endl;
						}
					}
				}
			}
		}
	}
	return 0;
}

?

?

->函数与预处理
1、函数定义的形式没有啥好说的。在函数这里呢,我想讲一下我自己计算机基础入门与编程语言初学的一些体会。由于本人本科是一个广东的三本院校,当初入学学着学着也觉得没什么,可是当bz入了一985研究生才发现,当初自己那个三本院校的基础教学是有多么的差!我觉得,在这种非常关键的、伴随着我们整个职业的、无时无刻都要用到的编程语言计算机基础课程,非常有必要要一个有过技术公司经历并且有过深厚项目经验的人来教学。当初我的本科竟然用一些要不是刚刚毕业的“美女”教师,要不就是远离工程的“博士”来充斥这这些课程的教学,以至于我现在回想起来,怎一个烂了得!后来大三大四的确接触到了几个我觉得可以的人,可是尼玛竟然不给安排去教学这么关键的基础课程,而去教一些上层的开发课!要知道,地基没打牢,上层再漂亮也会又一天崩塌的!为什么要在这里讲了这么多,是因为我是到了大三的时候才知道,c或者c++在处理函数值传递的时候,编译器是一种怎样的机制!就是在进行函数调用的时候,当程序进入函数,执行函数体的时候,会将传进来的实参进行一个拷贝复制,再内部生成一个拷贝的副本,局部变量,在离开函数的时候销毁!这么重要的东西,我自我认为,经历过如今我经历的这种残酷的校园招聘与有过多年的项目洗礼的人才能体会深刻啊,一个刚刚毕业的女老师,男博士之类的,怎么能讲出个兴趣,讲出个心得呢!!吐槽多了,但是这也是自己整个学生生涯的一种心得吧!
2、函数重载的判定(这个各种笔试经常会考!):
参数个数、参数类型或者参数顺序3者中至少有一种不同,就构成了函数的重载。
3、函数模板这个问题我觉得很重要,谭浩强这本书讲的很少,我决定直接在后面的《c++primer》的梳理中去总结,因为这个点关系到后面的类的模板的问题,这个很关键,类似于java的泛型,可是和泛型又有很大的不同,java中泛型是经常用到的,在c++中,后面数据结构的各处也都要用到模板,所以在此先不介绍!
4、函数默认值问题:
①参数默认值必须放在函数参数的右边,否则报错;
②函数声明的时候,如果这个函数有默认值必须要在声明中给出,在函数定义的时候可以不用写默认值;
③注意函数默认值与函数重载的问题,因为容易出现二义性。
5、数学知识,已知两点的二维坐标,能求出两点连线相交于x轴的坐标

?????????????????????????

6、c++内存模型:(这个感觉不太全,以后深入了再完善)
?用户区
?程序区
?静态存储区(主要存储全局变量,程序开始执行的时候就分配了存储单元,程序执行完毕就释放这些空间)
?动态存储区(①函数形参②函数中的自动变量,也是未加static的局部变量③函数调用时的现场保护和返回地址等)
7、头文件一般包含以下几类内容:
(1)对类型的声明,结构体或者类等等;
(2)函数声明,各种库函数或者自定义函数等等,其中似乎不要包含命名空间最好;
(3)内置(inline)函数;
(4)宏定义(#define);
(5)全局变量的定义;
(6)外部变量的声明,如extern int a;
8、习题9:
汉诺塔问题。

/*
习题9:此乃经典的汉诺塔问题,很好的一道递归入门编程题
*/
#include<iostream>
using namespace std;
void function(int n, char a, char b, char c){
	if (n == 1){
		cout << a << "->" << c << endl;
	}
	else{
		function(n - 1, a, c, b);
		cout << a << "->" << c << endl;
		function(n - 1, b, a, c);
	}
}
int main(){
	function(2, 'A', 'B', 'C');
	return 0;
}

9、习题11:
用递归的方法求

n由主函数输入。?

/*
习题11
*/
#include<iostream>
using namespace std;
int sum = 0;
void function(int n){
	if (n >= 0){
		sum += n*n;
		function(n-1);
	}
}
int main(){
	int n;
	cin >> n;
	function(n);
	cout << sum << endl;
	return 0;
}

10、习题1:
最大公约数与最小公倍数。

/*
习题1:最大公约数与最小公倍数,经典的算法->碾转相除法!
*/
#include<iostream>
using namespace std;
//最大公约数
int gys(int a, int b){
	int t;
	while (a%b != 0){
		t = b;
		b = a%b;
		a = t;
	}
	if (a%b == 0)
		return b;
	else
		return 1;
}
//最小公倍数
int gbs(int a, int b){
	int g = gys(a, b);
	return g*(a/g)*(b/g);
}
int main(){
	cout << gbs(15,28) << endl;
	return 0;
}

(最后贴出网页嵌入数学公式的图片链接:<img src="http://latex.codecogs.com/gif.latex?在这里填写你的latex代码" />

发表评论
用户名: 匿名