C++学习日志

2023-11-18

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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++学习日志 的相关文章

  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 执行npm install 时报错 Host key verification failed

    问题 安装依赖的时候出现Host key verification failed问题 整理了一下解决流程 1 要在git设置一下身份的名字和邮箱 git config global user name yourname gt 用户名 git
  • Unity中自定义协程函数

    Unity中提供了协程的方法 在处理一些需要异步的函数时非常方便 尤其是在处理网络请求响应的时候 但是协程函数有些时候需要自定义 这就需要自己实现满足条件的协程函数了 好在Unity提供了这样的类来帮助我们实现相关的功能 通过继承Custo
  • Springboot2.0中webflux到底优秀在哪里

    Spring boot webflux中所说的反应堆式编程reactor到底优秀在哪里 小编的Springboot2 0的课程已经快全部写完了 总结来看 对于有基础的同学学习难度不是很大 一周内就能上手 但是在小编看来编程如果说只会用 而不
  • 记一次wwwscan目录扫描后获取敏感目录登录后台

    1 开启wwwscan工具 2 配置信息 目标域名不要带协议头 直接www xxx com或者192 168 67 xxx 3 点击 扫描 等待扫描之后会在wwwscan的同级目录下生成结果文件 4 打开第三个文件 5 点击访问 说明 tx
  • [机器学习与scikit-learn-31]:算法-回归-线性模拟拟合拟合非线性数据-概述

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123555129 目录 第1章 什么是
  • 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU 它承担了所有的计算任务 而操作系统是计算机的管理者 它负责任务的调度 资源的分配和管理 统领整个计算机硬件 应用程序是具有某种功能的程序 程序是运行于操作系统之上的 2 进程 我们编写的代
  • 交直流双电源无缝切换

    使用ATmega32编写交直流双电源无缝切换 输入过欠压保护 输出过流保护 主要使用了单片机自带的比较器功能 比较器的一端使用了LT431制作的2 5V基准源 include iom32v h define WDR asm WDR defi
  • 尚硅谷nodejs操作mongodb报错,MongoNotConnectedError: Client must be connected before running operations【已解决】

    1 准备好第一步的静态案例 2 启动mongodb服务 在cmd运行mongod Waiting for connections attr port 27017 ssl off 3 准备mongoose数据库模块化 4 新建AccountM
  • this.$el.querySelectorAll is not a function报错解决

    问题描述 使用el tree时 报错this el querySelectorAll is not a function 导致树无法渲染 问题解析 参考如下代码片段
  • [激光原理与应用-66]:激光器-器件 - 二极管

    第1章 二级管的基本原理 1 1 原理 现在的电子产品中 元件应用最多的是半导体材料 在集成电路中 也是应用的半导体单晶硅作为基底 通过离子注入技术而添加了硼和磷元素从而构成数以亿计的半导体晶体管 对于半导体元件来说 发挥作用的是PN结 在
  • 5G/NR 随机接入过程之Msg2

    21 6 Msg2 UE发送了preamble之后 将在RAR时间窗 RA Response window 内监听PDCCH 以接收对应RA RNTI的RAR 此时不考虑可能出现的测量gap 如果在RAR时间窗内没有接收到gNB回复的RAR
  • RPA经验分享--离线识别普通验证码

    了解RPA www i search com cn 学习RPA https support i search com cn 下载RPA https www i search com cn from csdn 前言 以下方法适用于简易的验证码
  • 【Linux】进程控制2-进程等待

    文章目录 进程等待 进程等待的必要性 wait函数 waitpid函数 进程等待 进程等待的必要性 我们之前提到过僵尸进程 僵尸进程就是子进程先于父进程退出 子进程的退出状态信息发送给父进程但是父进程忽略处理 子进程就变成了僵尸进程 解决僵
  • programming massively parrellel processors(1)

    I have to say this is a very good book to learn more about cuda especially for a novice like me who take interest in par
  • 入职字节两个月,实在卷不动,还是离职了

    对自己收入不满意 就看下自己每天做了什么 把每天记录下来 看下自己的时间都用在哪里了 对自己的时间分配搞清楚了 就可以着手去改进 如果一直糊涂的过 时间到了报复就来了 时间管理很简单 不过大多数人是不会重视的 别总抱怨自己赚钱少 关键你做了
  • Asgard King(埃氏筛法)

    Description Thor had great power but his arrogant and reckless behavior set off an ancient war and he was demoted into t
  • Mock介绍

    mock的定义 what mock是在测试过程中 对于一些不容易构造 获取的对象 创建一个mock对象来模拟对象的行为 为什么要使用mock why 在做单元测试过程中 经常会有以下的场景 class A 依赖 class B class
  • 14.C++之对象的初始化和清理

    学习目标 学习内容 1 对象的初始化和清理 在C 中 每个对象也都会有初始设置以及 对象销毁前的清理数据的设置 今天介绍两种函数 构造函数和析构函数 来完成对象的初始化和清理 构造函数 主要用于为对象的成员属性赋值 又编译器自动完成 无须手
  • 报错:SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position xx: truncated

    我给出的错误代码 错误原因 文件路径输入问题 解决方法 1 在前面加r 2 将 变为 3 将 变为
  • C++学习日志

    小白C 从入门到放弃 1 黑马通讯录管理系统 点运算符 和箭头运算符 gt 的区别 2 Essential C 中练习2 1 3 Essential C 中练习2 2 4 Essential C 中练习2 3 5 Essential C 中