Doxygen 源码分析: QCString类

news2024/11/24 7:53:31

2023-05-20 23:41:56
ChrisZZ imzhuo@foxmailcom
Hompage https://github.com/zchrissirhcz

在这里插入图片描述

文章目录

    • 1. Doxygen 版本
    • 2. QCString 类概览
    • 3. QCString 特殊成员函数
      • 3.1 `=default` 方式的构造函数
      • 3.2 单个参数和两个参数的构造函数
    • 4. inline方式实现的成员函数
      • 4.1 operator= 函数
      • 4.2 判断是否为空
      • 4.3 判断长度
      • 4.4 获取裸数据
      • 4.5 调整字符串大小
      • 4.6 用相同字符填充字符串
      • 4.7 删除前缀
      • 4.8 获取子串
      • 4.9 大小写转换
      • 4.10 删除前导和尾部的空格
      • 4.11 引用字符串(quoted string)
      • 4.12 删除全部空白字符
      • 4.13 自我重复n次
      • 4.14 插入字符串
      • 4.15 尾部追加字符
      • 4.16 首部插入字符
      • 4.17 删除若干连续字符
      • 4.18 数字转字符串
      • 4.19 判断是否以某个字符串开头、结尾
      • 4.20 获取裸数据
      • 4.21 字符串拼接:operator+= 操作符函数
      • 4.22 获取字符
    • 5. 非 inline 方式实现的成员函数(WIP)

1. Doxygen 版本

本次使用的 doxygen 版本如下, 是 1.9.8 正式发布版本对应的 commit

$ git log
commit 5fded4215d4f9271fe92c940fc4532d4704f5be1 (HEAD -> master, upstream/master)
Author: Dimitri van Heesch <doxygen@gmail.com>
Date:   Thu May 18 22:14:30 2023 +0200

    bump version to 1.9.8 for development

2. QCString 类概览

通过前文 Doxygen源码分析:构建过程简介,并生成doxygen自身的C++文档 生成的 Doxygen C++ 文档, 可以查询得到 QCString 类的文档网页:
在这里插入图片描述

相关文件:

  • qcstring.h
  • qcstring.cpp
  • utf8.h
  • utf8.cpp

3. QCString 特殊成员函数

这里用“特殊成员函数”表示“没有返回值的成员函数”, 基本上是构造函数。

3.1 =default 方式的构造函数

首先是使用了 C++11 中增加 =default 用法的几个:

    QCString() = default;
   ~QCString() = default;
    QCString( const QCString &s ) = default;
    QCString &operator=( const QCString &s ) = default;
    QCString( QCString &&s ) = default;
    QCString &operator=( QCString &&s ) = default;

3.2 单个参数和两个参数的构造函数

其次是传入单个参数, 赋值给到 m_rep 成员的:

    explicit QCString( const std::string &s ) : m_rep(s) {}

    QCString( std::string &&s) : m_rep(std::move(s)) {}

其中 m_rep 的定义如下:

  private:
    std::string m_rep;

构造函数也可以传入 size, 如果 size 大于0则让 m_rep 执行 resize 到 size-1 的大小, 否则大小置为0:

    /** creates a string with room for size characters
     *  @param[in] size the number of character to allocate (also counting the 0-terminator!)
     */
    explicit QCString( size_t size ) { m_rep.resize(size>0 ? size-1 : 0); }

其中 std::string 类的 resize 方法,可以在 https://en.cppreference.com/w/cpp/string/basic_string/resize 找到解释:

  • void resize( size_type count )
  • 如果 m_rep 当前长度小于 count, 则继续填充 CharT() 字符, 对于 std::string 而言就是 \0 字符,直到到达 count 个字符
  • 如果 m_rep 当前长度超过 count, 则砍掉多余的字符

也可以从 C 字符串初始化 m_rep:

    /** creates a string from a plain C string.
     *  @param[in] str A zero terminated C string. When 0 an empty string is created.
     */
    QCString( const char *str ) : m_rep(str?str:"") {}

还可以指定 str 和 maxlen 两个参数, 从 str 的前 maxlen 个字符执行拷贝来初始化 m_rep:

    /** creates a string from \a str and copies over the first \a maxlen characters. */
    QCString( const char *str, size_t maxlen ) : m_rep(str?str:"") { m_rep.resize(maxlen); }

4. inline方式实现的成员函数

在 QCString 的 class body 内直接定义(实现)的函数。 比较短小。

4.1 operator= 函数

传入一个 C 字符串指针 或 std::string 对象, 用来替代 m_rep 的值:

    /** replaces the contents by that of C string \a str. */
    QCString &operator=( const char *str) { m_rep = str?str:""; return *this; }

    QCString &operator=( const std::string &s) { m_rep = s; return *this; }

4.2 判断是否为空

    /** Returns TRUE iff the string is empty. Equivalent to isEmpty(). */
    bool isNull() const { return m_rep.empty(); }

    /** Returns TRUE iff the string is empty */
    bool isEmpty() const { return m_rep.empty(); }

4.3 判断长度

    /** Returns the length of the string, not counting the 0-terminator. Equivalent to size(). */
    uint32_t length() const { return static_cast<uint32_t>(m_rep.size()); }

    /** Returns the length of the string, not counting the 0-terminator. */
    uint32_t size() const { return static_cast<uint32_t>(m_rep.size()); }

4.4 获取裸数据

    /** Returns a pointer to the contents of the string in the form of a 0-terminated C string */
    const char *data() const { return m_rep.c_str(); }

    /** Returns a writable pointer to the data.
     */
    char *rawData() { return &m_rep[0]; }

4.5 调整字符串大小

resize: 增加字符串尺寸, 或减小尺寸

    /** Resizes the string to hold \a newlen characters
     *  (this value should also count the 0-terminator).
     *  If the string is enlarged the contents will
     *  be left unmodified.
     */
    bool resize( size_t newlen ) { m_rep.resize( newlen>0 ? newlen-1 : 0 ); return TRUE; }

truncate: 英文本意是截断, 这里其实允许 pos 大于现有长度, 于是是将字符串长度增大:

    /** Truncates the string at position \a pos. */
    bool truncate( size_t pos ) { return resize( pos + 1 ); }

reserve: 修改预留空间大小, 也就是改变 capacity, 但不改变 size

    /** Reserve space for \a size bytes without changing the string contents */
    void reserve( size_t size ) { m_rep.reserve(size); }

4.6 用相同字符填充字符串

会覆盖替换原有内容:

    /** Fills a string with a predefined character
     *  @param[in] c the character used to fill the string with.
     *  @param[in] len the number of character to fill. Use -1 to fill the whole string.
     *  @note the string will be resized to contain \a len characters. The contents of the
     *  string will be lost.
     */
    bool fill( char c, int len = -1 )
    {
      int l = len==-1 ? static_cast<int>(m_rep.size()) : len;
      m_rep = std::string(l,c);
      return TRUE;
    }

4.7 删除前缀

如果 m_rep 的前面 n 个长度的子串等于 prefix, 那就删除它们, 返回 true; 其他情况返回 false:

    bool stripPrefix(const QCString &prefix)
    {
      if (prefix.isEmpty() || m_rep.empty()) return FALSE;
      if (m_rep.rfind(prefix.data(),0)==0) // string starts with prefix
      {
        m_rep.erase(0,prefix.length());
        return TRUE;
      }
      return FALSE;
    }
    bool stripPrefix(const char *prefix)
    {
      return stripPrefix(QCString(prefix));
    }

4.8 获取子串

获取左子串: 给定长度 len, 获取 m_rep 的左边 len 个字符组成的 QCString:

    QCString left( size_t len ) const
    {
      return m_rep.empty() ? QCString() : QCString(m_rep.substr(0,len));
    }

获取右子串: 类似于左子串:

    QCString right( size_t len ) const
    {
      return m_rep.empty()    ? QCString() :
             len<m_rep.size() ? QCString(m_rep.substr(m_rep.size()-len,len)) :
             *this;
    }

获取中间子串: 需要给出起始索引位置 index, 从 index 开始的 len 个字符作为构成结果字符串的元素:

    QCString mid( size_t index, size_t len=static_cast<size_t>(-1)) const
    {
      size_t slen = m_rep.size();
      if (len==static_cast<uint32_t>(-1)) len = slen-index;
      return m_rep.empty() || index>slen || len==0 ? QCString() :
             QCString(m_rep.substr(index,len));
    }

4.9 大小写转换

字符串转小写, 依赖了 utf8.hutf8.cpp 中的函数:

    QCString lower() const
    {
      return QCString(convertUTF8ToLower(m_rep));
    }

    QCString upper() const
    {
      return QCString(convertUTF8ToUpper(m_rep));
    }

utf8.cpp 中的代码略复杂, 本篇不做分析:

std::string convertUTF8ToLower(const std::string &input)
{
  return caseConvert(input,asciiToLower,convertUnicodeToLower);
}

std::string convertUTF8ToUpper(const std::string &input)
{
  return caseConvert(input,asciiToUpper,convertUnicodeToUpper);
}

4.10 删除前导和尾部的空格

使用到了前一篇 Doxygen源码分析: QCString类依赖的qstr系列C函数浅析 分析过的 qisspace() 函数, 主要思路是双指针, 也即:判断前导空格结束的位置记录为 start, 从后往前判断空格得到尾部连续空格得第一个位置的前面一个索引位置 end。 然后用 substr 方法获取结果。

    /// returns a copy of this string with leading and trailing whitespace removed
    QCString stripWhiteSpace() const
    {
      size_t sl = m_rep.size();
      if (sl==0 || (!qisspace(m_rep[0]) && !qisspace(m_rep[sl-1]))) return *this;
      size_t start=0,end=sl-1;
      while (start<sl && qisspace(m_rep[start])) start++;
      if (start==sl) return QCString(); // only whitespace
      while (end>start && qisspace(m_rep[end])) end--;
      return QCString(m_rep.substr(start,1+end-start));
    }

4.11 引用字符串(quoted string)

将 QCString 转为引用方式的字符串:

  • 去掉前导和尾部的空格(好奇为什么不通过调用StripWiteSpace实现);
  • 扫描剩余的字符, 如果存在 - 字符, 或者存在空格, 则判定为需要引号
  • 如果需要引号, 就在去掉了前后空格后的字符串的开头、结尾增加引号
    // Returns a quoted copy of this string, unless it is already quoted.
    // Note that trailing and leading whitespace is removed.
    QCString quoted() const
    {
      size_t start=0, sl=m_rep.size(), end=sl-1;
      while (start<sl && qisspace(m_rep[start])) start++; // skip over leading whitespace
      if (start==sl) return QCString(); // only whitespace
      while (end>start && qisspace(m_rep[end]))   end--;   // skip over trailing whitespace
      bool needsQuotes=false;
      size_t i=start;
      if (i<end && m_rep[i]!='"') // stripped string has at least non-whitespace unquoted character
      {
        while (i<end && !needsQuotes) // check if the to be quoted part has at least one whitespace character
        {
          needsQuotes = m_rep[i] =='-';
          needsQuotes |= qisspace(m_rep[i++]);
        }
      }
      QCString result(m_rep.substr(start,1+end-start));
      if (needsQuotes)
      {
        result.prepend("\"");
        result.append("\"");
      }
      return result;
    }

可以简单验证下:

    printf("Hello, World!\n");
    QCString s = "Hello World";
    std::cout << s.quoted() << std::endl;

    QCString t = "Hello-World";
    std::cout << t.quoted() << std::endl;

将输出:

“Hello World”
“Hello-World”

4.12 删除全部空白字符

对原有字符串逐个判断, 不是空格,则执行拷贝,空格则跳过。

对于拷贝动作来说, 没有新创建字符串, 是在原字符串上就地执行的, 因而节省了内存。

具体实现如下:

    /// returns a copy of this string with all whitespace removed
    QCString removeWhiteSpace() const
    {
      size_t sl = m_rep.size();
      if (sl==0) return *this;
      std::string result = m_rep;
      size_t src=0,dst=0;
      while (src<sl)
      {
        if (!qisspace(m_rep[src])) result[dst++]=m_rep[src];
        src++;
      }
      if (dst<m_rep.size()) result.resize(dst);
      return QCString(result);
    }

4.13 自我重复n次

将原有字符串内容重复n次,复制到新的字符串中并返回:

    // Returns a copy of this string repeated n times
    QCString repeat(unsigned int n) const
    {
      QCString result(n * size() + 1);
      size_t offset = 0;
      for (offset = 0; offset < n * size(); offset += size())
      {
        memcpy(result.rawData() + offset, data(), size());
      }
      return result;
    }

4.14 插入字符串

    QCString &insert( size_t index, const QCString &s )
    {
      if (s.length()>0)
      {
        size_t ol = m_rep.size();
        if (index>ol) // insert beyond end of string and fill gap with spaces
        {
          m_rep.resize(index+s.length());
          std::memset(&m_rep[ol],' ',index-ol);
          std::memcpy(&m_rep[index],s.data(),s.length()+1);
        }
        else // insert inside the string
        {
          m_rep.insert(index,s.str());
        }
      }
      return *this;
    }
    QCString &insert( size_t index, const char *s )
    {
      size_t len = s ? qstrlen(s) : 0;
      if (len>0)
      {
        size_t ol = m_rep.size();
        if (index>ol) // insert beyond end of string and fill gap with spaces
        {
          m_rep.resize(index+len);
          std::memset(&m_rep[ol],' ',index-ol);
          std::memcpy(&m_rep[index],s,len+1);
        }
        else // insert inside the string
        {
          m_rep.insert(index,s);
        }
      }
      return *this;
    }

    QCString &insert( size_t index, char c)
    {
      char s[2] = { c, '\0' };
      return insert(index,s);
    }

4.15 尾部追加字符

    QCString &append( char c)
    {
      m_rep+=c;
      return *this;
    }

    QCString &append( const char *s )
    {
      return operator+=(s);
    }

    QCString &append( const QCString &s )
    {
      return operator+=(s);
    }

    QCString &append( const std::string &s )
    {
      return operator+=(s);
    }

    QCString &prepend( const char *s )
    {
      return insert(0,s);
    }

4.16 首部插入字符

    QCString &prepend( const QCString &s )
    {
      return insert(0,s.data());
    }

    QCString &prepend( const std::string &s )
    {
      return insert(0,s.c_str());
    }

4.17 删除若干连续字符

    QCString &remove( size_t index, size_t len )
    {
      size_t ol = m_rep.size();
      if (index<ol && len>0) m_rep.erase(index,index+len>=ol ? std::string::npos : len);
      return *this;
    }

4.18 数字转字符串

使用C++11的 std::to_string() 实现的:

    QCString &setNum(short n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

    QCString &setNum(uint16_t n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

    QCString &setNum(int n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

    QCString &setNum(uint32_t n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

    QCString &setNum(long n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

    QCString &setNum(long long n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

    QCString &setNum(unsigned long long n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

    QCString &setNum(unsigned long n)
    {
      m_rep = std::to_string(n);
      return *this;
    }

4.19 判断是否以某个字符串开头、结尾

Python 用户一定很熟悉这个 API。 使用 std::string 的 rfind 和 compare 实现的:

    bool startsWith( const char *s ) const
    {
      if (m_rep.empty() || s==0) return s==0;
      return m_rep.rfind(s,0)==0; // looking "backward" starting and ending at index 0
    }

    bool startsWith( const QCString &s ) const
    {
      if (m_rep.empty() || s.isEmpty()) return s.isEmpty();
      return m_rep.rfind(s.str(),0)==0; // looking "backward" starting and ending at index 0
    }

    bool endsWith(const char *s) const
    {
      if (m_rep.empty() || s==0) return s==0;
      size_t l = strlen(s);
      return m_rep.length()>=l && m_rep.compare(m_rep.length()-l, l, s, l)==0;
    }

    bool endsWith(const QCString &s) const
    {
      size_t l = s.length();
      return m_rep.length()>=l && m_rep.compare(m_rep.length()-l, l, s.str())==0;
    }

4.20 获取裸数据

#define HAS_IMPLICIT_CAST_TO_PLAIN_C_STRING 0
#if HAS_IMPLICIT_CAST_TO_PLAIN_C_STRING
    /** Converts the string to a plain C string */
    operator const char *() const
    {
      return data();
    }
#endif

    const std::string &str() const
    {
      return m_rep;
    }

4.21 字符串拼接:operator+= 操作符函数

直接调用 std::string 的 += 实现的:

    QCString &operator+=( const QCString &s)
    {
      m_rep+=s.str();
      return *this;
    }

    QCString &operator+=( const std::string &s)
    {
      m_rep+=s;
      return *this;
    }

    /** Appends string \a str to this string and returns a reference to the result. */
    QCString &operator+=( const char *s )
    {
      if (s) m_rep+=s;
      return *this;
    }

#define HAS_CHARACTER_APPEND_OPERATOR 1
#if HAS_CHARACTER_APPEND_OPERATOR
    /** Appends character \a c to this string and returns a reference to the result. */
    QCString &operator+=( char c )
    {
      m_rep+=c;
      return *this;
    }
#endif

4.22 获取字符

不执行索引是否非法的安全检查。提供 at()operator[] 两类函数, 每类函数提供 const 和 非const 的版本:

    /** Returns a reference to the character at index \a i. */
    char &at( size_t i)
    {
      return m_rep[i];
    }

    const char &at( size_t i) const
    {
      return m_rep[i];
    }

    /** Indexing operator. Equivalent to at(). */
    char &operator[]( int i )
    {
      return m_rep[i];
    }

    const char &operator[]( int i ) const
    {
      return m_rep[i];
    }

5. 非 inline 方式实现的成员函数(WIP)

    QCString &sprintf( const char *format, ... );

    int	find( char c, int index=0, bool cs=TRUE ) const;
    int	find( const char *str, int index=0, bool cs=TRUE ) const;
    int find( const QCString &str, int index=0, bool cs=TRUE ) const;
    //int	find( const QRegExp &rx, int index=0 ) const;

    int	findRev( char c, int index=-1, bool cs=TRUE) const;
    int	findRev( const char *str, int index=-1, bool cs=TRUE) const;
    //int	findRev( const QRegExp &rx, int index=-1 ) const;

    int	contains( char c, bool cs=TRUE ) const;
    int	contains( const char *str, bool cs=TRUE ) const;
    //int contains( const QRegExp &rx ) const;

    /// return a copy of this string with leading and trailing whitespace removed and multiple
    /// whitespace characters replaced by a single space
    QCString simplifyWhiteSpace() const;

    QCString &replace( size_t index, size_t len, const char *s);
    //QCString &replace( const QRegExp &rx, const char *str );

    short         toShort(  bool *ok=0, int base=10 ) const;
    uint16_t      toUShort( bool *ok=0, int base=10 ) const;
    int	          toInt(    bool *ok=0, int base=10 ) const;
    uint32_t      toUInt(   bool *ok=0, int base=10 ) const;
    long          toLong(   bool *ok=0, int base=10 ) const;
    unsigned long toULong(  bool *ok=0, int base=10 ) const;
    uint64_t      toUInt64( bool *ok=0, int base=10 ) const;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/549632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-pythonguanwang

Python官网SEO分析 Python是一种高级编程语言&#xff0c;被广泛应用于Web开发、数据科学、人工智能、机器学习等领域。Python官网&#xff08;https://www.python.org&#xff09;是Python语言的官方网站&#xff0c;为Python用户和开发者提供了最新的Python解释器、文档、库…

中文Python(5)中文Python的while条件循语句

中文Python&#xff08;5&#xff09;中文Python的while条件循语句 Python是一种流行的编程语言&#xff0c;其简单而直观的语法吸引了很多人学习和使用。中文Python则是针对中文用户开发的一种版本。中文Python原先为了给不懂编写程序的人写量化程序&#xff0c;我们开发了中…

代码随想录算法训练营 Day 43 | 1049.最后一块石头的重量 II,494.目标和,474.一和零

1049.最后一块石头的重量 II 讲解链接&#xff1a;代码随想录-1049.最后一块石头的重量 II 确定 dp 数组以及下标的含义&#xff1a;dp[j]表示容量&#xff08;这里说容量更形象&#xff0c;其实就是重量&#xff09;为 j 的背包&#xff0c;最多可以背最大重量为 dp[j]。 石…

XPath语法:在XML文档中定位和选择节点的利器

XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位和选择节点的语言。它提供了强大的定位和选择能力&#xff0c;使开发人员能够准确、灵活地定位所需的元素。本篇博客将介绍XPath的语法和常用定位方法&#xff0c;帮助你在Web自动化测试等场景中更好地…

Glob 文件匹配

前言 glob本质是Unix shell 风格的路径匹配规则。 该规则后续被其它语言支持。 ?&#xff1a;匹配一个任意字符 *&#xff1a;匹配任意个任意字符 [sequence]&#xff1a;匹配出现在sequence里面的一个字符 [!sequence]&#xff1a;匹配没有出现在sequence里面的一个字符 [a…

【解决】CSS下拉菜单不会显示的问题

导航栏的下拉菜单显示&#xff0c;但按 F5 刷新的一瞬间又能看见 下拉菜单的内容&#xff0c;但就是不会显示出来&#xff0c;一开始以为是 js 代码写错或者 css 的动画函数的影响&#xff0c;后面找到一篇博客&#xff0c;说这是老生常谈的问题&#xff0c;对于小白确实很难找…

移动应用数据安全性:如何防止应用程序被黑客攻击和数据泄露?

第一章&#xff1a;引言 在移动应用成为人们生活中不可或缺的一部分的今天&#xff0c;数据安全性已经成为一个非常重要的问题。随着黑客攻击和数据泄露事件的频繁发生&#xff0c;用户对于移动应用程序的信任度也在逐渐下降。本文将探讨移动应用数据安全性的重要性&#xff0…

chatgpt赋能Python-pythongpu加速

Python GPU加速&#xff1a;让你的Python应用飞速运行 介绍 Python是一种高级编程语言&#xff0c;具有易于学习、易于使用和强大的功能。作为一门解释型语言&#xff0c;Python会在运行时逐行解释程序代码&#xff0c;而这种解释方式会导致Python在运行速度上较慢。在需要大…

2023上半年软考系统分析师科目一整理-01

2023上半年软考系统分析师科目一整理-01 1. 面向对象2. UML 1. 面向对象 面向对象分析中&#xff0c;对象是类的实例。对象的构成成分包含了&#xff08;A&#xff09;&#xff0c;属性和方法&#xff08;或操作&#xff09;。 A.标识 B.消息 C.规则 D.结构 对象的三要素为&am…

linux服务器安装python环境配置

linux服务器安装python环境配置 服务器跳板机服务器配置配置anaconda环境安装其他python版本卸载anaconda root用户为用户添加权限其他工具Jupyter Noetbooktmux 服务器跳板机 跳板机是一个可以从公共网络访问的服务器&#xff0c;它允许用户通过 SSH 连接进入私有网络中的其他…

AI绘画-Midjourney基础2-创意之旅启航:超强二次元风格模型 niji 5

niji 模型是 mj 的一种模型&#xff0c;可以生成二次元风格的图片。 在控制台输入 /settings 指令&#xff0c;进入设置页面。 选择第二行的 Niji version 5 模型&#xff0c;就可以创作二次元风格的图片了&#xff01; niji 5 模型还有 expressive、cute、scenic 3种风格可以…

【C++初阶】类与对象(中)之取地址及const取地址操作符重载(了解即可)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

chatgpt赋能Python-pythongroup

PythonGroup&#xff1a;提高Python技能和构建社交网络的绝佳平台 PythonGroup是一家致力于为Python编程者提供高质量资源和社交网络的平台。无论您是新手还是有十年以上的经验&#xff0c;PythonGroup都可以帮助您提高您的技能&#xff0c;增加您的知识和职业发展机会。 Pyt…

t检验与Z检验的区别

在统计学中&#xff0c;假设检验是评估某种特定情况下观察到的数据是否符合假设的一种方法。t检验和Z检验是两种常用的假设检验方法&#xff0c;分别用于比较均值差异以及比例差异。在医学统计中&#xff0c;t检验和Z检验经常被用于研究和比较不同治疗方法的效果&#xff0c;例…

chatgpt赋能Python-pythonfor遍历列表

Python for循环&#xff1a;遍历列表 - 提高您的编程技能 列表是Python编程语言中广泛使用的数据结构。在许多情况下&#xff0c;我们需要遍历列表中的元素。Python中的for循环是一种最常用的遍历列表的方式。在本文中&#xff0c;我们将介绍如何使用Python的for循环语句遍历列…

SSRS rdlc报表之创建报表 一

环境 vs2019 fromwork4.5 第一步 安装rdlc报表插件 vs2019使用rdlc&#xff0c;需要安装扩展插件&#xff0c;扩展→扩展管理→联机&#xff0c;搜索rdlc&#xff0c;安装Microsoft RDLC Report Designer&#xff0c;我在安装过程中&#xff0c;安装了很久都没安装成功&…

一、数据字典介绍

文章目录 一、数据字典介绍1、页面效果2、表设计3、数据分析4、根据页面效果分析数据接口 一、数据字典介绍 何为数据字典&#xff1f;数据字典就是管理系统常用的分类数据或者一些固定数据&#xff0c;例如&#xff1a;省市区三级联动数据、民族数据、行业数据、学历数据等&a…

Spring Boot系列(一):Spring Boot 入门篇

目录 对于学习Java的童鞋来说&#xff0c;可都是有用的博文&#xff0c;也是我悉心选择推荐给大家的。这次为大家带来的系列文章是关于Spring Boot的&#xff0c;Spring Boot对Javaer来说应该是很常用的一个框架。希望这个系列能对大家有用&#xff01;​编辑 快速入门 总结 …

C语言的位运算

1. 位操作符综述 位操作有逻辑运算和移位运算&#xff0c;如位与、位或、位取反、按位异或、移位等操作。位运算通常会和底层代码寄存器的操作结合在一起使用&#xff0c;比如想要让寄存器中的任意1位或者任意几位位设置为1&#xff0c;或者设置为0&#xff0c;从而实现对寄存…

chatgpt赋能Python-pythongame怎么样

Python Game&#xff1a;打造属于自己的游戏 Python是一种全球流行的编程语言&#xff0c;因其简洁易懂、高效稳定&#xff0c;被广泛应用于各类软件、网站与游戏的开发领域。其中&#xff0c;Python Game成为许多开发者的关注焦点&#xff0c;不同于传统游戏开发的复杂与繁琐…