来个大神指点一下小白吧
第一次写程序,写得乱七八糟的,请指点一下。以下代码。想加入求十次成绩平均数,可以说明一下如何写吗?新人分不多请见谅。
/*2014年7月1日
学生成绩管理系统*/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <windows.h>
struct student
{
char num[20];
char name[20];
char cla[20];
char cj1[30];
char cj2[30];
char cj3[30];
char cj4[30];
char cj5[30];
char cj6[30];
char cj7[30];
char cj8[30];
char cj9[30];
char cj10[30];
char grade[20];
char average[20];
struct student * next;
} * head, * p1, * p2;
void gotoxy(int x, int y)//移动光标位置;
{
HANDLE hout;
COORD coord;
coord.X = x;
coord.Y = y;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout, coord);
}
void auther( void )//课程名称界面
{
gotoxy(20, 10);
printf("学生成绩管理系统\n 徐诺", 1, 1);
gotoxy(0, 23);
system("PAUSE");
system("CLS");
gotoxy(0, 0);
}
int mainmenu( void )//主菜单
{
int n=0;
while (1)
{
puts("\t /********************************************\\");
puts("\t # 1.输入学生成绩 #");
puts("\t # 2.读入学生成绩 #");
puts("\t # 3.查询学生成绩 #");
puts("\t # 4.删除学生成绩 #");
puts("\t # 5.修改学生成绩 #");
puts("\t # 0.退出系统 #");
puts("\t \\********************************************/");
printf("\t\n请选择:");
scanf("%d", &n );
if (n>5 || n<0)
{
puts("\n输入不合法! 请重新输入!\n");
system("PAUSE");
system("CLS");
}
else
{
break;
}
}
system("CLS");
return n;
}
void input( void ) // 输入学生成绩;
{
p1 = (struct student *)malloc(sizeof(struct student));
head = p1;
while (1)
{
puts("请输入学生成绩(学号为0时结束输入):");
printf("学号:");
scanf("%s", p1->num );
if (0 == strcmp("0", p1->num ))
{
break;
}
printf("姓名:");
scanf("%s", p1->name );
printf("班级:");
scanf("%s", p1->cla );
printf("第一次: ");
scanf("%s", p1->cj1 );
printf("第二次:");
scanf("%s", p1->cj2 );
printf("第三次:");
scanf("%s", p1->cj3 );
printf("第四次:");
scanf("%s", p1->cj4 );
printf("第五次:");
scanf("%s", p1->cj5 );
printf("第六次:");
scanf("%s", p1->cj6 );
printf("第七次:");
scanf("%s", p1->cj7 );
printf("第八次:");
scanf("%s", p1->cj8 );
printf("第九次:");
scanf("%s", p1->cj9 );
printf("第十次:");
scanf("%s", p1->cj10 );
p2 = p1;
p1->next = (struct student *)malloc(sizeof(struct student));
p1 = p1->next;
}
p1->next = NULL;
}
void really_save( void )//储存到文件
{
struct student *p1;
FILE * fp;
char fname[30];
while (1)
{
printf("输入要存入的文件名(如果文件已存在,将会被覆盖!):");
scanf("%s", fname );
fp = fopen(fname, "w");
if (fp == NULL)
{
puts("打开失败!");
continue;
}
else
{
break;
}
}
p1 = head;
while ( p1->next != NULL )
{
fprintf(fp, "%s %s %s %s %s %s %s %s %s %s %s %s %s \t ", p1->num, p1->name, p1->cla, p1->cj1, p1->cj2, p1->cj3, p1->cj4, p1->cj5, p1->cj6, p1->cj7, p1->cj8, p1->cj9, p1->cj10 );
p1 = p1->next;
}
fclose(fp);
}
void save( void )//判断是否要保存
{
char ch;
while (1)
{
fflush(stdin);
printf("是否保存?(Y/N):");
scanf("%c", &ch);
switch (ch)
{
case 'N':
printf("确定不保存?(Y/N):");
scanf("%c", &ch);
if ('N'==ch||'n'==ch)
{
continue;
}
else if ('Y'==ch||'y'==ch)
{
break;
}
else
{
puts("输入错误!");
continue;
}
case 'Y':
case 'y':
really_save();
break;
default:
continue;
}
break;
}
}
void read( void ) //将文件中的内容保存到链表中
{
FILE * fp;
char fname[30];
while (1)
{
printf("输入要打开的文件名:");
scanf("%s", fname );
if (!(fp = fopen(fname, "r" )))
{
puts("\n打开失败!\n");
system("PAUSE");
continue;
}
else
{
p1 = (struct student *)malloc( sizeof(struct student) );
head = p1;
do
{
fscanf(fp, "%s%s%s%s%s%s%s%s%s%s%s%s%s", p1->num, p1->name, p1->cla, p1->cj1, p1->cj2, p1->cj3, p1->cj4, p1->cj5, p1->cj6, p1->cj7, p1->cj8, p1->cj9, p1->cj10);
p2 = p1;
p1->next = (struct student *)malloc( sizeof(struct student) );
p1 = p1->next;
}
while (!feof(fp));
p2->next = NULL;
fclose(fp);
break;
}
}
}
void output( void ) //将链表中的数据输出
{
read();
puts("\n学号 姓名 班级 第一次 第二次 第三次 第四次 第五次 第六次 第七次 第八次 第九次 第十次 \n");
p1 = head;
do
{
printf("%s %s %s %s %s %s %s %s %s %s %s %s %s \n", p1->num, p1->name, p1->cla, p1->cj1, p1->cj2, p1->cj3, p1->cj4, p1->cj5, p1->cj6, p1->cj7, p1->cj8, p1->cj9, p1->cj10 );
p1 = p1->next;
}while ( p1->next != NULL );
printf("\n");
}
void print(struct student * p) //输出一个结构体数据
{
printf("%s %s %s %s %s %s %s %s %s %s %s %s %s \n", p->num, p->name, p1->cla, p->cj1, p->cj2, p->cj3, p->cj4, p->cj5, p->cj6, p->cj7, p->cj8, p->cj9, p->cj10 );
}
void find( void ) //找到目标并输出
{
char fin[30];
read();
printf("请输入要查找的内容:");
scanf("%s", fin );
puts("\n学号 班级 第一次 第二次 第三次 第四次 第五次 第六次 第七次 第八次 第九次 第十次 \n");
p1 = head;
do
{
//按学号
if (0 == strcmp(fin, p1->num ))
{
print(p1);
}
//按姓名
if (0 == strcmp(fin, p1->name ))
{
print(p1);
}
//按班级
if (0 == strcmp(fin, p1->cla ))
{
print(p1);
}
//按第一次成绩
if (0 == strcmp(fin, p1->cj1 ))
{
print(p1);
}
//按第二次成绩
if (0 == strcmp(fin, p1->cj2))
{
print(p1);
}
//按第三次成绩
if (0 == strcmp(fin, p1->cj3 ))
{
print(p1);
}
//按第四次成绩
if (0 == strcmp(fin, p1->cj4 ))
{
print(p1);
}
//按第五次成绩
if (0 == strcmp(fin, p1->cj5 ))
{
print(p1);
}
//按第六次成绩
if (0 == strcmp(fin, p1->cj6 ))
{
print(p1);
}
//按第七次成绩
if (0 == strcmp(fin, p1->cj7 ))
{
print(p1);
}
//按第八次成绩
if (0 == strcmp(fin, p1->cj8 ))
{
print(p1);
}
//按第九次成绩
if (0 == strcmp(fin, p1->cj9 ))
{
print(p1);
}
//按第十次成绩
if (0 == strcmp(fin, p1->cj10 ))
{
print(p1);
}
p1 = p1->next;
}
while (p1 != NULL);
printf("\n");
}
void dele( void ) //删除某一个结构体数据
{
char ch, de[30];
int i=0;
read();
while (1)
{
printf("输入要删除的学号:");
scanf("%s", de );
p1 = head;
printf("\n");
do
{
if (0 == strcmp(de, p1->num ))
{
print(p1);
break;
}
i++; //判断要删除的是不是链表第一个
p2 = p1;
p1 = p1->next;
}
while (p1 != NULL);
if (p1 == NULL)
{
puts("未找到!");
continue;
}
else
{
break;
}
}
while (1)
{
fflush(stdin);
printf("\n确定删除?(Y/N):");
scanf("%c", &ch);
switch (ch)
{
case 'Y':
case 'y':
{
if (i==0)
{
head = p1->next;
}
else
{
p2->next = p1->next;
}
break;
}
case 'N':
case 'n':
{
break;
}
default: continue;
}
break;
}
save();
}
void really_change( struct student * p)//修改链表的某一项
{
int n;
char change[30];
puts("选择要修改的选项:");
puts("\t 1. 学号 ");
puts("\t 2. 姓名 ");
puts("\t 3. 班级 ");
puts("\t 4. 第一次 ");
puts("\t 5. 第二次 ");
puts("\t 6. 第三次 ");
puts("\t 7. 第四次 ");
puts("\t 8. 第五次 ");
puts("\t 9. 第六次 ");
puts("\t 10.第七次 ");
puts("\t 11.第八次 ");
puts("\t 12.第九次 ");
puts("\t 13.第十次 ");
while (1)
{
while (1)
{
puts("请选择:");
scanf("%d", &n);
if (n>13 || n<1)
{
puts("输入错误!");
}
else
{
puts("请输入修改数据:");
scanf("%s", change);
break;
}
}
switch (n)
{
case 1:
{
strcpy(p->num, change);
break;
}
case 2:
{
strcpy(p->name, change);
break;
}
case 3:
{
strcpy(p->cla, change);
break;
}
case 4:
{
strcpy(p->cj1, change);
break;
}
case 5:
{
strcpy(p->cj2, change);
break;
}
case 6:
{
strcpy(p->cj3, change);
break;
}
case 7:
{
strcpy(p->cj4, change);
break;
}
case 8:
{
strcpy(p->cj5, change);
break;
}
case 9:
{
strcpy(p->cj6, change);
break;
}
case 10:
{
strcpy(p->cj7, change);
break;
}
case 11:
{
strcpy(p->cj8, change);
break;
}
case 12:
{
strcpy(p->cj9, change);
break;
}
case 13:
{
strcpy(p->cj10, change);
break;
}
default:
{
puts("输入错误!!!");
system("CLS");
continue;
}
}
save();
break;
}
}
void change( void ) //判断是否修改
{
char ch, cha[30];
read();
printf("输入要修改的学号:");
scanf("%s", cha );
p1 = head;
do
{
if (0 == strcmp(cha, p1->num))
{
print( p1 );
break;
}
p1 = p1->next;
}
while (p1 != NULL);
while (1)
{
fflush(stdin);
printf("\n 是否修改?(Y/N):");
scanf("%c", &ch);
switch ( ch )
{
case 'Y':
case 'y':
{
really_change( p1 );
break;
}
case 'N':
case 'n':
{
break;
}
default:
{
continue;
}
}
break;
}
}
int main( void ) //主函数
{
auther();
while (1)
{
switch( mainmenu() )
{
case 1:
{
input();
save();
break;
}
case 2:
{
output();
break;
}
case 3:
{
find();
break;
}
case 4:
{
dele();
break;
}
case 5:
{
change();
break;
}
case 0:
{
system("PAUSE");
exit(0);
}
default:
{
puts("输入错误!!!");
system("PAUSE");
system("CLS");
continue;
}
}
system("PAUSE");
system("CLS");
}
return 0;
}