当前位置: 首页 > news >正文

【C++ Primer Plus】第六章:分支语句和逻辑运算符

文章目录

  • 第六章 分支语句和逻辑运算符
    • 6.1 字符函数库cctype
    • 6.2 ?:运算符
    • 6.3 读取数字的输入
    • 6.4 cin的处理过程
      • char类型
      • int
      • double
      • char数组
      • 使用char数组来存储输入
    • 6.5 写入到文本文件中
    • 6.6 读取文本文件
    • 6.7 总结

第六章 分支语句和逻辑运算符

6.1 字符函数库cctype

C++从C语言继承了一个与字符相关的、非常方便的函数软件包,它可以简化诸如确定字符是否为大写字母、数字、标点符号等工作,这些函数的原型是在头文件cctype(老式的风格中为ctype.h)中定义的。
例如,如果ch是一个字母,则isalpha(ch)函数返回一个非零值,否则返回0。同样,如果ch是标点符号(如逗号或句号),函数ispunct(ch)将返回true。(这些函数的返回类型为int,而不是bool,但通常bool转换让您能够将它们视为bool类型。)

使用这些函数比使用AND和OR运算符更方便。例如,下面是使用AND和OR来测试字符ch是不是字母字符的代码:

if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))if(isalpha(ch))

具体地说,它使用isalpha( )来检查字符是否为字母字符,使用isdigits( )来测试字符是否为数字字符,如3,使用isspace( )来测试字符是否为空白,如换行符、空格和制表符,使用ispunct( )来测试字符是否为标点符号。

函数名称 返回值
isalnum(); 如果参数是字母数字,即字母或数字,该函数返回true;
isalpha(); 如果参数是字母,该函数返回true;
iscntrl(); 如果参数是控制字符,该函数返回true;
isdigit(); 如果参数是数字(0~9),该函数返回true;
isgraph(); 如果参数是除空格之外的打印字符,该函数返回true;
islower(); 如果参数是小写字母,该函数返回true;
isprint(); 如果参数是打印字符(包括空格),该函数返回true;
ispunct(); 如果参数是标点符号,该函数返回true;
isspace(); 如果参数是标准空白字符,如空格、进纸、换行符、回车、水平制表符或 者垂直制表符,该函数返回true;
isupper(); 如果参数是大写字母,该函数返回true;
isxdigit(); 如果参数是十六进制数字,即0~9、a~f或A~F,该函数返回true;
tolower(); 如果参数是大写字符,则返回其小写,否则返回该参数;
toupper(); 如果参数是小写字符,则返回其大写,否则返回该参数;

6.2 ?:运算符

C++有一个常被用来代替if else语句的运算符,这个运算符被称为条件运算符(?:),它是C++中唯一一个需要3个操作数的运算符。该运算符的通用格式如下:

expression1 ? expression2 : expression3

如果expression1为true,则整个条件表达式的值为expression2的值;否则,整个表达式的值为expression3的值。

continue跳过循环体剩余的部分,开始新一轮循环;

break跳过循环的剩余部分,到达下一条语句;

6.3 读取数字的输入

任务描述: 假设要编写一个将一系列数字读入到数组中的程序,并允许用户在数组填满之前结束输入。

**应用:**假设要编写一个程序,来计算平均每天捕获的鱼的重量。这里假设每天最多捕获5条鱼,因此一个包含5个元素的数组将足以存储所有的数据,但也可能没有捕获这么多鱼。在程序清单6.13中,如果数组被填满或者输入了非数字输入,循环将结束。

#include <iostream>
#include <cstring>
//#include <iso646.h>
using namespace std;
const int Max = 5;int main() {double fish[Max];cout << "Please enter the weight of your fish:" << endl << "and ""you enter up to" << Max << "fiash<q to terminate>"<<endl;cout << "fish #1:";int i = 0;while (i < Max && cin >> fish[i]) {if (++i < Max) {cout << "fish #" << i + 1 << ":";}}double total = 0.0;for (int j = 0; j < i; j++) {total += fish[j];}if (i == 0) {cout << "No fish!" << endl;} else {cout << total / i << " = average weight of " << i << " fish\n";}cout << "Done.\n";return 0;
}

如果cin位于测试条件中,则将被转换为bool类型。如果输入成功,则转换后的值为true,否则为false。如果表达式的值为false,则循环结束l,fish[q]不存在,因此输入失败。

在这个例子中,当用户输入的不是数字时,该程序将不再读取输入。下面来看一个继续读取的例子。

假设程序要求用户提供5个高尔夫得分,以计算平均成绩。如果用户输入非数字输入,程序将拒绝,并要求用户继续输入数字。可以看到,可以使用cin输入表达式的值来检测输入是不是数字。程序发现用户输入了错误内容时,应采取3个步骤:

  1. 重置cin以接收新的输出;
  2. 删除错误输入;
  3. 提示用户再输入。

请注意,程序必须先重置cin,然后才能删除错误输入。

#include <iostream>
#include <cstring>
//#include <iso646.h>using namespace std;
const int Max = 5;int main() {int golf[Max];cout << "Please enter you must enter 5 rounds: " << endl << "and ""you must enter " << Max << "rounds" << endl;int i;for (i = 0; i < Max; i++) {cout << "round # " << i + 1 << ":";while (!(cin >> golf[i])) {cin.clear();while (cin.get() != '\n')continue;cout << "Please enter a number:";}}double total = 0.0;for (i = 0; i < Max; i++ ) {total += golf[i];}cout << total / Max << " = average score " << Max << " rounds\n";return 0;
}

运行结果如下:

Please enter you must enter 5 rounds:
and you must enter 5rounds
round # 1:28
round # 2:34
round # 3:lv
Please enter a number:er
Please enter a number:23
round # 4:34
round # 5:t
Please enter a number:23
28.4 = average score 5 rounds--------------------------------
Process exited after 27.28 seconds with return value 0
请按任意键继续. . .

如果用户输入88,则cin表达式将为true,因此将一个值放到数组中;而表达式!(cin >> golf [i])为false,因此结束内部循环。然而,如果用户输入lv?,则cin表达式将为false,因此不会将任何值放到数组中;而表达式!(cin >> golf [i])将为true,因此进入内部的while循环。该循环的第一条语句使用clear( )方法重置输入,如果省略这条语句,程序将拒绝继续读取输入。接下来,程序在while循环中使用cin.get( )来读取行尾之前的所有输入,从而删除这一行中的错误输入。另一种方法是读取到下一个空白字符,这样将每次删除一个单词,而不是一次删除整行。最后,程序告诉用户,应输入一个数字。

6.4 cin的处理过程

使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。不管目标数据
类型是什么,输入一开始都是字符数据——文本数据。然后,cin对象负责将文本转换为其他类型。

为说明这是如何完成的,来看一些处理同一个输入行的代码。

假设有如下示例输入行:

38.5  19.2

来看一下使用不同数据类型的变量来存储时,cin是如何处理该输入行的。

char类型

char ch;
cin >> ch;

输入行中的第一个字符被赋给ch。在这里,第一个字符是数字3,其字符编码(二进制)被存储在变量ch中。输入和目标变量都是字符,因此不需要进行转换。注意,这里存储的数值3,而是字符3的编码。执行上述输入语句后,输入队列中的下一个字符为字符8,如果有下一个输入,则下一个输入操作将对其进行处理。

int

int n;
cin >> n;

在这种情况下,cin将不断读取,直到遇到非数字字符。也就是说,它将读取3和8,这样句点将成为输入队列中的下一个字符。cin通过计算发现,这两个字符对应数值38,因此将38的二进制编码复制到变量n中。

注意: 这里有的人认为是进行了强转,将一个输入的浮点型数据转换成了这种整型数据,这样理解是错误的。

double

double x;
cin >> x;

在这种情况下,cin将不断读取,直到遇到第一个不属于浮点数的字符。也就是说,cin读取3、8、句点和5,使得空格成为输入队列中的下一个字符。cin通过计算发现,这四个字符对应于数值38.5,因此将38.5的二进制编码(浮点格式)复制到变量x中。

char数组

char word[50];
cin >> word;

在这种情况下,cin将不断读取,直到遇到空白字符。也就是说,它读取3、8、句点和5,使得空格成为输入队列中的下一个字符。然后,cin将这4个字符的字符编码存储到数组word中,并在末尾加上一个空字符。这里不需要进行任何转换。

使用char数组来存储输入

char word[50];
cin.getline(word,50);

在这种情况下,cin将不断读取,直到遇到换行符(示例输入行少于50个字符)。所有字符都将被存储到数组word中,并在末尾加上一个空字符。换行符被丢弃,输入队列中的下一个字符是下一行中的第一个字符。这里不需要进行任何转换。

即整数被转换为数字字符序列,浮点数被转换为数字字符和其他字符组成的字符序列(如284.53或
−1.58E+06)。字符数据不需要做任何转换。

6.5 写入到文本文件中

对于文件输入,C++使用类似于cout的东西。下面来复习一些有关将cout用于控制台输出的基本事实,为文件输出做准备。

  • 必须包含头文件iostream。
  • 头文件iostream定义了一个用处理输出的ostream类。
  • 头文件iostream声明了一个名为cout的ostream变量(对象)。
  • 必须指明名称空间std;例如,为引用元素cout和endl,必须使用编译指令using或前缀std::。
  • 可以结合使用cout和运算符<<来显示各种类型的数据。

文件输出与此极其相似:

  • 必须包含头文件fstream。
  • 头文件fstream定义了一个用于处理输出的ofstream类。
  • 需要声明一个或多个ofstream变量(对象),并以自己喜欢的方式。对其进行命名,条件是遵守常用的命名规则。
  • 必须指明名称空间std;例如,为引用元素ofstream,必须使用编译指令using或前缀std::。
  • 需要将ofstream对象与文件关联起来。为此,方法之一是使用open()方法。
  • 使用完文件后,应使用方法close( )将其关闭。
  • 可结合使用ofstream对象和运算符<<来输出各种类型的数据。
  • 可以使用ifstream对象和get( )方法来读取一个字符,使用ifstream对象和getline( )来读取一行字符。
  • 可以结合使用ifstream和eof( )、fail( )等方法来判断输入是否成功。
  • ifstream对象本身被用作测试条件时,如果最后一个读取操作成功,它将被转换为布尔值true,否则被转换为false。

注意,虽然头文件iostream提供了一个预先定义好的名为cout的ostream对象,但您必须声明自己ofstream对象,为其命名,并将其同文件关联起来。下面演示了如何声明这种对象:

ofstream outFile;
ofstream fout;

下面演示了如何将这种对象与特定的文件关联起来:

outFile.open("fish.txt");
char filename[50];
cin>>filename;
fout.open(filename);

方法open( )接受一个C-风格字符串作为参数,这可以是一个字面字符串,也可以是存储在数组中的字符串。

重要的是,声明一个ofstream对象并将其同文件关联起来后,便可以像使用cout那样使用它。所有可用于cout的操作和方法(如<<、endl和setf( ))都可用于ofstream对象(如前述示例中的outFile和fout)。

总之,使用文件输出的主要步骤如下:

1.包含头文件fstream。

2.创建一个ofstream对象。

3.将该ofstream对象同一个文件关联起来。

4.就像使用cout那样使用该ofstream对象。

下面的程序演示了这种方法。它要求用户输入信息,然后将信息显示到屏幕上,再将这些信息写入到文件中。读者可以使用文本编辑器来查看该输出文件的内容。

#include <iostream>
#include <fstream>
#include <cstring>using namespace std;int main() {char automobile[50];int year;double a_price;double d_price;ofstream outFile;outFile.open("carinfo.txt");//与文本文件建立联系cout << "Enter the make and model of automobile:";cin.getline(automobile, 50);cout << "Enter the model year:";cin >> year;cout<<"Enter the original asking price:";cin >> a_price;d_price = 0.913 * a_price;cout << fixed;//以普通方式输出,非科学计数法cout.precision(2);//保留两位小数cout.setf(ios_base::showpoint);cout << "Make and model: " << automobile << endl;cout << "Year:" << year << endl;cout << "Was asking $" << a_price << endl;cout << "Now asking $" << d_price << endl;outFile << fixed;//以普通方式输出,非科学计数法outFile.precision(2);//保留两位小数outFile.setf(ios_base::showpoint);outFile << "Make and model:" << automobile << endl;outFile << "Year:" << year << endl;outFile << "Was asking $" << a_price << endl;outFile << "Now asking $" << d_price << endl;outFile.close();return 0;
}

注意,方法close( )不需要使用文件名作为参数,这是因为outFile已经同特定的文件关联起来。如果您忘记关闭文件,程序正常终止时将自动关闭它。

outFile.open("carinfo.txt");//与文本文件建立联系

在这里,该程序运行之前,文件carinfo.txt并不存在。在这种情况下,方法open( )将新建一个名为carinfo.txt的文件。如果在此运行该程序,文件carinfo.txt将存在,此时情况将如何呢?默认情况下,open( )将首先截断该文件,即将其长度截短到零——丢其原有的内容,然后将新的输出加入到该文件中。

打开已有的文件,以接受输出时,默认将它其长度截短为零,因此原来的内容将丢失。

打开文件用于接受输入时可能失败。例如,指定的文件可能已经存在,但禁止对其进行访问。因此细心的程序员将检查打开文件的操作是否成功。

6.6 读取文本文件

接下来介绍文本文件输入,它是基于控制台输入的。控制台输入涉及多个方面,下面首先总结这些方面。

  • 必须包含头文件iostream。
  • 头文件iostream定义了一个用处理输入的istream类。
  • 头文件iostream声明了一个名为cin的istream变量(对象)。
  • 必须指明名称空间std;例如,为引用元素cin,必须使用编译指令using或前缀std::。
  • 可以结合使用cin和运算符>>来读取各种类型的数据。
  • 可以使用cin和get( )方法来读取一个字符,使用cin和getline( )来读取一行字符。
  • 可以结合使用cin和eof( )、fail( )方法来判断输入是否成功。
  • 对象cin本身被用作测试条件时,如果最后一个读取操作成功,它将被转换为布尔值true,否则被转换false。

注意,虽然头文件iostream提供了一个预先定义好的名为cin的istream对象,但您必须声明自己的ifstream对象,为其命名,并将其同文件关联起来。下面演示了如何声明这种对象:

ifstream inFile;
ifstream fin;

下面演示了如何将这种对象与特定的文件关联起来:

inFile.open("bowling.txt");
char filename[50];
cin>>filename;
fin.open(filename);

注意,方法open( )接受一个C-风格字符串作为参数,这可以是一个字面字符串,也可以是存储在数组中的字符串。

下面演示了如何使用这种对象:

double wt;
inFile >> wt;
char line[81];
fin.getline(line,81);

声明一个ifstream对象并将其同文件关联起来后,便可以像使用cin那样使用它。所有可用于cin的操作和方法都可用于ifstream对象。

如果试图打开一个不存在的文件用于输入,情况将如何呢?这种错误将导致后面使用ifstream对象进行输入时失败。检查文件是否被成功打开的首先方法是使用方法is_open( ),为此,可以使用类似于下面的代码:

inFile.open("bowling.txt");
if(!inFile.isopen){exit(EXIT_FAILURE);
}

如果文件被成功地打开,方法is_open( )将返回true;因此如果文件没有被打开,表达式!inFile.isopen( )将为true。函数exit( )的原型是在头文件cstdlib中定义的,在该头文件中,还定义了一个用于同操作系统通信的参数值EXIT_FAILURE。函数exit( )终止程序。

下面的程序打开用户指定的文件,读取其中的数字,然后指出文件中包含多少个值以及它们的和与平均值。正确地设计输入循环至关重要。

#include <iostream>
#include <fstream>
#include <cstdlib>using namespace std;
const int SIZE = 60;int main() {char filename[SIZE];ifstream inFile;cout << "Enter name of data file:";cin.getline(filename, SIZE);inFile.open(filename);if (!inFile.is_open()) {cout << "Could not open the file " << filename << endl;cout << "Program terminating.\n";exit(EXIT_FAILURE);}double value;double sum = 0.0;int count = 0;inFile >> value;while (inFile.good()) {//while input good and not at EOF++count;sum += value;inFile >> value;}if (inFile.eof()) {cout << "End of file reached." << endl;} else if (inFile.fail()) {cout << "Input terminated by data mismatch." << endl;}else{cout<<"Input terminated for unknow reason."<<endl;}if (count == 0) {cout << "No data processed" << endl;} else {cout << "Item read:"  << endl;cout << "Sum:" << sum << endl;cout << "Average: " << sum / count << endl;}inFile.close();return 0;
}

文件“scores.txt"文本内容如下:

18  19  18  14  14 
16  20  20 8  12  29
17

输出结果如下:

Enter name of data file:scores.txt
End of file reached.
Item read:
Sum:188
Average: 17.0909--------------------------------
Process exited after 7.936 seconds with return value 0
请按任意键继续. . .

Windows文本文件的每行都以回车字符和换行符结尾;通常情况下,C++在读取文件时将这两个字符转换为换行符,并在写入文件时执行相反的转换。有些文本编辑器(如MetrowerksCodeWarrior IDE编辑器),不会自动在最后一行末尾加上换行符。因此,如果读者使用的是这种编辑器,请在输入最后的文本后按下回车键,然后再保存文件。

读者需要特别注意的是文件读取循环的正确设计。读取文件时,有几点需要检查。首先,程序读取文件时不应超过EOF。如果最后一次读取数据时遇到EOF,方法eof( )将返回true。其次,程序可能遇到类型不匹配的情况。例如,程序清单6.16期望文件中只包含数字。如果最后一次读取操作中发生了类型不匹配的情况,方法fail( )将返回true(如果遇到了EOF,该方法也将返回true)。最后,可能出现意外的问题,如文件受损或硬件故障。如果最后一次读取文件时发生了这样的问题,方法bad( )将返回true。不要分别检查这些情况,一种更简单的方法是使用
good( )方法,该方法在没有发生任何错误时返回true:

while(inFile.good()){...
}
if (inFile.eof()) {cout << "End of file reached." << endl;} else if (inFile.fail()) {cout << "Input terminated by data mismatch." << endl;}else{cout<<"Input terminated for unknow reason."<<endl;}

这些代码紧跟在循环的后面,用于判断循环为何终止。由于eof( )只能判断是否到达EOF,而fail( )可用于检查EOF和类型不匹配,因此上述代码首先判断是否到达EOF。这样,如果执行到了else if测试,便可排除EOF,因此,如果fail( )返回true,便可断定导致循环终止的原因是类型不匹配。

方法good( )指出最后一次读取输入的操作是否成功,这一点至关重要。这意味着应该在执行读取输入的操作后,立刻应用这种测试。为此,一种标准方法是,在循环之前(首次执行循环测试前)放置一条输入语句,并在循环的末尾(下次执行循环测试之前)放置另一条输入语句:

inFile >> value;
while(inFile.good()){inFile>>value;
}

鉴于以下事实,可以对上述代码进行精简:

  • 表达式inFile >> value的结果为inFile;
  • 而在需要一个bool值的情况下,inFile的结果为inFile.good( ),即true或false。

因此,可以将两条输入语句用一条用作循环测试的输入语句代替。也就是说,可以将上述循环结构替换为如下循环结构:

while(inFile>>value){
//loop body goes here
}

这种设计仍然遵循了在测试之前进行读取的规则,因为要计算表达式inFile >> value的值,程序必须首先试图将一个数字读取到value中。

6.7 总结

  1. 使用引导程序选择不同操作的语句后,程序和编程将更有趣。C++提供了if语句、ifelse语句和switch语句来管理选项。if语句使程序有条件地执行语句或语句块,也就是说,如果满足特定的条件,程序将执行特定的语句或语句块。if else语句程序选择执行两个语句或语句块之一。可以在这条语句后再加上if else,以提供一系列的选项。switch语句引导程序执行一系列选项之一。
  2. C++还提供了帮助决策的运算符。第5章讨论了关系表达式,这种表达式对两个值进行比较。if和if else语句通常使用关系表达式作为测试条件。通过使用逻辑运算符(&&、||和!),可以组合或修改关系表达式,创建更细致的测试。条件运算符(?:)提供了一种选择两个值之一的简洁方式。
  3. cctype字符函数库提供了一组方便的、功能强大的工具,可用于分析字符输入。
  4. 对于文件I/O来说,循环和选择语句是很有用的工具;文件I/O与控制台I/O极其相似。声明ifstream和ofstream对象,并将它们同文件关联起来后,便可以像使用cin和cout那样使用这些对象。
  5. 使用循环和决策语句,便可以编写有趣的、智能的、功能强大的程序。

相关文章:

【C++ Primer Plus】第六章:分支语句和逻辑运算符

文章目录第六章 分支语句和逻辑运算符6.1 字符函数库cctype6.2 ?:运算符6.3 读取数字的输入6.4 cin的处理过程char类型intdoublechar数组使用char数组来存储输入6.5 写入到文本文件中6.6 读取文本文件6.7 总结第六章 分支语句和逻辑运算符 6.1 字符函数库cctype C从C语言继承…...

堡垒机的主要功能是什么?为什么需要堡垒机?

堡垒机是一种用于管理和控制服务器的工具&#xff0c;其主要功能是为管理人员提供安全、便捷的远程管理和操作方式。为什么需要堡垒机呢&#xff1f;下面我们将详细阐述堡垒机的主要功能和必要性。 一、堡垒机的主要功能&#xff1a; ①、用户认证和授权管理&#xff1a;堡垒机…...

记录spring中Transactional事务注解失效的六个场景

记录spring中Transactional事务注解失效的六个场景 方法内的自调用 原因&#xff1a;通过this内部调用其他带有Transactional注解的方法&#xff0c;是通过this进行调用&#xff0c;并没有通过cglib代理对象进行调用&#xff0c;导致方法未被增强导致无法检测内部事务 解决方…...

【23种设计模式】行为型模式详细介绍(下)

前言 本文为 【23种设计模式】行为型模式 相关内容介绍&#xff0c;下边将对访问者模式&#xff0c;模板模式&#xff0c;策略模式&#xff0c;状态模式&#xff0c;观察者模式&#xff0c;备忘录模式&#xff0c;中介者模式&#xff0c;迭代器模式&#xff0c;解释器模式&…...

dbeaver工具连接达梦数据库

、一 概述 DBeaver 是一个基于 Java 开发&#xff0c;免费开源的通用数据库管理和开发&#xff0c;DBeaver 采用 Eclipse 框架开发&#xff0c;支持插件扩展&#xff0c;并且提供了许多数据库管理工具&#xff1a;ER 图、数据导入/导出、数据库比较、模拟数据生成等&#xff0…...

比Teambition、Worktile 更适合研发团队的几大工具盘点

Worktile 和 Teambitiom 哪个更好&#xff1f;两个产品各有特点。1.Teambition 优势&#xff1a;操作简单、个人版永不收费、更适合小型团队&#xff1b;2.Teambition 劣势&#xff1a;无法满足中大型团队复杂的项目管理、自定义能力弱、无法与钉钉以外的工具打通等&#xff1b…...

matlab图像处理常用功能以及函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、matlab灰度处理相关二、形态学的一些函数1.腐蚀2.膨胀3.开运算4.闭运算三、其他一些可能会用到的方法1.使用hough进行直线检测2.圆检测3.闭合形状检测4.寻找…...

eBPF 之 ProgramType、AttachType和InputContext

1. ProgramType 定义定义在 include/uapi/linux/bpf.h 文件中&#xff0c;不同 Linux 版本会有变化&#xff0c;以下是 Linux 5.19 版本定义&#xff1a;enum bpf_prog_type {BPF_PROG_TYPE_UNSPEC,BPF_PROG_TYPE_SOCKET_FILTER,BPF_PROG_TYPE_KPROBE,BPF_PROG_TYPE_SCHED_CLS,…...

C++运行时类型识别RTTI

C技能 runtime type identification(RTTI) 运行时类型识别在使用多态的时候经常用到。本文将会介绍RTTI的几个特征。1. 运行时类型转换下面的程序模仿了dynamic_cast<type_id>()类型转化符号&#xff0c;根据每个类的id来判断当前的类型&#xff0c;如果id不匹配&#xf…...

idea多时编辑多行-winmac都支持

1背景介绍 idea编辑器非常强大&#xff0c;其中一个功能非常优秀&#xff0c;很多程序员也非常喜欢用。这个功能能够大大大提高工作效率-------------多行代码同时编辑 2win 2.1方法1 按住alt鼠标左键上/下拖动即可 这样选中多行后&#xff0c;可以直接多行编辑。 优点&a…...

BI是报表?BI是可视化?BI到底是什么?

很多企业认为只要买一个前端商业智能BI分析工具就可以解决企业级的商业智能BI所有问题&#xff0c;这个看法实际上也不可行的。可能在最开始分析场景相对简单&#xff0c;对接数据的复杂度不是很高的情况下这类商业智能BI分析工具没有问题。但是在企业的商业智能BI项目建设有一…...

Python基础-数据类型之元组

一、元组的定义 nums (1, 2, 3, 4, 5) 元组是序列的其中一种&#xff0c;每个元素都以逗号分隔&#xff0c;用()包围。 当元组中只有一个元素时&#xff0c;需要在元素后面加逗号分隔&#xff0c;nums (1,)&#xff0c;否则括号会被当成运算符 nums (1) print(type(nums…...

大数据面试小抄

项目地址&#xff1a;https://github.com/GTyingzi/BigDATA 该项目是自己在学习大数据过程中整理、总结下来的一份面试小抄。涵盖Hadoop、Spark、Flink、Hive、HBae、Kafka、ES、Zookeeper等。 开源给大家&#xff0c;若感觉不错欢迎star~ 摘取Flink部分如下文章目录FlinkFli…...

Vue:(三十一)Vue封装的过度与动画

上一篇订阅与发布不够过瘾&#xff0c;接着再来一篇&#xff0c;come on&#xff01;&#xff01;&#xff01;作用&#xff1a;在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名写法&#xff1a;过度&#xff1a;元素进入的样式&#xff1a;v-enter&am…...

文本处理:字符串替换

方法1&#xff1a;str.replace str.replace(old, new[, count]) Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced. 该方法逻辑大致如下所示&am…...

python 调用 dll 出现精度问题

问题&#xff1a;python 在调用dll 的时候出现了精度问题 总结&#xff1a;使用decimal库进行转换就可以正常传递。 ‘ 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 ’ 遇到的问题具体情况 dll 生成函数…...

STL讲解——模拟实现string

STL讲解——模拟实现string 经典的string类问题 大厂在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现string类的增、删、查、改、构造、拷贝构造、赋值运算符重载以及析构函数。大家看下自己可不可以写一个string类&#xff1f; cla…...

CDH 6.3.2 升级Hive 2.3.9

升级背景 DolphinScheduler 3.1.1安装好后&#xff0c;其源码中集成的是Hive 2.1.1&#xff0c;版本太低&#xff0c;当在数据中心连接Hive数据源时报错&#xff0c;所以升级CDH自带的Hive为2.3.9版本。 一、准备工作 1、下载hive2.3.9并解压 下载地址&#xff1a;http://a…...

距离不是拦截我们前进的主因,与社科院杜兰金融硕士一起奔赴山海

最近有咨询社科院杜兰金融管理硕士项目的同学反馈他在西安&#xff0c;读研来北京上课太远了。一直在纠结要不要申请&#xff0c;其实距离不是问题&#xff0c;相向而行才是关键。在项目就读的同学好多也是来自外地&#xff0c;他们克服了种种困难来到项目学习&#xff0c;就是…...

【SpringBoot】MyBatis-plus 报错 sqlSessionFactory sqlSessionTemplate 最新解决办法

本文针对 MyBatis-plus&#xff0c;对于 MyBatis 报相同的错误&#xff0c;可以看这个大佬的文章&#xff1a;SpringBoot3整合MyBatis报错&#xff1a;Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 针对报错如下&#xff1a; Property sqlSessionF…...

jsp诊疗预约系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp诊疗预约系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用jav…...

详解 APISIX Lua 动态调试插件 inspect

作者罗锦华&#xff0c;API7.ai 技术专家/技术工程师&#xff0c;开源项目 pgcat&#xff0c;lua-resty-ffi&#xff0c;lua-resty-inspect 的作者。 原文链接 为什么需要 Lua 动态调试插件&#xff1f; Apache APISIX 有很多 Lua 代码&#xff0c;如何在运行时不触碰源代码的…...

#科研筑基# python初学自用笔记 第五篇 函数

调用函数python有很多内置函数&#xff0c;我们可以直接调用&#xff0c;详见python官方文档&#xff1a;内置函数 — Python 3.11.2 文档&#xff0c;也可以在命令行中输入help(函数名)来查看该函数的使用法则。函数名的本质就是指向一个函数对象的引用&#xff0c;完全可以用…...

设计模式之策略模式

一.基本内容1 . 实例有各种鸭子&#xff08;野鸭&#xff0c;北京鸭子&#xff0c;水鸭等&#xff0c;鸭子有各种行为&#xff0c;比如飞&#xff0c;叫等显示鸭子的信息传统方法解决&#xff1a;鸭子为抽象类&#xff0c;具体鸭子继承抽象类2.传统方法的不足&#xff1a;其他鸭…...

dbdeployer 使用札记

https://github.com/datacharmer/dbdeployer默认配置文件为当前用户的$HOME/.dbdeployer/config.json作为配置文件&#xff0c;可以通过dbdeplyoer defaults export导出并修改配置或者直接通过dbdeployer defaults update来更新默认文件&#xff0c;配置文件包含MySQL初始信息。…...

MATLAB算法实战应用案例精讲-【图像处理】数字图像模糊化(附Java、python和matlab代码实现)

目录 前言 几个相关概念 噪声 滤波器 算法原理 算法思想 噪...

搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法

搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 Coding GitHub Hexo Markdown 搭建博客 大家好&#xff0c;这是我第一次写博客。使用 GitHub Hexo 创建最基本的博客很容易&#xff0c;网上有很多现成的教程。…...

【C++修行之路】C/C++内存管理

文章目录程序区域内存划分C语言动态内存分配&#xff1a;new和delete&#xff1a;new、delete和malloc、free的区别:程序区域内存划分 C/C程序内存区域划分非常相似。 C语言动态内存分配&#xff1a; malloc、calloc、realloc都是C语言动态开辟内存的常用函数 其中 malloc 开…...

spring cloud alibaba Sentinel(四)

服务雪崩 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。 如果一个服务出现了问题&#xff0c;调用这个服务就会出现线程阻塞的情况&#xff0c; 此时若有大量的请求涌入&#xff0c;就会出现多条 线程阻塞等待&#xff0c;进而导致服务瘫痪。 由于服…...

Redis第三讲

目录 三、Redis03 3.1 Redis持久化之RDB 3.1.1 什么是RDB 3.1.2 备份是如何执行的 3.1.3 Fork 3.1.4 RDB持久化流程 3.1.5 dump.rdb文件 3.1.6 配置rdb文件生成位置 3.1.7 如何触发RDB快照以及保持策略 3.2 Redis持久化之AOF 3.2.1 什么是AOF 3.2.2 AOF持久化流程 …...

wordpress怎么调用一个分类的文章/博客推广的方法与技巧

最近&#xff0c;由于工作需要使用了SQL 2008数据库&#xff0c;遇到一些问题。这里先解决我遇到的第一个问题吧&#xff01; 当用户在在SQL Server 2008企业管理器中更改表结构时&#xff0c;必须要先删除原来的表&#xff0c;然后重新创建新表&#xff0c;才能完成表的更改&…...

川畅互联咨询 网站建设/五种关键词优化工具

做随机显示推荐广告的时候&#xff0c;需要随机排序数据数组&#xff0c;就动手写了一个&#xff0c;如下&#xff1a; 1 function randomOrder (targetArr) {2 var originalArr targetArr;3 var newArr [];4 var arrLength targetArr.length;5 var j -1;…...

Lms wordpress功能/广州seo好找工作吗

对于NAS厂商来说&#xff0c;如果要在市场超过上竞争&#xff0c;硬件是一方面&#xff0c;软件的重要性也正逐渐增加。如今&#xff0c;NAS厂商都有自己的专属操作系统&#xff0c;并且功能多种多样&#xff0c;相反&#xff0c;高中端产品虽然能够更多的提供一些诸如重删、分…...

全国招聘网站排名/seo网络推广

做realsense中手势部分的时候&#xff0c;涉及到检测手势关节旋转的部分&#xff0c;找了篇博文资料。 四元数介绍 旋转&#xff0c;应该是三种坐标变换——缩放、旋转和平移&#xff0c;中最复杂的一种了。大家应该都听过&#xff0c;有一种旋转的表示方法叫四元数。按照我们的…...

易天时代网站建设/目前疫情最新情况

为什么80%的码农都做不了架构师&#xff1f;>>> 按照上一节中《搭建高可用mongodb集群&#xff08;三&#xff09;—— 深入副本集》搭建后还有两个问题没有解决&#xff1a; 从节点每个上面的数据都是对数据库全量拷贝&#xff0c;从节点压力会不会过大&#xff…...

深圳优秀网站建设/优化营商环境

准备基本事项Docker环境登录授权方式镜像存放地址HTTPS外网访问启动Docker Registry1. 基本事项本篇涉及到的数据文件都放在/data目录下, 其中会有三个子目录/data/auth/ 基本的用户名密码认证文件存放地址/data/certs/ docker registry 镜像https访问射击到的证书与密钥的存放…...