【新手解答1】深入探索 C 语言:变量名、形参 + 主调函数、被调函数 + 类和对象 + 源文件(.c 文件)、头文件(.h 文件)+ 库

C语言的相关问题解答

  • 写在最前面
    • 目录
  • 问题1
      • 变量名与变量的关系与区别
      • 变量和数据类型
      • 形参(形式参数)的概念
  • 问题2
    • 解析:主调函数和被调函数
    • 延伸
      • 解析:主调函数
      • 对于多文件程序的理解
      • 总结
  • 问题3
      • 类和对象
      • 变量和数据类型
      • 变量是否为抽象的数据类型?
      • 总结
  • 问题4
    • 解析
      • 源文件(.c 文件)
      • 头文件(.h 文件)
      • 源文件和头文件的关系
      • 使用 `extern` 和头文件的区别
      • `.c` 文件与 `.c` 程序的差异
    • 延伸
      • a.c(源文件)
      • a.h(头文件)
      • 整体解释
    • 延伸2
      • 如果头文件中原本没有这个函数声明
      • 如果头文件中已经有这个函数声明
      • 为什么要这样做?
      • 示例
  • 问题5
    • 问题6
    • 解析
      • 库(Library)
      • 源代码(Source Code)
      • 区别和联系

写在最前面

一位粉丝私信交流,回想起了当初的我C语言一题写一下午的,而且很多概念糊糊的不清楚。借助这次机会,整理了相关C 语言中最常见而关键的疑惑,并对概念进行解答。

如有不对的地方欢迎指出!好久没接触C了hh


我们将从基础的变量名与变量的关系讲起,探索它们与数据类型的紧密联系,延伸到更复杂的概念,如函数参数(形参)的工作原理。接着,我们会深入讨论类和对象在 C 语言中的应用,探讨变量是否可以被视为一种抽象的数据类型,以及这些概念如何协同工作以创建强大的程序。

此外,本文还将解析 C 语言中源文件与头文件的区别,讲解如何使用 extern 关键字和头文件来优化你的代码结构,以及 .c 文件和 .c 程序之间的区别。我们还会通过实例来展示如何在实际编程中应用这些知识。

通过本文,你不仅会获得对 C 语言核心概念的深入理解,还能学习到如何在实际编程中有效地应用这些知识。让我们开始这段精彩的编程之旅吧!


目录

问题1: 变量名与变量的关系与区别

  • 变量和数据类型
  • 形参(形式参数)的概念

问题2: 多文件程序的理解

  • 解析与延伸

问题3: 类和对象在 C 语言中的角色

  • 变量和数据类型
  • 变量是否为抽象的数据类型?

问题4: 源文件与头文件的关键差异

  • 解析 .c 文件和 .h 文件
  • 使用 extern 和头文件的对比
  • .c 文件与 .c 程序的区别

延伸: 实际应用案例分析

  • a.c(源文件)与 a.h(头文件)
  • 处理新函数声明的方法
  • 处理已存在的函数声明

问题1

能讲讲变量名和变量之间的关系与区别吗?我看见类是对对象的抽象,也就是说,类是一种抽象的数据类型,那么变量可以说是一个框子,包含了一份地址和一份内容,那变量也算不算抽象的数据类型呢?

我一个朋友说变量及定义,定义及声明,并且形参是一个容器,但是我又在某些资料上看到说形参是变量名的,而根据朋友的建议,变量名是一种参考,但又分不太清晰,(而且他那个说没有变量名,无法被调用)

问题涉及了几个不同的概念,我将逐一解释以帮助你更好地理解。

变量名与变量的关系与区别

  1. 变量名:变量名是程序员用来标识变量的标签或名称。它是一种符号,用于在代码中引用变量的存储位置。

  2. 变量:变量是计算机内存中用来存储数据的一个存储单元。变量具有数据类型,这决定了变量存储的数据类型(如整数、浮点数、字符等)。

关系:变量名和变量之间的关系可以类比于家庭住址和房子。住址(变量名)是用来识别房子(变量)的位置的标识。

区别:变量名是对变量存储位置的引用,而变量本身是实际存储数据的内存区域。

变量和数据类型

变量通常不被视为抽象的数据类型。在计算机科学中,数据类型(如整数、浮点数、字符等)是一种描述数据特性的抽象,它定义了数据的操作、表示和存储方式。变量则是这些数据类型的具体化,用于存储特定类型的数据。

形参(形式参数)的概念

在函数中,形式参数(简称形参)是用于接收传递给函数的值的变量。它们在函数定义时被声明,用于指定函数可接受的数据类型和数量。

  • 形参本质上是局部变量,它们在函数调用期间存在,并用于存储传递给函数的实际参数(实参)的值。
  • 形参是变量的一种,因此它们有变量名,这些变量名在函数体内用于引用传递给函数的值。

问题2

主调函数和被调函数不在同一个点c文件的时候,一定要声明,但是主调函数main不是编译器自带的吗?怎么会属于一个文件呢?

解析:主调函数和被调函数

在C语言中,当一个函数(被调函数)在其他文件中定义时,确实需要在调用该函数的文件(主调文件)中进行声明。这是因为C编译器按文件进行编译,编译器在编译一个文件时不知道其他文件中的内容。声明是一种告诉编译器被调函数存在、其类型和参数的方式,即使实际定义在别处。

至于main函数,它确实是C程序的入口点,但并不是编译器自带的。main函数需要由程序员在某个文件中定义。这个文件可以是程序的任何一个.c文件,但通常是主程序文件。编译器知道查找名为main的函数并从那里开始执行程序。

当你编写一个C程序,分为多个文件时,每个文件都可能包含函数的定义。主调函数(如main)可能在一个文件中,而它调用的其他函数可能分布在其他文件中。在这种情况下,需要在包含主调函数的文件中声明那些定义在其他文件中的被调函数。这样做是为了在编译时期让编译器知道这些函数的存在和它们的接口。

简而言之,main函数是程序员定义的,它可以位于程序的任何.c文件中,而不是由编译器自动提供的。当一个函数调用另一个位于不同文件的函数时,需要在调用方文件中对被调用函数进行声明。

延伸

但是主调文件又是什么呢?可以理解为包含了主函数的文件吗?或者是正在运行的程序部分(一个程序包含多个源文件,这是我目前已知的)

答:如果术语“主调文件”被用来指代包含 main() 函数的文件,可以这样理解,因为这个文件控制着程序的启动和主要执行流程。

解析:主调函数

“主调文件”(Main Calling File)这个术语在程序设计中不是一个标准或广泛使用的术语,但根据字面意思和上下文,它可以被理解为包含程序主入口点(如 main() 函数)的文件,或者是触发和控制程序执行的主要源文件。

在多文件的 C 语言程序中,通常有一个文件包含 main() 函数,这个文件通常被视为程序的起始点,因为当你运行程序时,执行将从 main() 函数开始。所以,在这个意义上,包含 main() 函数的文件可以被认为是“主调文件”,因为它是程序执行的起点。

对于多文件程序的理解

在一个由多个源文件组成的程序中,每个文件通常包含程序的不同部分。例如,一些文件可能包含特定的函数定义,其他文件可能包含数据结构的定义等。这些文件在编译过程中被编译成对象文件,然后链接在一起形成最终的可执行程序。

其中,包含 main() 函数的文件是特殊的,因为:

  1. 程序入口main() 函数是程序的入口点。程序开始执行的时候,执行流程首先进入 main() 函数。

  2. 控制流:虽然程序的其他部分可能分布在不同的文件中,但通常它们都是从 main() 函数直接或间接被调用的。因此,包含 main() 函数的文件在程序的控制流中起着核心作用。

总结

  • 变量名是用于标识和引用变量的符号。
  • 变量是存储数据的内存单元,具有特定的数据类型。
  • 变量不是抽象的数据类型;相反,数据类型是一种抽象,用于描述数据的特性和操作方式。
  • 形参是函数内的局部变量,用于接收传递给函数的值。

问题3

类是对对象的抽象,也就是说,类是一种抽象的数据类型,那么变量可以说是一个框子,包含了一份地址和一份内容,那变量也算不算抽象的数据类型呢?

这个问题涉及了几个基本的编程概念,我会逐一解释以帮助你更好地理解。

类和对象

在面向对象编程(OOP)中,是对对象的一个抽象描述。它定义了一组属性(数据成员)和方法(成员函数),这些属性和方法共同描述了一类具体对象的共同特征和行为。例如,如果你有一个“汽车”类,它可能包含属性如“品牌”、“颜色”和“速度”,以及方法如“驾驶”和“加速”。

对象是根据类的模板创建的实例。每个对象都拥有类中定义的属性和方法,但每个对象的属性值可能不同。继续上面的例子,一个特定的汽车对象可能有特定的品牌、颜色和速度。

变量和数据类型

在编程中,变量是用于存储数据的一个标识符(名称)。变量指向内存中的一个位置,这个位置存储了变量的值。变量的数据类型决定了变量可以存储什么类型的数据,以及可以对这些数据执行哪些操作。例如,一个整型变量可以存储整数值,而一个字符串变量可以存储文本数据。

变量是否为抽象的数据类型?

变量本身不被认为是抽象的数据类型。变量更像是数据类型的具体化表现:

  • 数据类型(如整数类型、浮点类型、字符类型)是抽象的,它们定义了一组值和这些值上可以执行的操作。
  • 变量是这些数据类型的具体实例。它们是数据类型在程序中的具体表现,用于存储特定类型的值。

变量可以被看作是包含地址(指向变量存储位置的内存地址)和内容(存储在那个地址的数据)的“容器”,但这并不使它成为一个抽象的数据类型。相反,它是数据类型的具体应用。

总结

  • 类是对对象的抽象,定义了一组属性和行为。
  • 对象是类的实例,具体化了类的定义。
  • 数据类型是抽象的,定义了值的类型和可执行的操作。
  • 变量是数据类型的具体实现,用于存储特定类型的数据。

问题4

还有关于声明的问题(主调与被调函数在不同点c文件中时),我看到了两种方案,一种是用extern,而另一种则是把,声明放在头文件里,让点c程序包含整个头文件。

我是在这里感到不懂的,源文件和头文件到底有什么区别?是源文件包含头文件吗?(这个查资料了,但还是看不懂),点c程序与点c文件又有什么差别?

解析

理解 C 语言中源文件和头文件的概念,以及它们如何协同工作,对于理解 C 语言程序的结构非常重要。我会一一解释这些概念。

源文件(.c 文件)

  • 源文件,通常是以 .c 为扩展名的文件,包含 C 语言的函数定义和代码。这些文件包含了程序的实际逻辑和算法部分。

  • 当你编译一个程序时,编译器将这些源文件转换成机器语言(通常是对象文件),这些机器语言文件随后可以被链接器合并成一个可执行文件。

头文件(.h 文件)

  • 头文件,通常是以 .h 为扩展名的文件,用于声明函数、宏定义、常量和类型定义等。它们不包含函数的具体实现,而是提供了一种方式来共享函数声明、宏定义等,以便在多个源文件之间复用。

  • 头文件的主要目的是提供接口的声明,这样其他源文件就可以了解如何调用这些函数,而无需知道它们的具体实现。

源文件和头文件的关系

  • 包含关系:源文件通常通过预处理指令 #include 来包含一个或多个头文件。这使得在一个源文件中可以使用在另一个源文件中定义的函数和类型。

  • 组织结构:在大型项目中,通过头文件和源文件的分离,可以更好地组织代码,使其更易于管理和维护。

使用 extern 和头文件的区别

  • 使用 extern:当你在一个源文件中使用 extern 关键字声明一个在另一个源文件中定义的函数或变量时,你告诉编译器这个函数/变量的定义将在其他地方出现。这是一种使得多个源文件能够共享相同的全局变量或函数的方法。

  • 使用头文件:另一种方法是将这些外部函数或变量的声明放在一个头文件中,然后在需要它们的每个源文件中包含这个头文件。这种方式更加模块化,可以简化源文件间的依赖关系管理。

.c 文件与 .c 程序的差异

  • .c 文件:指的是单个的 C 语言源代码文件,通常包含程序的一部分代码。

  • .c 程序:可能指的是整个由 .c 文件(可能不止一个)组成的程序。它包括了程序的所有源代码文件,这些文件共同构成了完整的程序。

延伸

这里第一行的a点c又是什么意思?

在这里插入图片描述
在提供的代码示例中,“a.c”和“a.h”代表两个不同类型的文件,分别是 C 语言的源文件和头文件。让我们详细解释这些文件和代码的意义:

a.c(源文件)

  • 文件名a.c 是一个源文件(.c 文件),包含 C 语言编写的程序代码。
  • 代码内容
    • #include "a.h":这行代码包含了头文件 a.h。这意味着 a.c 将使用在 a.h 中声明的内容。
    • int main():定义了程序的入口点,即 main() 函数。
    • fun();:在 main() 函数中调用了 fun() 函数。这个函数的声明在 a.h 中,而定义在 a.c 中。
    • void fun(void):定义了 fun() 函数,它打印 “hello world\n”。

a.h(头文件)

  • 文件名a.h 是一个头文件(.h 文件),通常包含函数声明、宏定义、类型定义等。
  • 代码内容
    • extern void fun(void);:这是 fun() 函数的声明。关键字 extern 表明 fun() 函数在其他地方(在这个例子中,是在 a.c 文件中)定义。这使得在包含 a.h 的任何其他源文件中都能调用 fun() 函数。

整体解释

在这个例子中,a.ca.h 协同工作,实现了代码的模块化。a.h 头文件提供了 fun() 函数的声明,而 a.c 源文件包含了 fun() 函数的具体实现和程序的主入口 main() 函数。当编译这个程序时,编译器会先查看 a.h 来了解 fun() 函数的原型,然后在 a.c 中找到并编译 fun() 函数的定义以及 main() 函数。

这种组织代码的方式有利于维护和代码重用,因为函数声明和定义被清晰地分离开来。头文件(如 a.h)可以被多个不同的源文件(如 a.c)包含,这样就可以在多个源文件之间共享相同的函数声明。

延伸2

还是有点不放心,我之前在资料里看到的,把函数声明放在头文件的……假如头文件里原本没有这个函数,该如何操作?又或者已经有了这个函数了,那么是否直接引用就可以了?

当你在编写 C 程序并使用头文件时,你的目的通常是为了组织和共享代码,特别是在有多个源文件的情况下。以下是关于如何处理头文件中的函数声明的一些指南:

如果头文件中原本没有这个函数声明

  1. 添加新的函数声明:如果你正在编写一个新的函数,而这个函数需要在多个源文件中被调用,你应该在一个头文件中声明这个函数。方法如下:

    • 在头文件(例如 myfunctions.h)中添加函数声明。这通常是函数的原型,比如 void myFunction(int param);
    • 在每个需要调用这个函数的源文件(.c 文件)顶部,使用 #include "myfunctions.h" 来包含这个头文件。
  2. 确保一致性:确保你在头文件中声明的函数原型与在任何源文件中定义的函数原型完全一致。

如果头文件中已经有这个函数声明

  • 直接引用:如果头文件(比如 existing.h)已经包含了你需要的函数声明,你只需在每个需要使用这个函数的源文件顶部包含这个头文件,使用 #include "existing.h"
  • 检查一致性:确保你在源文件中定义的函数与头文件中声明的原型匹配。不一致可能导致编译错误。

为什么要这样做?

  • 避免重复声明:在头文件中声明函数可以避免在多个源文件中重复相同的声明,这有助于保持代码的干净和一致。
  • 提高可维护性:如果需要更改函数的签名(例如添加一个新的参数),你只需要更改头文件中的声明,而不是更改每个源文件中的声明。

示例

假设你有一个函数 void sayHello(void);,它在多个源文件中被调用。

  • 在头文件中(假设为 hello.h):

    // hello.h
    extern void sayHello(void);
    
  • 在源文件中(例如 main.cother.c):

    // main.c
    #include "hello.h"int main() {sayHello();return 0;
    }// other.c
    #include "hello.h"void someFunction() {sayHello();
    }
    
  • 定义函数(可能在任何一个 .c 文件中,例如 hello.c):

    // hello.c
    #include <stdio.h>void sayHello(void) {printf("Hello, world!\n");
    }
    

在这个例子中,无论你的程序有多少个源文件需要调用 sayHello 函数,它们都通过包含同一个头文件 hello.h 来获取函数声明。这确保了函数的使用在整个程序中是一致的。

问题5

假如我在编译器上面写一个in tat,仅仅只是一个inta,那它是否隐性引用了stdio点h?我从我的朋友那里得到一个词语叫做启动函数所在的文件,这个具体是什么意思呢?

首先,关于你提到的“in tat”和“inta”,我先理解为是在 C 语言中声明一个变量,比如 int a;,那么这个声明本身并不会隐式地包含或引用 <stdio.h> 或任何其他头文件。在 C 语言中,变量声明和头文件的包含是两个独立的操作:

  • 变量声明,如 int a;,仅仅是声明了一个整型变量 a。它不需要任何特定的头文件,因为 int 是 C 语言的基本数据类型。

  • 头文件包含,如 #include <stdio.h>,是用来包含标准输入输出库的头文件,这通常用于输入输出操作,例如 printf()scanf() 函数。除非你需要使用这些特定的输入输出功能,否则无需包含 <stdio.h>

至于“启动函数所在的文件”,这个表达可能指的是包含程序入口点(通常是 main() 函数)的源文件。在 C 语言程序中,程序的执行从 main() 函数开始,所以含有 main() 函数的文件可以被视为程序的启动文件或主文件。这个文件通常是程序编译和执行的起点。

总结一下:

  • int a; 这样的代码不会隐式地包含任何头文件。
  • “启动函数所在的文件”可能指的是包含 main() 函数的源文件,这是程序的入口点。

问题6

库包含源文件和头文件,而源代码也包含点c点h的文件,那么库和源代码到底是不是一家?

答:库和源代码是编程领域的两个重要概念,它们相互关联但有着不同的用途和特性。源代码是创建库的基础,而库则是源代码编译后的集合,用于在多个程序或项目中共享代码。

解析

库(Library)和源代码(Source Code)在编程中是两个相关但不同的概念。虽然它们可能包含相似类型的文件(如 .c.h 文件),它们的用途和作用方式有所不同。

库(Library)

  1. 定义:库是一组预编译的代码,通常由函数、类、或其他资源组成,这些可以在多个程序中共享和重用。库的目的是提供一组已实现的功能,以便开发者不必从头开始编写代码。

  2. 类型:库可以是静态的(Static Libraries,如 .lib.a 文件)或动态的(Dynamic Libraries,如 .dll.so 文件)。

  3. 内容:库通常包含编译后的代码(不是源代码),以及可能的头文件(.h 文件),后者用于提供库中函数的声明和接口。

源代码(Source Code)

  1. 定义:源代码是用任何编程语言编写的原始代码。它是程序的基础,编写、阅读和修改的都是源代码。

  2. 内容:源代码通常包含源文件(.c 文件,包含具体的代码实现)和头文件(.h 文件,包含函数声明和类型定义)。

区别和联系

  • 用途区别:库是为了代码复用和分发而存在的,它封装了一系列功能供其他程序调用。而源代码是编写程序的基础,是程序开发的起点。

  • 构成关系:源代码可以被编译和封装成库。换句话说,库可能最初是从源代码编译而来的。

  • 可见性:源代码通常是可见的,允许开发者阅读和修改。而库,特别是二进制形式的库,其内容通常是不可见的,或者难以修改。


希望这些解释能帮助更清晰地理解这些概念!如果还有其他疑问或需要进一步的解释,随时欢迎提问。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS中基于人口数据计算人口密度的方法

文章目录 一、密度分析原理二、点密度分析三、线密度分析四、核密度分析一、密度分析原理 密度分析是指根据输入的要素数据集计算整个区域的数据聚集状况,从而产生一个联系的密度表面。通过密度计算,将每个采样点的值散步到整个研究区域,并获得输出栅格中每个像元的密度值。…

嵌入式八股 | 校招秋招 | 笔试面试 | 精选题目

欢迎关注微信公众号【赛博二哈】获取八股PDF 并加入嵌入式求职交流群。提供简历模板、学习路线、岗位整理等 欢迎加入知识星球【嵌入式求职星球】获取完整嵌入式八股。 提供简历修改、项目推荐、求职规划答疑。另有各城市、公司岗位、笔面难题、offer选择、薪资爆料等 嵌入式…

分布式数据恢复-hbase+hive分布式存储误删除如何恢复数据?

hbasehive分布式存储数据恢复环境&#xff1a; 16台某品牌R730XD服务器节点&#xff0c;每台物理服务器节点上有数台虚拟机&#xff0c;虚拟机上配置的分布式&#xff0c;上层部署hbase数据库hive数据仓库。 hbasehive分布式存储故障&初检&#xff1a; 数据库文件被误删除…

十八、初识elasticsearsh (索引)

目录 一、Elasticsearch的介绍&#xff1a; 二、正向索引和倒排索引 1、正向索引 2、倒排索引 3、索引(index) :相同类型的文档的集合 4、映射(mapping):索引中文档的字段约束信息&#xff0c;类似表的结构约束 一、Elasticsearch的介绍&#xff1a; Elasticsearch是一个…

企业数字化转型的作用是什么?_光点科技

在当今快速变化的商业环境中&#xff0c;数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式&#xff0c;以提升效率、增强竞争力和创造新的增长机会。 提升运营效率&#xff1a;数字化转型通过引入自动化工具和智能系统&#x…

JVM——产生内存溢出原因

目录 1.产生内存溢出原因一 &#xff1a;代码中的内存泄漏1.案例1&#xff1a;equals()和hashCode()导致的内存泄漏问题&#xff1a;**正常情况**&#xff1a;**异常情况&#xff1a;**解决方案&#xff1a; 2.案例2&#xff1a;内部类引用外部类问题&#xff1a;解决方案&…

计算机网络——网络可靠性及网络出口配置

1. 前言&#xff1a; 学习目标&#xff1a; 1.了解链路聚合的作用 2. 了解ACL的工作原理 3. 了解NAT的工作原理和配置 2. 网络可靠性方案 网络可靠性是指网络在面对各种异常情况或故障时&#xff0c;能够维持正常运行和提供服务的能力。这包括防止网络中断、减小数据丢失的可能…

深入Python元编程:了解声明与初始化定制元类

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 简介 在Python中&#xff0c;元编程是指在运行时创建或定制类的编程。元类是Python中最强大的元编程工具之一&#xff0c;允许您控制类的创建过程。元类是类的类&#xff0c;它控制类的实例化&#xff0c;允许您…

详解Python中print和return的作用及区别

文章目录 关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 print的作用是输出数据到控制端,就是打印在你能看到的…

C51--LCD1602显示屏

LCD602显示&#xff1a; 1、概述 LCD602是一种工业字符型液晶&#xff0c;能够同时显示16x02&#xff0c;即32字符&#xff08;16列&#xff0c;2行&#xff09; 2、引脚&#xff1a; VSS&#xff1a;电源地VDD&#xff1a;电源正极——5V电源VO&#xff1a; 液晶显示偏压 …

给企业做公众号运营你都有哪些宝贵经验?

运营企业公众号需要长期的坚持和不断的创新&#xff0c;如何运营好一个企业公众号&#xff0c;使其成为企业与受众互动、传递价值、提升品牌形象的平台&#xff0c;是许多企业所面临的挑战。但只要不断学习&#xff0c;总结经验&#xff0c;就一定能够找到适合自己企业的公众号…

具有“真实触感”的动捕数据手套mhand pro,提供更精确的动作捕捉

随着人工智能的普及和万物互联&#xff0c;vr虚拟技术备受关注&#xff0c;为了更加真实的虚拟现实交互体验&#xff0c;动捕数据手套的使用逐渐普及&#xff0c;vr手套可以实时采集各手指关节运动数据&#xff0c;使用动捕数据手套可以在虚拟现实的场景中实现对真实手部运动的…

竞赛选题 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正

文章目录 0 简介1 思路简介1.1 车牌定位1.2 畸变校正 2 代码实现2.1 车牌定位2.1.1 通过颜色特征选定可疑区域2.1.2 寻找车牌外围轮廓2.1.3 车牌区域定位 2.2 畸变校正2.2.1 畸变后车牌顶点定位2.2.2 校正 7 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享…

巧妙之中见真章:深入解析常用的创建型设计模式

设计模式之创建型设计模式详解 一、设计模式是什么&#xff1f;二、模板方法2.1、代码结构2.2、符合的设计原则2.3、如何扩展代码2.4、小结 三、观察者模式3.1、代码结构3.2、符合的设计原则3.3、如何扩展代码3.4、小结 四、策略模式4.1、代码结构4.2、符合的设计原则4.3、如何…

模拟火车订票系统---python序列

if __name__ __main__:#创建车辆信息列表list["车次","出发站-到达站","出发时间","到达时间","历时","余票"]trainNumber[T40,T298,Z158,Z62]address[长春-北京,长春-北京,长春-北京,长春-北京]getTime[00:12,0…

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点&#xff0c;表达真实的地形&#xff0c;这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据…

Python之数据可视化

文章目录 一、1、matplotlib简单应用1.1、绘制带有中文标签和图例的图1.2、 绘制散点图1.3、绘制饼状图1.4、多个图形一起显示 一、 1、matplotlib简单应用 matplotlib模块依赖于numpy模块和tkinter模块&#xff0c;可以绘制多种形式的图形&#xff0c;包括线图、直方图、饼状…

【Linux】匿名管道与命名管道,进程池的简易实现

文章目录 前言一、匿名管道1.管道原理2.管道的四种情况3.管道的特点 二、命名管道1. 特点2.创建命名管道1.在命令行上2.在程序中 3.一个程序执行打开管道并不会真正打卡 三、进程池简易实现1.makefile2.Task.hpp3.ProcessPool.cpp 前言 一、匿名管道 #include <unistd.h&g…

线性代数的艺术

推荐一本日本网友Kenji Hiranabe写的《线性代数的艺术》。这本书是基于MIT大牛Gilbert Strang教授的《每个人的线性代数》制作的。 虽然《线性代数的艺术》这本书仅仅只有12页的内容&#xff0c;就把线性代数的重点全画完了&#xff0c;清晰明了。 《线性代数的艺术》PDF版本&…

算法中的时间复杂度,空间复杂度

一、前言 算法&#xff08;Algorithm&#xff09;是指用来操作数据、解决程序问题的一组方法。对于同一个问题&#xff0c;使用不同的算法&#xff0c;也许最终得到的结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别 衡量不同算法之间的优劣主要是通过时…