AA制消费金额统计的Bash脚本

本文提供了一个Bash脚本来处理AA制消费记录,计算每个人应承担的金额。通过解析输入的消费记录文件,脚本计算出每个参与者的消费总额,并根据指定的折扣率计算出最终每人需支付的金额。

AA制消费金额统计的Bash脚本

什么是AA制?

百度百科 AA制 写道
AA制是源于大中华地区的词汇,意思是各人平均分担所需费用,通常用于饮食聚会及旅游等场合。“AA”是 “Algebraic Average”的缩写。意思是“代数平均”。意思可以从字面看出,就是按人头平均分担帐单的意思。这个意思首先来自英国人对荷兰人的偏见,因为古荷兰人 就是平分帐单的,英国人认为荷兰人没有绅士风度。因为在古英语中与荷兰有关的东西大部分都是贬义的。但AA制还有其他说法,比如香港人把AA作为All Apart的缩写,意为“全部分开”。还有人认为“AA”是英文“Acting Appointment”的缩写。
 

消费原始记录文件格式

每次消费记录占一行,第一项是每次的总金额,从第二项开始是消费人员的列表。比如:

34 zhy kx zxe
39 zhy kx zxe oyc
36 zhy kx zxe
50 zhy kx zxe oyc
36 zhy kx zxe

 

脚本实现思路

对每行数据进行分解,得到总金额,得到人数,每个人的消费金额就是总金额除以人数,对每个人的金额求和。

本文所提供的脚本是采用纯粹的Bash方式,对于数据处理,更好的方式是采用awk来进行,欢迎有兴趣的朋友尝试实现一下。

 

Bash脚本 calc_bill.sh

#!/bin/sh

# 用法:./calc_bill.sh [discount]

# 折扣,由第一个参数指定,如果没有指定就设置为1,即无折扣
# 折扣可以是小数,比如 0.8;也可以是一个除式,比如 1/1.1 或 10/11
discount=${1:-1}

# 人员数组
declare -a ids

# 费用数组,保存一个计算费用的表达式,比如 0+34/3+45/4
declare -a fee

# 在人员数组ids中查找人员,如果没有查到就增加,将位置通过退出码返回
find_or_add_id()
{
        n=${#ids[@]}
        for ((i = 0; i < n; ++i))
        do
                if [ "${ids[i]}" == "$1" ]; then
                        return $i
                fi
        done
        ids[n]=$1
        fee[n]=0
        return $n
}

# 读取数据并处理
# 数据格式:每行一条记录,第一项是总金额,第二项开始时消费人员的名单
while read -a data
do
        amt=${data[0]}  # 总金额
        if [ ! "$amt" ]; then continue; fi
        declare -i num=${#data[@]}-1    # 消费人员的数量
        echo "$num ${data[@]}"
        for id in "${data[@]:1}"        # 对每一个人员进行处理
        do
                find_or_add_id "$id"
                index=$?
                #echo "index of $id is $index"
                fee[index]="${fee[index]}+$amt/$num"
        done
        #declare -p ids
        #declare -p fee
done

echo

# 打印并计算每个人的消费金额
# 格式:人员  金额
for ((i = 0; i < ${#ids[@]}; ++i))
do
        #echo "${ids[i]}" "$(echo "scale=2; (${fee[i]})*$discount" | bc)"
        printf "%-4s %8s\n" "${ids[i]}" "$(echo "scale=4; (${fee[i]})*$discount" | bc)"
done

 

执行示例

[root@jfht bill]# cat bill20110902.txt
34 zhy kx zxe
39 zhy kx zxe oyc
36 zhy kx zxe
50 zhy kx zxe oyc
36 zhy kx zxe

[root@jfht bill]# ./calc_bill.sh 10/11 <bill20110902.txt
3 34 zhy kx zxe
4 39 zhy kx zxe oyc
3 36 zhy kx zxe
4 50 zhy kx zxe oyc
3 36 zhy kx zxe

zhy   52.3484
kx    52.3484
zxe   52.3484
oyc   20.2272
[root@jfht bill]# ./calc_bill.sh <bill20110902.txt 10/11
3 34 zhy kx zxe
4 39 zhy kx zxe oyc
3 36 zhy kx zxe
4 50 zhy kx zxe oyc
3 36 zhy kx zxe

zhy   52.3484
kx    52.3484
zxe   52.3484
oyc   20.2272

 

[root@jfht bill]#

 

 

本文链接:http://codingstandards.iteye.com/blog/1164630   (转载请注明出处)

 

 

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模与仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建与控系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态与位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控与轨迹跟踪。此外,文章还提到了多种优化与控策略的应用背景,如模型预测控、PID控等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学与科研实践;②为无人机控系统设计(如姿态控、轨迹跟踪)提供仿真验证平台;③支持高级控算法(如MPC、LQR、PID)的研究与对比分析; 阅读建议:建议读者结合文中提到的Matlab代码与仿真模型,动手实践飞行器建模与控流程,重点关注动力学方程的实现与控器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值