【计导作业】——商品记录

题目

问题描述:有一家商店,为了查看店里有些什么商品、数量有多少以及每件商品的价格如何,需要编制一份商品目录。每种商品都包括4种属性:商品ID、商品名、数量与价格。商品ID为0—99之间的整数,每种商品的ID号互不相同,所以这里默认只有100种商品;商品名只包含大小写字母与空格,长度不超过35个字符;商品数量的范围是0—99999;商品的价格为一个非负的浮点数。

你要帮助商店设计一个二进制文件,存储该商店的所有商品情况。下表为该商店商品清单的样例。


记录号(商品ID)


商品名


数量


价格


5


Lamp


23


5.99


8


Screwdriver


9


7.99


10


Hammer


10


12.00


13


Bicycle


5


100.99


16


Optical mouse


21


11.50


25


keyboard


32


59.99

要求:

1.设计一个结构,来表示一件商品。

2.创建名为“commodity.dat”的二进制文件,存储该商店商品信息,初始化为100条空记录,用商品ID作为记录号。

3.实现对“commodity.dat”中商品信息的初始化录入。

4.实现对“commodity.dat”中商品信息的更新,其中记录号不可以更新,其他三项信息均可更新。

5.实现对“commodity.dat”中商品信息的删除。

6.实现对“commodity.dat”中商品信息的输出。

7.上述2~6项中对文件的初始化、记录的删除和更新、文件信息的输出这些功能,都分别定义成单独的函数。

 

程序运行效果:

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]1

100条空记录创建完毕

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]2

请输入商品信息[记录号为-1代表输入结束]:

商品ID:5

商品名:Lamp

数量:23

价格:5.99

请输入商品信息[记录号为-1代表输入结束]:

商品ID: 8

商品名:Screwdriver

数量:9

价格:7.99

请输入商品信息[记录号为-1代表输入结束]:

商品ID: 10

商品名:Hammer

数量:10

价格:12.00

请输入商品信息[记录号为-1代表输入结束]:

-1

商品信息如下:

记录号(商品ID) 商品名       数量 价格

5                 Lamp       23 5.99

8                 Screwdriver    9 7.99

10               Hammer       10 12.00

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]3

请输入待更新商品ID:

8

原商品信息如下:

记录号(商品ID) 商品名         数量 价格

8                 Screwdriver     9     7.99

请输入更新信息[如某项不更新请直接按回车键]:

商品名:

数量:7

价格:9.99

更新后商品信息如下:

记录号(商品ID) 商品名         数量 价格

8                 Screwdriver     7     9.99

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]5

商品信息如下:

记录号(商品ID) 商品名         数量 价格

5                 Lamp         23     5.99

8                 Screwdriver     7     9.99

10               Hammer         10     12.00

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]3

请输入待更新商品ID:

90

对不起,不存在该商品,无法进行更新操作

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]4

请输入待删除商品ID:

8

删除成功

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]5

商品信息如下:

记录号(商品ID) 商品名         数量 价格

5                 Lamp         23     5.99

10               Hammer         10     12.00

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

[选择]4

请输入待删除商品ID:

8

对不起,不存在该商品,无法进行删除操作

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

1

100条空记录创建完毕

请输入您的选择:

1--创建一个100条空记录的文件

2--输入商品记录

3--更新商品记录

4--删除商品记录

5--输出商品记录

2

请输入商品信息[记录号为-1代表输入结束]:

记录号:5

商品名:Lamp

数量:23

价格:5.99

请输入商品信息[记录号为-1代表输入结束]:

记录号:8

商品名:Screwdriver

数量:9

价格:7.99

请输入商品信息[记录号为-1代表输入结束]:

记录号:10

商品名:Hammer

数量:10

价格:12.00

请输入商品信息[记录号为-1代表输入结束]:

-1

代码

#include<stdio.h>
#include<string.h>
typedef struct Commodity
{
    int id;
    char name[40];
    int num;
    double price;
} cd;

cd a[105];

void init(FILE *f)
{
    int i;
    rewind(f);
    for(i=1; i<=100; i++)
        a[i].id=i;
    fwrite(a, sizeof(cd), 100 , f);
    printf("100条空记录创建完毕\n");
}

void add()
{
    int i,id[105],cnt=0;
    while(1)
    {
        printf("请输入商品信息[记录号为-1代表输入结束]:\n");
        printf("商品ID:");
        scanf("%d",&id[++cnt]);
        if(id[cnt]==-1)break;
        printf("商品名:");
        scanf("%s",&a[id[cnt]].name);
              printf("数量:");
              scanf("%d",&a[id[cnt]].num);
              printf("价格:");
              scanf("%lf",&a[id[cnt]].price);
    }
    printf("商品信息如下:\n");
    printf("记录号(商品ID)\t\t商品名\t\t数量\t\t价格\n");
    for(i=1; i<cnt; i++)
        printf("%-16d\t\t%-6s\t\t%-4d\t\t%-4lf\n",
               id[i],a[id[i]].name,a[id[i]].num,a[id[i]].price);
}

void update(FILE *f)
{
    int id;
    while(1){
        printf("请输入待更新商品ID:\n");
        scanf("%d",&id);
        if(id==-1)break;
        if(strlen(a[id].name)==0)
            printf("对不起,不存在该商品,无法进行更新操作\n");
        else
        {
            fseek(f,(id-1)*sizeof(cd),SEEK_SET);
            fwrite(a,sizeof(cd),1,f);
            printf("更新%d成功\n",id);
        }
    }
}

void delete(FILE *f){
    int id;
    rewind(f);
    while(1){
        printf("请输入待删除商品ID:\n");
        scanf("%d",&id);
        if(id==-1)break;
        if(strlen(a[id].name)==0)
            printf("对不起,不存在该商品,无法进行更新操作\n");
        else
        {
            memset(a[id].name,0,sizeof(a[id].name));
            a[id].num=0;
            a[id].price=0;
            fseek(f,(id-1)*sizeof(cd),SEEK_SET);
            fwrite(a,sizeof(cd),1,f);
            printf("删除%d成功\n",id);
        }
    }
}
void output(){
    int i;
    printf("商品信息如下:\n");
    printf("记录号(商品ID)\t\t商品名\t\t数量\t\t价格\n");
    for(i=1; i<=100; i++){
        if(strlen(a[i].name)!=0)
        {
            printf("%-16d\t\t%-6s\t\t%-4d\t\t%-4lf\n",
               i,a[i].name,a[i].num,a[i].price);
        }
    }
}
int main()
{
    FILE *f=fopen("commodity.dat","rb+");//读写,不清空,覆盖写。
    while(1){
        int i;
        printf("请输入您的选择:\n");
        printf("1--创建一个100条空记录的文件\n2--输入商品记录\n3--更新商品记录\n4--删除商品记录\n5--输出商品记录\n");
        printf("[选择]");
        scanf("%d",&i);
        if(i==1)init(f);
        else if(i==2)add();
        else if(i==3)update(f);
        else if (i==4)delete(f);
        else if(i==5)output();
        getchar();
        printf("\n");
    }
    fclose(f);
    return 0;
}

还是,欢迎同学们找出bug

时间: 2024-12-08 23:31:05

【计导作业】——商品记录的相关文章

【计导作业】链表——差集与交集

题目 问题描述:已知有两个递增的正整数序列A和B,序列中元素个数未知,同一序列中不会有重复元素出现,有可能某个序列为空.你的任务是求这两个序列的差集A-B与交集A+B.A-B就是仅由在A中出现而不在B中出现的元素所构成的集合,设为C1:A+B就是既在A中出现也在B中出现的元素所构成的集合,设为C2. 要求: 建立四个单链表,分别为A.B.C1.C2,并使用A.B这两个链表存储两个正整数序列,然后将集合A-B中的元素存储在链表C1中,将集合A+B中的元素存储在链表C2中.正整数序列的输入是按照递增

Cookie小案例-----记住浏览过的商品记录

Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中很常见.这里处理请求和页面显示都是由servlet实现,主要是为了体现cookie的作用, 实现功能如下: 1,点击购买的商品后,显示到另一页面 2,记住用户浏览过的商品,并在页面时中显示 3,当浏览过的数量超过最大值限度时,最下面一个商品被挤下去 4,当浏览过的商品本身就在浏览记录中,显示列表将其从中间移到最上面 显示一打开网站的样子和显示用户的浏览记录: package cn.itcast.cookie; im

java cookie记录最近浏览商品记录(取最新的五个浏览记录)

//商品浏览详细信息记录商品id,存到cookie中 package com.kt.servlet_qt; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.servlet.ServletException; im

第一次个人作业工作记录

作业要求: 1.    对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等)统计字符数.单词数.行数.词频,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件. 2.    使用性能测试工具进行分析,找到性能的瓶颈并改进 3.    对代码进行质量分析,消除所有警告 http://msdn.microsoft.com/en-us/library/dd264897.aspx 4.    设计10个测试样例用于

计蒜客学习记录

#include<iostream> #include<cstdio> using namespace std; int str_len(char *str); int main() { char *str = new char[100]; //定义一个指针str,指向一个长度100的char数组 cin>>str; cout<<str_len(str); delete str; return 0; } int str_len(char *str) { in

silverlight使用小计(先做记录后续整理)

1.Grid: a.通过获取指定行的高度和指定列的宽度来获取指定单元格的宽高 b.几种宽高默认值: 宽高(Width/Heigth):1* 最大宽高(MaxWidth/MaxHeigth):正无穷大 最小宽高(MinWidth/MinHeight):0 计算宽高(ActualWidth/ActualHeight):页面显示的宽高 c.动态添加某一单元格的控件 border.SetValue(Grid.RowProperty, i); border.SetValue(Grid.ColumnProp

计导实验报告 丼字走三关(人人对战)

#include<stdio.h>#include<string.h>void initialize(char a[3][3]);void print(char a[3][3]);int judge(char a[3][3]);void Input1P(char a[3][3]);void Input2P(char a[3][3]);int main(void){ char a[3][3]; initialize(a); int count=1; print(a); while(j

软工第一次作业 进度记录三 简单的性能分析

到了今天,编码工作已经基本完成.除了非文本文件的字符.单词计数仍然和标准答案不一样以外,文本文件计数都是正确的,而且效率较高.非文本文件的读取大概无解了,不打算修改了. 对于助教给出的样例,visual studio生成的Release版本exe能在30s内完成,linux下经过少许修改生成的可执行文件大约20s完成. 在visual studio上进行了一个简单的性能测试.分析如下: 1. fclose函数占用非独占时间最多,几近20%,但占用独占时间少.说明文件操作依然较慢,尤其是测试集中小

2020.1.3计导全面复习

//用宏定义替换文本 #include<iostream> #include<cstdio> #define p(m,n) printf("Hi,"#m"!\n""...And "#n"~\n") int main(){ p(John,Amy); } //条件编译 #include<iostream> #include<cstdio> #ifdef WIN32 #define P