day06 记账程序01

本文介绍了一个简易的记账程序实现方法,通过Python语言完成开支与收入的记录、查询等功能。程序采用pickle模块来实现数据的持久化存储,并利用时间模块获取当前日期,确保每条记录的时间准确性。

记账程序
1.  假设在记账时,有一万元钱
2.  无论是开销还是收入都要进行记账
3.  记账内容包括时间、金额和说明等
4.  记账数据要求永久存储

 

 

 

 

import pickle
import os
import time


def cost(wallet, record):
    amount = int(input('amount: '))
    comment = input('comment: ')
    date = time.strftime('%Y-%m-%d')
    with open(wallet, 'rb') as fobj:
        balance = pickle.load(fobj) - amount
    with open(wallet, 'wb') as fobj:
        pickle.dump(balance, fobj)
    with open(record, 'a') as fobj:
        fobj.write(
            '%-12s%-8s%-8s%-10s%-20s\n' % (date, amount, '', balance, comment)
        )

def save(wallet, record):
    amount = int(input('amount: '))
    comment = input('comment: ')
    date = time.strftime('%Y-%m-%d')
    with open(wallet, 'rb') as fobj:
        balance = pickle.load(fobj) + amount
    with open(wallet, 'wb') as fobj:
        pickle.dump(balance, fobj)
    with open(record, 'a') as fobj:
        fobj.write(
            '%-12s%-8s%-8s%-10s%-20s\n' % (date, '', amount, balance, comment)
        )

def query(wallet, record):
    print('%-12s%-8s%-8s%-10s%-20s' % ('date', 'cost', 'save', 'balace', 'comment'))
    with open(record) as fobj:
        for line in fobj:
            print(line, end='')
    with open(wallet, 'rb') as fobj:
        balance = pickle.load(fobj)
    print("Latest Balance: %d" % balance)


def show_menu():
    cmds = {'0': cost, '1': save, '2': query}
    prompt = """(0) cost
(1) save
(2) query
(3) exit
Please input your choice(0/1/2/3): """
    wallet = 'wallet.data'
    record = 'record.txt'
    if not os.path.exists(wallet):
        with open(wallet, 'wb') as fobj:
            pickle.dump(10000, fobj)

    while True:
        try:
            choice = input(prompt).strip()[0]
        except IndexError:
            continue
        except (KeyboardInterrupt, EOFError):
            print()
            choice = '3'

        if choice not in '0123':
            print('Invalid input. Try again.')
            continue

        if choice == '3':
            break
        cmds[choice](wallet, record)

if __name__ == '__main__':
    show_menu()

使用C语言编写记账程序可按以下步骤实现: ### 总体设计 需设计程序的整体架构,明确主要模块及其功能,规划主要函数之间的调用关系,同时可绘制流程图辅助设计,清晰展示程序的执行流程和逻辑结构[^1]。 ### 功能模块实现 1. **菜单界面**:设计主菜单,为用户提供操作选项,如输入账单、查看账单等功能。 ```c #include <stdio.h> void showMenu() { printf("1. 输入账单\n"); printf("2. 查看账单\n"); printf("3. 退出\n"); } int main() { int choice; showMenu(); scanf("%d", &choice); // 根据用户选择执行相应操作 return 0; } ``` 2. **输入账单功能**:允许用户输入收支信息,可包含日期、金额、收支类型(收入或支出)、备注等信息。 ```c #include <stdio.h> typedef struct { int year; int month; int day; float amount; char type[10]; char note[100]; } Bill; void inputBill(Bill *bill) { printf("请输入日期(年 月 日):"); scanf("%d %d %d", &bill->year, &bill->month, &bill->day); printf("请输入金额:"); scanf("%f", &bill->amount); printf("请输入收支类型(收入/支出):"); scanf("%s", bill->type); printf("请输入备注:"); scanf("%s", bill->note); } int main() { Bill bill; inputBill(&bill); // 可将账单信息保存到文件或数组中 return 0; } ``` 3. **查看账单功能**:支持多种查询方式,如按月查询、按年查询、查询所有收支信息等。 ```c #include <stdio.h> // 假设已有一个保存账单信息的数组 #define MAX_BILLS 100 Bill bills[MAX_BILLS]; int billCount = 0; void viewAllBills() { for (int i = 0; i < billCount; i++) { printf("日期:%d-%d-%d\n", bills[i].year, bills[i].month, bills[i].day); printf("金额:%.2f\n", bills[i].amount); printf("收支类型:%s\n", bills[i].type); printf("备注:%s\n", bills[i].note); printf("-------------------\n"); } } int main() { // 假设已有账单信息 viewAllBills(); return 0; } ``` 4. **删除功能**:可实现删除单条收支信息、按日期删除部分信息或删除所有信息的功能。 ```c #include <stdio.h> void deleteBill(int index) { if (index >= 0 && index < billCount) { for (int i = index; i < billCount - 1; i++) { bills[i] = bills[i + 1]; } billCount--; printf("删除成功!\n"); } else { printf("无效的索引!\n"); } } int main() { int index; printf("请输入要删除的账单索引:"); scanf("%d", &index); deleteBill(index); return 0; } ``` ### 日期处理 在处理日期相关功能时,可定义数组保存平年每个月的天数,方便进行日期计算和判断。 ```c int monthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; ``` ### 程序运行效果验证 编写完程序后,进行测试,截取程序运行效果的截图,检查各功能是否正常工作,如主菜单显示、输入账单、查看账单等功能的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值