笨蛋学C++【C++基础第四弹】

发布于:2024-04-29 ⋅ 阅读:(35) ⋅ 点赞:(0)

11.C++日期&时间

  • C++ 继承了 C 语言用于日期和时间操作的结构和函数

  • 需要在 C++ 程序中引用 头文件

    struct tm {
      int tm_sec;   // 秒,正常范围从 0 到 59,但允许至 61
      int tm_min;   // 分,范围从 0 到 59
      int tm_hour;  // 小时,范围从 0 到 23
      int tm_mday;  // 一月中的第几天,范围从 1 到 31
      int tm_mon;   // 月,范围从 0 到 11
      int tm_year;  // 自 1900 年起的年数
      int tm_wday;  // 一周中的第几天,范围从 0 到 6,从星期日算起
      int tm_yday;  // 一年中的第几天,范围从 0 到 365,从 1 月 1 日算起
      int tm_isdst; // 夏令时
    };
    
序号 函数 & 描述
1 time_t time(time_t *time); 该函数返回系统的当前日历时间,自 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 -1。
2 **char *ctime(const time_t *time);**该返回一个表示当地时间的字符串指针,字符串形式 day month year hours:minutes:seconds year\n\0
3 struct tm *localtime(const time_t *time); 该函数返回一个指向表示本地时间的 tm 结构的指针。
4 clock_t clock(void); 该函数返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。如果时间不可用,则返回 -1。
5 char * asctime ( const struct tm * time ); 该函数返回一个指向字符串的指针,字符串包含了 time 所指向结构中存储的信息,返回形式为:day month date hours:minutes:seconds year\n\0。
6 **struct tm *gmtime(const time_t *time);**该函数返回一个指向 time 的指针,time 为 tm 结构,用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。
7 time_t mktime(struct tm *time); 该函数返回日历时间,相当于 time 所指向结构中存储的时间。
8 double difftime ( time_t time2, time_t time1 ); 该函数返回 time1 和 time2 之间相差的秒数。
9 **size_t strftime();**该函数可用于格式化日期和时间为指定的格式。
//
// Created by 16690 on 2024/4/19.
//

#include <iostream>
#include <ctime>
using namespace std;

int main(void){

    //基于当前系统的当前日期/时间
    time_t now = time(0);
    //把now转为字符串形式
    char * dt = ctime(&now);
    cout << "本地日期和时间:" << dt << endl;


    //把now转为 tm 结构
    tm *gmtm = gmtime(&now);
    dt = asctime(gmtm);
    cout << "UTC 日期和时间:" << dt << endl;
    return 0;
}

  • 使用结构tm格式化时间

    //
    // Created by 16690 on 2024/4/19.
    //
    
    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main(void) {
    
        //基于当前系统的当前日期/时间
        time_t now = time(0);
        //把now转为字符串形式
        char *dt = ctime(&now);
        cout << "本地日期和时间:" << dt << endl;
    
    
        //把now转为 tm 结构
        tm *gmtm = gmtime(&now);
        dt = asctime(gmtm);
        cout << "UTC 日期和时间:" << dt << endl;
    
        cout << "1970 年以来的秒数:" << now << endl;
        tm *ltm = localtime(&now);
        cout << "年:" << 1900 + ltm->tm_year << endl;
        cout << "月:" << 1+ltm->tm_mon << endl;
        cout << "日:" << ltm->tm_mday << endl;
        cout << "时:" << ltm->tm_hour << endl;
        cout << "分:" << ltm->tm_min << endl;
        cout << "秒:" << ltm->tm_sec << endl;
    
        //格式化时间,存放时间字符串
        char tmp[64];
        strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", ltm);
        cout << "当前时间:" << tmp << endl;
    
        return 0;
    }
    
    

12.C++基本的输入输出

12.1I/O库头文件

头文件 函数和描述
该文件定义了 cin、cout、cerrclog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。
该文件通过所谓的参数化的流操纵器(比如 setwsetprecision),来声明对执行标准化 I/O 有用的服务。
该文件为用户控制的文件处理声明服务。

12.2标准输出流(cout)

#include <iostream>
 
using namespace std;
 
int main( )
{
   char str[] = "Hello C++";
 
   cout << "Value of str is : " << str << endl;
}

12.3标准输入流(cin)

#include <iostream>
 
using namespace std;
 
int main( )
{
   char name[50];
 
   cout << "请输入您的名称: ";
   cin >> name;
   cout << "您的名称是: " << name << endl;
 
}

12.4标准错误流(cerr)

#include <iostream>
 
using namespace std;
 
int main( )
{
   char str[] = "Unable to read....";
 
   cerr << "Error message : " << str << endl;
}

12.5标准日志流(clog)

#include <iostream>
 
using namespace std;
 
int main( )
{
   char str[] = "Unable to read....";
 
   clog << "Error message : " << str << endl;
}

13.C++结构体

  • C/C++数组允许定义可存储相同类型数据项的变量

  • C++结构体允许自定义可存储的不同类型数据项的变量

  • 语法:

    struct 结构体类型名{
    	数据类型 变量名;
    	数据类型 变量名;
    	数据类型 变量名;
    } 结构体名;
    

13.1访问结构体成员

  • 使用成员访问运算符 . 来访问结构体成员
//
// Created by 16690 on 2024/4/19.
//
#include <iostream>
#include <cstring>

using namespace std;

struct Books {
    char title[50];
    char author[50];
    char subject[100];
    int book_id;
} books;

int main(void) {
    //定义结构体类型Books的变量books1
    Books books1;
    //定义结构体类型Books的变量books2
    Books books2;

    //books1 详述
    strcpy(books1.title,"C++编程");
    strcpy(books1.author, "C++");
    strcpy(books1.subject,"编程语言");
    books1.book_id=12345;

    //books2 详述
    strcpy(books2.title,"Java编程");
    strcpy(books2.author, "Java");
    strcpy(books2.subject,"编程语言");
    books2.book_id=12346;

    //输出books1信息
    cout << "书1ID : " << books1.book_id << endl;
    cout << "书1标题 : " << books1.title << endl;
    cout << "书1作者 : " << books1.author << endl;
    cout << "书1类目 : " << books1.subject << endl;

    //输出books2信息
    cout << "书2ID : " << books2.book_id << endl;
    cout << "书2标题 : " << books2.title << endl;
    cout << "书2作者 : " << books2.author << endl;
    cout << "书2类目 : " << books2.subject << endl;


    return 0;
}

13.2结构体作为函数参数

//
// Created by 16690 on 2024/4/19.
//
#include <iostream>
#include <cstring>

using namespace std;

struct Books {
    char title[50];
    char author[50];
    char subject[100];
    int book_id;
} books;

void printInfo(struct Books book, int num);

int main(void) {
    //定义结构体类型Books的变量books1
    Books books1;
    //定义结构体类型Books的变量books2
    Books books2;

    //books1 详述
    strcpy(books1.title, "C++编程");
    strcpy(books1.author, "C++");
    strcpy(books1.subject, "编程语言");
    books1.book_id = 12345;

    //books2 详述
    strcpy(books2.title, "Java编程");
    strcpy(books2.author, "Java");
    strcpy(books2.subject, "编程语言");
    books2.book_id = 12346;

    cout << "-------------------------" << endl;
    
    //使用 . 运算符
    //输出books1信息
    printInfo(books1, 1);
    //输出books2信息
    printInfo(books2, 2);
    return 0;
}

void printInfo(struct Books books, int id) {
    cout << "书-" << id << "-ID : " << books.book_id << endl;
    cout << "书-" << id << "-标题 : " << books.title << endl;
    cout << "书-" << id << "-作者 : " << books.author << endl;
    cout << "书-" << id << "-类目 : " << books.subject << endl;
}

13.3指向结构的指针

  • 可以定义指向结构的指针,方式与定义指向其他类型

    struct 结构体类型名  * 结构体指针名;
        
    结构体指针名 = &结构体名;
        
    结构体指针名 -> 结构体属性;
    
  • 访问结构的成员时使用点运算符,而通过指针访问结构的成员时,则使用箭头运算符。

  • 结构体定义的是一个实体,那么这个实体要引用结构体成员,就用 . 操作符,

  • 如果用结构体定义的是一个结构体指针,那么要引用结构体成员就用 ->操作符

    //
    // Created by 16690 on 2024/4/19.
    //
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    struct Books {
        char title[50];
        char author[50];
        char subject[100];
        int book_id;
    };
    
    void printInfo(struct Books *books, int id);
    int main(void){
        //定义结构体类型Books的变量books1
        Books books1;
        //定义结构体类型Books的变量books2
        Books books2;
    
        //books1 详述
        strcpy(books1.title, "C++编程");
        strcpy(books1.author, "C++");
        strcpy(books1.subject, "编程语言");
        books1.book_id = 12345;
    
        //books2 详述
        strcpy(books2.title, "Java编程");
        strcpy(books2.author, "Java");
        strcpy(books2.subject, "编程语言");
        books2.book_id = 12346;
    
        //使用 -> 运算符
        printInfo(&books1,1);
        printInfo(&books2,2);
    
        return 0;
    }
    
    void printInfo(struct Books *books, int id) {
        cout << "书-" << id << "-ID : " << books->book_id << endl;
        cout << "书-" << id << "-标题 : " << books->title << endl;
        cout << "书-" << id << "-作者 : " << books->author << endl;
        cout << "书-" << id << "-类目 : " << books->subject << endl;
    }
    

13.4typedef关键字

  • 给创建的类型取一个别名,然后使用typedef 来定义对应的结构体类型

    struct Books {
        char title[50];
        char author[50];
        char subject[100];
        int book_id;
    } books;
    
    Books books1,books2;
    
  • typedef来定义非结构类型

    typedef long int *pint32;
    pint32 x, y, z;
    

14.C++Vector容器

  • C++ 中的 vector 是一种序列容器,允许在运行时动态地插入和删除元素
  • vector 是基于数组的数据结构,但它可以自动管理内存,这意味着不需要手动分配和释放内存

14.1基本特性

  • 动态大小vector 的大小可以根据需要自动增长和缩小。
  • 连续存储vector 中的元素在内存中是连续存储的,这使得访问元素非常快速。
  • 可迭代vector 可以被迭代,你可以使用循环(如 for 循环)来访问它的元素。
  • 元素类型vector 可以存储任何类型的元素,包括内置类型、对象、指针等。

14.2使用场景

  • 当需要一个可以动态增长和缩小的数组时。
  • 当需要频繁地在序列的末尾添加或移除元素时。
  • 当需要一个可以高效随机访问元素的容器时。

14.3创建Vector

  • 包含头文件

    //
    // Created by 16690 on 2024/4/19.
    //
    #include <iostream>
    #include <vector>
    
    using namespace std;
    int main(void){
    
        //创建vector容器
        //如果没有使用命名空间 需要使用std::vector<int>
        vector<int> myVector1;
        //创建vector容器并初始化
        // 创建一个包含 5 个整数的 vector,每个值都为默认值(0)
        vector<int> myVector2(5);
        // 创建一个包含 5 个整数的 vector,每个值都为 10
        vector<int> myVector4(5,10);
        // 初始化一个包含元素的 vector
        vector<int> myVector5={1,2,3,4,5};
    
        return 0;
    }
    

14.4添加元素

//
// Created by 16690 on 2024/4/19.
//
#include <iostream>
#include <vector>

using namespace std;

int main(void) {

    //创建vector容器
    //如果没有使用命名空间 需要使用std::vector<int>
    vector<int> myVector1;
    //创建vector容器并初始化
    // 创建一个包含 5 个整数的 vector,每个值都为默认值(0)
    vector<int> myVector2(5);
    // 创建一个包含 5 个整数的 vector,每个值都为 10
    vector<int> myVector4(5, 10);
    // 初始化一个包含元素的 vector
    vector<int> myVector5 = {1, 2, 3, 4, 5};


    //添加元素
    //使用 push_back 方法向 vector 中添加元素,添加到末尾
    myVector5.push_back(6);

    //访问元素
    //使用下标操作符 [] 或 at() 方法访问 vector 中的元素:
    int x = myVector5[0];
    int y = myVector5.at(0);

    cout << "myVector5[0]=" << x << endl;
    cout << "myVector5.at(0)=" << y << endl;
    //获取大小
    //使用 size() 方法获取 vector 中元素的数量
    int size = myVector5.size();

    //迭代访问1
    for (auto it = myVector5.begin(); it != myVector5.end(); it++) {
        cout << *it << endl;
    }
    //迭代访问2
    cout << "-------------------" << endl;
    for (const auto &item: myVector5) {
        cout << item << endl;
    }
    //迭代访问3
    cout << "-------------------" << endl;
    for (int element: myVector5) {
        cout << element << "\t" << endl;
    }

    //删除元素
    myVector5.erase(myVector5.begin() + 2);

    //清空元素
    myVector5.clear();
    cout << "myVector5.size=" << myVector5.size() << endl;

    return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到