文档章节

c语言之仓库信息管理系统

o
 osc_yf4y1952
发布于 07/01 12:16
字数 1486
阅读 56
收藏 0

精选30+云产品,助力企业轻松上云!>>>

仓库管理系统报告

一、项目背景

仓库信息管理系统:实现进库出库、展示仓库信息、支持查询功能、数据的长久保存

二、实现环境

1. WSL
2. clang version 10.0.0
   Target: x86_64-pc-linux-gnu

(c环境都能跑哦~)

三、报告正文

  1. 实现方法
    1. 数据使用文件保存
    2. 采用函数模块化编程思想
    3. 使用了必要的结构体
  2. 重要的数据结构
typedef struct{
    char name[100]; 
    int count;
}Goods;     // 物品结构体,其成员为物品名称和数量。

typedef struct{
    Goods goods[50];
    int count;
}Store;     // 仓库结构体,成员是物品类数组和目前已存进的数目
  1. 实现过程
    1. main函数
      1. 调用void Init_Store()函数,读取文件数据,初始化全局变量store及其成员
      2. 使用switch分支结构,进行每次操作选择
    2. 初始化
      1. 主控函数void Init_Store()
        1. 定义文件指针FILE *fp,只读权限
        2. 通过feof(fp)保证文件完成读取,同时更新仓库store内容
        3. 完成后关闭文件
    3. 入库
      1. 主控函数int add_to_list(char name[], int count)
        1. 调用函数int InStore(char name[]),查找该物品是否已经存在
        2. 若已存在(即返回值不是FALSE),调用函数int increase_count(char name[], int count, int pos);更新store变量和data.txt数据存储文件
        3. 若不存在(即返回值为具体下标),调用函数int add_to_list(char name[], int count);更新store变量和data.txt数据存储文件
      2. int increase_count(char name[], int count, int pos)
        1. 说明该物品在仓库中已存在,通过下标修改物品数量
      3. int add_to_list(char name[], int count)
        1. 判断仓库是否已满(store.count > 50 ?)
        2. 判断存储物品的名称是否合法(strlen(name) > 100 ?)
        3. 若合法,则将物品添加到store.goods数组末尾;若不合法,则添加失败
    4. 出库
      1. 主控函数int delete_goods(char namep[], int count)
        1. 调用函数int InStore(char name[]),查找仓库中是否有该物品;若不存在则报错
        2. 获取到物品目前数量,与需取出相比较
          1. 物品数量不足,取出失败
          2. 数量恰好,调用函数int delete_from_list(char name[], int pos)
          3. 数量大于需求,调用函数int decrease_count(char name[], int count, int pos)
        3. 取出完成,更新store变量和data.txt数据存储文件
      2. int delete_from_list(char name[], int pos)
        1. 判断要删除的位置是否在数组末尾
        2. 若不是,则删除目前位置内容;并将该位置之后的内容依次向前挪一个单元
        3. 将数组末尾初始化置为0;store.count --
      3. int decrease_count(char name[], int count, int pos)
        1. 通过下标修改物品数量
    5. 查找
      1. 遍历仓库void show_goods()
      2. 查找物品Goods find_goods(char name[])
        1. 调用函数int InStore(char name[])
        2. 若未找到,则返回一个空goods;若找到,则返回变量内容
    6. 辅助函数
      1. int InStore(char name[])遍历函数
        1. 查找store中是否有name
        2. 若有,则返回对应下标;若无,则返回FALSE
      2. void Write_tofile()更新文件函数
        1. 只写方式打开data.txt
        2. store.goods[]写入,并控制写入格式
  2. 测试
    1. 数据正常读入,正常写入。
    2. 程序功能完整。



  3. 总结
    就简单的写写 ... 题目中也没要求太多 ...
    UI使用qt或者MFC都是不错的选择 ...
    或者使用一些宏渲染一下颜色什么的都是可以的 ...
    然后也没有进行异常处理 ... 只进行了警告和函数控制 ...
    对于程序消耗,struct Store是起控制作用的结构体,完全可以用指针来代替定长数组 ... and so on
    就这样吧 ...





  4. 源码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE -1

typedef struct{
      char name[100];
      int count;
}Goods; 

typedef struct{
      Goods goods[50];
      int count;
}Store;

Store store;

void Init_Store()
{
      printf("Init Start ...\n");
      FILE *fp;
      fp = fopen("data.txt","r");
      if(fp == NULL) {
            printf("No such file !\n");
            exit(0);
      }
      while(1) {
            if(feof(fp)) break;
            fscanf(fp, "%s%d", store.goods[store.count].name, &store.goods[store.count].count);
            store.count++;
      }
      fclose(fp);
      printf("Init Finished !\n");
      printf("There are %d kinds of items.\n", store.count);
}

int InStore(char name[])
{
      int i = 0;
      for(;i < store.count; ++ i){
            if(strcmp(name, store.goods[i].name) == 0)
                  return i;
      }
      return FALSE;
}

void Write_tofile()
{
      FILE *fp = NULL;
      fp = fopen("data.txt","w");
      int i = 0;
      while(i < store.count) {
            fprintf(fp, "%s %d", store.goods[i].name, store.goods[i].count);
	    if(i != store.count-1) {
		fprintf(fp, "\n");
	    }
	    i++;
      }
      fclose(fp);
}

int increase_count(char name[], int count, int pos)
{
      store.goods[pos].count += count;
      printf("The items already exist and have increased %d.\nNow the count is : %d.\n", count, store.goods[pos].count);
      return TRUE;
}

int add_to_list(char name[], int count)
{
      if(store.count > 50) {
            printf("No more space for this goods ! Can't be stocked !\n");
            return FALSE;
      }
      if(strlen(name) > 100) {
            printf("Name's length over 100! Can't be stocked !\n");
            return FALSE;
      }
      strcpy(store.goods[store.count].name, name);
      store.goods[store.count].count = count;
      printf("Stock successfully !\nNow the count is : %d.\n", store.goods[store.count].count);
      store.count ++;
      return TRUE;
}

int add_goods(char name[], int count)
{
      int instore = InStore(name);
      if(instore != FALSE) {
            increase_count(name, count, instore);
            Write_tofile();
            return TRUE;
      }
      add_to_list(name, count);
      Write_tofile();
      return 0;
}

int decrease_count(char name[], int count, int pos)
{
      store.goods[pos].count -= count;
      printf("%d out of stock.\nNow the count is : %d.\n", count, store.goods[pos].count);
      return TRUE;
}

int delete_from_list(char name[], int pos)
{
      if(pos != store.count-1) {
            for(;pos < store.count-1;) {
                  strcpy(store.goods[pos].name, store.goods[pos+1].name);
                  store.goods[pos].count = store.goods[pos+1].count;
		  pos ++;
            }
      }
      store.goods[pos].name[0] = '\0';
      store.goods[pos].count = 0;
      store.count --;
      printf("Out of stock and delete from list.\n");
      return TRUE;
}

int delete_goods(char name[], int count)
{
      int instore = InStore(name);
      if(instore == FALSE) {
            printf("There is no such goods ! Can't out of the stock !\n");
            return FALSE;
      }
      int goods_count = store.goods[instore].count;
      if(goods_count < count) {
            printf("The %s goods isn't enough !\nNow the count is : %d.\n", name, goods_count);
            return FALSE;
      } else if(goods_count == count) {
            delete_from_list(name, instore);		
      } else if(goods_count > count) {
            decrease_count(name, count, instore);
      }
      Write_tofile();
      return TRUE;
}

void show_goods()
{
      int i = 0;
      printf("show goods : \n");
      for(;i < store.count;i ++) {
            printf("%s : %d\n",store.goods[i].name, store.goods[i].count);
      }
}

Goods find_goods(char name[])
{
      int instore = InStore(name);
      if(instore == FALSE) {
            printf("Can't find such goods!\n");
            Goods goods;
            goods.count = 0;
            goods.name[0] = '\0';
            return goods;
      }
      return store.goods[instore];
}

int main()
{
      Init_Store();
	
      printf("		---- list ----		\n");
      printf("	1: add goods	2: delete goods\n");
      printf("	3: list goods	4: find goods\n");
      printf("		-- 0: exit  --		\n");
	
      int choice = 1;
      while(choice!=0) {
            printf("Enter your choice : ");
	    scanf("%d",&choice);
	    switch(choice) {
                  case 1:{
                        char str[100];
			int count;
			printf("Input goods and count to add : ");
			scanf("%s%d", str, &count);
			add_goods(str, count);
			break;
                  }
                  case 2:{
                        char str[100];
			int count;
			printf("Input goods and count to delete : ");
			scanf("%s%d", str, &count);
			delete_goods(str, count);
			break;
                  }
                  case 3:{
                        show_goods();
			break;
                  }
                  case 4:{
			char str[100];
			printf("Input goods name to find : ");
			scanf("%s",str);
			Goods temp = find_goods(str);
			printf("The goods : %s %d\n", temp.name, temp.count);
			break;
                  }
                  default:{
                        printf("Please enter correct choice!\n");
                        break;
                  }
            }
      }
      return 0;
}
o
粉丝 0
博文 53
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

DateTime2与SQL Server中的DateTime - DateTime2 vs DateTime in SQL Server

问题: Which one: 哪一个: datetime datetime2 is the recommended way to store date and time in SQL Server 2008+? 是在SQL Server 2008+中存储日期和时间的推荐方法吗? I'm aware of......

富含淀粉
今天
13
0
Linux 文件打开过多 (Too many open files)

如图是程序运行了一段时间后抛出来的一个bug, 刚开始看这个bug的时候各种网上找答案, 无外乎教你怎么改ulimit(就是linux最大打开文件数), 当然不是说改这个没有用, 作为程序开发者来说, 如果...

onedotdot
今天
25
0
ZStack实践汇|ZStack与行云管家对接实践ZStack与行云管家对接实践

一、ZStack与行云管家概述 大道至简·极速部署,ZStack致力于产品化私有云和混合云。 ZStack是一家坚持自主创新、专注产品化的云计算公司,以“降低企业上云门槛、让每一家企业都拥有自己的云...

ZStack社区版
今天
7
0
switch linux mint 20 apt repository to tsinghua' mirrors

edit file /etc/apt/sources.list.d/cat official-package-repositories.list lwk@qwfys:/etc/apt/sources.list.d$ lltotal 12drwxr-xr-x 2 root root 4096 Jul 5 20:01 ./drwxr-xr-x 7 ......

qwfys
今天
12
0
面试系列之C++的对象布局【建议收藏】

我们都知道C++多态是通过虚函数表来实现的,那具体是什么样的大家清楚吗?开篇依旧提出来几个问题: 普通类对象是什么布局? 带虚函数的类对象是什么布局? 单继承下不含有覆盖函数的类对象是...

伊牙牙嘿哈哈
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部