最近看了些别人写的源代码,自己不妨就尝试模仿下比较规范的格式写个简单的泛型排序程序吧。(主要是为了尝试别人写代码的规范)
程序包括文件 main.c init.c run.c sort.h
sort.h
1 #ifndef SORT
2 #define SORT
3
4 #define FALSE -1
5 #define TRUE 0
6
7 #define INPUT_ERROR 10
8 #define SORT_ERROR 11
9
10 #define SORT //用于扩展
11
12 void *DataBase; //用于申请空间
13
14 int *IpDataBase; //保存int
15 float *FpDataBase; //保存float
16 double *DpDataBase; //保存double
17
18 int iTotle; //数据个数
19 int iType; //用户输入想排序的类型
20
21
22 #endif //SORT
main.c
1 #include<stdio.h>
2
3 #include"sort.h"
4
5 int main()
6 {
7 if(MY_InitProcess()) //模仿源代码中初始化哈
8 {
9 fprintf(stderr, "init failed at %d.\n", __LINE__);//用fprintf 可以保证输出在屏幕上 比如运行程序用了 "./a.out>1.txt" , 出错信息会在屏幕上输出
10 return -1;
11 }
12 return 0;
13 }
init.c
1 #include<stdio.h>
2
3 #include"sort.h"
4
5 int SORT MY_InitProcess() //define SORT 将SORT设为空 方便以后扩展
6 {
7 if(InitInput()) //模仿源代码中初始化哈 输入
8 {
9 fprintf(stderr, "init input failed at %d.\n", __LINE__);
10 return FALSE;
11 }
12
13 if(SortRun()) //模仿源代码中初始化哈 排序
14 {
15 fprintf(stderr, "init sort failed at %d.\n", __LINE__);
16 return FALSE;
17 }
18
19 if(EndPrint()) //模仿源代码中初始化哈 输出
20 {
21 fprintf(stderr, "init print failed at %d.\n", __LINE__);
22 return FALSE;
23 }
24
25 return TRUE;
26 }
run.c //主要实现排序的文件
1 #include<stdio.h>
2 #include<malloc.h>
3
4 #include"sort.h"
5
6 void IntPrint(void) //int数据输入
7 {
8 int i;
9 IpDataBase = DataBase;
10 printf("inpit your data...\n");
11 for(i=0; i<iTotle; i++)
12 {
13 scanf("%d", &IpDataBase[i]);
14 }
15 }
16
17 void FloatPrint(void) //float数据输入
18 {
19 int i;
20 FpDataBase = DataBase;
21 printf("inpit your data...\n");
22 for(i=0; i<iTotle; i++)
23 {
24 scanf("%f", &FpDataBase[i]);
25 }
26 }
27
28 void DoublePrint(void) //double数据输入
29 {
30 int i;
31 DpDataBase = DataBase;
32 printf("inpit your data...\n");
33 for(i=0; i<iTotle; i++)
34 {
35 scanf("%lf", &DpDataBase[i]);
36 }
37 }
38
39 int SORT InitInput(void)
40 {
41 void (*PFUN)(); //根据需要指向所需函数
42 fprintf(stderr, "input your data type and number\n");
43 fprintf(stderr, "1:int 2:float 3:double\n");
44 scanf("%d%d", &iType,&iTotle);
45
46 switch(iType)
47 {
48 case 1:
49 if(NULL == (DataBase = malloc((iTotle + 1) * sizeof(int))))
50 return FALSE;
51 PFUN = IntPrint;
52 break;
53 case 2:
54 if(NULL == (DataBase = malloc((iTotle + 1) * sizeof(float))))
55 return FALSE;
56 PFUN = FloatPrint;
57 break;
58 case 3:
59 if(NULL == (DataBase = malloc((iTotle + 1) * sizeof(double))))
60 return FALSE;
61 PFUN = DoublePrint;
62 break;
//default:
// fprintf(stderr, "init failed at %d.\n", __LINE__); //之前忘了加default了, 每个switch最好要有
// break;
63 }
64
65 PFUN();
66 return TRUE;
67 }
68 void SORT FloatSort(void) //float数据插入排序
69 {
70 int i,j;
71 float iKey;
72
73 for(j=1; j<iTotle; j++)
74 {
75 iKey = FpDataBase[j];
76
77 i = j-1;
78 while(i>=0 && FpDataBase[i] > iKey)
79 {
80 FpDataBase[i + 1] = FpDataBase[i];
81 i = i-1;
82 }
83 FpDataBase[i + 1] = iKey;
84 }
85 }
86 void SORT DoubleSort(void) //double数据插入排序
87 {
88 int i,j;
89 double iKey;
90
91 for(j=1; j<iTotle; j++)
92 {
93 iKey = DpDataBase[j];
94
95 i = j-1;
96 while(i>=0 && DpDataBase[i] > iKey)
97 {
98 DpDataBase[i + 1] = DpDataBase[i];
99 i = i-1;
100 }
101 DpDataBase[i + 1] = iKey;
102 }
103 }
104
105 void SORT IntSort(void) //int数据插入排序
106 {
107 int i,j;
108 int iKey;
109
110 for(j=1; j<iTotle; j++)
111 {
112 iKey = IpDataBase[j];
113
114 i = j-1;
115 while(i>=0 && IpDataBase[i] > iKey)
116 {
117 IpDataBase[i + 1] = IpDataBase[i];
118 i = i-1;
119 }
120 IpDataBase[i + 1] = iKey;
121 }
122 }
123
124 int SORT SortRun(void)
125 {
126 void (*PFUN)();
127 if(1 == iType)
128 {
129 PFUN = IntSort;
130 }
131 else if(2 == iType)
132 {
133 PFUN = FloatSort;
134 }
135 else
136 {
137 PFUN = DoubleSort;
138 }
139
140 PFUN();
141 return TRUE;
142 }
143
144 int SORT EndPrint(void) //数据输出
145 {
146 int i;
147 if(NULL == DataBase)
148 return FALSE;
149
150 switch(iType)
151 {
152 case 1: //int型数据输出
153 for(i=0; i<iTotle; i++)
154 {
155 printf("%d ", IpDataBase[i]);
156 }
157 printf("\n");
158 break;
159 case 2: //float型数据输出
160 for(i=0; i<iTotle; i++)
161 {
162 printf("%f ", FpDataBase[i]);
163 }
164 printf("\n");
165 break;
166 case 3: //double型数据输出
167 for(i=0; i<iTotle; i++)
168 {
169 printf("%f ", DpDataBase[i]);
170 }
171 printf("\n");
172 break;
173 default:
174 fprintf(stderr, "error ..");
175 return FALSE;
176 }
177 return TRUE;
178 }