1.黑马通讯录管理系统
整体不难,但是有两个地方需要注意:
1.一般在windows平台写代码为了在终端看到运行结果,所以加入了system(“pause”);语句。但是在linux下shell里pause不再是一条命令,因此会出现sh: 1: pause: not found的提示。
2.代码有个地方踩坑:
int isExist(Addressbooks *abs,string name){
for(int i=0;i<abs->m_Size;i++)
{
if(abs->personArray[i].m_Name==name)
{
return i;
}
return -1; // 错误写法
}
return -1; //正确写法
}
错误写法会使返回值一直为-1,因为在遍历数组中所有值时总会有name不相同的,因此要把return -1放在for循环外侧。
点运算符( . )和箭头运算符( -> )的区别
很多时候,在对结构体进行相应的编码时,时而发现是用点运算符( . ),时而是用箭头运算符( -> );那么这两者之间的使用有什么区别么?
相同点:两者都是二元操作符,而且右边的操作数都是成员的名称。
不同点:点运算符( . )的左边操作数是一个结果为结构的表达式箭头运算符( -> )的左边的操作数是一个指向结构体的指针。
例如:
typedef struct // 定义一个结构体类型:DATA
{
char key[10]; // 结构体成员:key
char name[20]; // 结构体成员:name
int age; // 结构体成员:age
}DATA;
DATA data; // 声明一个结构体变量
DATA *pdata; // 声明一个指向结构体的指针
// 访问数据操作如下:
data.age = 24; // 结构体变量通过点运算符( . )访问
pdata->age = 24; // 指向结构体的指针通过箭头运算符( -> )访问
转载自:C 语言结构体之点运算符( . )和箭头运算符( -> )的区别
2.Essential C++中练习2.1
2.1文章中的代码部分:
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
bool fibon_elem(int pos,int &elem){
if(pos<=0||pos>1024)
{
elem=0;
return 0;
}
elem=1;
int n_1=1,n_2=1;
for(int ix=3;ix<=pos;++ix)
{
elem=n_1+n_2;
n_1=n_2;n_2=elem;
}
return 1;
}
bool print_sequence(int pos)
{
if(pos<=0||pos>1024)
{
cerr<<"invalid position:"<<pos
<<"-- cannot handle request!\n ";
return 0;
}
cout<<"The Fibonacci Sequence for "
<<pos<<" positions:\n\t";
switch (pos){
default:
case 2:
cout<<"1 ";
case 1:
cout<<"1 ";
break;
}
int elem;
int n_2=1,n_1=1;
for(int ix=3;ix<=pos;++ix){
elem=n_2+n_1;
n_2=n_1;n_1=elem;
cout<<elem <<(!(ix%10)?"\n\t": " ");
}
cout<<endl;
}
int main(){
int pos;
cout<<"Please enter a position:";
cin>>pos;
int elem;
if(fibon_elem(pos,elem)) {
cout << "element # " << pos
<< " is " << elem << endl;
}
else{
cout << "Sorry.Could not calculate element #"
<< pos << endl;
}
print_sequence(pos);
}
switch (pos){
default:
case 2:
cout<<"1 ";
case 1:
cout<<"1 ";
break;
}
其中switch部分有了重新的理解,default:下方不论pos值为多少都会默认执行,case2下也无break,故继续向下执行,所以不论输入多少都会输出1 1。
当pos为2时,匹配到case2,输出1后因无break故会继续输出case1中的1,因此输出的还是1 1.
除非输入1时就会匹配到case1,仅输出1.
3.Essential C++中练习2.2
主要讲了值传递与地址传递的区别,较为简单:
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int ia[8]={8,34,3,13,1,21,5,2};
vector<int> vec(ia,ia+8);
void test_1();
void test_2();
void display(vector<int>vec)
{
for(int ix=0;ix<vec.size();ix++)
{
cout<<vec[ix]<<' ';
}
cout<<endl;
}
void swap(int val1,int val2)
{
int temp=val1;
val1=val2;
val2=temp;
}
void swap2(int &val1,int &val2)
{
int temp=val1;
val1=val2;
val2=temp;
}
void bubble_sort(vector<int> vec)
{
for(int ix=0;ix<vec.size();ix++)
for(int jx=ix+1;jx<vec.size();jx++)
{
if(vec[ix]>vec[jx])
swap(vec[ix],vec[jx]);
}
}
void bubble_sort2(vector<int> &vec)
{
for(int ix=0;ix<vec.size();ix++)
for(int jx=ix+1;jx<vec.size();jx++)
{
if(vec[ix]>vec[jx])
swap2(vec[ix],vec[jx]);
}
}
int main()
{
// test_1();
test_2();
return 0;
}
void test_1()
{
cout<<"vector before sort:";
display(vec);
bubble_sort(vec);
cout<<"vector after sort:";
display(vec);
}
void test_2()
{
cout<<"vector before sort:";
display(vec);
bubble_sort2(vec);
cout<<"vector after sort:";
display(vec);
}
4.Essential C++中练习2.3
本章理解起来有些困难,虽然基本都已经搞懂,但是以后还需要复习加深印象和理解。
#include<stdio.h>
#include<iostream>
#include <fstream>
#include<vector>
using namespace std;
int ia[8]={8,34,3,13,1,21,5,2};
vector<int> vec(ia,ia+8);
ofstream ofil("text_out1");
void test_1();
void test_2();
/*void display(vector<int>vec)
{
for(int ix=0;ix<vec.size();ix++)
{
cout<<vec[ix]<<' ';
}
cout<<endl;
}*/
void display(const vector<int>&vec,ostream &os = cout)
{
for(int ix=0;ix<vec.size();ix++)
{
os<<vec[ix]<<' ';
}
os<<endl;
}
void swap(int val1,int val2)
{
// ofil<<"swap("<<val1
// <<","<<val2<<")\n";
int temp=val1;
val1=val2;
val2=temp;
/* ofil<<"after swap():val1"<<val1<<" val2:"<<val2<<"\n";*/
}
void swap2(int &val1,int &val2)
{
int temp=val1;
val1=val2;
val2=temp;
}
void bubble_sort(vector<int> vec)
{
for(int ix=0;ix<vec.size();ix++)
for(int jx=ix+1;jx<vec.size();jx++)
if(vec[ix]>vec[jx])
{
/* ofil<<"about to call swap!"
<<" ix:"<<ix<<" jx:"<<jx<<'\t'
<<" swapping:"<<vec[ix]
<<" with "<<vec[jx]<<endl;*/
swap(vec[ix],vec[jx]);
}
}
void bubble_sort2(vector<int> &vec,ofstream *ofil=0)
{
for(int ix=0;ix<vec.size();ix++)
for(int jx=ix+1;jx<vec.size();jx++)
{
if(vec[ix]>vec[jx])
{
if(ofil !=0)
(*ofil)<<"about to call swap!"
<<" ix:"<<ix<<" jx:"<<jx<<'\t'
<<" swapping:"<<vec[ix]
<<" with "<<vec[jx]<<endl;
swap2(vec[ix],vec[jx]);
}
}
}
int main()
{
test_1();
//test_2();
return 0;
}
void test_1()
{
cout<<"vector before sort:";
display(vec);
bubble_sort2(vec,&ofil);
cout<<"vector after sort:";
display(vec,ofil);
display(vec);
/* ofstream ofil("data.txt");
bubble_sort2(vec,&ofil);
display(vec,ofil);*/
}
void test_2()
{
cout<<"vector before sort:";
display(vec);
bubble_sort2(vec);
cout<<"vector after sort:";
display(vec);
}
5.Essential C++中练习2.4
#include<iostream>
#include<vector>
using namespace std;
const vector<int>* fibon_seq(int size)
{
if(size<=0 || size>1024)
{
cerr<<"warning:fibon_seq():"
<<size<<"not supported -- resetting to 8\n";
size=8;
}
static vector<int> elems(size);
for(int ix=0;ix<size;++ix)
if(ix==0||ix==1)
elems[ix]=1;
else elems[ix]=elems[ix-1]+elems[ix-2];
return &elems;
}
vector<int> fibon_seq1(int size)
{
if(size<=0 || size>1024)
{
cerr<<"warning:fibon_seq():"
<<size<<"not supported -- resetting to 8\n";
size=8;
}
vector<int> elems(size);
for(int ix=0;ix<size;++ix)
if(ix==0||ix==1)
elems[ix]=1;
else elems[ix]=elems[ix-1]+elems[ix-2];
return elems;
}
int main()
{
//auto a=*fibon_seq(24);
auto a=fibon_seq1(24);
for(int ix=0;ix<24;ix++)
{
cout<<a[ix]<<" ";
}
}
局部静态对象
一.关键字的static的由来
某些时候,有必要令局部变量的生命周期贯穿函数调用及以后的时间,于是关键字static横空出世。
二.局部静态对象
在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。
三.代码证明
#include<iostream>
using namespace std;
int useTimes()
{
static int cnt=0;
cnt++;
return cnt;
}
int main()
{
for(int i=0;i<10;i++)
{
cout<<useTimes()<<endl;
}
}
代码运行结果:
去掉static关键字后
6.Essential C++中练习2.8
需要重新再看!!
#include<iostream>
#include<vector>
using namespace std;
const vector<int> *fibon_seq(int size)
{
if(size<=0 || size>1024)
{
cerr<<"warning:fibon_seq():"
<<size<<"not supported -- resetting to 8\n";
size=8;
}
static vector<int> elems(size);
for(int ix=0;ix<size;++ix)
if(ix==0||ix==1)
elems[ix]=1;
else elems[ix]=elems[ix-1]+elems[ix-2];
return &elems;
}
const vector<int> *pell_seq(int size)
{
if(size<=0 || size>1024)
{
cerr<<"warning:fibon_seq():"
<<size<<"not supported -- resetting to 8\n";
size=8;
}
static vector<int> elems2(size);
for(int ix=0;ix<size;++ix)
if(ix==0)
elems2[ix]=1;
else elems2[ix]=elems2[ix-2]+2*elems2[ix-1];
return &elems2;
}
const vector<int> *(*seq_array[])(int)={fibon_seq,pell_seq};
enum ns_type{
ns_fibon,ns_pell
};
bool seq_elem(int pos,int &elem,const vector<int>* (*seq_ptr)(int)) {
const vector<int> *pseq = seq_ptr(pos);
if (!seq_ptr) {
cout << "wrong!" << endl;
}
if (!pseq) {
elem = 0;
return false;
}
elem = (*pseq)[pos - 1];
return 1;
}
int main() {
//auto a=*fibon_seq(24);
// auto a=*pell_seq(24);
int elem, pos;
cin >> pos;
if (seq_elem(pos, elem, pell_seq)) {
cout << "element #" << pos
<< " is " << elem << endl;
}
/*for(int ix=0;ix<24;ix++)
{
cout<<a[ix]<<" ";
}*/
}
7.Essential C++中练习4.1
inline部分未看以后补上
#include<iostream>
#include<vector>
using namespace std;
class Stack{
public:
bool push(const string &elem){
if(full())
return 0;
_stack.push_back(elem);
return 1;
}
bool pop(string &elem){
if(empty())
return 0;
elem=_stack.back();
_stack.pop_back();
return 1;
}
bool peek(string &elem){
if(empty())return 0;
elem=_stack.back();
return 1;
}
bool empty(){
return _stack.empty();
}
bool full(){
return _stack.size()==_stack.max_size();
}
int size(){return _stack.size();}
private:
vector<string> _stack;
};
void fill_stack(Stack &stack,istream &is =cin)
{
string str;
while(is>>str&&!stack.full())
stack.push(str);
cout<<"Read in"<<stack.size()<<"element\n";
}
int main() {
Stack stack;
fill_stack(stack);
}