现要为某一个销售部门编写一个程序管理约100种商品。要求设计一个结构体类型来描述商品,每种商品包括商品编号(如A001)、商品名称、商品销售量和商品销售额等信息,并编写以下函数···········

原题:现要为某一个销售部门编写一个程序管理约100种商品。要求设计一个结构体类型来描述商品,每种商品包括商品编号(如A001)、商品名称、商品销售量和商品销售额等信息,并编写以下函数:
1.编写一个函数输入所有商品的信息
2.编写一个函数对商品进行排序,排序规则如下:首先按照商品销售额排降序;如果商品销售额相同,则再按照商品销售量排升序
3.编写一个函数将所有商品信息保存到一个二进制文件中
4.编写一个函数读取二进制文件中的所有商品信息
5.编写一个函数search_no(char *pNo),根据商品编号(pNo)查找商品。查找规则如下:如果pNo为NULL,则表示没有指定商品编号,否则查找指定商品编号的商品并输出
6.编写一个函数search_values(double count ,double amount),根据商品数量(count)和金额(amount)来查找数量小于等于count且金额大于等于amount的商品。例如,search_values(10,2600)查找数量小于等于10,金额大于等于2600的商品,并且输出找到的所有商品
7.编写主函数调用上述函数
说明:除了这些函数之外,还可以有其他的函数。

话不多说,开工!

首先设计一个结构体类型描述商品

struct commodity{
	char GoodsNumber[10];//商品编号
	char GoodsName[21];//商品名称
	double GoodsCount;//商品数量
	double GoodsAmount;//商品金额
	int SalesNumber;//商品销售量
	int SalesVolume;//商品销售额
}goods[120];//初始化一个足够大的结构体数组

1.第一个函数:编写一个函数输入所有商品的信息

void Enter_Product_Information(struct commodity goods[],int n){
	int i;
	for(i=0;i<n;i++){//可以实现对n个商品的信息进行输入
		printf("请输入商品的编号:\n");
		scanf("%s",&goods[i].GoodsNumber);
		printf("请输入商品的名称:\n");
		scanf("%s",&goods[i].GoodsName);
		printf("请输入商品的数量:\n");
		scanf("%lf",&goods[i].GoodsCount);
		printf("请输入商品的金额:\n");
		scanf("%lf",&goods[i].GoodsAmount);
		printf("请输入商品的销售量:\n");
		scanf("%d",&goods[i].SalesNumber);
		printf("请输入商品的销售额:\n");
		scanf("%d",&goods[i].SalesVolume);
	}
}

2.编写一个函数对商品进行排序,排序规则如下:首先按照商品销售额排降序;如果商品销售额相同,则再按照商品销售量排升序

void Commodity_Ranking(struct commodity goods[],int n){
	int i,j;
	struct commodity *p[n];//定义一个指针数组
    for(i=0;i<n;i++)
    {
        p[i]=&goods[i];//使每个指针指向一个结构体数组元素 
    }
    struct commodity *temp; 
    for(i=0;i<n-1;i++)//冒泡排序 
        for(j=0;j<n-i-1;j++){
            if((p[j]->SalesVolume)<(p[j+1]->SalesVolume))
            {
                temp=p[j+1];//交换两结构体在结构体数组中的位置 
                p[j+1]=p[j];
                p[j]=temp;
            }
            if((p[j]->SalesVolume)==(p[j+1]->SalesVolume)){
            	if((p[j]->SalesNumber)>(p[j+1]->SalesNumber)){
            		temp=p[j+1];
                	p[j+1]=p[j];
                	p[j]=temp;
				}
			}
        }
    printf("商品排名:\n");
    for(i=0;i<n;i++){
    	printf("第%d名:%s\n",i+1,p[i]->GoodsName);
	}
}

3.编写一个函数将所有商品信息保存到一个二进制文件中

void Save(char *GoodsName,int n){
	FILE *fp;
	int i,k,count;
	if((fp=fopen(GoodsName,"wb"))==NULL){
		printf("cannot open file\n");
		exit(0);//需要stdlib.h头文件 
	}
	for(i=0;i<n;i++)
		if(fwrite(&goods[i],sizeof(struct commodity),1,fp)==0)
			k++;
		if(fwrite(&goods[i],sizeof(struct commodity),1,fp)!=0)
			count++;
		if(count!=0){
			printf("文件读写成功!\n");
		}
		else
			printf("文件读写失败!\n");
	fclose(fp);
}


下面是之前搞的,可以不看
void Save_to_file(struct commodity goods[],int n){
	FILE *fp;
	int i;
	int size =sizeof(struct commodity);
	fp=fopen("zq.txt","wb");
	if((fp==NULL)){
		printf("cannot create file\n");
		exit(0);//需要stdlib.h头文件 
	}
	rewind(fp);// 定位到文件开始处,为开始读取做好准备
	while(i<n&&fread(&goods[i],size,1,fp)==1){// 读取字段成功(每次循环把一个结构读到结构数组中,当数组满或文件读完时停止)
		i++;
	}
	fclose(fp);
}

4.编写一个函数读取二进制文件中的所有商品信息

void show(char *GoodsName,int n){
	int i;
	FILE *fp;
	if((fp=fopen(GoodsName,"rb"))==NULL){
		printf("cannot open file\n");
		exit(0);
	}
	for(i=0;i<n;i++){
		fread(&goods[i],sizeof(struct commodity),1,fp);
		printf("商品编号:%s\n",goods[i].GoodsNumber);
		printf("商品名称:%s\n",goods[i].GoodsName);
		printf("商品数量:%lf\n",goods[i].GoodsCount);
		printf("商品金额:%lf\n",goods[i].GoodsAmount);
		printf("商品销售量:%d\n",goods[i].SalesNumber);
		printf("商品销售额:%d\n",goods[i].SalesVolume);
		printf("\n");
	}
	fclose(fp);
}

5.编写一个函数search_no(char *pNo),根据商品编号(pNo)查找商品。查找规则如下:如果pNo为NULL,则表示没有指定商品编号,否则查找指定商品编号的商品并输出。

void search_no(char *pNo){
	int i,k=0;
	char goods_number[10];
	printf("请输入商品编号:\n");
					scanf("%s",goods_number);
					pNo=goods_number;
	for(i=0;i<=120;i++){
		if(strcmp(goods_number,goods[i].GoodsNumber)==0){
			printf("商品为%s\n",goods[i].GoodsName);
			k++;
		}
	}
	if(k==0)
			printf("没有指定商品编号!\n");
}

6.编写一个函数search_values(double count ,double amount),根据商品数量(count)和金额(amount)来查找数量小于等于count且金额大于等于amount的商品。例如,search_values(10,2600)查找数量小于等于10,金额大于等于2600的商品,并且输出找到的所有商品。

额…到这里我才发现商品还需要数量和金额这两个属性…怎么办…改吧…

void search_values(double count,double amount){
	int i;
	printf("找到的所有商品如下:\n");
	for(i=0;i<=120;i++){
		if(goods[i].GoodsCount<=count&&goods[i].GoodsAmount>=amount){
			printf("%s\n",goods[i].GoodsName);
		}
	}
} 

ok
最后一步

编写主函数调用上述函数

额…这个怎么搞
等等,我们可以自定义一个菜单函数!

void menu(){
	printf("\n\n\n\n\n");
	printf("\t\t|-----------------------菜单----------------------|\n");
	printf("\t\t|\t 0. 退出程序                              |\n");
	printf("\t\t|\t 1. 输入商品信息                          |\n");
	printf("\t\t|\t 2. 进行商品排序                          |\n");
	printf("\t\t|\t 3. 保存所有商品信息进二进制文件中        |\n");
	printf("\t\t|\t 4. 读取二进制文件中的商品信息            |\n");
	printf("\t\t|\t 5. 根据商品编号查找商品                  |\n");
	printf("\t\t|\t 6. 根据商品数量和金额查找商品            |\n");
	printf("\t\t|-------------------------------------------------|\n\n");
	printf("\t\t\t\t选择0~6"); 
}

ok 我们可以开始搞主程序了!

int main(){
	int n=0,number;
	double count,amount;
	char filename[66];
	char *p=NULL;
	menu();
	printf("\n\n------------------------输入你的选择:");
	scanf("%d",&number);
	while(number){
		switch(number){
			case 1:
				printf("请输入需要处理的商品种类数量:\n");
				scanf("%d",&n);
				Enter_Product_Information(goods,n); 
				break;
			case 2:
				if(n==0)
					printf("请先输入商品信息!\n");
				else
					Commodity_Ranking(goods,n);
				break;
			case 3:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					printf("请输入文件所在路径及名称:\n");
					scanf("%s",filename);
					Save(filename,n);
				}	
			    break;
			case 4:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					printf("请输入文件所在路径及名称:\n");
					scanf("%s",filename);
					show(filename,n);
				}	
				break;
			case 5:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					search_no(p);
				}	
				break;
			case 6:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					printf("请输入商品数量和金额的值:\n");
					scanf("%lf%lf",&count,&amount);
					search_values(count,amount);
				}
				break;
			default:break;
		}
		getch();
		menu();
		printf("\n\n------------------------输入你的选择:");
		scanf("%d",&number);
	} 
}

对了头文件不能忘了

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

ok
那么这个小程序算是做完了!

下面是完整程序

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
struct commodity{
	char GoodsNumber[10];//商品编号
	char GoodsName[21];//商品名称
	double GoodsCount;//商品数量
	double GoodsAmount;//商品金额
	int SalesNumber;//商品销售量
	int SalesVolume;//商品销售额
}goods[120];//初始化一个足够大的结构体数组

void Enter_Product_Information(struct commodity goods[],int n){
	int i;
	for(i=0;i<n;i++){//可以实现对n个商品的信息进行输入
		printf("请输入商品的编号:\n");
		scanf("%s",&goods[i].GoodsNumber);
		printf("请输入商品的名称:\n");
		scanf("%s",&goods[i].GoodsName);
		printf("请输入商品的数量:\n");
		scanf("%lf",&goods[i].GoodsCount);
		printf("请输入商品的金额:\n");
		scanf("%lf",&goods[i].GoodsAmount);
		printf("请输入商品的销售量:\n");
		scanf("%d",&goods[i].SalesNumber);
		printf("请输入商品的销售额:\n");
		scanf("%d",&goods[i].SalesVolume);
	}
}

void Commodity_Ranking(struct commodity goods[],int n){
	int i,j;
	struct commodity *p[n];//定义一个指针数组
    for(i=0;i<n;i++)
    {
        p[i]=&goods[i];//使每个指针指向一个结构体数组元素 
    }
    struct commodity *temp; 
    for(i=0;i<n-1;i++)//冒泡排序 
        for(j=0;j<n-i-1;j++){
            if((p[j]->SalesVolume)<(p[j+1]->SalesVolume))
            {
                temp=p[j+1];//交换两结构体在结构体数组中的位置 
                p[j+1]=p[j];
                p[j]=temp;
            }
            if((p[j]->SalesVolume)==(p[j+1]->SalesVolume)){
            	if((p[j]->SalesNumber)>(p[j+1]->SalesNumber)){
            		temp=p[j+1];
                	p[j+1]=p[j];
                	p[j]=temp;
				}
			}
        }
    printf("商品排名:\n");
    for(i=0;i<n;i++){
    	printf("第%d名:%s\n",i+1,p[i]->GoodsName);
	}
}

void Save(char *GoodsName,int n){
	FILE *fp;
	int i,k,count;
	if((fp=fopen(GoodsName,"wb"))==NULL){
		printf("cannot open file\n");
		exit(0);//需要stdlib.h头文件 
	}
	for(i=0;i<n;i++)
		if(fwrite(&goods[i],sizeof(struct commodity),1,fp)==0)
			k++;
		if(fwrite(&goods[i],sizeof(struct commodity),1,fp)!=0)
			count++;
		if(count!=0){
			printf("文件读写成功!\n");
		}
		else
			printf("文件读写失败!\n");
	fclose(fp);
}

void show(char *GoodsName,int n){
	int i;
	FILE *fp;
	if((fp=fopen(GoodsName,"rb"))==NULL){
		printf("cannot open file\n");
		exit(0);
	}
	for(i=0;i<n;i++){
		fread(&goods[i],sizeof(struct commodity),1,fp);
		printf("商品编号:%s\n",goods[i].GoodsNumber);
		printf("商品名称:%s\n",goods[i].GoodsName);
		printf("商品数量:%lf\n",goods[i].GoodsCount);
		printf("商品金额:%lf\n",goods[i].GoodsAmount);
		printf("商品销售量:%d\n",goods[i].SalesNumber);
		printf("商品销售额:%d\n",goods[i].SalesVolume);
		printf("\n");
	}
	fclose(fp);
}

void search_no(char *pNo){
	int i,k=0;
	char goods_number[10];
	printf("请输入商品编号:\n");
					scanf("%s",goods_number);
					pNo=goods_number;
	for(i=0;i<=120;i++){
		if(strcmp(goods_number,goods[i].GoodsNumber)==0){
			printf("商品为%s\n",goods[i].GoodsName);
			k++;
		}
	}
	if(k==0)
			printf("没有指定商品编号!\n");
}

void search_values(double count,double amount){
	int i;
	printf("找到的所有商品如下:\n");
	for(i=0;i<=120;i++){
		if(goods[i].GoodsCount<=count&&goods[i].GoodsAmount>=amount){
			printf("%s\n",goods[i].GoodsName);
		}
	}
} 

void menu(){
	printf("\n\n\n\n\n");
	printf("\t\t|-----------------------菜单----------------------|\n");
	printf("\t\t|\t 0. 退出程序                              |\n");
	printf("\t\t|\t 1. 输入商品信息                          |\n");
	printf("\t\t|\t 2. 进行商品排序                          |\n");
	printf("\t\t|\t 3. 保存所有商品信息进二进制文件中        |\n");
	printf("\t\t|\t 4. 读取二进制文件中的商品信息            |\n");
	printf("\t\t|\t 5. 根据商品编号查找商品                  |\n");
	printf("\t\t|\t 6. 根据商品数量和金额查找商品            |\n");
	printf("\t\t|-------------------------------------------------|\n\n");
	printf("\t\t\t\t选择0~6"); 
}

int main(){
	int n=0,number;
	double count,amount;
	char filename[66];
	char *p=NULL;
	menu();
	printf("\n\n------------------------输入你的选择:");
	scanf("%d",&number);
	while(number){
		switch(number){
			case 1:
				printf("请输入需要处理的商品种类数量:\n");
				scanf("%d",&n);
				Enter_Product_Information(goods,n); 
				break;
			case 2:
				if(n==0)
					printf("请先输入商品信息!\n");
				else
					Commodity_Ranking(goods,n);
				break;
			case 3:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					printf("请输入文件所在路径及名称:\n");
					scanf("%s",filename);
					Save(filename,n);
				}	
			    break;
			case 4:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					printf("请输入文件所在路径及名称:\n");
					scanf("%s",filename);
					show(filename,n);
				}	
				break;
			case 5:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					search_no(p);
				}	
				break;
			case 6:
				if(n==0)
					printf("请先输入商品信息!\n");
				else{
					printf("请输入商品数量和金额的值:\n");
					scanf("%lf%lf",&count,&amount);
					search_values(count,amount);
				}
				break;
			default:break;
		}
		getch();
		menu();
		printf("\n\n------------------------输入你的选择:");
		scanf("%d",&number);
	} 
}

程序可能还有一些不足之处
欢迎大家指正

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是实现代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_STUDENTS 100 typedef struct { char name[20]; int score; } Student; int main() { Student students[MAX_STUDENTS] = { {"Tom", 80}, {"John", 90}, {"Lily", 70}, {"Lucy", 85}, {"Bob", 95} }; int num_students = 5; int min_score, max_score; printf("请输入要查询的分数范围(用空格隔开):"); scanf("%d %d", &min_score, &max_score); Student* selected_students[MAX_STUDENTS]; int num_selected = 0; for (int i = 0; i < num_students; i++) { if (students[i].score >= min_score && students[i].score <= max_score) { selected_students[num_selected] = &students[i]; num_selected++; } } printf("分数在 %d 到 %d 之间的学生有:\n", min_score, max_score); for (int i = 0; i < num_selected; i++) { printf("%s %d\n", selected_students[i]->name, selected_students[i]->score); } return 0; } ``` 这里定义了一个 `Student` 结构体,其中包含了学生的姓名和成绩。在主函数中,我们通过结构体数组初始化了一些学生记录,无需输入。 接下来,我们让用户输入要查询的分数范围,然后遍历学生数组,将分数在指定范围内的学生记录通过结构体指针保存到 `selected_students` 数组中,并记录数量。最后,我们输出查询结果。 请注意,这里使用了一个 `selected_students` 数组来保存指针,而不是直接保存结构体。这是因为如果直接保存结构体,会产生多余的内存拷贝,而使用指针可以避免这情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值