STL-ACM常用函数

STL-ACM常用函数
STL-ACM常用函数

【STL】 ...................................................................................................................... - 1 - |全排列函数next_permutation ................................................................................. - 1 -

一、关于STL........................................................................................................ - 2 -

二、使用STL........................................................................................................ - 3 -

ACM/ICPC 竞赛之STL--pair ................................................................................. - 4 - ACM/ICPC 竞赛之STL--vector ............................................................................. - 5 - ACM/ICPC 竞赛之STL--iterator 简介 ................................................................... - 6 - ACM/ICPC 竞赛之STL--string .............................................................................. - 7 - ACM/ICPC 竞赛之STL--stack/queue...................................................................... - 8 -

1、stack ......................................................................................................... - 8 -

2、queue ........................................................................................................ - 9 -

3、priority_queue .......................................................................................... - 10 -

ACM/ICPC 竞赛之STL--map .............................................................................. - 12 - ACM/ICPC 竞赛之STL--algorithm....................................................................... - 14 -

【STL】

|全排列函数next_permutation

STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题)

头文件:#include

using namespace std;

调用:next_permutation(start, end);

注意:函数要求输入的是一个升序排列的序列的头指针和尾指针.

用法:

// 数组

int a[N];

sort(a, a+N);

next_permutation(a, a+N);

// 向量

vector ivec;

sort(ivec.begin(), ivec.end());

next_permutation(ivec.begin(), ivec.end());

例子:

vector myV ec;

// 初始化代码

sort(myV ec.begin(),myV ec.end());

do{

for (i = 0 ;i < size;i ++ ) cout << myV ec[i] << " \t " ;

cout << endl;

}while (next_permutation(myV ec.begin(), myV ec.end()));

ACM/ICPC 竞赛之STL 简介

一、关于STL

STL(Standard Template Library,标准模板库)是C++语言标准中的重

要组成部分。STL 以模板类和模板函数的形式为程序员提供了各种数据结构和

算法的精巧实现,程序员如果能够充分地利用STL,可以在代码空间、执行时

间和编码效率上获得极大的好处。

STL 大致可以分为三大类:算法(algorithm)、容器(container)、迭代器

(iterator)。

STL 容器是一些模板类,提供了多种组织数据的常用方法,例如vector(向量,

类似于数组)、list(列表,类似于链表)、deque(双向队列)、set(集合)、

map(映象)、stack(栈)、queue(队列)、priority_queue(优先队列)等,通过模板的参数我们可以指定容器中的元素类型。

STL 算法是一些模板函数,提供了相当多的有用算法和操作,从简单如for_each(遍历)到复杂如stable_sort(稳定排序)。STL 迭代器是对C 中的指针的一般化,用来将算法和容器联系起来。几乎所有的STL 算法都是通过迭代器来存取元素序列进行工作的,而STL 中的每一个容器也都定义了其本身所专有的迭代器,用以存取容器中的元素。有趣的是,普通的指针也可以像迭代器一样工作。熟悉了STL 后,你会发现,很多功能只需要用短短的几行就可以实现了。通过STL,我们可以构造出优雅而且高效的代码,甚至比你自己手工实现的代码效果还要好。

STL 的另外一个特点是,它是以源码方式免费提供的,程序员不仅可以自由地使用这些代码,也可以学习其源码,甚至按照自己的需要去修改它。下面是用STL 写的题Ugly Numbers 的代码:

#include

#include

using namespace std;

typedef pair node_type;

int main(){

unsigned long result[1500];

priority_queue< node_type, vector,

greater > Q;

Q.push( make_pair(1, 2) );

for (int i=0; i<1500; i++){

node_type node = Q.top(); Q.pop();

switch(node.second){

case 2: Q.push( make_pair(node.first*2, 2) );

case 3: Q.push( make_pair(node.first*3, 3) );

case 5: Q.push( make_pair(node.first*5, 5) );

}

result[i] = node.first;

}

int n;

cin >> n;

while (n>0){

cout << result[n-1] << endl;

cin >> n;

}

return 0;

}

在ACM 竞赛中,熟练掌握和运用STL 对快速编写实现代码会有极大的帮助。

二、使用STL

在C++标准中,STL 被组织为以下的一组头文件(注意,是没有.h 后缀的!):

algorithm / deque / functional / iterator / list / map

memory / numeric / queue / set / stack / utility / vector

当我们需要使用STL 的某个功能时,需要嵌入相应的头文件。但要注意的是,

在C++标准中,STL 是被定义在std 命名空间中的。如下例所示:

#include

int main(){

std::stack s;

s.push(0);

...

return 0;

}

如果希望在程序中直接引用STL,也可以在嵌入头文件后,用usingnamespace 语句将std 命名空间导入。如下例所示:

#include

using namespace std;

int main(){

stack s;

s.push(0);

...

return 1;

}

STL 是C++语言机制运用的一个典范,通过学习STL 可以更深刻地理解C++语言的思想和方法。在本系列的文章中不打算对STL 做深入的剖析,而只是想介绍一些STL 的基本应用。有兴趣的同学,建议可以在有了一些STL 的使用经验后,认真阅读一下《C++STL》这本书(电力出版社有该书的中文版)。

ACM/ICPC 竞赛之STL--pair

STL 的头文件中描述了一个看上去非常简单的模板类pair,用来表示一个二元组或元素对,并提供了按照字典序对元素对进行大小比较的比较运算符模板函数。

例如,想要定义一个对象表示一个平面坐标点,则可以:

pair p1;cin >> p1.first >> p1.second;pair 模板类需要两个参数:首元素的数据类型和尾元素的数据类型。pair 模板类对象有两个成员:first 和second,分别表示首元素和尾元素。

中已经定义了pair 上的六个比较运算符:<、>、<=、>=、==、!=,其规则是先比较first,first 相等时再比较second,这符合大多数应用的逻辑。当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。除了直接定义一个pair 对象外,如果需要即时生成一个pair 对象,也可以调用在中定义的一个模板函数:make_pair。make_pair 需要两个参数,分别为元素对的首元素和尾元素。

在题1067--Ugly Numbers 中,就可以用pair 来表示推演树上的结点,用first 表示结点的值,用second 表示结点是由父结点乘以哪一个因子得到的。

#include

#include

using namespace std;

typedef pair node_type;

int main(){

unsigned long result[1500];

priority_queue< node_type, vector,

greater > Q;

Q.push( make_pair(1, 2) );

for (int i=0; i<1500; i++){

node_type node = Q.top(); Q.pop();

switch(node.second){

case 2: Q.push( make_pair(node.first*2, 2) );

case 3: Q.push( make_pair(node.first*3, 3) );

case 5: Q.push( make_pair(node.first*5, 5) );

}

result[i] = node.first;

}

int n;

cin >> n;

while (n>0){

cout << result[n-1] << endl;

cin >> n;

}

return 0;

}

看上去是很简单的一个头文件,但是的设计中却浓缩反映了STL 设计的基本思想。有意深入了解和研究STL 的同学,仔细阅读和体会这个简单的头文件,不失为一种入门的途径。

ACM/ICPC 竞赛之STL--vector

在STL 的头文件中定义了vector(向量容器模板类),vector容器以连续数组的方式存储元素序列,可以将vector 看作是以顺序结构实现的线性表。当我们在程序中需要使用动态数组时,vector 将会是理想的选择,vector 可以在使用过程中动态地增长存储空间。vector 模板类需要两个模板参数,第一个参数是存储元素的数据类型,第二个参数是存储分配器的类型,其中第二个参数是可选的,如果不给出第二个参数,将使用默认的分配器。下面给出几个常用的定义vector 向量对象的方法示例:38

vector s;

定义一个空的vector 对象,存储的是int 类型的元素。

vector s(n);定义一个含有n 个int 元素的vector 对象。

vector s(first, last);定义一个vector 对象,并从由迭代器first 和last 定义的序列[first,last)中复制初值。

vector 的基本操作有:

s[i]直接以下标方式访问容器中的元素。

s.front() 返回首元素。

s.back() 返回尾元素。

s.push_back(x)向表尾插入元素x。

s.size() 返回表长。

s.empty() 当表空时,返回真,否则返回假。

s.pop_back() 删除表尾元素。

s.begin() 返回指向首元素的随机存取迭代器。

s.end() 返回指向尾元素的下一个位置的随机存取迭代器。

s.insert(it, x) 向迭代器it 指向的元素前插入新元素val。

s.insert(it, n, x)向迭代器it 指向的元素前插入n 个x。

s.insert(it, first, last)将由迭代器first 和last 所指定的序列[first, last)插入到迭代器it

指向的元素前面。

s.erase(it)删除由迭代器it 所指向的元素。

s.erase(first, last)删除由迭代器first 和last 所指定的序列[first, last)。

s.reserve(n)预分配缓冲空间,使存储空间至少可容纳n 个元素。

s.resize(n)改变序列的长度,超出的元素将会被删除,如果序列需要扩展(原空间小于n),元素默认值将填满扩展出的空间。

s.resize(n, val)改变序列的长度,超出的元素将会被删除,如果序列需要扩展(原空间小于n),将用val 填满扩展出的空间。

s.clear()删除容器中的所有的元素。

s.swap(v)将s 与另一个vector 对象v 进行交换。

s.assign(first, last)将序列替换成由迭代器first 和last 所指定的序列[first, last)。[first, last)不能是原序列中的一部分。要注意的是,resize 操作和clear 操作都是对表的有效元素进行的操作,但并不一定会改变缓冲空间的大小。另外,vector 还有其他一些操作如反转、取反等,不再一下列举。vector 上还定义了序列之间的比较操作运算符(>, <, >=, <=, ==, !=),

可以按照字典序比较两个序列。还是来看一些示例代码。输入个数不定的一组整数,再将这组整数按倒序输出,

如下所示:

#include

#include

using namespace std;

int main(){

vector L;

int x;

while (cin>>x) L.push_back(x);

for (int i=L.size()-1; i>=0; i--) cout << L[i] << " ";

cout << endl;

return 0;

}

ACM/ICPC 竞赛之STL--iterator 简介

iterator(迭代器)是用于访问容器中元素的指示器,从这个意义上说,iterator(迭代器)相当于数据结构中所说的“遍历指针”,也可以把iterator(迭代器)看作是一种泛化的指针。STL 中关于iterator(迭代器)的实现是相当复杂的,这里我们暂时不去详细讨论关于iterator(迭代器)的实现和使用,而只对iterator(迭代器)做一点简单的介绍。

简单地说,STL 中有以下几类iterator(迭代器):

输入iterator(迭代器),在容器的连续区间内向前移动,可以读取容器内任意值;输出iterator(迭代器),把值写进它所指向的容器中;前向iterator(迭代器),读取队列中的值,并可以向前移动到下一位置(++p,p++);双向iterator(迭代器),读取队列中的值,并可以向前向后遍历容器;随机访问iterator(迭代器), 可以直接以下标方式对容器进行访问,vector 的iterator(迭代器)就是这种iterator(迭代器);流iterator(迭代器),可以直接输出、输入流中的值;每种STL 容器都有自己的iterator(迭代器)子类,下面先来看一段简单的示例代码:

#include

#include

using namespace std;

main()

{

vector s;

for (int i=0; i<10; i++) s.push_back(i);

for (vector::iterator it=s.begin(); it!=s.end();

it++)

cout << *it << " ";

cout << endl;

return 1;

}

vector 的begin()和end()方法都会返回一个vector::iterator 对象,分别指向vector 的首元素位置和尾元素的下一个位置(我们可以称之为结束标志位置)。对一个iterator(迭代器)对象的使用与一个指针变量的使用极为相似,或者可以这样说,指针就是一个非常标准的iterator(迭代器)。再来看一段稍微特别一点的代码:

#include

#include

using namespace std;

main()

{

vector s;

s.push_back(1);

s.push_back(2);

s.push_back(3);

copy(s.begin(), s.end(), ostream_iterator(cout, "

"));

cout <

return 1;

}

这段代码中的copy 就是STL 中定义的一个模板函数,copy(s.begin(),s.end(), ostream_iterator(cout, " "));的意思是将由s.begin()至s.end()(不含s.end())所指定的序列复制到标准输出流cout 中,用" "作为每个元素的间隔。也就是说,这句话的作用其实就是将表中的所有内容依次输出。iterator(迭代器)是STL 容器和算法之间的“胶合剂”,几乎所有的STL 算法都是通过容器的iterator(迭代器)来访问容器内容的。只有通过有效地运用iterator(迭代器),才能够有效地运用STL 强大的算法功能。

ACM/ICPC 竞赛之STL--string

字符串是程序中经常要表达和处理的数据,我们通常是采用字符数组或字符指针来表示字符串。STL 为我们提供了另一种使用起来更为便捷的字符串的表达方式:string。string 类的定义在头文件中。string 类其实可以看作是一个字符的vector,vector 上的各种操作都可以适用于string,另外,string 类对象还支持字符串的拼合、转换等操作。下面先来看一个简单的例子:

#include

#include

using namespace std;

int main(){

string s = "Hello! ", name;

cin >> name;

s += name;

s += '!';

cout << s << endl;

return 0;

}

再以题1064--Parencoding 为例,看一段用string 作为容器,实现由P

代码还原括号字符串的示例代码片段:

int m;

cin >> m; // P 编码的长度

string str; // 用来存放还原出来的括号字符串

int leftpa = 0; // 记录已出现的左括号的总数

for (int j=0; j

int p;

cin >> p;

for (int k=0; k

str += ')';

leftpa = p;

}

ACM/ICPC 竞赛之STL--stack/queue

stack(栈)和queue(队列)也是在程序设计中经常会用到的数据容器,STL为我们提供了方便的stack(栈)的queue(队列)的实现。39准确地说,STL 中的stack 和queue 不同于vector、list 等容器,而是对这些容器的重新包装。这里我们不去深入讨论STL 的stack 和queue 的实现细节,而是来了解一些他们的基本使用。

1、stack

stack 模板类的定义在头文件中。

stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元

素类型是必要的,在不指定容器类型时,默认的容器类型为deque。

定义stack 对象的示例代码如下:

stack s1;

stack s2;

stack 的基本操作有:

入栈,如例:s.push(x);

出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。

访问栈顶,如例:s.top()

判断栈空,如例:s.empty(),当栈空时,返回true。

访问栈中的元素个数,如例:s.size()

下面是用string 和stack 写的解题1064--Parencoding 的程序。

#include

#include

#include

using namespace std;

int main(){

int n;

cin >> n;

for (int i=0; i

int m;

cin >> m;

string str;

int leftpa = 0;

for (int j=0; j

{

int p;

cin >> p;

for (int k=0; k

str += ')';

leftpa = p;

}

stack s;

for (string::iterator it=str.begin();

it!=str.end(); it++) { // 构造M 编码

if (*it=='(') s.push(1);

else{

int p = s.top(); s.pop();

cout << p << " ";

if (!s.empty()) s.top() += p;

}

}

cout << endl;

}

return 0;

}

2、queue

queue 模板类的定义在头文件中。stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。

定义queue 对象的示例代码如下:

queue q1;

queue q2;

queue 的基本操作有:

入队,如例:q.push(x); 将x 接到队列的末端。

出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。

访问队首元素,如例:q.front(),即最早被压入队列的元素。

访问队尾元素,如例:q.back(),即最后被压入队列的元素。

判断队列空,如例:q.empty(),当队列空时,返回true。

访问队列中的元素个数,如例:q.size()

3、priority_queue

头文件中,还定义了另一个非常有用的模板类priority_queue(优先队列)。优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)。priority_queue 模板类有三个模板参数,第一个是元素类型,第二个容器类型,第三个是比较算子。其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队)。

定义priority_queue 对象的示例代码如下:

priority_queue q1;

priority_queue< pair > q2; // 注意在两个尖括号之间一定要留空格。

priority_queue, greater > q3; // 定义小的先出队

priority_queue 的基本操作与queue 相同。

初学者在使用priority_queue 时,最困难的可能就是如何定义比较算子了。如果是基本数据类型,或已定义了比较运算符的类,可以直接用STL 的less算子和greater 算子——默认为使用less 算子,即小的往前排,大的先出队。如果要定义自己的比较算子,方法有多种,这里介绍其中的一种:重载比较运算符。优先队列试图将两个元素x 和y 代入比较运算符(对less 算子,调用xy),若结果为真,则x 排在y 前面,y 将先于x 出队,反之,则将y 排在x 前面,x 将先出队。

看下面这个简单的示例:

#include

#include

using namespace std;

class T{

public:

int x, y, z;

T(int a, int b, int c):x(a), y(b), z(c){}

};

bool operator < (const T &t1, const T &t2){

return t1.z < t2.z; // 按照z 的顺序来决定t1 和t2 的顺序

}

int main(){

priority_queue q;

q.push(T(4,4,3));

q.push(T(2,2,5));

q.push(T(1,5,4));

q.push(T(3,3,6));

while (!q.empty()){

T t = q.top(); q.pop();

cout << t.x << " " << t.y << " " << t.z << endl;

}

return 0; }输出结果为(注意是按照z 的顺序从大到小出队的):

3 3 6

2 2 5

1 5 4

4 4 3

再看一个按照z 的顺序从小到大出队的例子:

#include

#include

using namespace std;

class T{

public:

int x, y, z;

T(int a, int b, int c):x(a), y(b), z(c)

{

}

};

bool operator > (const T &t1, const T &t2){

return t1.z > t2.z;

}

int main(){

priority_queue, greater > q;

q.push(T(4,4,3));

q.push(T(2,2,5));

q.push(T(1,5,4));

q.push(T(3,3,6));

while (!q.empty()){

T t = q.top(); q.pop();

cout << t.x << " " << t.y << " " << t.z << endl;

}

return 0;

}

输出结果为:

4 4 3

1 5 4

2 2 5

3 3 6

如果我们把第一个例子中的比较运算符重载为:

bool operator < (const T &t1, const T &t2){

return t1.z > t2.z; // 按照z 的顺序来决定t1 和t2 的顺序

}

则第一个例子的程序会得到和第二个例子的程序相同的输出结果。再回顾一下用优先队列实现的题1067--Ugly Numbers 的代码:

#include

#include

using namespace std;

typedef pair node_type;

int main( int argc, char *argv[] ){

unsigned long int result[1500];

priority_queue< node_type, vector,

greater > Q;

Q.push( make_pair(1, 3) );

40

for (int i=0; i<1500; i++){

node_type node = Q.top();

Q.pop();

switch(node.second){

case 3: Q.push( make_pair(node.first*2, 3) );

case 2: Q.push( make_pair(node.first*3, 2) );

case 1: Q.push( make_pair(node.first*5, 1) );

}

result[i] = node.first;

}

int n;

cin >> n;

while (n>0){

cout << result[n-1] << endl;

cin >> n;

}

return 1;

}

ACM/ICPC 竞赛之STL--map

在STL 的头文件中定义了模板类map 和multimap,用有序二叉树来存贮类型为pair的元素对序列。序列中的元素以const Key部分作为标识,map 中所有元素的Key 值都必须是唯一的,multimap 则允许有重复的Key 值。可以将map 看作是由Key 标识元素的元素集合,这类容器也被称为“关联容器”,可以通过一个Key 值来快速确定一个元素,因此非常适合于需要按照Key值查找元素的容器。map 模板类需要四个模板参数,第一个是键值类型,第二个是元素类型,第三个是比较算子,第四个是分配器类型。其中键值类型和元素类型是必要的。map 的基本操作有:

1、定义map 对象,例如:

map m;

2、向map 中插入元素对,有多种方法,例如:

m[key] = value;

[key]操作是map 很有特色的操作,如果在map 中存在键值为key 的元素对,

则返回该元素对的值域部分,否则将会创建一个键值为key 的元素对,值域为默认值。所以可以用该操作向map 中插入元素对或修改已经存在的元素对的值域部分。

m.insert( make_pair(key, value) );

也可以直接调用insert 方法插入元素对,insert 操作会返回一个pair,当map 中没有与key 相匹配的键值时,其first 是指向插入元素对的迭代器,其second 为true;若map 中已经存在与key 相等的键值时,其first 是指向该元素对的迭代器,second 为false。

3、查找元素对,例如:

int i = m[key];

要注意的是,当与该键值相匹配的元素对不存在时,会创建键值为key 的元素对。map::iterator it = m.find(key);如果map 中存在与key 相匹配的键值时,find 操作将返回指向该元素对的迭代器,否则,返回的迭代器等于map 的end()(参见vector 中提到的begin 和end 操作)。

4、删除元素对,例如:

m.erase(key);删除与指定key 键值相匹配的元素对,并返回被删除的元素的个数。

m.erase(it);删除由迭代器it 所指定的元素对,并返回指向下一个元素对的迭代器。

看一段简单的示例代码:

#include

#include

using namespace std;

typedef map > M_TYPE;

typedef M_TYPE::iterator M_IT;

typedef M_TYPE::const_iterator M_CIT;

int main(){

M_TYPE MyTestMap;

MyTestMap[3] = "No.3";

MyTestMap[5] = "No.5";

MyTestMap[1] = "No.1";

MyTestMap[2] = "No.2";

MyTestMap[4] = "No.4";

M_IT it_stop = MyTestMap.find(2);

cout << "MyTestMap[2] = " << it_stop->second << endl;

it_stop->second = "No.2 After modification";

cout << "MyTestMap[2] = " << it_stop->second << endl;

cout << "Map contents : " << endl;

for(M_CIT it = MyTestMap.begin(); it != MyTestMap.end();

it++){

cout << it->second << endl;

}

return 0;

}

程序执行的输出结果为:

MyTestMap[2] = No.2

MyTestMap[2] = No.2 After modification

Map contents :

No.1

No.2 After modification

No.3

No.4

No.5

再看一段简单的示例代码:

#include

#include

using namespace std;

int main(){

map m;

m["one"] = 1;

m["two"] = 2;

// 几种不同的insert 调用方法

m.insert(make_pair("three", 3));

m.insert(map::value_type("four", 4));

m.insert(pair("five", 5));

string key;

while (cin>>key){

map::iterator it = m.find(key);

if (it==m.end()){

cout << "No such key!" << endl;

}

else{

cout << key << " is " << it->second << endl;

cout << "Erased " << m.erase(key) << endl;

}

}

return 0;

}

ACM/ICPC 竞赛之STL--algorithm

无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的。下面列举出中的模板函数:

adjacent_find / binary_search / copy / copy_backward / count

/ count_if / equal / equal_range / fill / fill_n / find /

find_end / find_first_of / find_if / for_each / generate /

generate_n / includes / inplace_merge / iter_swap /

lexicographical_compare / lower_bound / make_heap / max /

max_element / merge / min / min_element / mismatch /

next_permutation / nth_element / partial_sort /

partial_sort_copy / partition / pop_heap / prev_permutation

/ push_heap / random_shuffle / remove / remove_copy /

remove_copy_if / remove_if / replace / replace_copy /

replace_copy_if / replace_if / reverse / reverse_copy /

rotate / rotate_copy / search / search_n / set_difference /

set_intersection / set_symmetric_difference / set_union /

sort / sort_heap / stable_partition / stable_sort / swap /

swap_ranges / transform / unique / unique_copy / upper_bound

如果详细叙述每一个模板函数的使用,足够写一本书的了。还是来看几个简单的示例程序吧。

示例程序之一,for_each 遍历容器:

#include

#include

#include

using namespace std;

int Visit(int v) // 遍历算子函数

{

cout << v << " ";

return 1;

}

class MultInt // 定义遍历算子类

{

private:

int factor;

public:

MultInt(int f) : factor(f){}

void operator()(int &elem) const{

elem *= factor;

}

};

int main(){

vector L;

for (int i=0; i<10; i++) L.push_back(i);

41

for_each(L.begin(), L.end(), V isit);

cout << endl;

for_each(L.begin(), L.end(), MultInt(2));

for_each(L.begin(), L.end(), V isit);

cout << endl;

return 0;

}

程序的输出结果为:

0 1 2 3 4 5 6 7 8 9

0 2 4 6 8 10 12 14 16 18

示例程序之二,min_element/max_element,找出容器中的最小/最大值:

#include

#include

#include

using namespace std;

int main(){

vector L;

for (int i=0; i<10; i++) L.push_back(i);

vector::iterator min_it = min_element(L.begin(), L.end());

vector::iterator max_it = max_element(L.begin(), L.end());

cout << "Min is " << *min_it << endl;

cout << "Max is " << *max_it << endl;

return 1;

}

程序的输出结果为:

Min is 0

Max is 9

示例程序之三,sort 对容器进行排序:

#include

#include

#include

using namespace std;

void Print(vector &L){

for (vector::iterator it=L.begin(); it!=L.end();

it++)

cout << *it << " ";

cout << endl;

}

int main(){

vector L;

for (int i=0; i<5; i++) L.push_back(i);

for (int i=9; i>=5; i--) L.push_back(i);

Print(L);

sort(L.begin(), L.end());

Print(L);

sort(L.begin(), L.end(), greater()); // 按降序排序Print(L);

return 0;

}

程序的输出结果为:

0 1 2 3 4 9 8 7 6 5

0 1 2 3 4 5 6 7 8 9

9 8 7 6 5 4 3 2 1 0

示例程序之四,copy 在容器间复制元素:

#include

#include

#include

using namespace std;

int main()

{

// 先初始化两个向量v1 和v2

vector v1, v2;

for (int i=0; i<=5; i++) v1.push_back(10*i);

for (int i=0; i<=10; i++) v2.push_back(3*i);

cout << "v1 = ( " ;

for (vector ::iterator it=v1.begin(); it!=v1.end();

it++)

cout << *it << " ";

cout << ")" << endl;

cout << "v2 = ( " ;

for (vector ::iterator it=v2.begin(); it!=v2.end();

it++)

cout << *it << " ";

cout << ")" << endl;

// 将v1 的前三个元素复制到v2 的中间

copy(v1.begin(), v1.begin()+3, v2.begin()+4);

cout << "v2 with v1 insert = ( " ;

for (vector ::iterator it=v2.begin(); it!=v2.end();

it++)

cout << *it << " ";

cout << ")" << endl;

// 在v2 内部进行复制,注意参数2 表示结束位置,结束位置不参与复

copy(v2.begin()+4, v2.begin()+7, v2.begin()+2);

cout << "v2 with shifted insert = ( " ;

for (vector ::iterator it=v2.begin(); it!=v2.end();

it++)

cout << *it << " ";

cout << ")" << endl;

return 1;

}

程序的输出结果为:

v1 = ( 0 10 20 30 40 50 )

v2 = ( 0 3 6 9 12 15 18 21 24 27 30 )

v2 with v1 insert = ( 0 3 6 9 0 10 20 21 24 27 30 )

v2 with shifted insert = ( 0 3 0 10 20 10 20 21 24 27 30 )

STL in ACM

容器(container):

迭代器(iterator): 指针

内部实现: 数组// 就是没有固定大小的数组,vector 直接翻译是向量vector // T 就是数据类型,Alloc 是关于内存的一个什么东西,一般是使用默认参数。

支持操作:

begin(), //取首个元素,返回一个iterator

end(), //取末尾(最后一个元素的下一个存储空间的地址)

size(), //就是数组大小的意思

clear(), //清空

empty(), //判断vector 是否为空

[ ] //很神奇的东东,可以和数组一样操作

//举例:vector a; //定义了一个vector

//然后我们就可以用a[i]来直接访问a 中的第i + 1 个元素!和数组的下标一模一样!push_back(), pop_back() //从末尾插入或弹出

insert() O(N) //插入元素,O(n)的复杂度

erase() O(N) //删除某个元素,O(n)的复杂度

可以用于数组大小不定且空间紧张的情况

Iterator 用法举例:

int main(){

int n,i;

vector vi; //类似于我们定义一个数组,同int vi[1000]; 但vector的大小是自动调整的vector ::iterator itr; //两个冒号

while (scanf("%d",&n) != EOF) vi.push_back(n);

for (i = 0 ; i < vi.size() ; i++) printf("%d\n",vi[i]);

for (itr = vi.begin() ; itr != vi.end() ; itr++)

printf("%d\n",*itr);

return 0;

}

类似:双端队列,两头都支持进出

支持push_front()和pop_front()

是的精简版:) //栈,只支持从末尾进出

支持push(), pop(), top()

是的精简版//单端队列,就是我们平时所说的队列,一头进,另一头出

支持push(), pop(), front(), back()

内部实现: 双向链表//作用和vector 差不多,但内部是用链表实现

list

支持操作:

begin(), end(), size(), clear(), empty()

push_back(), pop_back() //从末尾插入或删除元素

push_front(), pop_front()

insert() O(1) //链表实现,所以插入和删除的复杂度的O(1)

erase() O(1)

sort() O(nlogn),不同于中的sort

//不支持[ ]操作!

内部实现: 红黑树//Red-Black Tree,一种平衡的二叉排序树

set //又是一个Compare 函数,类似于qsort 函数里的那个Compare 函数,

作为红黑树在内部实现的比较方式

insert() O(logn)

erase() O(logn)

find() O(logn) 找不到返回a.end()

lower_bound() O(logn) 查找第一个不小于k 的元素

upper_bound() O(logn) 查找第一个大于k 的元素

equal_range() O(logn) 返回pair

42

允许重复元素的

的用法及Compare 函数示例:

struct SS {int x,y;};

struct ltstr {

bool operator() (SS a, SS b)

{return a.x < b.x;} //注意,按C 语言习惯,double 型要写成这样:

return a.x < b.x ? 1 : 0;

};

int main() {

set st;

}

内部实现: pair 组成的红黑树//map 中文意思:映射!!

map //就是很多pair 组成一个红黑树

insert() O(logn)

erase() O(logn)

find() O(logn) 找不到返回a.end()

lower_bound() O(logn) 查找第一个不小于k 的元素

upper_bound() O(logn) 查找第一个大于k 的元素

equal_range() O(logn) 返回pair

[key]运算符O(logn) *** //这个..太猛了,怎么说呢,数组有一个下标,如a[i],这里i 是int 型的。数组可以认为是从int 印射到另一个类型的印射,而map 是一个任意的印射,所以i 可以是任何类型的!允许重复元素, 没有[]运算符

内部实现: 堆//优先队列,听RoBa 讲得,似乎知道原理了,但不明白干什么用的

priority_queue

支持操作:

push() O(n)

pop() O(n)

top() O(1)

See also: push_heap(), pop_heap() … in

用法举例:

priority_queue maxheap; //int 最大堆

struct ltstr { //又是这么个Compare 函数,重载运算符???不明白为什么要这么写...反正这个Compare 函数对我来说是相当之神奇。RoBa

说了,照着这么写就是了。

bool operator()(int a,int b)

{return a > b;}

};

priority_queue minheap; //int 最小堆

1.sort()

void sort(RandomAccessIterator first, RandomAccessIterator

void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);

区间[first,last)

Quicksort,复杂度O(nlogn)

(n=last-first,平均情况和最坏情况)

用法举例:

1.从小到大排序(int, double, char, string, etc)

const int N = 5;

int main()

{

int a[N] = {4,3,2,6,1};

string str[N] = {“TJU”,”ACM”,”ICPC”,”abc”,”kkkkk”};

sort(a,a+N);

sort(str,str+N);

return 0;

}

2.从大到小排序(需要自己写comp 函数)

const int N = 5;

int cmp(int a,int b) {return a > b;}

int main()

{

int a[N] = {4,3,2,6,1};

sort(a,a+N,cmp);

return 0;

}

3. 对结构体排序

struct SS {int first,second;};

int cmp(SS a,SS b) {

if (a.first != b.first) return a.first < b.first;

return a.second < b.second;

}

v.s. qsort() in C (平均情况O(nlogn),最坏情况

O(n^2)) //qsort 中的cmp 函数写起来就麻烦多了!

int cmp(const void *a,const void *b) {

if (((SS*)a)->first != ((SS*)b)->first)

return ((SS*)a)->first – ((SS*)b)->first;

return ((SS*)a)->second – ((SS*)b)->second;

}

qsort(array,n,sizeof(array[0]),cmp);

sort()系列:

stable_sort(first,last,cmp); //稳定排序

partial_sort(first,middle,last,cmp);//部分排序

将前(middle-first)个元素放在[first,middle)中,其余元素位置不定

C语言一些常用语句

C语言一些常用语句 2010-03-25 09:55 423人阅读评论(0) 收藏举报一break 1. break语句形式:break; 2. break语句功能: A. switch语句中,break语句会终止其后语句的执行,退出switch语句。 B. 使一个循环立即结束,也就是说在循环中遇到break语句时,循环立即终止, 程序转到循环体后的第一个语句去继续执行。 3. 注: A. break语句在循环中使用时,总是与if一起使用,当条件满足(或不满足) 时,负责退出循环。 B. 如果循环体中使用switch语句,而break出现在switch语句中,则它只用 于结束switch,而不影响循环。 C. break语句只能结束包含它的最内层循环,而不能跳了多重循环。 4. 例: break语句的执行只能从while循环中退出,继续执行for循环的其它语句 而不是退出外层循环。 for() { : : while()

{ : : if() break; : : } : : } 二。continue 1.continue语句形式:continue; 2.continue语句功能:它只能出现在循环体中,其功能是立即结束本次循环, 即遇到continue语句时,不执行循环体中continue后的语句,立即转去判断循环条件是否成立。 3.Continue与break语句的区别: continue只是结束本次循环,而不是终止整个循 环语句的执行,break则是终止整个循环语句的 执行,转到循环语句后的下一条语句去执行。 程序表达式及流程图如下:

(1.) while(表达式1) (2.)while(表达式1) { { : : If(表达式2) break; if(表达式2) continue; : : } } 三.goto 1.goto语句形式:goto语句是无条件转向语句,其一般形式为: goto 语句标号; 2.功能:goto语句往往用来从多重循环中跳出。它在解决一些特定问题时很方便,但由于goto语句难于控制,尽量少用。 3.例: IN: For() { : : Goto IN; }

Excel常用函数及使用方法

excel常用函数及使用方法 一、数字处理 (一)取绝对值:=ABS(数字) (二)数字取整:=INT(数字) (三)数字四舍五入:=ROUND(数字,小数位数) 二、判断公式 (一)把公式返回的错误值显示为空: 1、公式:C2=IFERROR(A2/B2,"") 2、说明:如果是错误值则显示为空,否则正常显示。 (二)IF的多条件判断 1、公式:C2=IF(AND(A2<500,B2="未到期"),"补款","") 2、说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 (一)统计两表重复 1、公式:B2=COUNTIF(Sheet15!A:A,A2) 2、说明:如果返回值大于0说明在另一个表中存在,0则不存在。 (二)统计年龄在30~40之间的员工个数 公式=FREQUENCY(D2:D8,{40,29} (三)统计不重复的总人数 1、公式:C2=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 2、说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

(四)按多条件统计平均值 =AVERAGEIFS(D:D,B:B,"财务",C:C,"大专") (五)中国式排名公式 =SUMPRODUCT(($D$4:$D$9>=D4)*(1/COUNTIF(D$4:D$9,D$4:D$9))) 四、求和公式 (一)隔列求和 1、公式:H3=SUMIF($A$2:$G$2,H$2,A3:G3) 或=SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 2、说明:如果标题行没有规则用第2个公式 (二)单条件求和 1、公式:F2=SUMIF(A:A,E2,C:C) 2、说明:SUMIF函数的基本用法 (三)单条件模糊求和 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 (四)多条求模糊求和 1、公式:=SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 2、说明:在sumifs中可以使用通配符* (五)多表相同位置求和 1、公式:=SUM(Sheet1:Sheet19!B2) 2、说明:在表中间删除或添加表后,公式结果会自动更新。

VF常用函数列表

VF常用函数列表数值函数: 1.绝对值和符号函数 格式:ABS(<数值表达式>) SIGN(<数值表达式>) 例如:ABS(-5)=5,ABS(4)=4,SIGN(8)=1,SIGN(-3)=-1,SIGN(0)=0 2.求平方根表达式 格式:SQRT(<数值表达式>) 例如:SQRT(16)=4,它与开二分之一次方等同。 3.圆周率函数 格式:PI() 4.求整数函数 格式:INT(<数值表达式>)返回数值表达式的整数部分 CEILING(<数值表达式>)返回大于或等于表达式的最小整数FLOOR(<数值表达式>)返回小于或等于表达式的最大整数 例如: INT(5.8)=5.8,INT(-7.8)=-7,CEILING(6.4)=7,CEILING(-5.9)=-5 FLOOR(9.9)=9 5.四舍五入函数 格式:ROUND(<数值表达式1>,<数值表达式2>) 功能:返回制定表达式在制定位置四舍五入的结果 例如:

ROUND(345.345,2)=345.35,ROUND(345.345,1)=345.3,ROUND(345.345,0)=345,ROUND(345.345,-1)=350 6.求余函数 格式:MOD(<数值表达式1>,<数值表达式2>) 例如: MOD(10,3)=1 MOD(10,-3)=-2 MOD(-10,3)=2 MOD(-10,-3)=-1 求余数的规律:1.首先按照两数的绝对值求余 2.表达式1的绝对值大于表达式2的绝对值,则余数为表达式1的值 3.余数取表达式1的正负号 4.若两数异好号,余数在加上表达式2的值为最终的结果 7. 求最大值和最小值函数 MAX(数值表达式列表) MIN (数值表达式列表) 例如:MAX(2,3,5)=5 MAX(…2?,?12?,?05?)=2 MAX(…汽车?,?飞机?,?轮船?) 字符串比较的规律: 字符串比较首先比较第一个字母,如果有结果那就不用在进行比较了。如果相等在进行第二个字母的比较,以次类推。 字符函数 1.求字符串长度函数 格式:LEN(<字符表达式>) 功能:返回制定字符表达式的长度,即所包含的字符个数。函数值为数值型 例如:X=“中文Visual FoxPro6.0” 则LEN(X)=20 2.大小写转换函数

HR常用的Excel函数公式大全

在HR同事电脑中,经常看到海量的Excel表格,员工基本信息、提成计算、考勤统计、合同管理....看来再完备的HR系统也取代不了Excel表格的作用。 一、员工信息表公式 1、计算性别(F列) =IF(MOD(MID(E3,17,1),2),"男","女") 2、出生年月(G列) =TEXT(MID(E3,7,8),"0-00-00") 3、年龄公式(H列)

=DATEDIF(G3,TODAY(),"y") 4、退休日期?(I列) =TEXT(EDATE(G3,12*(5*(F3="男")+55)),"yyyy/mm/dd aaaa") 5、籍贯(M列) =VLOOKUP(LEFT(E3,6)*1,地址库!E:F,2,) 注:附带示例中有地址库代码表 6、社会工龄(T列)

=DATEDIF(S3,NOW(),"y") 7、公司工龄(W列) =DATEDIF(V3,NOW(),"y")&"年"&DATEDIF(V3,NOW(),"ym")&"月"&DATEDIF(V3,NOW(),"md")&"天" 8、合同续签日期(Y列) =DATE(YEAR(V3)+LEFTB(X3,2),MONTH(V3),DAY(V3))-1 9、合同到期日期(Z列) =TEXT(EDATE(V3,LEFTB(X3,2)*12)-TODAY(),"[ 10、工龄工资(AA列) =MIN(700,DATEDIF($V3,NOW(),"y")*50) 11、生肖(AB列) =MID("猴鸡狗猪鼠牛虎兔龙蛇马羊 ",MOD(MID(E3,7,4),12)+1,1) 二、员工考勤表公式

18个Excel最常用的公式运算技巧总结

18个Excel最常用的公式运算技巧总结 大家经常用Excel处理表格和数据,在处理表格和数据过程中,会用到公式和函数,下面我们就为大家整理一些Excel常用公式及使用方法,希望对大家有所帮助。 一、查找重复内容公式:=IF(COUNTIF(A:AA2)>1”重复””")。 二、用出生年月来计算年龄公式: =TRUNC((DAYS360(H6”2009/8/30″FALSE))/3600)。 三、从输入的18位身份证号的出生年月计算公式: =CONCATENATE(MID(E274)”/”MID(E2112)”/”MID(E2132))。 四、从输入的身份证号码内让系统自动提取性别,可以输入以下公式:=IF(LEN(C2)=15IF(MOD(MID(C2151)2)=1”男””女”)IF(MOD(MID(C2171)2)=1”男””女”))公式内的“C2”代表的是输入身份证号码的单元格。 五、求和:=SUM(K2:K56) ——对K2到K56这一区域进行求和;

六、平均数:=AVERAGE(K2:K56) ——对K2 K56这一区域求平均数; 七、排名:=RANK(K2,K$2:K$56) ——对55名学生的成绩进行排名; 八、等级:=IF(K2>=85”优”IF(K2>=74”良”IF(K2>=60”及格””不及格”))) 九、学期总评:=K2*0.3+M2*0.3+N2*0.4 ——假设K列、M列和N列分别存放着学生的“平时总评”、“期中”、“期末”三项成绩; 十、最高分:=MAX(K2:K56) ——求K2到K56区域(55名学生)的最高分; 十一、最低分:=MIN(K2:K56) ——求K2到K56区域(55名学生)的最低分; 十二、分数段人数统计:

Excel中常用函数列表

数据库函数: DA VERAGE 返回选择的数据库条目的平均值 DCOUNT 计算数据库中包含数字的单元格个数 DCOUNTA 计算数据库中的非空单元格 DGET 从数据库提取符合指定条件的单个记录 DMAX 返回选择的数据库条目的最大值 DMIN 返回选择的数据库条目的最小值 DPRODUCT 将数据库中符合条件的记录的特定字段中的值相乘DSTDEV 基于选择的数据库条目的样本估算标准偏差DSTDEVP 基于选择的数据库条目的总体计算标准偏差 DSUM 将数据库中符合条件的记录的字段列中的数字相加 DV AR 基于选择的数据库条目的样本估算方差 DV ARP 基于选择的数据库条目的样本总体计算方差GETPIVOTDATA 返回存储在数据透视表中的数据 日期与时间函数 DA TE 返回特定日期的序列号 DA TEV ALUE 将文本格式的日期转换为序列号 DAY 将序列号转换为月的日期 DAYS360 计算基于一年 360 天的两个日期间的天数 EDATE 返回用于表示开始日期之前或之后月数的日期的序列号EOMONTH 返回指定个数月之前或之后的月的末日的序列号HOUR 将序列号转换为小时 MINUTE 将序列号转换为分钟 MONTH 将序列号转换为月 NETWORKDAYS 返回两个日期之间的所有工作日个数 NOW 返回当前日期和时间的序列号 SECOND 将序列号转换为秒 TIME 返回特定时间的序列号 TIMEV ALUE 将文本格式的时间转换为序列号 TODAY 返回今天日期的序列号 WEEKDAY 将序列号转换为一星期的某天 WEEKNUM 将序列号转换为代表该星期为一年中的第几周的数字WORKDAY 返回指定个数工作日之前或之后日期的序列号

JS中的常用语句

1.document.write( " "); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document- >html- >(head,body) 4.一个浏览器窗口中的DOM顺序是:window- >(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById( "表单中元素的ID號 ").name(或value) 6.一个小写转大写的JS: document.getElementById( "output ").value = document.getElementById( "input ").value.toUpperCase(); 7.JS中的值类型:String,Number,Boolean,Null,Object,Function 8.JS中的字符型转换成数值型:parseInt(),parseFloat() 9.JS中的数字转换成字符型:( " " 变量) 10.JS中的取字符串长度是:(length) 11.JS中的字符与字符相连接使用號. 12.JS中的比较操作符有:==等于,!=不等于, >, >=, <. <= 13.JS中声明变量使用:var来进行声明 14.JS中的判定语句结构:if(condition){}else{} 15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop} 16.循环中止的命令是:break 17.JS中的函数定义:function functionName([parameter],...){statement[s]} 18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替. 19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self 20.状態栏的设置:window.status= "字符 "; 21.弹出提示信息:window.alert( "字符 "); 22.弹出確认框:window.confirm(); 23.弹出输入提示框:window.prompt(); 24.指定当前显示链接的位置:window.location.href= "URL " 25.取出窗体中的所有表单的数量:document.forms.length 26.关闭文档的输出流:document.close(); 27.字符串追加连接符: = 28.创建一个文档元素:document.createElement(),document.createTextNode() 29.得到元素的方法:document.getElementById() 30.设置表单中所有文本型的成员的值为空: var form = window.document.forms[0] for (var i = 0; i

最常用函数公式大全

Excel函数公式大全工作中最常用Excel函数公式大全 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 ? 2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数.

? 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 ? 2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

? 四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 ? 2、单条件求和 公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

? 3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 ? 4、多条件模糊求和 公式:C11 =SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符*

电脑办公常用的Excel函数公式及设计方法与技巧

电脑办公常用的Excel函数 公式及设计方法与技巧 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值 公式:C2

=IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2

=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式。 2、单条件求和 公式:F2

=SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法。 3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 4、多条件模糊求和 公式:C11

常用计算公式和函数

公式运用: 请在注册后使用:音视频转换工具软件 名称: crsky 注册码: WHAT-DOYO-UWAN-TTOD-00CE-58F8-5D10-2F1A 常用公式: 一、 1:求和:SUM 可以利用来算一行或一列数字的总和。如算总分。 2:求平均数:average 可以利用来算一行或一列数字的平均值。如算平均分 3:求非空单元格的个数:counta /count 可以利用来算一行或一列(有内容/有数字)的单元格个数。如算参加考试的学生数。4:求满足条件的非空单元格的个数:countif 可以利用来算一行或一列有内容的同时又满足某个条件的单元格个数。如算满足60分以上的学生人数,即及格人数。 5:标准差:STDEVP 可以利用来算一行或一列数字的标准差。标准差是一组数值自平均值分散开来的程度的一种测量观念。一个较大的标准差,代表大部分的数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值。反映学生的分数分化差异。 二、自由公式的运用 1.加减乘除四则运算:电脑键盘的右边,小键盘上有。 加:+ (如:=A1+A2)也可: =5+5 减:- (如:=A1-A2)也可: =5-5 乘:* (如:=A1*A2)也可: =5*5 除:/ (如:=A1/A2)也可: =5/5 2.组合公式运算: A.算及格率:组合公式原理:知道及格人数和总人数。利用及格人数除以总人数 及格人数公式:countif来计算。=COUNTIF(A1:A50,”>=60”) 总人数:可以手写如50,也可以counta来算。 公式组合:= COUNTIF(A1:A50,”>=60”)/ counta(A1:A50) B.算优秀率:组合公式原理:知道优秀人数和总人数。利用优秀人数除以总人数 优秀人数公式:countif来计算。 总人数:可以手写如50,也可以counta来算。 公式组合:= COUNTIF(A1:A50,”>=80”)/ counta(A1:A50) C.算难度系数:组合公式原理:知道平均分和总分。利用平均分除以总分 平均分公式:average来计算。 总分:试卷小题有标注,如3分 公式组合:= average (A1:A50)/ 3 D.选择题选A率:组合公式原理:知道选择了A的总数和班级总人数。利用选择了A的总数除以班级总人数 选择A的总数公式:countif来计算。

三角函数公式及其记忆方法

三角函数公式及其记忆方法 一、同角三角函数的基本关系式 (一)基本关系 1、倒数关系 1cot tan =?αα 1csc sin =?αα 1sec cos =?αα 2、商的关系 αααtan cos sin = ααα tan csc sec = αααcot sin cos = αα α cot sec csc = 3、平方关系 1cos sin 22=+αα αα22sec tan 1=+ αα22csc cot 1=+ (二)同角三角函数关系六角形记忆法 构造以"上弦、中切、下割;左正、右余、中间1"的正六边形为模型。 1、倒数关系 对角线上两个函数互为倒数; 2、商数关系 六边形任意一顶点上的函数值等于与它相邻的两个顶点上函数值的乘积。 (主要是两条虚线两端的三角函数值的乘积,下面4个也存在这种关系。)。由此,可得商数关系式。 3、平方关系 在带有阴影线的三角形中,上面两个顶点上的三角函数值的平方和等于下面 顶点上的三角函数值的平方。 二、诱导公式的本质 所谓三角函数诱导公式,就是将角n·(π/2)±α的三角函数转化为角α的三角函数。 (一)常用的诱导公式 1、公式一: 设α为任意角,终边相同的角的同一三角函数的值相等: z k k ∈=+,sin )2sin(ααπ z k k ∈=+,cos )2cos(ααπ z k k ∈=+,tan )2tan(ααπ z k k ∈=+,cot )2cot(ααπ z k k ∈=+,sec )2sec(ααπ z k k ∈=+,csc )2csc(ααπ 2、公式二:α为任意角,π+α的三角函数值与α的三角函数值之间的关系: ααπsin )sin(-=+ ααπcos )cos(-=+ ααπtan )tan(=+ ααπcot )cot(=+ ααπsec )sec(-=+ ααπcsc )csc(-=+ 3、公式三:任意角α与 -α的三角函数值之间的关系: ααsin )sin(-=- ααcos )cos(=- ααtan )tan(-=- ααcot )cot(-=- ααsec )sec(=- ααcsc )csc(-=-

C语言常用语句总结讲解学习

C语言常用语句总结

C语言常用语句总结 一:常用函数 1、putchar函数: putchar函数(字符输出函数):向终端输出一个字符。 一般形式为: putchar(c) // 输出字符变量c的值。 == printf(“%c”,c) 2、getchar函数 getchar函数(字符输入函数):从终端输入一个字符。 getchar函数没有参数,一般形式为: c=getchar() //将输入的字符赋值给c 3、printf函数 printf函数(格式输入函数):向终端输出若干个任意类型的数据。printf的一般格式为: printf(“格式控制”,对应变量名) // 例如:printf (”%d,%c\n”,i,c) 4、scanf函数 scanf(格式输入函数):从终端输入若干个任意类型的数据。 一般形式为: scanf(“格式控制”,&变量名)

二:基本语句(除if语句外,switch和三种循环语句都需要{大括号}的支持)(1)条件语句if和switch 1、if语句: ********************* if(表达式) 语句1; 语句2;// if下的各独立语句用分号分隔。 ********************* if(表达式) 语句1; else 语句2; ********************* if(表达式1) 语句1; else if(表达式2) // 每一个if与他最近的一个else对应。 语句2; .... else if(表达式n) 语句n; else 语句n+1; ********************* If语句的嵌套 if(表达式)

工作中最常用的excel函数公式大全71954

工作中最常用的excel函数公式大全 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。

2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2

=COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3)说明:如果标题行没有规则用第2个公式

2、单条件求和 公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法 3、单条件模糊求和

公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 4、多条件模糊求和 公式:C11 =SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符*

常用excel函数公式大全

常用的excel函数公式大全 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。

2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。

2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式

1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3)说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。

4、多条件模糊求和 公式:C11 =SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符* 5、多表相同位置求和 公式:b2 =SUM(Sheet1:Sheet19!B2) 说明:在表中间删除或添加表后,公式结果会自动更新。 6、按日期和产品求和

C程序设计常用函数列表

C语言常用函数 2009-11-07 22:53 1、字符处理函数 本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换头文件 ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F),返回非0值,否则返回0 int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0 int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0 int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n'), 返回非0值,否则返回0 int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0 int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则返回0 int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z') 2、数学函数 本分类给出了各种数学计算函数

Excel常用的函数计算公式大全(一看就会)

计算机等级考试 =公式名称(参数1,参数2,。。。。。) =sum(计算范围) =average(计算范围) =sumifs(求和范围,条件范围1,符合条件1,条件范围2,符合条件2,。。。。。。) =vlookup(翻译对象,到哪里翻译,显示哪一种,精确匹配) =rank(对谁排名,在哪个范围里排名) =max(范围) =min(范围) =index(列范围,数字) =match(查询对象,范围,0) =mid(要截取的对象,从第几个开始,截取几个) =int(数字) =weekday(日期,2) =if(谁符合什么条件,符合条件显示的内容,不符合条件显示的内容) =if(谁符合什么条件,符合条件显示的内容,if(谁符合什么条件,符合条件显示的内容,不符合条件显示的内容)) EXCEL的常用计算公式大全 一、单组数据加减乘除运算: ①单组数据求加和公式:=(A1+B1) 举例:单元格A1:B1区域依次输入了数据10和5,计算:在C1中输入=A1+B1 后点击键盘“Enter(确定)”键后,该单元格就自动显示10与5的和15。 ②单组数据求减差公式:=(A1-B1) 举例:在C1中输入=A1-B1即求10与5的差值5,电脑操作方法同上; ③单组数据求乘法公式:=(A1*B1) 举例:在C1中输入=A1*B1即求10与5的积值50,电脑操作方法同上; ④单组数据求乘法公式:=(A1/B1) 举例:在C1中输入=A1/B1即求10与5的商值2,电脑操作方法同上; ⑤其它应用: 在D1中输入=A1^3即求5的立方(三次方); 在E1中输入=B1^(1/3)即求10的立方根 小结:在单元格输入的含等号的运算式,Excel中称之为公式,都是数学里面的基本 运算,只不过在计算机上有的运算符号发生了改变——“×”与“*”同、“÷”与 “/”同、“^”与“乘方”相同,开方作为乘方的逆运算,把乘方中和指数使用成分数 就成了数的开方运算。这些符号是按住电脑键盘“Shift”键同时按住键盘第二排 相对应的数字符号即可显示。如果同一列的其它单元格都需利用刚才的公式计算,只 需要先用鼠标左键点击一下刚才已做好公式的单元格,将鼠标移至该单元格的右下 角,带出现十字符号提示时,开始按住鼠标左键不动一直沿着该单元格依次往下拉到 你需要的某行同一列的单元格下即可,即可完成公司自动复制,自动计算。

EXCEL的常用函数计算公式速记使用技巧-(举例)

EXCEL的常用函数计算公式速记使用技巧-(举例)一、单组数据加减乘除运算指令: ①单组数据求乘法公式:=(A1/B1) 举例:在C1中输入 =A1/B1 即求10与5的商值2,电脑操作方法同上; ②单组数据求乘法公式:=(A1*B1) 举例:在C1中输入 =A1*B1 即求10与5的积值50,电脑操作方法同上; ③单组数据求减差公式:=(A1-B1) 举例:在C1中输入 =A1-B1 即求10与5的差值5,电脑操作方法同上; ④单组数据求加和公式:=(A1+B1) 举例:单元格A1:B1区域依次输入了数据10和5,计算:在C1中输入 =A1+B1 后点击键盘“Enter(确定)”键后,该单元格就自动显示10与5的和15。 ⑤其它应用: 在D1中输入 =A1^3 即求5的立方(三次方); 在E1中输入 =B1^(1/3)即求10的立方根 小结:在单元格输入的含等号的运算指令式,Excel中称之为公式,都是数学里面的基本运算指令,只不过在计算机上有的运算指令符号发生了改变——“×”与“*”同、“÷”与“/”同、“^”与“乘方”相同,开方作为乘方的逆运算指令,把乘方中和指数使用成分数就成了数的开方运算指令。这些符号是按住电脑键盘“Shift”键同时按住键盘第二排相对应的数字符号即可显示。如果同一列的其它单元格都需利用刚才的公式计算,只需要先用鼠标左键点击一下刚才已做好公式的单元格,将鼠标

移至该单元格的右下角,带出现十字符号提示时,开始按住鼠标左键不动一直沿着该单元格依次往下拉到你需要的某行同一列的单元格下即可,即可完成公司自动复制,自动计算。 二、多组数据加减乘除运算指令: ①多组数据求加和公式:(常用) 举例说明:=SUM(A1:A10),表示同一列纵向从A1到A10的所有数据相加; =SUM(A1:J1),表示不同列横向从A1到J1的所有第一行数据相加; ②多组数据求乘积公式:(较常用) 举例说明:=PRODUCT(A1:J1)表示不同列从A1到J1的所有第一行数据相乘; =PRODUCT(A1:A10)表示同列从A1到A10的所有的该列数据相乘; ③多组数据求相减公式:(很少用) 举例说明:=A1-SUM(A2:A10)表示同一列纵向从A1到A10的所有该列数据相减; =A1-SUM(B1:J1)表示不同列横向从A1到J1的所有第一行数据相减; ④多组数据求除商公式:(极少用) 举例说明:=A1/PRODUCT(B1:J1)表示不同列从A1到J1的所有第一行数据相除; =A1/PRODUCT(A2:A10)表示同列从A1到A10的所有的该列数据相除; 三、其它应用函数代表指令: ①平均函数 =AVERAGE(:);②最大值函数 =MAX (:);③最小值函数 =MIN (:); ④统计函数 =COUNTIF(:):举例:Countif ( A1:B5,”>60”) 说明:统计分数大于60分的人数,注意,条件要加双引号,在英文状态下输入。 1、请教excel中同列重复出现的货款号应怎样使其合为一列,并使款号后的数 值自动求和?

Excel常用函数公式大全(实用)

Excel常用函数公式大全 1、查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,"重复","")。 2、用出生年月来计算年龄公式:=TRUNC((DAYS360(H6,"2009/8/30",FALSE))/360,0)。 3、从输入的18位身份证号的出生年月计算公式: =CONCATENATE(MID(E2,7,4),"/",MID(E2,11,2),"/",MID(E2,13,2))。 4、从输入的身份证号码内让系统自动提取性别,可以输入以下公式: =IF(LEN(C2)=15,IF(MOD(MID(C2,15,1),2)=1,"男","女"),IF(MOD(MID(C2,17,1),2)=1,"男","女"))公式内的“C2”代表的是输入身份证号码的单元格。 1、求和:=SUM(K2:K56) ——对K2到K56这一区域进行求和; 2、平均数:=AVERAGE(K2:K56) ——对K2 K56这一区域求平均数; 3、排名:=RANK(K2,K$2:K$56) ——对55名学生的成绩进行排名; 4、等级:=IF(K2>=85,"优",IF(K2>=74,"良",IF(K2>=60,"及格","不及格"))) 5、学期总评:=K2*0.3+M2*0.3+N2*0.4 ——假设K列、M列和N列分别存放着学生的“平时总评”、“期中”、“期末”三项成绩; 6、最高分:=MAX(K2:K56) ——求K2到K56区域(55名学生)的最高分; 7、最低分:=MIN(K2:K56) ——求K2到K56区域(55名学生)的最低分; 8、分数段人数统计: (1)=COUNTIF(K2:K56,"100") ——求K2到K56区域100分的人数;假设把结果存放于K57单元格; (2)=COUNTIF(K2:K56,">=95")-K57 ——求K2到K56区域95~99.5分的人数;假设把结果存放于K58单元格; (3)=COUNTIF(K2:K56,">=90")-SUM(K57:K58) ——求K2到K56区域90~94.5分的人数;假设把结果存放于K59单元格; (4)=COUNTIF(K2:K56,">=85")-SUM(K57:K59) ——求K2到K56区域85~89.5分的人数;假设把结果存放于K60单元格;

(Excel)常用函数公式及操作技巧之六:条件自定义格式(二)

(Excel)常用函数公式及操作技巧之六: 条件自定义格式(二) ——通过知识共享树立个人品牌。常用的自定义格式 单元格属性自定义中的“G/通用格式“和”@”作用有什么不同? 设定成“G/通用格式“的储存格,你输入数字1..9它自动认定为数字,你输入文字a..z它自动认定为文字,你输入数字1/2它会自动转成日期。 设定成“@“的储存格,不管你输入数字1..9、文字a..z、1/2,它一律认定为文字。 文字与数字的不同在於数字会呈现在储存格的右边,文字会呈现在储存格的左边。 常用的自定义格式拿出来大家分享 我最常用的有: 1. 0”文本”、0.0”文本”、0.00”文本”等(输入带单位符号的数值); 2. #”文本”、#.#”文本”、###,###.##”文本”等(同上); 3. [DBNum1][$-804]G/通用格式、[DBNum2][$-804]G/通用格式等(数值的大小写格式); 4.@”文本”(在原有的文本上加上新文本或数字); 5.0000000 (发票号码等号码输入); 6. yyyy/mm 7. yyyy/m/d aaaa -->ex. 2003/12/20 星期六 8. m"月"d"日" (ddd) -->ex. 12月20日(Sat) 9. "Subject (Total: "0")" -->单纯加上文字 10. "Balance"* #,##0_ -->对齐功能 11. [蓝色]+* #,##0_ ;-* #,##0_ -->正负数的颜色变化 12. **;**;**;** -->仿真密码保护(搭配sheet保护) 13. [红色][<0];[绿色][>0] (小于0时显示红色,大于0时绿色,都以绝对值显示) 14 [>0]#,##0.00;[<0]#,##0.00;0.00 (会计格式,以绝对值形式显示) 自定义格式 Excel中预设了很多有用的数据格式,基本能够满足使用的要求,但对一些特殊的要求,如强调显示某些重要数据或信息、设置显示条件等,就要使用自定义格式功能来完成。Excel的自定义格式使用下面的通用模型:正数格式,负

完整word版常用函数列表word文档良心出品

附录信号处理工具箱函数汇总1、滤波器分析与实现 函数名描述绝对值(幅值abs 取相angle 求卷conv 求二维卷conv2 去卷deconv 重叠相加FF滤波器实fftfilt 直接滤波器实filter 二维数字滤波filter2

零相位数字滤波filtfilt 滤波器初始条件选filtic 模拟滤波器频率响freqs 频率响应中的频率间freqspace 数字滤波器频率响freqz 画出频率响应曲freqzplot 平均滤波延grpdelay 数字滤波器的单位抽样响impz 格形滤波latcfilt 一维中值滤medfilt1 Savitzky-Gola滤波sgolayfilt 二次分式滤波sosfilt 离散系统零极点zplane 上采upfirdn 去除相unwrap 2、FIR数字滤波器设计 函数名描述 矩阵卷积convmtx 复、非线性相位等波纹滤波器设计cremez 基于窗函数的FIR滤波器设计fir1 1 FIR滤波器设计基于频率采样的fir2

FIR多频滤波器设计约束的最小二乘fircls FIR滤波设计约束的最小二乘、低通和高能、线性相位fircls1 FIR滤波器设计最优最小二乘firls 升余弦滤波器设计firrcos FIR滤波器设计内插intfilt 基于阶数估计的凯瑟滤波器设kaiserord FI滤波器设切比雪夫最remez reme设基于阶数估计remezord 滤波器设Savizky-Golay FIsgolay 数字滤波器设计IIR3、 描函数 巴特沃思滤波器设butter 型滤波器设切比雪cheby1 I型滤波器设切比雪cheby2 椭圆滤波器设计ellip 广义巴特沃思低通滤波器设计maxflat 递归滤波器设计yulewalk 巴特沃思滤波器阶估计buttord I型滤波器阶估计切比雪夫cheb1ord 型滤波器阶估计切比雪夫IIcheb2ord 椭圆滤波器阶估计ellipord 拟滤波器设计模4、

相关文档
最新文档