SUM 函数和她的七个姑姑。
小伙伴们好啊,今天老祝和大家分享一组常用的函数公式知识,一起来学习一下Excel中的求和计算。
SUM函数
这个不用我多说了吧,最常用的求和函数。
如下图所示,是某单位食堂的采购记录表,使用以下公式,即可计算所有物品的数量总和。
=SUM(D2:D14)
SUMIF函数
如果要按指定条件求和,那就要请出SUMIF函数了。
这个函数的用法是:
=SUMIF(条件区域,指定的条件,求和区域)
如下图所示,要计算职工食堂的物资采购总量,公式为:
=SUMIF(B2:B14,H3,D2:D14)
公式的意思是,如果B2:B14单元格区域中等于H3指定的部门“职工食堂”,就对D2:D14单元格区域对应的数值进行求和。
SUMIFS函数
SUMIFS函数的作用是多条件求和。这个函数的用法是:
=SUMIFS(求和区域,条件区域1,指定的条件1,条件区域2,指定的条件2,……)
第一参数指定要求和的区域,后面是一一对应的条件区域和指定条件,多个条件之间是同时符合的意思,可以根据需要,最多写127对区域/条件。
如下图所示,要计算部门是职工食堂,单价在1元以下的物质采购总量。
公式为:
=SUMIFS(D2:D14,B2:B14,H3,E2:E14,I3)
公式的意思是,如果B2:B14单元格区域中等于H3指定的部门“职工食堂”,并且E2:E14单元格区域中等于指定的条件"<1",就对D列对应的数值求和。
SUMIF或是SUMIFS的判断条件除了引用单元格中的内容,也可以直接写在公式中:
=SUMIFS(D2:D14,B2:B14,"职工食堂",E2:E14,"<1")
SUMPRODUCT函数
该函数作用是将数组间对应的元素相乘,并返回乘积之和。
如下图所示,要计算采购所有物资的总金额,公式为:
=SUMPRODUCT(D2:D14,E2:E14)
公式中,将D2:D14的数量和E2:E14的单价分别对应相乘,然后将乘积求和,得到最终所有物资的采购总金额。
使用SUMPRODUCT函数,还可以计算指定条件的乘积。
如下图所示,要分别计算职工食堂和领导餐厅的物资采购金额。公式为:
=SUMPRODUCT((B$2:B$14=G2)*1,D$2:D$14,E$2:E$14)
公式先使用B$2:B$14=G2,依次判断B列的部门是不是等于G2单元格指定的部门,得到一组由逻辑值TRUE和FALSE构成的内存数组,然后将这一组逻辑值乘以1,逻辑值TRUE乘1,结果是1,逻辑值FALSE乘1,结果是0。
最后,将三个数组的元素对应相乘后,再计算出乘积之和。
SUBTOTAL函数
仅对可见单元格汇总计算,能够计算在筛选状态下的求和。
如下图,对B列的部门进行了筛选,使用以下公式可以计算出筛选后的数量之和。
=SUBTOTAL(9,D2:D14)
SUBTOTAL第一参数用于指定汇总方式,可以是1~11的数值,通过指定不同的第一参数,可以实现平均值、求和、最大、最小、计数等多种计算方式。
如果第一参数使用101~111,还可以忽略手工隐藏行的数据,小伙伴们有空可以试试。
AGGREGATE函数
和SUBTOTAL函数功能类似,功能比SUBTOTAL更多,第一参数可以使用1到19的数值,来指定19种不同的汇总方式。第二参数使用1到7,来指定忽略哪些内容。
如下图所示,已经对B列的部门进行了筛选,而且F列的金额计算结果有错误值,使用以下公式,可以对F列的金额进行汇总。
=AGGREGATE(9,7,F2:F14)
AGGREGATE函数第一参数使用9,表示汇总方式为求和,第二参数使用7,表示忽略隐藏行和错误值。
以上咱们学习了Excel中的求和计算,今天的内容就是这些吧,祝各位小伙伴一天好心情!
练手文件链接:
https://pan.baidu.com/s/1wXxjX61M7EzAhjcO4qVtwA
上一篇: [学习笔记] 三维数学(1)--向量
下一篇: 机器学习中的基础数学
推荐阅读
-
轻松掌握 LINQ Sum函数的使用方法
-
玩转MySQL:窗口函数详解 - SUM、AVG、MIN和MAX的运用
-
探索Hive中的窗口函数:理解SUM、AVG、COUNT、MAX和MIN的窗口聚合操作
-
理解 SQL 窗口函数: over()与 sum, AVG, MIN, MAX 的实战应用
-
SUM 函数和她的七个姑姑。
-
SUM函数超实用的13种经典用法 - 四、SUM函数的第四种用法:批量多区域求和
-
如何使用 Matlab 的求和函数 sum
-
excel 减法函数_Excel 教程:最常用的 SUM 函数给你 [珍藏版
-
正负偏差变量 即 d2+、d2- 分别表示决策值中超出和未达到目标值的部分。而 di+、di- 均大于 0 刚性约束和目标约束(柔性目标约束有偏差) 在多目标规划中,>=/<= 在刚性约束中保持不变。当需要将约束条件转换为柔性约束条件时,需要将 >=/<= 更改为 =(因为已经有 d2+、d2- 用来表示正负偏差),并附加上 (+dii-di+) 注意这里是 +di、-di+!之所以是 +di,-di+,是因为需要将目标还原为最接近的原始刚性约束条件 优先级因素和权重因素 对多个目标进行优先排序和优先排序 目标规划的目标函数 是所有偏差变量的加权和。值得注意的是,这个加权和都取最小值。而 di+ 和 dii- 并不一定要出现在每个不同的需求层次中。具体分析需要具体问题具体分析 下面是一个例子: 题目中说设备 B 既要求充分利用,又要求尽可能不加班,那么列出的时间计量表达式即为:min z = P3 (d3- + d3 +) 使用 + 而不是 -d3 + 的原因是:正负偏差不可能同时存在,必须有 di+di=0 (因为判定值不可能同时大于目标值和小于目标值),而前面是 min,所以只要取 + 并让 di+ 和 dii- 都为正值即可。因此,得出以下规则: 最后,给出示例和相应的解法: 问题:某企业生产 A 和 B 两种产品,需要使用 A、B、C 三种设备。下表显示了与工时和设备使用限制有关的产品利润率。问该企业应如何组织生产以实现下列目标? (1) 力争利润目标不低于 1 500 美元; (2) 考虑到市场需求,A、B 两种产品的生产比例应尽量保持在 1:2; (3)设备 A 是贵重设备,严禁超时使用; (4)设备 C 可以适当加班,但要控制;设备 B 要求充分利用,但尽量不加班。 从重要性来看,设备 B 的重要性是设备 C 的三倍。 建立相应的目标规划模型并求解。 解:设企业生产 A、B 两种产品的件数分别为 x1、x2,并建立相应的目标计划模型: 以下为顺序求解法,利用 LINGO 求解: 1 级目标: 模型。 设置。 variable/1..2/:x;! s_con_num/1...4/:g,dplus,dminus;!所需软约束数量(g=dplus=dminus 数量)及相关参数; s_con(s_con_num);! s_con(s_con_num,variable):c;!软约束系数; 结束集 数据。 g=1500 0 16 15. c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(1);!第一个目标函数;!对应于 min=z 的第一小部分;! 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); !使用设置完成的数据构建软约束表达式; ! !软约束表达式 @for(variable:@gin(x)); !将变量约束为整数; ! 结束 此时,第一级目标的最优值为 0,第一级偏差为 0: 第二级目标: !求 dminus(1)=0,然后求解第二级目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=dminus(2)+dplus(2);!第二个目标函数 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标结果 @for(variable:@gin(x)); ! 结束 此时,第二个目标的最优值为 0,偏差为 0: 第三目标 !求 dminus(2)=0,然后求解第三个目标。 模型。 设置。 变量/1..2/:x;!设置:变量/1..2/:x; ! s_con_num/1...4/:g,dplus,dminus;!软约束数量及相关参数; s_con(s_con_num(s_con_num));! s_con(s_con_num,variable):c;! 软约束系数; s_con(s_con_num,variable):c;! 结束集 数据。 g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; 结束数据 min=3*dminus(3)+3*dplus(3)+dminus(4);!第三个目标函数。 2*x(1)+2*x(2)<12;!硬约束 @for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i)); ! 软约束表达式;! dminus(1)=0; !第一个目标约束条件; ! dminus(2)+dplus(2)=0; !第二个目标约束条件 @for(variable:@gin(x));! 结束 最终结果为 x1=2,x2=4,dplus(1)=100,最优利润为
-
= 0; i--) {
printf("%5d", *(p + i));
}
printf("\n");
return 0;
}
```
2. 利用指针计算奇数索引数组元素之和
```c
// 使用指针计算奇数索引数组元素之和
#include
int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int n = sizeof(arr) / sizeof(arr[0]); printf("数组元素: "); for (int i = 0; i < n; i++) { printf("%3d", arr[i]); // 宽度为3,右对齐 } printf("\n"); printf("数组下标: "); for (int i = 0; i < n; i++) { printf("%3d", i); // 宽度为3,右对齐 } printf("\n"); int sum = 0; int *p = arr; // 声明指向整数的指针 for (int i = 0; i < n; i++) { if (i % 2 != 0) { sum += *(p + i); // 若索引i为奇数,累加对应元素值 } } printf("奇数索引数组元素之和: %d\n", sum); return 0; } ``` 3. 查看不同类型指针在Linux Ubuntu gcc下的字节大小 ```c // 在Linux Ubuntu gcc环境下查看不同类型指针的字节大小 #include #include int main() { printf("int指针大小: %zu bytes\n", sizeof(int *)); printf("char指针大小: %zu bytes\n", sizeof(char *)); printf("float指针大小: %zu bytes\n", sizeof(float *)); printf("double指针大小: %zu bytes\n", sizeof(double *)); return 0; } ``` 请注意,对于现代64位系统(如Linux),`int`、`char`、`float`和`double`指针通常都是8字节。但在某些特定情况下(如32位系统或特定编译环境),可能有所不同。 4. 使用指针遍历并打印字符数组 ```c // 使用指针遍历并打印字符数组 #include #include // 引入strlen函数 int main() { char str[] = "Hello, World"; // 字符串常量 int len = strlen(str); // 获取字符串长度 char *ptr = str; // 定义指向字符的指针 printf("输出字符串: %s\n", str); // 输出原始字符串 printf("遍历并打印字符数组: "); for (int i = 0; i < len; i++) { printf("%c", *ptr); // 输出当前字符 ptr++; // 移动指针到下一个字符 } printf("\n"); return 0; } ``` 对于用户自定义输入字符串的情况,请参考以下代码: ```c #include #include int main() { char input[100]; // 用于存放用户输入的字符串,假设最大长度为100 printf("请输入字符串: "); fgets(input, sizeof(input), stdin); // 从标准输入读取字符串,fgets会保留换行符 int len = strlen(input) - 1; // 去掉fgets读取的换行符 char *ptr = input; // 定义指向字符的指针 printf("输入的字符串: %s\n", input); printf("遍历并打印字符数组: "); for (int i = 0; i < len; i++) { printf("%c", *ptr); // 输出当前字符 ptr++; // 移动指针到下一个字符 } printf("\n"); return 0; } ```"> 1. 使用指针倒序显示整数数组内容 ```c // 通过指针逆序打印整数数组 #include
#include #include int main() { int arr[10] = {0}; int n = sizeof(arr) / sizeof(arr[0]); srand(time(NULL)); printf("原始数组: "); for (int i = 0; i < n; i++) { arr[i] = rand() % 100; printf("%5d", arr[i]); } printf("\n"); int *p = arr; // 指针指向数组元素 printf("反转打印数组元素: "); for (int i = n - 1; i >= 0; i--) { printf("%5d", *(p + i)); } printf("\n"); return 0; } ``` 2. 利用指针计算奇数索引数组元素之和 ```c // 使用指针计算奇数索引数组元素之和 #include int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int n = sizeof(arr) / sizeof(arr[0]); printf("数组元素: "); for (int i = 0; i < n; i++) { printf("%3d", arr[i]); // 宽度为3,右对齐 } printf("\n"); printf("数组下标: "); for (int i = 0; i < n; i++) { printf("%3d", i); // 宽度为3,右对齐 } printf("\n"); int sum = 0; int *p = arr; // 声明指向整数的指针 for (int i = 0; i < n; i++) { if (i % 2 != 0) { sum += *(p + i); // 若索引i为奇数,累加对应元素值 } } printf("奇数索引数组元素之和: %d\n", sum); return 0; } ``` 3. 查看不同类型指针在Linux Ubuntu gcc下的字节大小 ```c // 在Linux Ubuntu gcc环境下查看不同类型指针的字节大小 #include #include int main() { printf("int指针大小: %zu bytes\n", sizeof(int *)); printf("char指针大小: %zu bytes\n", sizeof(char *)); printf("float指针大小: %zu bytes\n", sizeof(float *)); printf("double指针大小: %zu bytes\n", sizeof(double *)); return 0; } ``` 请注意,对于现代64位系统(如Linux),`int`、`char`、`float`和`double`指针通常都是8字节。但在某些特定情况下(如32位系统或特定编译环境),可能有所不同。 4. 使用指针遍历并打印字符数组 ```c // 使用指针遍历并打印字符数组 #include #include // 引入strlen函数 int main() { char str[] = "Hello, World"; // 字符串常量 int len = strlen(str); // 获取字符串长度 char *ptr = str; // 定义指向字符的指针 printf("输出字符串: %s\n", str); // 输出原始字符串 printf("遍历并打印字符数组: "); for (int i = 0; i < len; i++) { printf("%c", *ptr); // 输出当前字符 ptr++; // 移动指针到下一个字符 } printf("\n"); return 0; } ``` 对于用户自定义输入字符串的情况,请参考以下代码: ```c #include #include int main() { char input[100]; // 用于存放用户输入的字符串,假设最大长度为100 printf("请输入字符串: "); fgets(input, sizeof(input), stdin); // 从标准输入读取字符串,fgets会保留换行符 int len = strlen(input) - 1; // 去掉fgets读取的换行符 char *ptr = input; // 定义指向字符的指针 printf("输入的字符串: %s\n", input); printf("遍历并打印字符数组: "); for (int i = 0; i < len; i++) { printf("%c", *ptr); // 输出当前字符 ptr++; // 移动指针到下一个字符 } printf("\n"); return 0; } ```