c语言问题 高分求助 函数sortdat 是学生编写的 题目是有100个销售记录 是结构体 其中名称mc 单价dj数量sl

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

#define MAX 100
typedef struct {
char dm[5] ; /* 产品代码 */
char mc[11] ; /* 产品名称 */
int dj ; /* 单价 */
int sl ; /* 数量 */
long je ; /* 金额 */
} PRO ;
PRO sell[MAX] ;
void ReadDat() ;
void WriteDat() ;

void SortDat()
{
int i, j, len ;
PRO tmp ;

len = sizeof(tmp) ;
memset((PRO *) & tmp, 0, len) ;
for(i = 0 ; i < 100 ; i++)
for(j = i + 1 ; j < 100 ; j++) {
if(strcmp(sell[i].mc, sell[j].mc) < 0 ||
(sell[i].je > sell[j].je && strcmp(sell[i].mc, sell[j].mc) == 0)) {
memcpy((PRO *) & tmp, (PRO *) & sell[i], len) ;
memcpy((PRO *) & sell[i], (PRO *) & sell[j], len) ;
memcpy((PRO *) & sell[j], (PRO *) & tmp, len) ;
}
}
}

void main()
{
memset(sell, 0, sizeof(sell)) ;
ReadDat() ;
SortDat() ;
WriteDat() ;
}

void ReadDat()
{
FILE *fp ;
char str[80], ch[11] ;
int i ;

fp = fopen("C:\\WEXAM\\35990001\\IN.DAT", "r") ;
for(i = 0 ; i < 100 ; i++) {
fgets(str, 80, fp) ;
memcpy(sell[i].dm, str, 4) ;
memcpy(sell[i].mc, str + 4, 10) ;
memcpy(ch, str + 14, 4) ; ch[4] = 0 ;
sell[i].dj = atoi(ch) ;
memcpy(ch, str + 18, 5) ; ch[5] = 0 ;
sell[i].sl = atoi(ch) ;
sell[i].je = (long)sell[i].dj * sell[i].sl ;
}
fclose(fp) ;
}

void WriteDat()
{
FILE *fp ;
int i ;

fp = fopen("C:\\WEXAM\\35990001\\OUT.DAT", "w") ;
for(i = 0 ; i < 100 ; i++) {
fprintf(fp, "%s %s %4d %5d %10ld\n", sell[i].dm, sell[i].mc, sell[i].dj, sell[i].sl, sell[i].je) ;
}
fclose(fp) ;
}

就是sortdat这个函数中求解释 memset 和memcpy的用法
就以这个为例给我讲解下
在线等
高分回馈
我是考3级的数据库
为什么 我编写的这样的程序只有50多分 我觉得是一样的
void SortDat()
{int i,j,p;
PRO t;
for(i=0;i<MAX-1;i++)
{ p=i;
for(j=i+1;j<MAX;j++)
{if(sell[p].dj*sell[p].sl<sell[j].dj*sell[j].sl)
p=j;
else if(strcmp(sell[p].dm,sell[j].dm)<0&& (sell[p].dj*sell[p].sl==sell[j].dj*sell[j].sl) )
p=j;
if(p!=i)
{t=sell[p];
sell[p]=sell[i];
sell[i]=t;}}
}
}

第1个回答  推荐于2016-02-03
// 先按 名称(mc)降序排列,
if(strcmp(sell[i].mc, sell[j].mc) < 0 ||
//如果名称(mc)相同,再按金额(je)升序排列
(sell[i].je > sell[j].je && strcmp(sell[i].mc, sell[j].mc) == 0))

// 先按单价(dj)乘以数量(sl)(应该等于金额(je))降序
if(sell[p].dj*sell[p].sl<sell[j].dj*sell[j].sl)
p=j;
// 如果单价(dj)乘以数量(sl)(应该等于金额(je))相同,按代码(dm)降序
else if(strcmp(sell[p].dm,sell[j].dm)<0&& (sell[p].dj*sell[p].sl==sell[j].dj*sell[j].sl) )
p=j;

这个两个逻辑根本不一样,你得50不是很正常么。。。

另外,memset 和memcpy和是比较高效的函数,memset 用来初始化,memcpy用来拷贝内容。

****************************************************************************************************************
#include <string.h>
void *memset( void *buffer, int ch, size_t count );

功能: 函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。例如:
memset( the_array, '\0', sizeof(the_array) );
这是将一个数组的所以分量设置成零的很便捷的方法。
****************************************************************************************************************
#include <string.h>
void *memcpy( void *to, const void *from, size_t count );

功能:函数从from中复制count 个字符到to中,并返回to指针。 如果to 和 from 重叠,则函数行为不确定。追问

如果 不用memset 和memcpy 函数
像你那样修改 会不会是对的嘛???

追答

我没有修改代码,只是注释了一下啊!!!
【这个是标准答案】
// 先按 名称(mc)降序排列,
if(strcmp(sell[i].mc, sell[j].mc) sell[j].je && strcmp(sell[i].mc, sell[j].mc) == 0))
【这个是你的答案】
// 先按单价(dj)乘以数量(sl)(应该等于金额(je))降序
if(sell[p].dj*sell[p].sl<sell[j].dj*sell[j].sl)
p=j;
// 如果单价(dj)乘以数量(sl)(应该等于金额(je))相同,按代码(dm)降序
else if(strcmp(sell[p].dm,sell[j].dm)<0&& (sell[p].dj*sell[p].sl==sell[j].dj*sell[j].sl) )
p=j;

不知道我这样理解对不对

本回答被提问者采纳