做一个编程题
老大给我们新人出了个题,记录一下自己写的结构混乱的代码= =
题目说明:
文本文件中有N条书本的记录,每条记录的格式为:“类型编号TABLE类内序列号TABLE书名TABLE条形码”。
其中“类型编号”的范围是1~255;“类内序列号”的范围1~999;“书名”长度小于64字节;“条形码”长度18字节,其中前4字节固定为"ISBN",后14字节为数字。请用C语言或JAVA编写程序处理文件中的书本记录:
1、交付C语言或JAVA源代码和编译后的demo。
2、执行方式: "./demo books.txt books_sort.txt"。其中books.txt文本文件存有书本记录,作为程序的输入;books_sort.txt作为输出文件,保存排序后的结果。
3、算法要求:
3.1 按“类型编号”由小到大的顺序排序;
3.2 “类型编号”相同的记录,按“类内序列号”由大到小排序。
3.3 如果文件中有不符合范围要求的书本记录,请将其提取出来排放在已经排好序的正确记录的最后面。
4、示例和开发测试数据:在Sample文件夹中有10条,50条,150条和错误数据四种测试数据及其对应的结果。
我的代码如下:
#include <stdio.h> #include <stdlib.h> typedef struct book_list { int type_number; int serial_number; char name[100]; char bar_code[50]; }Book; Book book[200]; int main() { FILE *fs,*fd; if((fs=fopen("D:\\books.txt","r"))==NULL) //读取书本记录 { printf("open file error\n"); exit(0); } int i=0; char str[100]; for(i = 0; i >= 0; i++) { fscanf(fs, "%d", &book[i].type_number); //读类型编号 fscanf(fs, "%d", &book[i].serial_number); //读类内序列号 fscanf(fs, "%[^\n]%*c", str); //读剩下的字符串 if(feof(fs)) { break; } char* p1 = strtok(str, "\t\n"); //用Tab分割字符串 char* p2 = strtok(NULL, "\t\n"); strcpy(book[i].name, p1); strcpy(book[i].bar_code, p2); printf("%d %d %s %s \n",book[i].type_number, book[i].serial_number, book[i].name, book[i].bar_code); } /*这里不明白为什么用下面的方法读取150条记录出错 while(!feof(fs)) { fscanf(fs,"%d %d %s %s\n",&book[i].type_number, &book[i].serial_number, book[i].name, book[i].bar_code); printf("%d %d %s %s \n",book[i].type_number, book[i].serial_number, book[i].name, book[i].bar_code ); i++; }*/ int n=i,s=i; Book src; Book t[200]; int j; printf("\n"); for(i=0;i<n;i++) { char str1[4]; char str2[14]; strncpy(str1, book[i].bar_code, 4); strncpy(str2, book[n-1].bar_code , 4); if (book[i].type_number < 1 || book[i].type_number >255 || book[i].serial_number < 1 || book[i].serial_number > 999 || strlen(book[i].name) > 32 ||strlen(book[i].bar_code) >18 ||strcmp(str1, "ISBN")) //不符合范围要求的书本记录 { if (book[n-1].type_number < 1 || book[n-1].type_number >255 || book[n-1].serial_number < 1 || book[n-1].serial_number > 999 || strlen(book[n-1].name) > 32 ||strlen(book[n-1].bar_code) >18||strcmp(str2, "ISBN") ) { n--; i--; } else { src = book[n-1]; book[n-1] = book[i]; book[i] = src; n--; } } } for(i = 0; i < n-1 ; i++) { for (j = 0;j < n-i-1;j++) { if(book[j].type_number == book[j+1].type_number)//类型编号相同,按“类内序列号”由大到小排序。 { int a,b; for( a = 0; a < n ; a++) { for ( b = 0;b < n-b;b++) { if(book[b].serial_number < book[b+1].serial_number) { t[b] = book[b]; book[b] = book[b+1]; book[b+1] = t[b]; } } } } } } for(i = 0; i < n-1 ; i++) { for (j = 0;j < n-i-1;j++) { if(book[j].type_number > book[j+1].type_number) //按“类型编号”由小到大的顺序排序; { t[j] = book[j]; book[j] = book[j+1]; book[j+1] = t[j]; } } } printf("\n"); if((fd=fopen("D:\\books_sort.txt","w"))==NULL) { printf("cannot open des file\n"); exit(0); } for(i = 0; i <s;i++) //输出排序后的书本记录到txt { printf("%d %d %s %s\n",book[i].type_number, book[i].serial_number, book[i].name, book[i].bar_code); fprintf(fd,"%d %d %s %s\n",book[i].type_number, book[i].serial_number, book[i].name, book[i].bar_code); } fclose(fs); fclose(fd); }