命令控制台学生管理系统 c语言链表实现

短学期大作业  半天搞定

主要实现

1.文件读入

2.文件内容删除

3.查询

4.排序

很简单 重点是链表操作的熟练  文件操作

  1 #include "stdio.h"

  2 #include "stdlib.h"

  3 #include "string.h"

  4 typedef struct st1

  5 {

  6     char stdNum[10];

  7     char name[10];

  8     char sex[10];

  9     char dorNum[10];

 10     char dorPhonenum[10];

 11     struct st1* next;

 12 } StudentBaseMessage;        //学生基本信息 

 13 

 14 typedef struct st2

 15 {

 16     char stdNum[10];

 17     char classNum[10];

 18     char className[10];

 19     int credit;

 20     int gradesDay;

 21     int gradesExper;

 22     int gradesPaper;

 23     int gradesALL;

 24     float grades;

 25 } StudentGradesMessage;        //学生成绩 

 26 

 27 typedef struct st3

 28 {

 29     StudentGradesMessage st;

 30     struct st3 *next;    

 31 } StudentGradesMessageLink;//学生基本信息链表 

 32 

 33 typedef struct st4

 34 {

 35     StudentBaseMessage st;

 36     struct st4 *next;    

 37 } StudentBaseMessageLink;    //学生成绩链表 

 38 

 39 float culGrades(int n,int credit);    //计算成绩 

 40 //void  input(StudentGradesMessageLink *head);    

 41 StudentGradesMessageLink *inputgrade();    //成绩读入 

 42 StudentBaseMessageLink *inputbase();    //基本信息读入 

 43 

 44 void search(char stunum[],StudentGradesMessageLink *head,StudentBaseMessageLink *head1);

 45 void searhbase(char stunum[],StudentBaseMessageLink *head);

 46 void sort(StudentGradesMessageLink *head);

 47 void output(StudentGradesMessageLink *head);

 48 void deleteA(StudentBaseMessageLink *head,char stdnum[]);

 49 void deleteB(StudentGradesMessageLink *head,char stdnum[]);

 50 

 51 int main()

 52 {

 53     StudentGradesMessageLink *headgrade=NULL;

 54     StudentBaseMessageLink *headbase=NULL;

 55     char stunum[10];

 56     char ch[10];

 57     int flag;

 58     headgrade=inputgrade();

 59     headbase=inputbase();

 60     printf("1.查询学生基本情况\n2.查询成绩:\n3.成绩排序:\n4.删除学生信息\n");

 61     scanf("%d",&flag);

 62     if(flag==3)

 63     {

 64         sort(headgrade);

 65         output(headgrade);

 66         return 0;

 67     } 

 68     switch(flag)

 69     {

 70         case 1:printf("请输入你要查询的宿舍号:\n");break;

 71         case 2:printf("请输入你要查询的学生学号:\n") ;break;

 72     }

 73     gets(ch);

 74     gets(stunum);

 75     if(flag==4)

 76     {

 77         deleteA(headbase,stunum);

 78         deleteB(headgrade,stunum);

 79         printf("删除成功!"); 

 80         return 0;

 81     } 

 82     if(flag==2)

 83         search(stunum,headgrade,headbase);

 84     else

 85         searhbase(stunum,headbase);

 86 }

 87 void deleteB(StudentGradesMessageLink *head,char stdnum[])

 88 {

 89     StudentGradesMessageLink *p,*tail;

 90     int flag=1; 

 91     p=head->next;

 92     tail=head;

 93     while(p)

 94     {

 95         if(p && strcmp(stdnum,p->st.stdNum)==0)

 96         {

 97             tail->next=tail->next->next;

 98             flag=0;

 99         }

100         p=p->next;

101         if(flag==1)

102         {tail=tail->next;}

103         else

104             flag=1;

105         

106     }

107     FILE *fpb;

108     if((fpb=fopen("C:\\Users\\Administrator\\Desktop\\B.txt","w"))==NULL)

109         printf("文件打开错误!");

110     p=head->next;

111     fprintf(fpb,"学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分\n"); 

112     while(p)

113     {                 

114         fprintf(fpb,"%s   %s       %-10s    %d   %d      %d        %d\n",

115          p->st.stdNum,p->st.classNum,p->st.className,p->st.credit,p->st.gradesDay,p->st.gradesExper

116          ,p->st.gradesPaper);            

117         p=p->next;

118     }    

119 }

120 void deleteA(StudentBaseMessageLink *head,char stdnum[])

121 {

122     StudentBaseMessageLink *p,*tail;

123     p=head->next;

124     tail=head;

125     while(p)

126     {

127         if(p && strcmp(stdnum,p->st.stdNum)==0)

128         {

129             tail->next=tail->next->next;

130         }

131         p=p->next;

132         tail=tail->next;

133     }

134     FILE *fpa;

135     if((fpa=fopen("C:\\Users\\Administrator\\Desktop\\A.txt","w"))==NULL)

136         printf("文件打开错误!");

137     p=head->next;

138     fprintf(fpa,"学号    姓名    性别    宿舍号码    电话号码\n"); 

139     while(p)

140     {

141         fprintf(fpa,"%s    %s  %s    %s        %s\n",

142          p->st.stdNum,p->st.name,p->st.sex,p->st.dorNum,p->st.dorPhonenum);            

143         p=p->next;

144     }    

145 }

146 void output(StudentGradesMessageLink *head)

147 {

148     StudentGradesMessageLink *s;

149     s=head->next;

150     while(s)

151     {

152         

153         printf("课程编号:%s    课程名称:%-10s    综合成绩:%d    实得学分:%.2f\n"

154         ,s->st.classNum,s->st.className,s->st.gradesALL,s->st.grades);

155         s=s->next;

156     }

157 }

158 void sort(StudentGradesMessageLink *head)

159 {

160     StudentGradesMessageLink *s,*p,*q;

161     StudentGradesMessage temp;

162     p=head->next;

163     for(p=head->next;p;p=p->next)

164     {

165         for(q=p;q;q=q->next)

166         {

167             if(q->st.gradesALL>p->st.gradesALL)

168             {

169                 temp=q->st;

170                 p->st=q->st;

171                 q->st=temp;

172             }

173         }

174     }

175 }

176 StudentBaseMessageLink *inputbase()

177 {

178     StudentBaseMessage sgm;

179     StudentBaseMessageLink *head=NULL;

180     StudentBaseMessageLink *s,*tail;

181     char ch[1024];

182     FILE *fpa;

183     if((fpa=fopen("C:\\Users\\Administrator\\Desktop\\A.txt","r"))==NULL)

184         printf("文件打开错误!");

185     fgets(ch,1024,fpa);

186     head=(StudentBaseMessageLink *)malloc(sizeof(StudentBaseMessageLink));

187     tail=head;

188     while(!feof(fpa)) 

189      {    

190          

191          s=(StudentBaseMessageLink*)malloc(sizeof(StudentBaseMessageLink));

192          fscanf(fpa,"%s    %s  %s    %s        %s\n",

193                      

194          &sgm.stdNum,&sgm.name,&sgm.sex,&sgm.dorNum,&sgm.dorPhonenum);

195          

196          s->st=sgm;

197         s->next=NULL;

198         tail->next=s;

199         tail=tail->next;                   

200     } 

201     fclose(fpa);

202     return head;

203 }

204 void search(char stunum[],StudentGradesMessageLink *head,StudentBaseMessageLink *head1)

205 {

206     StudentGradesMessageLink *s;

207     StudentBaseMessageLink *t;

208     t=head1->next;

209     s=head->next;    

210     int count=0;

211     float allcredit=0;

212     while(t)

213     {

214         if(strcmp(t->st.stdNum,stunum)==0)

215             break;

216         t=t->next;

217     }

218     printf("学    号:%s    姓    名:  %s\n",stunum,t->st.name);

219     while(s)

220     {

221         if(strcmp(s->st.stdNum,stunum)==0)

222         {

223             printf("课程编号:%s    课程名称:%10s    综合成绩:%d    实得学分:%.2f\n"

224             ,s->st.classNum,s->st.className,s->st.gradesALL,s->st.grades);

225             count++;

226             allcredit+=s->st.grades;

227         }    

228         s=s->next;

229     }

230     printf("共    修:%d科   实得总学分:%.2f\n",count,allcredit);

231 }

232 void searhbase(char stunum[],StudentBaseMessageLink *head)

233 {

234     StudentBaseMessageLink *s;

235     s=head->next;

236     while(s)

237     {

238         if(strcmp(s->st.dorNum,stunum)==0)

239         {

240             printf("姓名:%s    性别:%s    宿舍号码:%s    电话号码:%s\n"

241             ,s->st.name,s->st.sex,s->st.dorNum,s->st.dorPhonenum);

242         }

243         s=s->next;    

244     }

245 }

246 StudentGradesMessageLink *inputgrade()

247 {

248     StudentGradesMessage sgm;

249     StudentGradesMessageLink *head=NULL;

250     StudentGradesMessageLink *s,*tail;

251     char ch[1024];

252     char x[10];

253     FILE *fpb;

254     if((fpb=fopen("C:\\Users\\Administrator\\Desktop\\B.txt","r"))==NULL)

255         printf("文件打开错误!");

256     fgets(ch,1024,fpb);

257     head=(StudentGradesMessageLink *)malloc(sizeof(StudentGradesMessageLink));

258     tail=head;

259     while(!feof(fpb)) 

260      {    

261          

262          s=(StudentGradesMessageLink *)malloc(sizeof(StudentGradesMessageLink));

263                                                                          

264          fscanf(fpb,"%s   %s       %s    %d   %d      %d        %d\n",

265          sgm.stdNum,sgm.classNum,sgm.className,&sgm.credit,&sgm.gradesDay,

266          &sgm.gradesExper,&sgm.gradesPaper,&sgm.gradesALL,&sgm.grades);

267          if(sgm.gradesExper==-1)

268              sgm.gradesALL=sgm.gradesDay*0.3+sgm.gradesPaper*0.7;

269          else 

270              sgm.gradesALL=sgm.gradesDay*0.15+sgm.gradesExper*0.15+sgm.gradesPaper*0.7;    

271          sgm.grades=culGrades(sgm.gradesALL,sgm.credit);

272          s->st=sgm;

273         s->next=NULL;

274         tail->next=s;

275         tail=tail->next;                   

276     } 

277     fclose(fpb);

278     return head;

279 }

280 

281 float culGrades(int n,int credit)

282 {

283     float Grades;

284     switch(n/10)

285     {

286         case 10:

287         case 9:Grades=1.0*credit;break;

288         case 8:Grades=1.0*credit*0.8;break;

289         case 7:Grades=1.0*credit*0.75;break;

290         case 6:Grades=1.0*credit*0.6;break;

291         default:Grades=0;

292     }

293     return Grades;

294 }

 

你可能感兴趣的:(C语言)