c实用技巧:文件统计信息和银行账户管理系统

简介: c实用技巧:文件统计信息和银行账户管理系统

需求

       写一个shell程序命名为wc,统计文件字符数、行数和单词数。

       写一个shell程命名为bank,完成以下功能:退出、存款、取款、添加账户、删除账户、查询账户、显示所有账户,所有信息保存在account.dat文件中,每次操作会实时更新account.dat文件。

       编写对应的makefile,使用 make编译


shell版本

       shell实用技巧:文件统计信息和银行账户管理系统

      https://blog.csdn.net/qq21497936/article/details/79952413


实现截图(c与shell的差不多)

wc

       图片.png

bank

图片.png图片.png

wc的makefile

CC=gcc
wc : wc.o
  $(CC) -o wc wc.o
wc.o : wc.c
  $(CC) -c wc.c
clean:
  rm -rf wc.o wc

wc的c代码

#include <stdio.h>
void wc(char *path)
{
  int isWord = 0;
  int chars = 0;
  int rows = 0;
  int words = 0;
  int ch;
  FILE *fp = NULL; 
  fp = fopen(path, "r");
  if(fp == NULL)
  {
    printf("Failed to open file:%s", path);
    return;
  }
  do
  {
    ch = fgetc(fp);
    if(ch != EOF)
      chars++;
    if(ch == '\n')
      rows++;
    if((ch >= 'a' && ch <='z') || (ch >= 'A' && ch <='Z'))
    {
      isWord = 1;
    }else{
      if(isWord == 1)
        words++;
      isWord = 0;
    }
  }while(ch != EOF);
  fclose(fp);
  printf("===== file: %s =====\n", path);
  printf("字符数:%d\n", chars);
  printf("换行数:%d\n", rows);
  printf("单词数:%d\n", words);
  return;
}
int main(int argc, char *argv[])
{
  int i = 0;
  char path[32] = {0x00};
  if( argc == 1 )
  {
     printf("input a file:");
     scanf("%s", path);
     wc(path);
  }else{
     for(i = 1; i < argc; i++)
     {
         wc(argv[i]);
     }
  }
}

bank的makefile

CC=gcc
bank : bank.o
  $(CC) -o bank bank.o
bank.o : bank.c
  $(CC) -c bank.c
clean:
  rm -rf bank.o bank

bank的c代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DATA_FILE ("accounts.dat")
struct Info *pAccountHead = 0;
struct Info{
  char firstName[128];
  char middleName[128];
  char lastName[128];
  char number[128];
  int balance;
  struct Info *pNext;
};
void loadInfo()
{
  struct Info *p = 0;
  struct Info *q = 0;
  struct Info *pInfo = 0;
  FILE *fp = fopen(DATA_FILE, "rb");
  if(fp == NULL)
  {
    printf("Failed to open file : %s", DATA_FILE);
    return;
  }
  pAccountHead = 0;
  do{
    struct Info *pInfo = (struct Info *)malloc(sizeof(struct Info));
    memset(pInfo, 0x00, sizeof(struct Info));
    if(5!=fscanf(fp,"%s %s %s %s %d ", pInfo->firstName, pInfo->middleName, pInfo->lastName, pInfo->number, &pInfo->balance))
    {
      free(pInfo);
      break;
    }
    if(pAccountHead == 0)
    {
      pAccountHead = pInfo;
    }else{
      p = pAccountHead;
      while(p->pNext != 0)
      {
        p = p->pNext;
      }
      p->pNext = pInfo;
      pInfo->pNext = 0;
    }
  }while(1);
  fclose(fp);
} 
void saveInfo()
{
  struct Info *p = 0;
  int result = 0;
  FILE *fp = 0;
  fp = fopen(DATA_FILE, "wb+");
  if(fp == NULL)
  {
    printf("Failed to open file : %s", DATA_FILE);
    return;
  }
  p = pAccountHead;
  while(p != 0)
  {
    fprintf(fp,"%s %s %s %s %d ", p->firstName, p->middleName, p->lastName, p->number, p->balance);
    p = p->pNext;
  }
  fclose(fp);
}
int showMenu()
{
  int number = 0;
  printf("========== 银行账户菜单 ==========");
  printf("\n");
  printf("0.退出");
  printf("\n");
  printf("1.存款");
  printf("\n");
  printf("2.取款");
  printf("\n");
  printf("3.添加账户");
  printf("\n");
  printf("4.删除账户");
  printf("\n");
  printf("5.查询账户余额");
  printf("\n");
  printf("6.打印所有账户信息");
  printf("\n");
  printf("=================================");
  printf("\n");
  printf("请输入您的选择(0-6):");
  scanf("%d", &number);
  return number;
}
void menu2()
{
  int i = 0;
  char number[128] = {0x00};
  int balance;
  struct Info *pInfo = 0;
  struct Info *p = 0;
  struct Info *q = 0;
  printf("请输入account(6位数字):");
  scanf("%s", number);
  if(strlen(number) != 6)
  {
    printf("账户必须是6位数字!!!");
    printf("\n");
    return;
  }
  for(i = 0; i < 6; i++)
  {
    if(number[i] >= '0' && number[i] <= '9')
    {
      ;
    }else{
      printf("账户必须是6位数字!!!");
      printf("\n");
      return;
    }
  }
  printf("请输入取款金额(元):");
  scanf("%d", &balance);
  q = 0;
  p = pAccountHead;
  while(p != 0)
  {
    if(strcmp(p->number, number) == 0)
    {
      if(p->balance-balance < 0)
      {
        printf("取款失败,账户余额不足!!!");
        printf("\n");
        return;
      }
      p->balance-=balance;
      printf("取款成功!!!");
      printf("\n");
      return;
    }
    q = p;
    p = p->pNext;
  }
  printf("未找到账户");
  printf("\n");
}
void menu1()
{
  int i = 0;
  char number[128] = {0x00};
  int balance;
  struct Info *pInfo = 0;
  struct Info *p = 0;
  struct Info *q = 0;
  printf("请输入account(6位数字):");
  scanf("%s", number);
  if(strlen(number) != 6)
  {
    printf("账户必须是6位数字!!!");
    printf("\n");
    return;
  }
  for(i = 0; i < 6; i++)
  {
    if(number[i] >= '0' && number[i] <= '9')
    {
      ;
    }else{
      printf("账户必须是6位数字!!!");
      printf("\n");
      return;
    }
  }
  printf("请输入存款金额(元):");
  scanf("%d", &balance);
  q = 0;
  p = pAccountHead;
  while(p != 0)
  {
    if(strcmp(p->number, number) == 0)
    {
      p->balance+=balance;
      printf("存款成功!!!");
      printf("\n");
      return;
    }
    q = p;
    p = p->pNext;
  }
  printf("未找到账户");
  printf("\n");
}
void menu3()
{ 
  int i = 0;
  char fisrtName[128] = {0x00};
  char middleName[128] = {0x00};
  char lastName[128] = {0x00};
  char number[128] = {0x00};
  struct Info *pInfo = 0;
  struct Info *p = 0;
  printf("请输入firstName:");
  scanf("%s", fisrtName);
  printf("请输入middleName:");
  scanf("%s", middleName);
  printf("请输入lastName:");
  scanf("%s", lastName);
  printf("请输入account(6位数字):");
  scanf("%s", number);
  if(strlen(number) != 6)
  {
    printf("账户必须是6位数字!!!");
    printf("\n");
    return;
  }
  for(i = 0; i < 6; i++)
  {
    if(number[i] >= '0' && number[i] <= '9')
    {
      ;
    }else{
      printf("账户必须是6位数字!!!");
      printf("\n");
      return;
    }
  }
  pInfo = (struct Info*)malloc(sizeof(struct Info));
  memset(pInfo, 0x00, sizeof(struct Info));
  memcpy(pInfo->firstName, fisrtName, strlen(fisrtName)+1);
  memcpy(pInfo->middleName, middleName, strlen(middleName)+1);
  memcpy(pInfo->lastName, lastName, strlen(lastName)+1);
  memcpy(pInfo->number, number, strlen(number)+1);
  pInfo->balance = 0;
  pInfo->pNext = 0;
  if(pAccountHead == 0)
  {
    pAccountHead = pInfo;
    return;
  }
  p = pAccountHead;
  do
  {
    if(p->pNext == 0)
    {
      p->pNext = pInfo;
      return;
    }
    p = p->pNext;
  }while(1);
}
void menu4()
{
  int i = 0;
  char number[128] = {0x00};
  struct Info *q = 0;
  struct Info *p = 0;
  printf("请输入账户(6位数字):");
  scanf("%s", number);
  if(strlen(number) != 6)
  {
    printf("账户必须是6位数字!!!");
    printf("\n");
    return;
  }
  for(i = 0; i < 6; i++)
  {
    if(number[i] >= '0' && number[i] <= '9')
    {
      ;
    }else{
      printf("账户必须是6位数字!!!");
      printf("\n");
      return;
    }
  }
  q = 0;
  p = pAccountHead;
  while(p != 0)
  {
    if(strcmp(p->number, number) == 0)
    {
      if(q == 0)
      {
        pAccountHead = p->pNext;;
        free(p);
      }else{
        q->pNext = p->pNext;
        free(p);
      }
      printf("删除账户%s成功!!!", number);
      printf("\n");
    }
    q = p;
    p = p->pNext;
  }
}
void menu5()
{
  int i = 0;
  char number[128] = {0x00};
  struct Info *q = 0;
  struct Info *p = 0;
  printf("请输入账户(6位数字):");
  scanf("%s", number);
  if(strlen(number) != 6)
  {
    printf("账户必须是6位数字!!!");
    printf("\n");
    return;
  }
  for(i = 0; i < 6; i++)
  {
    if(number[i] >= '0' && number[i] <= '9')
    {
      ;
    }else{
      printf("账户必须是6位数字!!!");
      printf("\n");
      return;
    }
  }
  q = 0;
  p = pAccountHead;
  while(p != 0)
  {
    if(strcmp(p->number, number) == 0)
    {
      printf("firstName:%s middleName:%s lastName:%s account:%s balance:%d ", p->firstName, p->middleName, p->lastName, p->number, p->balance);
      printf("\n");
      return;
    }
    q = p;
    p = p->pNext;
  }
  printf("查询账户%s失败!!!", number);
  printf("\n");
}
void menu6()
{
  struct Info *p = pAccountHead;
  if(p == 0)
  {
    printf("没有账户信息");
    printf("\n");
    return;
  }
  do{
      printf("firstName:%s middleName:%s lastName:%s account:%s balance:%d ", p->firstName, p->middleName, p->lastName, p->number, p->balance);
    printf("\n");
    p = p->pNext;
  }while(p != NULL);
}
void main(int argc, char *argv[])
{
  loadInfo();
  while(1)
  {
    switch(showMenu())
    {
      case 0:
        return;
      case 1:
        menu1();
        break;
      case 2:
        menu2();
        break;
      case 3:
        menu3();
        break;
      case 4:
        menu4();
        break;
      case 5:
        menu5();
        break;
      case 6:
        menu6();
        break;
      default:
        ;
    }
    saveInfo();
  }
}


相关文章
|
10月前
|
传感器 人工智能 监控
智慧工地 AI 算法方案
智慧工地AI算法方案通过集成多种AI算法,实现对工地现场的全方位安全监控、精准质量检测和智能进度管理。该方案涵盖平台层、展现层与应用层、基础层,利用AI技术提升工地管理的效率和安全性,减少人工巡检成本,提高施工质量和进度管理的准确性。方案具备算法精准高效、系统集成度高、可扩展性强和成本效益显著等优势,适用于人员安全管理、施工质量监控和施工进度管理等多个场景。
460 0
|
自然语言处理 开发者 异构计算
社区供稿 | Llama3-8B中文版!OpenBuddy发布新一代开源中文跨语言模型
此次发布的是在3天时间内,我们对Llama3-8B模型进行首次中文跨语言训练尝试的结果:OpenBuddy-Llama3-8B-v21.1-8k。
|
机器学习/深度学习 人工智能 并行计算
GPU
GPU
328 1
|
6月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
267 0
|
12月前
|
Java 开发者 Spring
Bean生命周期介绍
Spring Boot 的 Bean 生命周期管理是其核心功能之一,负责应用程序中 Java 对象(称为 Beans)的创建、配置、初始化和销毁。此功能提供了灵活的依赖注入方式,便于组件化开发。Bean 生命周期包括实例化、属性注入、初始化方法调用、使用及销毁方法调用等阶段。应用场景涵盖依赖注入、配置管理、组件扩展及切面编程。通过实现特定接口或注解,开发者可轻松管理对象生命周期,优化应用性能。示例代码展示了如何通过日志观察 Bean 生命周期的不同阶段。
389 3
|
12月前
|
传感器 监控 物联网
无线传感器网络的基本架构及其广泛应用
无线传感器网络的基本架构及其广泛应用
949 1
|
Unix Linux 开发工具
linux笔记 diff及patch的制作与使用
这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。
381 2
linux笔记 diff及patch的制作与使用
|
数据采集 机器学习/深度学习 数据挖掘
R语言数据清洗:高效处理缺失值与重复数据的策略
【8月更文挑战第29天】处理缺失值和重复数据是数据清洗中的基础而重要的步骤。在R语言中,我们拥有多种工具和方法来有效地应对这些问题。通过识别、删除或插补缺失值,以及删除重复数据,我们可以提高数据集的质量和可靠性,为后续的数据分析和建模工作打下坚实的基础。 需要注意的是,处理缺失值和重复数据时,我们应根据实际情况和数据特性选择合适的方法,并在处理过程中保持谨慎,以避免引入新的偏差或错误。
|
IDE API 开发工具
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Flex容器组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Flex容器组件
315 5
|
人工智能 编解码 搜索推荐
AI绘画入门:从小白到入门,轻松玩转AI作画
随着AI技术的不断发展,AI绘画已经不再是遥不可及的梦想,它正逐渐走入大众视野,成为了一种新兴的艺术创作形式。即使没有绘画基础,你也可以通过AI工具轻松创作出精美的作品。本文将带你从小白入门,学习AI绘画的基础知识和操作技巧,让你快速体验AI绘画的乐趣。
761 0