注册 登录
编程论坛 C++教室

文件求解问题,高手来解答一下

宇智波曌 发布于 2011-07-03 12:37, 525 次点击
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 8
struct LIST//结构体
{
    char    SPM[20];
    char    FL[10];
    float    DJ;
    int    KC;
}list[N];
void tongji()//统计
{
    int i,j,k;
   
    float    all_sum=0,self_sum=0;
    printf("\n所有物品总价:\n");                                                               
    for(i=0;i<N;i++)
    {
        all_sum+=list[i].DJ*list[i].KC;
    }
        printf("all_sum=%0.2f\n",all_sum);
        printf("\n不同分类物品总价:\n");
        printf("\t生活用品    食品        学习用品    饮料\n");
    for(i=0;i<N-1;i++)
    {   
        
        for(j=i+1;j<N;j++)
        {
            k=i;
            if(strcmp(list[k].FL,list[j].FL)==0)
            {
               
                self_sum=list[k].DJ*list[k].KC+list[j].DJ*list[j].KC;
                printf("\t%-0.2f\t",self_sum);
            }
            
        }
   
    }   
}
void menu()//菜单
{
    printf("\n    ================>>>>仓库管理系统<<<<==================\n\n");
    printf("        1.实现查询和显示功能:\n");
    printf("        2.实现排序功能:\n");
    printf("        3.统计仓库所有物品的总价,每种不同分类的物品\n");
    printf("        4.实现物品出仓\n");
    printf("        5.实现物品库存信息和修改功能\n");
    printf("        6.退出\n\n");
    printf("    ======================================================\n\n");      
}
void main()//主函数
{
    int i;
    char    head[300];
    FILE    *fp;
    if((fp=fopen("jsj0202_store.txt","r"))==NULL)
    {
        printf("打开文件失败,请检查路径设置\n\n");
        exit(0);
    }
    printf("\n");
    fgets(head,200,fp);
    printf("\t%s\n",head);
    for(i=0;i<N;i++)
    {
        fscanf(fp,"%s%s%f%d",list[i].SPM,list[i].FL,&list[i].DJ,&list[i].KC);
        printf("\t%-10s\t%-10s\t%-10.2f\t%-10d\n ",list[i].SPM,list[i].FL,list[i].DJ,list[i].KC);
    }
    fclose(fp);
    printf("\n");
    while(i!=6)
    {
        menu();
        printf("    ************  请选择操作序号 :  **********************\n");
        scanf("%d",&i);
        switch(i)
        {
            case 1:
                printf("实现查询和显示功能:\n");
                                break;
            case 2:
                printf("实现排序功能:\n");
                                break;
            case 3:
                printf("统计仓库所有物品的总价,每种不同分类的物品\n");
                tongji();
                break;
            case 4:
                printf("实现物品出仓\n");
                //chuku();
                break;
            case 5:
                printf("实现物品库存信息和修改功能\n");
                break;
            case 6:
                printf("退出\n");
                break;
        }
    }

}商品名            分类                 单价               库存数量
雀巢咖啡          饮料                 10.00              100
康师傅方便面      食品                 3.50               100
统一矿泉水        饮料                 1.00               1000
红叶台灯          学习用品             15.00              20
江明饼干          食品                 2.30               20
作业本            学习用品             1.00               185
光明酸奶          饮料                 6.00               100
富光杯            生活用品             7.00               50
我想把不同分类的物品总价求出来,我的tongji()函数怎么修改?
9 回复
#2
玩出来的代码2011-07-03 12:45
单价*个数不就行了。。
#3
宇智波曌2011-07-03 13:19
回复 2楼 玩出来的代码
能说具体点吗
#4
玩出来的代码2011-07-03 16:53
LZ写的C程序发到了C++版,不知道你知不知道C++的容器。了解容器的话很简单。
程序代码:

map<string,int> smap;
        for(int i=0;i<N;i++)
        {
            smap[list[i].FL]+=list[i].DJ*list[i].KC;
        }


若不知道容器,那可以如下、
[/code]
char *goods[]={"生活用品","食品","学习用品","饮料"};
        float counts[4]={0};
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<N;j++)
            {
                if(strcmp(list[j].FL,goods[i])==0)
                    counts[i]+=list[j].DJ*list[j].KC;
            }
        }
[/code]
#5
宇智波曌2011-07-03 17:27
回复 4楼 玩出来的代码
怎么创建一个文本文件来保存这些数据呢
#6
宇智波曌2011-07-03 18:51
回复 4楼 玩出来的代码
char *goods[]这是什么意思,数组不是这样吗:char goods[]为什么要加 *goods
#7
玩出来的代码2011-07-03 20:30
怎么创建文本同样是用fopen,自己查下资料。char *goods[];这个表示指针数组,。也就是goods数组中存放的是指针。
#8
宇智波曌2011-07-04 01:11
回复 7楼 玩出来的代码
嗯,明白了!谢谢了!
你知道怎么修改文本文件的内容吗?
比如:
商品名            分类                 单价               库存数量
雀巢咖啡          饮料                 10.00              100
康师傅方便面      食品                 3.50               100
统一矿泉水        饮料                 1.00               1000
红叶台灯          学习用品             15.00              20
江明饼干          食品                 2.30               20
作业本            学习用品             1.00               185
光明酸奶          饮料                 6.00               100
富光杯            生活用品             7.00               50

我想把作业本改成练习本
输出:
商品名            分类                 单价               库存数量
雀巢咖啡          饮料                 10.00              100
康师傅方便面      食品                 3.50               100
统一矿泉水        饮料                 1.00               1000
红叶台灯          学习用品             15.00              20
江明饼干          食品                 2.30               20
练习本           学习用品             1.00               185
光明酸奶          饮料                 6.00               100
富光杯            生活用品             7.00               50


这样怎么修改啊!麻烦你了。

[ 本帖最后由 宇智波曌 于 2011-7-4 01:20 编辑 ]
#9
JackRap2011-07-04 09:55
修改文件可以有两种方法:
1、把文件整个读出来,该改的改,不改的造写回去;
2、把文件当做二进制文件:
int fd;
fd=open("jsj0202_store.txt",O_BINARY|O_RDWR);
定位到你要改的地方,就你的例子,要改的在第7行,数过6个‘\r’。不过“练习本”和“作业本”都是6个字符,如果字数不同,就麻烦了,后面的还得全读全写。
#10
宇智波曌2011-07-04 12:54
回复 9楼 JackRap
能具体点吗?还是不明白
1