找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: ivor

成绩单排序(多条件)挑战

[复制链接]
发表于 2020-2-24 18:53:38 | 显示全部楼层
本帖最后由 Gin_Q 于 2020-2-26 09:56 编辑
  1. //Dev-C++ 5.11
  2. //排序算法用的是选择排序
  3. //by Gin

  4. #include <time.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #define LINE_SIZE 100                //行存储大小


  9. FILE *fp(char *,const char *);
  10. int check_width(FILE *fp);
  11. int check_high(FILE *fp);

  12. int main(int argc,char *argv[])
  13. {
  14.         clock_t start_t,end_t;        //计时
  15.         double time_sum;                //储存时间
  16.         start_t=clock();                //开始计时
  17.        
  18.         FILE *a_txt=fp(argv[1],"r");
  19.         FILE *b_txt=fp(argv[2],"w");

  20.         int width=0,high=0;
  21.         width=check_width(a_txt);
  22.         high=check_high(a_txt);
  23.        
  24.         void anay(char *,char *,int linesize,int width);         //把二维素组做一维数组传递
  25.         void init(char *,int  *,int linesize,int width);                //把二维素组做一维数组传递
  26.         void sort_min_max(int *p,int high,int width,int n);                //小到大
  27.         void sort_max_min(int *p,int high,int width,int n);                //大到小
  28.         void res_print(FILE *fp,int *p,int high,int width,char *p_kemu,char *kemu,char *way,char *form,char *form_1,char *form_2);                //打印结果

  29.         char mu[LINE_SIZE]="0";                                        //储存第一行数据
  30.         char temp_1[high][width]={"0"};   //存储分割好的数据
  31.         char temp[LINE_SIZE]="0";                        //存储一行数据
  32.         int arr[high][width]={0};                         //存储最终数组
  33.         int (*p_arr)[width]=arr;
  34.         char kemu[5][7]={"0"};
  35.         char *p_kemu=kemu[0];
  36.        
  37.         char original[40]="原数据";
  38.         char min_m[7]="小到大";
  39.         char max_m[7]="大到小";
  40.         char form[8]="+-----+";
  41.         char form_1[8]="-----+";
  42.         char form_2[2]="|";
  43.         char spk[2]="\0";
  44.        
  45.         rewind(a_txt);
  46.         fgets(mu,LINE_SIZE,a_txt);
  47.         anay(mu,(char*)kemu,7,width);
  48.        
  49.         int i;
  50.         for (i=0;fgets(temp,LINE_SIZE,a_txt)!=NULL;i++)
  51.         {
  52.                 anay(temp,temp_1[0],width,width);      //将数据分割成二维字符串
  53.                 init(temp_1[0],arr[i],width,width);   //将二维字符串赋值给二维数组
  54.         }

  55.         res_print(b_txt,(int *)arr,high,width,p_kemu,spk,original,form,form_1,form_2);
  56.         fputc('\n',b_txt);
  57.        
  58.         int mark=0;                        //0代表升序,1代表降序
  59.        
  60.         for (i=0;i<width;i++)
  61.         {
  62.                 if (mark==0)
  63.                 {
  64.                         sort_min_max((int *)arr,high,width,i);
  65.                         mark=1;
  66.                         res_print(b_txt,(int *)arr,high,width,p_kemu,kemu[i],min_m,form,form_1,form_2);
  67.                 }
  68.                 else if (mark==1)
  69.                 {
  70.                         sort_max_min((int *)arr,high,width,i);
  71.                         mark=0;
  72.                         res_print(b_txt,(int *)arr,high,width,p_kemu,kemu[i],max_m,form,form_1,form_2);
  73.                 }
  74.                 if (i<(high-1)) fputs("\n",b_txt);
  75.         }
  76.         end_t=clock();
  77.         time_sum=(double)(end_t-start_t)/CLOCKS_PER_SEC;
  78.         fprintf(b_txt,"程序耗时:%f",time_sum);
  79.         fclose(a_txt);
  80.         fclose(b_txt);
  81.         return 0;
  82.        
  83.        
  84. }
  85. FILE *fp(char *p,const char *mode)
  86. {
  87.         FILE *pp;
  88.         if ((pp= fopen(p,mode))==NULL)
  89.         {
  90.                 printf("open fail! %s",p);
  91.                 getchar();
  92.                 exit (0);
  93.         }
  94.         return pp;
  95. }
  96. //检查数据
  97. int check_width(FILE *fp)
  98. {
  99.         rewind(fp);
  100.         char delims='0';
  101.         int w=1;
  102.         for (;(delims=fgetc(fp))!='\n';)
  103.         {
  104.                 if (delims==' ') w++;
  105.         }
  106.         return w;
  107. }
  108. int check_high(FILE *fp)
  109. {
  110.         rewind(fp);
  111.         int h=0;
  112.         char arr[LINE_SIZE];
  113.         for (;fgets(arr,LINE_SIZE,fp)!=NULL;h++);
  114.         return h-1;                //去掉第一行不算
  115. }
  116. void anay(char *p,char *t,int linesize, int width)
  117. {
  118.         int i,j=0,k=0;                        //j第二维,k第一维
  119.         for (i=0;*(p+i)!='\0';i++)
  120.         {
  121.                 if (*(p+i)!=' ' && *(p+i)!='\n')
  122.                 {
  123.                         *(t+j*linesize+k)=*(p+i);
  124.                         k++;
  125.                 }
  126.                 else
  127.                 {
  128.                         *(t+j*linesize+k)='\0';
  129.                         j++,k=0;
  130.                 }
  131.         }
  132. }
  133. void init(char *p,int *p1,int linesize,int width)
  134. {
  135.         int i;
  136.         for (i=0;i<width;i++)
  137.         {
  138.                 *(p1+i)=atoi(p+i*linesize);
  139.         }
  140. }
  141. void sort_min_max(int *p,int high,int width,int n)
  142. {
  143.         int i,k,l,temp=0;
  144.         for (i=0;i<high-1;i++)
  145.         {
  146.                 for (k=i+1;k<high;k++)
  147.                 {
  148.                         if (*(p+k*width+n)<*(p+i*width+n))
  149.                         {
  150.                                 for (l=0;l<width;l++)
  151.                                 {
  152.                                         temp=*(p+k*width+l);
  153.                                         *(p+k*width+l)=*(p+i*width+l);
  154.                                         *(p+i*width+l)=temp;       
  155.                                 }
  156.                          }
  157.                 }
  158.         }
  159. }
  160. void sort_max_min(int *p,int high,int width,int n)
  161. {
  162.         int i,k,l,temp=0;
  163.         for (i=0;i<high-1;i++)
  164.         {
  165.                 for (k=i+1;k<high;k++)
  166.                 {
  167.                         if (*(p+k*width+n)>*(p+i*width+n))
  168.                         {
  169.                                 for (l=0;l<width;l++)
  170.                                 {
  171.                                         temp=*(p+k*width+l);
  172.                                         *(p+k*width+l)=*(p+i*width+l);
  173.                                         *(p+i*width+l)=temp;       
  174.                                 }
  175.                          }
  176.                 }
  177.         }
  178. }
  179. void res_print(FILE *fp,int *p,int high,int width,char *p_kemu,char *kemu,char *way,char *form,char *form_1,char *form_2)
  180. {
  181.         fprintf(fp,"%s%s%s%s%s\n",form,form_1,form_1,form_1,form_1);
  182.         fprintf(fp,"%s%6s%-23s%s\n",form_2,way,kemu,form_2);
  183.         fprintf(fp,"%s%s%s%s%s\n",form,form_1,form_1,form_1,form_1);
  184.         for (int i=0;i<width;i++) fprintf(fp,"%s%-5s",form_2,(p_kemu+i*7));
  185.         fprintf(fp,"%s\n%s%s%s%s%s\n",form_2,form,form_1,form_1,form_1,form_1);
  186.         int i,j;
  187.         for (i=0;i<high;i++)
  188.         {
  189.                 for (j=0;j<width;j++)
  190.                 {
  191.                         fprintf(fp,"%s%-5d",form_2,*(p+i*width+j));
  192.                 }
  193.                 fprintf(fp,"%s\n",form_2);
  194.                 fprintf(fp,"%s%s%s%s%s",form,form_1,form_1,form_1,form_1);
  195.                 fputc('\n',fp);
  196.         }
  197. }
复制代码
结果:
  1. +-----+-----+-----+-----+-----+
  2. |原数据                       |
  3. +-----+-----+-----+-----+-----+
  4. |语文 |数学 |英语 |化学 |生物 |
  5. +-----+-----+-----+-----+-----+
  6. |79   |77   |70   |77   |67   |
  7. +-----+-----+-----+-----+-----+
  8. |64   |70   |74   |75   |72   |
  9. +-----+-----+-----+-----+-----+
  10. |79   |64   |72   |62   |76   |
  11. +-----+-----+-----+-----+-----+
  12. |62   |75   |65   |71   |63   |
  13. +-----+-----+-----+-----+-----+
  14. |79   |76   |62   |62   |77   |
  15. +-----+-----+-----+-----+-----+
  16. |66   |63   |77   |75   |79   |
  17. +-----+-----+-----+-----+-----+
  18. |74   |75   |72   |61   |61   |
  19. +-----+-----+-----+-----+-----+
  20. |71   |63   |79   |60   |70   |
  21. +-----+-----+-----+-----+-----+
  22. |74   |64   |74   |78   |69   |
  23. +-----+-----+-----+-----+-----+

  24. +-----+-----+-----+-----+-----+
  25. |小到大语文                   |
  26. +-----+-----+-----+-----+-----+
  27. |语文 |数学 |英语 |化学 |生物 |
  28. +-----+-----+-----+-----+-----+
  29. |62   |75   |65   |71   |63   |
  30. +-----+-----+-----+-----+-----+
  31. |64   |70   |74   |75   |72   |
  32. +-----+-----+-----+-----+-----+
  33. |66   |63   |77   |75   |79   |
  34. +-----+-----+-----+-----+-----+
  35. |71   |63   |79   |60   |70   |
  36. +-----+-----+-----+-----+-----+
  37. |74   |75   |72   |61   |61   |
  38. +-----+-----+-----+-----+-----+
  39. |74   |64   |74   |78   |69   |
  40. +-----+-----+-----+-----+-----+
  41. |79   |77   |70   |77   |67   |
  42. +-----+-----+-----+-----+-----+
  43. |79   |76   |62   |62   |77   |
  44. +-----+-----+-----+-----+-----+
  45. |79   |64   |72   |62   |76   |
  46. +-----+-----+-----+-----+-----+

  47. +-----+-----+-----+-----+-----+
  48. |大到小数学                   |
  49. +-----+-----+-----+-----+-----+
  50. |语文 |数学 |英语 |化学 |生物 |
  51. +-----+-----+-----+-----+-----+
  52. |79   |77   |70   |77   |67   |
  53. +-----+-----+-----+-----+-----+
  54. |79   |76   |62   |62   |77   |
  55. +-----+-----+-----+-----+-----+
  56. |62   |75   |65   |71   |63   |
  57. +-----+-----+-----+-----+-----+
  58. |74   |75   |72   |61   |61   |
  59. +-----+-----+-----+-----+-----+
  60. |64   |70   |74   |75   |72   |
  61. +-----+-----+-----+-----+-----+
  62. |74   |64   |74   |78   |69   |
  63. +-----+-----+-----+-----+-----+
  64. |79   |64   |72   |62   |76   |
  65. +-----+-----+-----+-----+-----+
  66. |71   |63   |79   |60   |70   |
  67. +-----+-----+-----+-----+-----+
  68. |66   |63   |77   |75   |79   |
  69. +-----+-----+-----+-----+-----+

  70. +-----+-----+-----+-----+-----+
  71. |小到大英语                   |
  72. +-----+-----+-----+-----+-----+
  73. |语文 |数学 |英语 |化学 |生物 |
  74. +-----+-----+-----+-----+-----+
  75. |79   |76   |62   |62   |77   |
  76. +-----+-----+-----+-----+-----+
  77. |62   |75   |65   |71   |63   |
  78. +-----+-----+-----+-----+-----+
  79. |79   |77   |70   |77   |67   |
  80. +-----+-----+-----+-----+-----+
  81. |74   |75   |72   |61   |61   |
  82. +-----+-----+-----+-----+-----+
  83. |79   |64   |72   |62   |76   |
  84. +-----+-----+-----+-----+-----+
  85. |74   |64   |74   |78   |69   |
  86. +-----+-----+-----+-----+-----+
  87. |64   |70   |74   |75   |72   |
  88. +-----+-----+-----+-----+-----+
  89. |66   |63   |77   |75   |79   |
  90. +-----+-----+-----+-----+-----+
  91. |71   |63   |79   |60   |70   |
  92. +-----+-----+-----+-----+-----+

  93. +-----+-----+-----+-----+-----+
  94. |大到小化学                   |
  95. +-----+-----+-----+-----+-----+
  96. |语文 |数学 |英语 |化学 |生物 |
  97. +-----+-----+-----+-----+-----+
  98. |74   |64   |74   |78   |69   |
  99. +-----+-----+-----+-----+-----+
  100. |79   |77   |70   |77   |67   |
  101. +-----+-----+-----+-----+-----+
  102. |64   |70   |74   |75   |72   |
  103. +-----+-----+-----+-----+-----+
  104. |66   |63   |77   |75   |79   |
  105. +-----+-----+-----+-----+-----+
  106. |62   |75   |65   |71   |63   |
  107. +-----+-----+-----+-----+-----+
  108. |79   |64   |72   |62   |76   |
  109. +-----+-----+-----+-----+-----+
  110. |79   |76   |62   |62   |77   |
  111. +-----+-----+-----+-----+-----+
  112. |74   |75   |72   |61   |61   |
  113. +-----+-----+-----+-----+-----+
  114. |71   |63   |79   |60   |70   |
  115. +-----+-----+-----+-----+-----+

  116. +-----+-----+-----+-----+-----+
  117. |小到大生物                   |
  118. +-----+-----+-----+-----+-----+
  119. |语文 |数学 |英语 |化学 |生物 |
  120. +-----+-----+-----+-----+-----+
  121. |74   |75   |72   |61   |61   |
  122. +-----+-----+-----+-----+-----+
  123. |62   |75   |65   |71   |63   |
  124. +-----+-----+-----+-----+-----+
  125. |79   |77   |70   |77   |67   |
  126. +-----+-----+-----+-----+-----+
  127. |74   |64   |74   |78   |69   |
  128. +-----+-----+-----+-----+-----+
  129. |71   |63   |79   |60   |70   |
  130. +-----+-----+-----+-----+-----+
  131. |64   |70   |74   |75   |72   |
  132. +-----+-----+-----+-----+-----+
  133. |79   |64   |72   |62   |76   |
  134. +-----+-----+-----+-----+-----+
  135. |79   |76   |62   |62   |77   |
  136. +-----+-----+-----+-----+-----+
  137. |66   |63   |77   |75   |79   |
  138. +-----+-----+-----+-----+-----+

  139. 程序耗时:0.000000
复制代码
发表于 2020-2-24 19:53:32 | 显示全部楼层
本帖最后由 Gin_Q 于 2020-2-25 10:49 编辑

1W行1秒内没有问题的!(CPU型号 :Intel(R) Celeron(R) CPU G1840 @ 2.80GHz)
  1. +-----+-----+-----+-----+-----+
  2. |66   |63   |77   |75   |79   |
  3. +-----+-----+-----+-----+-----+
  4. |66   |63   |77   |75   |79   |
  5. +-----+-----+-----+-----+-----+
  6. |66   |63   |77   |75   |79   |
  7. +-----+-----+-----+-----+-----+
  8. |66   |63   |77   |75   |79   |
  9. +-----+-----+-----+-----+-----+
  10. |66   |63   |77   |75   |79   |
  11. +-----+-----+-----+-----+-----+
  12. |66   |63   |77   |75   |79   |
  13. +-----+-----+-----+-----+-----+

  14. 程序耗时:0.916000
复制代码
发表于 2020-2-28 11:43:31 | 显示全部楼层
本帖最后由 Gin_Q 于 2020-2-28 19:40 编辑

学到结构体!想到用于这个题目相当合适!!!
  1. #include <stdio.h>
  2. struct Student
  3.         {
  4.                 int nu_1;
  5.                 int nu_2;
  6.                 int nu_3;
  7.                 int nu_4;
  8.                 int nu_5;
  9.         };
  10. int main(void)
  11. {
  12.         struct Student arr[9]={{79,77,70,77,67},{64,70,74,75,72},{79,64,72,62,76},{62,75,65,71,63},
  13.         {79,76,62,62,77},{66,63,77,75,79},{74,75,72,61,61},{71,63,79,60,70},{74,64,74,78,69}};
  14.         struct Student temp;
  15.         const int n=9;
  16.         int i,j;
  17.         for (i=0;i<n-1;i++)
  18.         {
  19.                 for (j=i+1;j<n;j++)
  20.                 {
  21.                         if (arr[i].nu_1>arr[j].nu_1)
  22.                         {
  23.                                 temp=arr[i];arr[i]=arr[j];arr[j]=temp;
  24.                         }
  25.                 }
  26.         }
  27.         printf("语文 数学 英语 化学 生物\n");
  28.         for (i=0;i<n;i++) printf("%-5d%-5d%-5d%-5d%-5d\n",arr[i].nu_1,arr[i].nu_2,arr[i].nu_3,arr[i].nu_4,arr[i].nu_5);
  29.         return 0;
  30. }
复制代码
  1. 语文 数学 英语 化学 生物
  2. 62   75   65   71   63
  3. 64   70   74   75   72
  4. 66   63   77   75   79
  5. 71   63   79   60   70
  6. 74   75   72   61   61
  7. 74   64   74   78   69
  8. 79   77   70   77   67
  9. 79   76   62   62   77
  10. 79   64   72   62   76

  11. --------------------------------
  12. Process exited after 0.01317 seconds with return value 0
  13. 请按任意键继续. . .
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:59 , Processed in 0.017746 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表