原题:现要为某一个销售部门编写一个程序管理约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);
}
}
程序可能还有一些不足之处
欢迎大家指正