C语言:请高手帮帮忙,问题解决后有额外分加?
下面这个程序如果把“dm”改成“mc”就能能排序,不知道为什么?
/*题目38:已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码
dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整
型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录
并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品代码从小到大进行排
列, 若产品代码相同, 则按金额从小到大进行排列. 最终排列结果仍存入结构数组sell中?
后调用函数WriteDat()把结果输出到文件OUT9.DAT中。
注意: 部分源程序存放在PROG1.C中。
请勿改动主函数main( )、读数据函数ReadDat()和输出数据函数WriteDat()的内容。*/
#include<stdio.h>
#include<mem.h>
#include<string.h>
#include<conio.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);/*读函数*/
void WriteDat(void);/*写函数*/
void SortDat(void){
int i,j;
PRO tem;
for(i = 0;i<MAX;i++){
for(j = i+1;j<MAX;j++){
if(strcmp(sell[i].mc,sell[j].mc)>0){
tem = sell[i];
sell[i] = sell[j];
sell[j] = tem;
}else if(strcmp(sell[i].mc,sell[j].mc)==0){
tem = sell[i];
sell[i] = sell[j];
sell[j] = tem;
}
}
}
}/*按代码从小到大排序*/
void main(void){
memset(sell,0,sizeof(sell));
ReadDat();
SortDat();
WriteDat();
}
void ReadDat(void){
FILE *fp;
char str[80],ch[11];
int i;
fp=fopen("IN.DAT","r");
for(i=0;i<100;i++){
fgets(str,80,fp);
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(void){
FILE *fp;
int i;
fp=fopen("OUT9.txt","w");
for(i=0;i<100;i++){
fprintf(fp,"%s %s %4d %5d %10d\
", sell[i].dm,sell[i].mc,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
}
答案:源程序经改动已经调试通过,你参考一下。请加点分哦。
你上面void ReadDat()函数中关于memcpy部分写错了,用fgets()函数字符串是带空格的,也就是说空格也要计算在内,所以如果你的文件in.dat中的数据不是严格对齐的话很容易出错。改用格式化输出函数fscanf();就一切ok了。必须要改动void ReadDat(),可以说你资料上的程序就算可以运行也不能得出正确结果。你可以试验,把程序调入win-tc或Dev-c++中运行再看结果,不要只运行它已经编译好的exe文件,那个没用。尽信书则不如无书,切记。
本题的一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过。
#include<stdio.h>
#include<string.h>
#include<conio.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);/*读函数*/
void WriteDat(void);/*写函数*/
void SortDat(void){
int i,j;
PRO tem;
for(i = 0;i<MAX-1;i++){ /* 注意这里是MAX-1 */
for(j = i+1;j<MAX;j++){
if(strcmp(sell[i].mc,sell[j].mc)>0){
tem = sell[i];
sell[i] = sell[j];
sell[j] = tem;
}else if(strcmp(sell[i].mc,sell[j].mc)==0)
if(sell[i].je>sell[j].je) /* 若产品代码相同, 则按金额从小到大进行排列 */
{tem = sell[i]; /* 你的代码在哪里?在我这里*/
sell[i] = sell[j];
sell[j] = tem;
}
}
}
}/*按代码从小到大排序*/
int main() /* 改成int main() */
{
memset(sell,0,sizeof(sell));
ReadDat();
SortDat();
WriteDat();
return 0;
}
void ReadDat()
{
FILE *fp;
int i; /* 这里和下面错的一塌糊涂 */
fp=fopen("IN.DAT","r"); /* 兄弟这是从文件中读代码,格式要求是一致的 */
for(i=0;i<MAX;i++){ /* 这段代码要这样改 */
fscanf(fp,"%s%s%d%d%*d",sell[i].dm,sell[i].mc,&sell[i].dj,&sell[i].sl);
sell[i].je=(long)sell[i].dj*sell[i].sl;}
fclose(fp);
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("OUT9.DAT","w");
for(i=0;i<MAX;i++){ /* 改下面的打印顺序就可以了 */
fprintf(fp,"%s %s %4d %5d %10ld\
",sell[i].mc,sell[i].dm,sell[i].dj,sell[i].sl,sell[i].je);
printf("%s %s %4d %5d %10ld\
",sell[i].mc,sell[i].dm,sell[i].dj,sell[i].sl,sell[i].je);
}
fclose(fp);
getch();
}
上一个:c语言二维数组问题,怎么输入的字母多了就出问题了
下一个:JAVA程序是基于C语言和C++语言的一种新的编辑语言吗