借练习册上的题目,写一个没有实际用途的学生成绩管理系统。
记一下在写代码事的感受吧。
发现的问题:
1.写代码没有自己的风格
2.对环境熟练程度不够
3.写代码之前缺少整体的构思,导致编写完成的代码重复部分多,结构冗杂
解决措施:
1.工欲善其事必先利其器,选择一个好的开发环境,多加练习
2.应该将时间用在程序设计上而不是花大量的时间在敲代码
发现的优点:
1.变量名逐渐形成了自己的特色
2.发现能够借助程序框图理清思路
3.程序编写趋向模块化,对某一模块把握较清楚
程序本身无实用性的原因:
1.程序采用读入文件中的所有数据到内存当中,当文件包含大量数据时不能实现;
2.没有排序功能;
3.数据文件无加密,程序运行无权限限制;
4.程序一次仅执行一次操作,效率低。
日后有时间再来整理优化完善程序
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<fcntl.h> 4 #include<unistd.h> 5 #include<errno.h> 6 #include<string.h> 7 #include<strings.h> 8 struct student//学生数据结构体 9 { 10 long int num; 11 char name[10]; 12 int sex; 13 int age; 14 float cscore; 15 struct student * next; 16 }*head,*on,*nt; 17 int main() 18 { 19 20 21 22 23 24 25 26 27 28 29 /*---开始从文件读入数据---*/ 30 int fd,pre,total=0; 31 fd=open("stu.dat",O_RDONLY);//打开文件 32 if(fd==EOF)//如果文件打开错误输出错误信息 33 perror(""); 34 pre=dup(0);//保存原标准输入 35 dup2(fd,0);//设置文件为标准输入 36 head=(struct student *)malloc(sizeof(struct student)); 37 on=head; 38 if(1+scanf("%ld",&(*on).num)) 39 { 40 total++; 41 scanf("%s %d %d %f",(*on).name,&(*on).sex,&(*on).age,&(*on).cscore); 42 nt=(struct student *)malloc(sizeof(struct student)); 43 while(1+scanf("%ld",&(*nt).num)) 44 { 45 total++; 46 scanf(" %s %d %d %f",(*nt).name,&(*nt).sex,&(*nt).age,&(*nt).cscore); 47 (*on).next=nt; 48 on=nt; 49 nt=(struct student *)malloc(sizeof(struct student)); 50 } 51 (*on).next=NULL; 52 } 53 close(fd);//关闭文件 54 dup2(pre,0);//重置标准输入 55 /*---结束从文件读入数据---*/ 56 57 58 59 60 61 62 63 64 65 66 /*---测试打印链表--- 67 struct student * print_on,* find_next; 68 print_on=head; 69 do 70 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*print_on).num,(*print_on).name,(*print_on).sex,(*print_on).age,(*print_on).cscore); 71 while((print_on=(*print_on).next)!=NULL); 72 ---打印链表完成---*/ 73 74 75 76 77 78 79 80 81 82 83 /*---查找数据并将指针存入数组---*/ 84 struct student * find[100],* find_on,* insert,* bef_delete; 85 int func,find_x,find_total=0,change_x; 86 long int find_num; 87 char find_name[10],*name; 88 int find_sex; 89 int find_age; 90 float find_cscore1,find_cscore2; 91 find_on=head; 92 printf("1.查看数据内容\n2.查找数据并在数据后插入数据\n3.查找数据并修改数据\n4.删除数据\n"); 93 scanf("%d",&func); 94 printf("1.按学号查找\n2.按姓名查找\n3.按性别查找\n4.按年龄查找\n5.按C成绩范围查找\n\n"); 95 scanf("%d",&find_x); 96 switch(find_x) 97 { 98 case 1: 99 { 100 printf("请输入学号:\n"); 101 scanf("%ld",&find_num); 102 do 103 if((*find_on).num==find_num) 104 find[find_total++]=find_on; 105 while((find_on=(*find_on).next)!=NULL); 106 break; 107 } 108 case 2: 109 { 110 printf("请输入姓名:\n"); 111 scanf("%s",find_name); 112 name=find_name; 113 do 114 if(!bcmp(find_name,&((*find_on).name),sizeof(name))) 115 find[find_total++]=find_on; 116 while((find_on=(*find_on).next)!=NULL); 117 break; 118 } 119 case 3: 120 { 121 printf("请输入性别(0=女,1=男):\n"); 122 scanf("%d",&find_sex); 123 do 124 if((*find_on).sex==find_sex) 125 find[find_total++]=find_on; 126 while((find_on=(*find_on).next)!=NULL); 127 break; 128 } 129 case 4: 130 { 131 printf("请输入年龄:\n"); 132 scanf("%d",&find_age); 133 do 134 if((*find_on).age==find_age) 135 find[find_total++]=find_on; 136 while((find_on=(*find_on).next)!=NULL); 137 break; 138 } 139 case 5: 140 { 141 printf("请输入C成绩范围(两个数值中间用空格隔开):\n"); 142 scanf("%f%f",&find_cscore1,&find_cscore2); 143 do 144 if((*find_on).cscore>=find_cscore1&&(*find_on).cscore<=find_cscore2||(*find_on).cscore<=find_cscore1&&(*find_on).cscore>=find_cscore2) 145 find[find_total++]=find_on; 146 while((find_on=(*find_on).next)!=NULL); 147 break; 148 } 149 default :break; 150 } 151 /*---指针存入数组完成---*/ 152 153 154 155 156 157 158 159 160 161 162 /*---功能实现---*/ 163 int find_total_tem=find_total-1; 164 int i,m; 165 int pfind=0; 166 switch(func) 167 { 168 case 1: 169 { 170 for(;pfind<find_total;pfind++) 171 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*find[pfind]).num,(*find[pfind]).name,(*find[pfind]).sex,(*find[pfind]).age,(*find[pfind]).cscore); 172 break; 173 } 174 case 2: 175 { 176 while(find_total_tem>=1) 177 { 178 for(;pfind<find_total;pfind++) 179 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*find[pfind]).num,(*find[pfind]).name,(*find[pfind]).sex,(*find[pfind]).age,(*find[pfind]).cscore); 180 printf("找到以上多个数据,请继续输入筛选条件:\n"); 181 182 printf("1.按学号查找\n2.按姓名查找\n\n"); 183 scanf("%d",&find_x); 184 switch(find_x) 185 { 186 case 1: 187 { 188 printf("请输入学号:\n"); 189 scanf("%ld",&find_num); 190 for(i=0;i<find_total;i++) 191 if((*find[i]).num==find_num) 192 find[0]=find[i]; 193 else find[i]=NULL; 194 find_total_tem=0; 195 break; 196 197 } 198 case 2: 199 { 200 find_total_tem=0; 201 printf("请输入姓名:\n"); 202 scanf("%s",find_name); 203 name=find_name; 204 for(i=0;i<find_total;i++) 205 if(!bcmp((*find[i]).name,find_name,sizeof((name)))) 206 find[find_total_tem++]=find[i]; 207 else find[i]=NULL; 208 find_total_tem--; 209 break; 210 }}} 211 insert=(struct student *)malloc(sizeof(struct student)); 212 printf("请输入待添加学生的学号:\n"); 213 scanf("%ld",&(*insert).num); 214 printf("请输入待添加学生的姓名:\n"); 215 scanf("%s",(*insert).name); 216 printf("请输入待添加学生的性别(0=女,1=男):\n"); 217 scanf("%d",&(*insert).sex); 218 printf("请输入待添加学生的年龄:\n"); 219 scanf("%d",&(*insert).age); 220 printf("请输入待添加学生C语言成绩:\n"); 221 scanf("%f",&(*insert).cscore); 222 (*insert).next=(*find[0]).next; 223 (*find[0]).next=insert; 224 fd=open("stu.dat",O_RDWR|O_TRUNC);//打开文件 225 if(fd==EOF)//如果文件打开错误输出错误信息 226 perror(""); 227 pre=dup(1);//保存原标准输出的值 228 dup2(fd,1);//设置文件为标准输出 229 on=head; 230 do printf("%-5ld%-10s%-2d%-4d%-4g\n",(*on).num,(*on).name,(*on).sex,(*on).age,(*on).cscore); 231 while((on=(*on).next)!=NULL); 232 close(fd);//关闭文件 233 dup2(pre,1);//重置标准输出 234 printf("添加并保存数据完成\n"); 235 break; 236 } 237 case 3: 238 { 239 while(find_total_tem>=1) 240 { 241 for(;pfind<find_total;pfind++) 242 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*find[pfind]).num,(*find[pfind]).name,(*find[pfind]).sex,(*find[pfind]).age,(*find[pfind]).cscore); 243 printf("找到多个数据,请继续输入筛选条件:\n"); 244 printf("1.按学号查找\n2.按姓名查找\n\n"); 245 scanf("%d",&find_x); 246 switch(find_x) 247 { 248 case 1: 249 { 250 printf("请输入学号:\n"); 251 scanf("%ld",&find_num); 252 for(i=0;i<find_total;i++) 253 if((*find[i]).num==find_num) 254 find[0]=find[i]; 255 else find[i]=NULL; 256 find_total_tem=0; 257 break; 258 } 259 case 2: 260 { 261 find_total_tem=0; 262 printf("请输入姓名:\n"); 263 scanf("%s",find_name); 264 name=find_name; 265 for(i=0;i<find_total;i++) 266 if(!bcmp((*find[i]).name,find_name,sizeof((name)))) 267 find[find_total_tem++]=find[i]; 268 else find[i]=NULL; 269 find_total_tem--; 270 break; 271 }}} 272 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*find[0]).num,(*find[0]).name,(*find[0]).sex,(*find[0]).age,(*find[0]).cscore); 273 printf("请输入要修改的内容:\n"); 274 printf("1.学号 2.姓名 3.性别 4.年龄 5.成绩\n"); 275 scanf("%d",&change_x); 276 switch(change_x) 277 { 278 case 1: 279 { 280 printf("请输入学号:\n"); 281 scanf("%ld",&(*find[0]).num); 282 break; 283 } 284 case 2: 285 { 286 printf("请输入姓名\n"); 287 scanf("%s",(*find[0]).name); 288 break; 289 } 290 case 3: 291 { 292 printf("请输入性别(0=女,1=男):\n"); 293 scanf("%d",&(*find[0]).sex); 294 break; 295 } 296 case 4: 297 { 298 printf("请输入年龄:\n"); 299 scanf("%d",&(*find[0]).age); 300 break; 301 } 302 case 5: 303 { 304 printf("请输入C成绩:\n"); 305 scanf("%f",&(*find[0]).cscore); 306 break; 307 } 308 default:break; 309 } 310 fd=open("stu.dat",O_RDWR|O_TRUNC);//打开文件 311 if(fd==EOF)//如果文件打开错误输出错误信息 312 perror(""); 313 pre=dup(1);//保存原标准输出 314 dup2(fd,1);//设置文件为标准输出 315 on=head; 316 do 317 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*on).num,(*on).name,(*on).sex,(*on).age,(*on).cscore); 318 while((on=(*on).next)!=NULL); 319 close(fd);//关闭文件 320 dup2(pre,1);//重置标准输出 321 printf("修改并保存数据完成\n"); 322 break; 323 } 324 case 4: 325 { 326 while(find_total_tem>=1) 327 { 328 for(;pfind<find_total;pfind++) 329 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*find[pfind]).num,(*find[pfind]).name,(*find[pfind]).sex,(*find[pfind]).age,(*find[pfind]).cscore); 330 printf("找到多个数据,请继续输入筛选条件:\n"); 331 printf("1.按学号查找\n2.按姓名查找\n\n"); 332 scanf("%d",&find_x); 333 switch(find_x) 334 { 335 case 1: 336 { 337 printf("请输入学号:\n"); 338 scanf("%ld",&find_num); 339 for(i=0;i<find_total;i++) 340 if((*find[i]).num==find_num) 341 find[0]=find[i]; 342 else find[i]=NULL; 343 find_total_tem=0; 344 break; 345 } 346 case 2: 347 { 348 find_total_tem=0; 349 printf("请输入姓名:\n"); 350 scanf("%s",find_name); 351 name=find_name; 352 for(m=0;m<find_total;i++) 353 if(!bcmp((*find[i]).name,find_name,sizeof((name)))) 354 find[find_total_tem++]=find[i]; 355 else find[i]=NULL; 356 find_total_tem--; 357 break; 358 }}} 359 bef_delete=head; 360 if(head==find[0]) 361 head=(*head).next; 362 else 363 { 364 while((*bef_delete).next!=find[0]) 365 bef_delete=(*bef_delete).next; 366 (*bef_delete).next=(*find[0]).next; 367 } 368 fd=open("stu.dat",O_RDWR|O_TRUNC);//打开文件 369 if(fd==EOF)//如果文件打开错误输出错误信息 370 perror(""); 371 pre=dup(1);//保存原标准输出的值 372 dup2(fd,1);//设置文件为标准输出 373 on=head; 374 do 375 printf("%-5ld%-10s%-2d%-4d%-4g\n",(*on).num,(*on).name,(*on).sex,(*on).age,(*on).cscore); 376 while((on=(*on).next)!=NULL); 377 close(fd);//关闭文件 378 dup2(pre,1);//重置标准输出 379 printf("删除数据完成\n"); 380 } 381 default :break; 382 } 383 /*---功能结束---*/ 384 385 386 387 388 389 390 391 392 return 0; 393 }