学了一学期C语言,期末老师出了道大的程序设计题,我实在无法完成,请各位C编程高手指点不才,不胜感激。
1.定义一个函数voidgetScore(inta[],intn);用于保存从键盘输入的n个成绩。2.定义一个函数为voidsort(inta[],intn),进行n个学...
1. 定义一个函数void getScore(int a[],int n);用于保存从键盘输入的n个成绩。
2. 定义一个函数为void sort(int a[],int n),进行n个学生成绩从高到低排名。
3. 改进第二步的函数为void sort(int a[],int n, char style);将n个学生成绩排序,排序方式根据sort()函数的style参数进行,如style为‘a’按升序排,style为’d’按降序排。
4. 定义一个查找函数int foundScore(int a[],int n,int score);要求:查找成功返回数组下标值,否则返回-1。
5. 定义一个插入函数void insertScore(int a[],int *n,int score);n是数组中实际存放成绩的个数,要求将score插入到最后一个成绩的后面(提示:插入前判断数组是否已满)。
6. 定义一个删除函数void deleteScore(int a[],int *n,int score);n是数组中实际存放成绩的个数,要求将数组中成绩为score元素删除(提示:删除前判断数组是否空)。
7. 定义一个输出函数void displayScore(int a[],int n);要求:输出数组中所有成绩。
8. 将上述功能通过菜单组织起来,要求程序运行时先显示一个菜单,通过菜单项选择对应功能。菜单中应包含退出选项。 展开
2. 定义一个函数为void sort(int a[],int n),进行n个学生成绩从高到低排名。
3. 改进第二步的函数为void sort(int a[],int n, char style);将n个学生成绩排序,排序方式根据sort()函数的style参数进行,如style为‘a’按升序排,style为’d’按降序排。
4. 定义一个查找函数int foundScore(int a[],int n,int score);要求:查找成功返回数组下标值,否则返回-1。
5. 定义一个插入函数void insertScore(int a[],int *n,int score);n是数组中实际存放成绩的个数,要求将score插入到最后一个成绩的后面(提示:插入前判断数组是否已满)。
6. 定义一个删除函数void deleteScore(int a[],int *n,int score);n是数组中实际存放成绩的个数,要求将数组中成绩为score元素删除(提示:删除前判断数组是否空)。
7. 定义一个输出函数void displayScore(int a[],int n);要求:输出数组中所有成绩。
8. 将上述功能通过菜单组织起来,要求程序运行时先显示一个菜单,通过菜单项选择对应功能。菜单中应包含退出选项。 展开
展开全部
#include <stdio.h>
#include <windows.h>
#define BUFFER 100
void getScore(int a[],int n);
void sort(int a[],int n);
void sort(int a[],int n, char style);
int foundScore(int a[],int n,int score);
void insertScore(int a[],int *n,int score);
void deleteScore(int a[],int *n,int score);
void displayScore(int a[],int n);
void main_menu();
int score[BUFFER]={-1}; //-1 表示没有成绩
void getScore(int a[],int n)
{
for (int i=0;i!=n;++i)
{
printf("请输入第%d个成绩:\n",i+1);
scanf("%d",&a[i]);
}
}
void sort(int a[],int n)
{
printf("从高到低排序\n");
for (int j=0;j!=n-1;++j)
{
for (int i=0;i!=n-1-j;++i)
{
if (a[i]<a[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("排序后输出:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
void sort(int a[],int n, char style)
{
if (style=='a')
{
printf("按升序排序\n");
for (int j=0;j!=n-1;++j)
{
for (int i=0;i!=n-1-j;++i)
{
if (a[i]>a[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("排序后输出:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
else if (style=='b')
{
printf("按降序排序\n");
for (int j=0;j!=n-1;++j)
{
for (int i=0;i!=n-1-j;++i)
{
if (a[i]<a[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("排序后输出:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
else
{
printf("输出错误");
}
}
int foundScore(int a[],int n,int score)
{
for (int i=0;i!=n;++i)
{
if (a[i]==score)
{
printf("你要查找的成绩%d下标是:%d",a[i],i);
break;
}
}
if (i==n)
{
printf("没有找到\n");
return -1;
}
return i;
}
void insertScore(int a[],int *n,int score)
{
if (BUFFER>*n)
{
a[++(*n)]=score;
printf("%d",a[*n]);
printf("插入成功\n");
}
else
{
printf("数组已满\n");
}
}
void deleteScore(int a[],int *n,int score)
{
if (*n!=0)
{
int temp=foundScore(a,*n,score);
for (;temp!=*n;++temp)
{
a[temp]=a[temp+1];
}
*n--;
printf("删除成功\n");
}
else
{
printf("数组是空的\n");
}
}
void displayScore(int a[],int n)
{
printf("输出所有成绩:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
int main_menu(int choice)
{
printf("\n\n\t\t\t 学生成绩管理\n");
printf("\t\t\t1、输入成绩\n");
printf("\t\t\t2、成绩从高到低排名\n");
printf("\t\t\t3、成绩排名\n");
printf("\t\t\t4、成绩查找\n");
printf("\t\t\t5、成绩插入\n");
printf("\t\t\t6、成绩删除\n");
printf("\t\t\t7、输出成绩\n");
printf("\t\t\t0、退出\n");
printf("\t\t 你的输入:");
scanf("%d",&choice);
return choice;
}
int main()
{
int choice=0;
int flag=0;
int num=0,temp;
char way;
while(1)
{
system("cls");
switch (main_menu(choice))
{
case 1:
system("cls");
printf("请输入要输入的成绩个数:");
scanf("%d",&num);
getScore(score,num);
system("pause");
break;
case 2:
system("cls");
sort(score,num);
system("pause");
break;
case 3:
system("cls");
printf("请输入排序方式:\ta==升序\tb==降序\n");
fflush(stdin); //清除缓冲
scanf("%c",&way);
sort(score,num,way);
system("pause");
break;
case 4:
system("cls");
printf("请输入你要查找的成绩:");
fflush(stdin);
scanf("%d",&temp);
foundScore(score,num,temp);
system("pause");
break;
case 5:
system("cls");
printf("请输入你要插入的成绩:");
fflush(stdin);
scanf("%d",&temp);
insertScore(score,&num,temp);
system("pause");
break;
case 6:
system("cls");
printf("请输入你要删除的成绩:");
fflush(stdin);
scanf("%d",&temp);
deleteScore(score,&num,temp);
system("pause");
break;
case 7:
system("cls");
displayScore(score,num);
system("pause");
break;
case 0:
flag=1;
break;
}
if (flag)
{
system("cls");
printf("感谢使用!");
break;
}
}
return 0;
}
#include <windows.h>
#define BUFFER 100
void getScore(int a[],int n);
void sort(int a[],int n);
void sort(int a[],int n, char style);
int foundScore(int a[],int n,int score);
void insertScore(int a[],int *n,int score);
void deleteScore(int a[],int *n,int score);
void displayScore(int a[],int n);
void main_menu();
int score[BUFFER]={-1}; //-1 表示没有成绩
void getScore(int a[],int n)
{
for (int i=0;i!=n;++i)
{
printf("请输入第%d个成绩:\n",i+1);
scanf("%d",&a[i]);
}
}
void sort(int a[],int n)
{
printf("从高到低排序\n");
for (int j=0;j!=n-1;++j)
{
for (int i=0;i!=n-1-j;++i)
{
if (a[i]<a[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("排序后输出:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
void sort(int a[],int n, char style)
{
if (style=='a')
{
printf("按升序排序\n");
for (int j=0;j!=n-1;++j)
{
for (int i=0;i!=n-1-j;++i)
{
if (a[i]>a[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("排序后输出:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
else if (style=='b')
{
printf("按降序排序\n");
for (int j=0;j!=n-1;++j)
{
for (int i=0;i!=n-1-j;++i)
{
if (a[i]<a[i+1])
{
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("排序后输出:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
else
{
printf("输出错误");
}
}
int foundScore(int a[],int n,int score)
{
for (int i=0;i!=n;++i)
{
if (a[i]==score)
{
printf("你要查找的成绩%d下标是:%d",a[i],i);
break;
}
}
if (i==n)
{
printf("没有找到\n");
return -1;
}
return i;
}
void insertScore(int a[],int *n,int score)
{
if (BUFFER>*n)
{
a[++(*n)]=score;
printf("%d",a[*n]);
printf("插入成功\n");
}
else
{
printf("数组已满\n");
}
}
void deleteScore(int a[],int *n,int score)
{
if (*n!=0)
{
int temp=foundScore(a,*n,score);
for (;temp!=*n;++temp)
{
a[temp]=a[temp+1];
}
*n--;
printf("删除成功\n");
}
else
{
printf("数组是空的\n");
}
}
void displayScore(int a[],int n)
{
printf("输出所有成绩:\n");
for (int i=0;i!=n;++i)
{
printf("%d\n",a[i]);
}
}
int main_menu(int choice)
{
printf("\n\n\t\t\t 学生成绩管理\n");
printf("\t\t\t1、输入成绩\n");
printf("\t\t\t2、成绩从高到低排名\n");
printf("\t\t\t3、成绩排名\n");
printf("\t\t\t4、成绩查找\n");
printf("\t\t\t5、成绩插入\n");
printf("\t\t\t6、成绩删除\n");
printf("\t\t\t7、输出成绩\n");
printf("\t\t\t0、退出\n");
printf("\t\t 你的输入:");
scanf("%d",&choice);
return choice;
}
int main()
{
int choice=0;
int flag=0;
int num=0,temp;
char way;
while(1)
{
system("cls");
switch (main_menu(choice))
{
case 1:
system("cls");
printf("请输入要输入的成绩个数:");
scanf("%d",&num);
getScore(score,num);
system("pause");
break;
case 2:
system("cls");
sort(score,num);
system("pause");
break;
case 3:
system("cls");
printf("请输入排序方式:\ta==升序\tb==降序\n");
fflush(stdin); //清除缓冲
scanf("%c",&way);
sort(score,num,way);
system("pause");
break;
case 4:
system("cls");
printf("请输入你要查找的成绩:");
fflush(stdin);
scanf("%d",&temp);
foundScore(score,num,temp);
system("pause");
break;
case 5:
system("cls");
printf("请输入你要插入的成绩:");
fflush(stdin);
scanf("%d",&temp);
insertScore(score,&num,temp);
system("pause");
break;
case 6:
system("cls");
printf("请输入你要删除的成绩:");
fflush(stdin);
scanf("%d",&temp);
deleteScore(score,&num,temp);
system("pause");
break;
case 7:
system("cls");
displayScore(score,num);
system("pause");
break;
case 0:
flag=1;
break;
}
if (flag)
{
system("cls");
printf("感谢使用!");
break;
}
}
return 0;
}
展开全部
没有时间帮你改
我这里有个以前交的作业
如果你真学过C
那应该是可以看懂的
自己改改吧
这个是用链表做的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct student)
struct student
{
char xh[12]; //学号 主键
char xm[12]; //姓名
int sxcj; //数学成绩
int cxsj; //程序设计成绩
int zf; //总分
struct student *next; //指向下条记录
struct student *prev; //指向上条记录
};
struct student *head=NULL; //链表头指针,定义为全局变量
struct student *tail=NULL; //链表尾指针,定义为全局变量
struct student *current=NULL; //链表结点指针,定义为全局变量
int nodes; //接点数
void orderprint()
{
struct student *p;
p=head;
if(head==NULL)
{
printf("\n没有记录!");
}
else
{
printf("\n");
do
{
printf("%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
p=p->next;
}
while(p!=NULL);
}
}
void order(int tag)
{ void save(int); //save函数申明
int i,min,nodes1=0;
struct student *head1,*tail1,*p;
if(head==NULL)
{
printf("\n没有找到记录!\n");
}
else
{
for(i=0;i<nodes;i++)
{
p=head;
current=NULL;
if(tag==1)
{
min=p->sxcj;
do
{
if(p->sxcj<=min)
{
min=p->sxcj;
current=p;
}
p=p->next;
}
while(p!=NULL);
}
if(tag==2)
{
min=p->cxsj;
do
{
if(p->cxsj<=min)
{
min=p->cxsj;
current=p;
}
p=p->next;
}
while(p!=NULL);
}
if(tag==3)
{
min=p->zf;
do
{
if(p->zf<=min)
{
min=p->zf;
current=p;
}
p=p->next;
}
while(p!=NULL);
}
if(current==head) //老链表中去掉该节点
{
head=head->next;
if(head!=NULL)
{
head->prev=NULL;
}
}
else if(current==tail)
{
tail=tail->prev;
tail->next=NULL;
}
else
{
(current->prev)->next=current->next;
(current->next)->prev=current->prev;
}
if(nodes1==0) //插入新的链表
{
head1=current;
tail1=current;
current->prev=NULL;
current->next=NULL;
nodes1+=1;
}
else
{
current->prev=tail1;
tail1->next=current;
tail1=current;
tail1->next=NULL;
nodes1+=1;
}
}
}
head=head1;
tail=tail1;
nodes=nodes1;
head1=NULL;
tail1=NULL;
current=NULL;
orderprint();
save(tag);
}
void load() //读取记录
{
int i;
FILE *fp;
struct student *p;
fp=fopen("nodes.txt","r");
fscanf(fp,"%d",&nodes);
fclose(fp);
fp=fopen("students.txt","rb");
if(fp==NULL)
{
printf("\n\n载入记录失败!\n");
}
else
{
for(i=0;i<nodes;i++)
{
p=(struct student * )malloc(LEN);
fread(p,LEN,1,fp);
if(i==0)
{
head=p;
tail=p;
head->prev=NULL;
tail->next=NULL;
}
else
{
p->prev=tail;
tail->next=p;
tail=p;
tail->next=NULL;
}
}
printf("\n\n成功载入记录!\n");
}
}
void save(int tag) //记录存入文件
{
int i;
struct student *p;
FILE *fp;
if(tag==1)
{
fp=fopen("sxcj.txt","wb");
}
if(tag==2)
{
fp=fopen("cxsj.txt","wb");
}
if(tag==3)
{
fp=fopen("zf.txt","wb");
}
if(tag==7)
{
fp=fopen("students.txt","wb");
}
p=head;
if(fp==NULL)
{
printf("\n\n保存失败!\n");
}
else
{
do
{
if(fwrite(p,LEN,1,fp)!=1)
{
printf("file write error\n");
}
p=p->next;
}
while(p!=NULL);
}
fclose(fp);
fp=fopen("nodes.txt","w");
if(fp==NULL)
{
printf("\n\n节点数保存失败!\n");
}
else
{
fprintf(fp,"%d",nodes);
}
fclose(fp);
current=NULL;
}
int select(struct student *p1) //查询
{
struct student *p;
p=head;
current=NULL;
if(p==NULL)
{
return 1;
}
else
{
do
{
if(strcmp(p->xh,p1->xh)==0)
{
current=p; //记录符合记录的位置
return 0;
}
p=p->next;
}
while(p!=NULL);
return 1;
}
}
void selectbyxh() //学号查询
{
struct student *p;
p=(struct student * )malloc(LEN);
printf("\n请输入需要查找的学生的学号:");
scanf("%s",p->xh);
if(select(p))
{
printf("\n未找到该学生的信息!");
}
else
{
printf("\n%12s%12s%4d%4d%4d\n",current->xh,current->xm,current->sxcj,current->cxsj,current->zf);
}
}
void selectbyxm() //姓名查询
{
struct student *p,*p1;
p1=(struct student * )malloc(LEN);
printf("\n请输入需要查找的学生的姓名:");
scanf("%s",p1->xm);
p=head;
current=NULL;
if(p==NULL)
{
printf("\n未找到记录!\n");
}
else
{
do
{
if(strcmp(p->xm,p1->xm)==0)
{
current=p; //记录查找到的位置
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
}
p=p->next;
}
while(p!=NULL);
}
}
void selectbysxcj() //数学成绩查询
{
struct student *p,*p1;
int tag=0; //标记
p1=(struct student * )malloc(LEN);
printf("\n请输入数学成绩:");
scanf("%d",&p1->sxcj);
p=head;
if(p==NULL)
{
printf("\n未找到成绩大于%d的同学!\n",p1->sxcj);
}
else
{
do
{
if(p->sxcj>=p1->sxcj)
{
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
tag=1;
}
p=p->next;
}
while(p!=NULL);
if(tag==0)
{
printf("\n未找到数学成绩大于等于%d的同学!\n",p1->sxcj);
}
}
}
void selectbycxsj() //程序设计成绩查询
{
struct student *p;
struct student *p1;
int tag=0; //标记
p1=(struct student *)malloc(LEN);
printf("\n请输入程序设计成绩:");
scanf("%d",&(p1->cxsj));
p=head;
if(p==NULL)
{
printf("\n未找到成绩大于%d的同学!\n",p1->cxsj);
}
else
{
do
{
if(p->cxsj>=p1->cxsj)
{
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
tag=1;
}
p=p->next;
}
while(p!=NULL);
if(tag==0)
{
printf("\n未找到程序设计大于等于%d的同学!\n",p1->cxsj);
}
}
}
void selectbyzf() //总分查询
{
struct student *p;
struct student *p1;
int tag=0; //标记
p1=(struct student * )malloc(LEN);
printf("\n请输入总分:");
scanf("%d",&p1->zf);
p=head;
if(p==NULL)
{
printf("\n未找到总分大于等于%d的同学!\n",p1->zf);
}
else
{
do
{
if(p->zf>=p1->zf)
{
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
tag=1; //修改标记
}
p=p->next;
}
while(p!=NULL);
if(tag==0)
{
printf("\n未找到总分大于等于%d的同学!\n",p1->zf);
}
}
}
void addstudent() //添加学生
{
struct student *p;
printf("\n请按照:学号 姓名 数学成绩 程序设计成绩 结束请输入0!\n");
p=(struct student * )malloc(LEN);
scanf("%s%s%d%d",p->xh,p->xm,&(p->sxcj),&(p->cxsj));
(p->zf)=(p->sxcj)+(p->cxsj);
if(nodes==0)
{
head=p;
tail=p;
p->prev=NULL;
p->next=NULL;
nodes+=1;
}
else
{
if(select(p))
{
p->prev=tail;
tail->next=p;
tail=p;
tail->next=NULL;
nodes+=1;
}
else
{
printf("\n请不重复录入学号为");
puts(p->xh);
printf("学生的成绩!\n");
}
}
}
void delstudent() //删除记录
{
struct student *p;
current=NULL;
p=(struct student * )malloc(LEN);
printf("\n请输入需要删除的学生的学号:");
scanf("%s",p->xh);
if(select(p))
{
printf("\n\n数据库中未找到该学生资料!\n");
}
else
{
if(current==head) //在链表表头找到学生
{
head=current->next;
if(head!=NULL)
{
head->prev=NULL;
}
free(current);
printf("\n删除成功!\n");
orderprint();
}
else if(current==tail) //在链表表尾找到学生
{
tail=current->prev;
tail->next=NULL;
free(current);
printf("\n删除成功!\n");
orderprint();
}
else
{
(current->prev)->next=current->next;
(current->next)->prev=current->prev;
free(current);
printf("\n删除成功!\n");
orderprint();
}
nodes-=1;
}
current=NULL;
}
void creatnewlist()
{
int goon=1;
nodes=0;
while(1)
{
if(goon)
{
addstudent();
printf("\n继续输入请按1、输入完成请按0:\n");
scanf("%d",&goon);
}
else
{
break;
}
}
}
void main()
{
load();
int menu; //1级菜单
int menu1; //2级菜单
int menu2; //2级菜单
while(1)
{
printf("\n1.新建数据 2.添加数据 3.删除数据 4.查看记录 5.排序 6查询 7.退出\n");
printf("\n请选择:");
scanf("%d",&menu);
if(menu==1)
{
creatnewlist();
}
else if(menu==2)
{
addstudent();
}
else if(menu==3)
{
delstudent();
}
else if(menu==4)
{
orderprint();
}
else if(menu==5)
{
while(1)
{
printf("\n1.数学成绩排序 2.程序设计成绩排序 3.总分排序。4.返回主菜单\n");
printf("\n请选择:");
scanf("%d",&menu1);
if(menu1==1)
{
order(menu1);
}
else if(menu1==2)
{
order(menu1);
}
else if(menu1==3)
{
order(menu1);
}
else if(menu1==4)
{
break;
}
}
}
else if(menu==6)
{
while(1)
{
printf("\n1.按学号查询 2.按姓名查询 3.按数学成绩查询。4.按程序设计成绩查询 5.按总分查询 6.返回主菜单\n");
printf("\n请选择查询方式:");
scanf("%d",&menu2);
if(menu2==1)
{
selectbyxh();
}
else if(menu2==2)
{
selectbyxm();
}
else if(menu2==3)
{
selectbysxcj();
}
else if(menu2==4)
{
selectbycxsj();
}
else if(menu2==5)
{
selectbyzf();
}
else if(menu2==6)
{
break;
}
}
}
else if(menu==7)
{
if(nodes!=0)
{
save(menu);
}
exit(0);
}
else
{
printf("\n请重新选择:\n");
}
}
}
我这里有个以前交的作业
如果你真学过C
那应该是可以看懂的
自己改改吧
这个是用链表做的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct student)
struct student
{
char xh[12]; //学号 主键
char xm[12]; //姓名
int sxcj; //数学成绩
int cxsj; //程序设计成绩
int zf; //总分
struct student *next; //指向下条记录
struct student *prev; //指向上条记录
};
struct student *head=NULL; //链表头指针,定义为全局变量
struct student *tail=NULL; //链表尾指针,定义为全局变量
struct student *current=NULL; //链表结点指针,定义为全局变量
int nodes; //接点数
void orderprint()
{
struct student *p;
p=head;
if(head==NULL)
{
printf("\n没有记录!");
}
else
{
printf("\n");
do
{
printf("%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
p=p->next;
}
while(p!=NULL);
}
}
void order(int tag)
{ void save(int); //save函数申明
int i,min,nodes1=0;
struct student *head1,*tail1,*p;
if(head==NULL)
{
printf("\n没有找到记录!\n");
}
else
{
for(i=0;i<nodes;i++)
{
p=head;
current=NULL;
if(tag==1)
{
min=p->sxcj;
do
{
if(p->sxcj<=min)
{
min=p->sxcj;
current=p;
}
p=p->next;
}
while(p!=NULL);
}
if(tag==2)
{
min=p->cxsj;
do
{
if(p->cxsj<=min)
{
min=p->cxsj;
current=p;
}
p=p->next;
}
while(p!=NULL);
}
if(tag==3)
{
min=p->zf;
do
{
if(p->zf<=min)
{
min=p->zf;
current=p;
}
p=p->next;
}
while(p!=NULL);
}
if(current==head) //老链表中去掉该节点
{
head=head->next;
if(head!=NULL)
{
head->prev=NULL;
}
}
else if(current==tail)
{
tail=tail->prev;
tail->next=NULL;
}
else
{
(current->prev)->next=current->next;
(current->next)->prev=current->prev;
}
if(nodes1==0) //插入新的链表
{
head1=current;
tail1=current;
current->prev=NULL;
current->next=NULL;
nodes1+=1;
}
else
{
current->prev=tail1;
tail1->next=current;
tail1=current;
tail1->next=NULL;
nodes1+=1;
}
}
}
head=head1;
tail=tail1;
nodes=nodes1;
head1=NULL;
tail1=NULL;
current=NULL;
orderprint();
save(tag);
}
void load() //读取记录
{
int i;
FILE *fp;
struct student *p;
fp=fopen("nodes.txt","r");
fscanf(fp,"%d",&nodes);
fclose(fp);
fp=fopen("students.txt","rb");
if(fp==NULL)
{
printf("\n\n载入记录失败!\n");
}
else
{
for(i=0;i<nodes;i++)
{
p=(struct student * )malloc(LEN);
fread(p,LEN,1,fp);
if(i==0)
{
head=p;
tail=p;
head->prev=NULL;
tail->next=NULL;
}
else
{
p->prev=tail;
tail->next=p;
tail=p;
tail->next=NULL;
}
}
printf("\n\n成功载入记录!\n");
}
}
void save(int tag) //记录存入文件
{
int i;
struct student *p;
FILE *fp;
if(tag==1)
{
fp=fopen("sxcj.txt","wb");
}
if(tag==2)
{
fp=fopen("cxsj.txt","wb");
}
if(tag==3)
{
fp=fopen("zf.txt","wb");
}
if(tag==7)
{
fp=fopen("students.txt","wb");
}
p=head;
if(fp==NULL)
{
printf("\n\n保存失败!\n");
}
else
{
do
{
if(fwrite(p,LEN,1,fp)!=1)
{
printf("file write error\n");
}
p=p->next;
}
while(p!=NULL);
}
fclose(fp);
fp=fopen("nodes.txt","w");
if(fp==NULL)
{
printf("\n\n节点数保存失败!\n");
}
else
{
fprintf(fp,"%d",nodes);
}
fclose(fp);
current=NULL;
}
int select(struct student *p1) //查询
{
struct student *p;
p=head;
current=NULL;
if(p==NULL)
{
return 1;
}
else
{
do
{
if(strcmp(p->xh,p1->xh)==0)
{
current=p; //记录符合记录的位置
return 0;
}
p=p->next;
}
while(p!=NULL);
return 1;
}
}
void selectbyxh() //学号查询
{
struct student *p;
p=(struct student * )malloc(LEN);
printf("\n请输入需要查找的学生的学号:");
scanf("%s",p->xh);
if(select(p))
{
printf("\n未找到该学生的信息!");
}
else
{
printf("\n%12s%12s%4d%4d%4d\n",current->xh,current->xm,current->sxcj,current->cxsj,current->zf);
}
}
void selectbyxm() //姓名查询
{
struct student *p,*p1;
p1=(struct student * )malloc(LEN);
printf("\n请输入需要查找的学生的姓名:");
scanf("%s",p1->xm);
p=head;
current=NULL;
if(p==NULL)
{
printf("\n未找到记录!\n");
}
else
{
do
{
if(strcmp(p->xm,p1->xm)==0)
{
current=p; //记录查找到的位置
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
}
p=p->next;
}
while(p!=NULL);
}
}
void selectbysxcj() //数学成绩查询
{
struct student *p,*p1;
int tag=0; //标记
p1=(struct student * )malloc(LEN);
printf("\n请输入数学成绩:");
scanf("%d",&p1->sxcj);
p=head;
if(p==NULL)
{
printf("\n未找到成绩大于%d的同学!\n",p1->sxcj);
}
else
{
do
{
if(p->sxcj>=p1->sxcj)
{
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
tag=1;
}
p=p->next;
}
while(p!=NULL);
if(tag==0)
{
printf("\n未找到数学成绩大于等于%d的同学!\n",p1->sxcj);
}
}
}
void selectbycxsj() //程序设计成绩查询
{
struct student *p;
struct student *p1;
int tag=0; //标记
p1=(struct student *)malloc(LEN);
printf("\n请输入程序设计成绩:");
scanf("%d",&(p1->cxsj));
p=head;
if(p==NULL)
{
printf("\n未找到成绩大于%d的同学!\n",p1->cxsj);
}
else
{
do
{
if(p->cxsj>=p1->cxsj)
{
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
tag=1;
}
p=p->next;
}
while(p!=NULL);
if(tag==0)
{
printf("\n未找到程序设计大于等于%d的同学!\n",p1->cxsj);
}
}
}
void selectbyzf() //总分查询
{
struct student *p;
struct student *p1;
int tag=0; //标记
p1=(struct student * )malloc(LEN);
printf("\n请输入总分:");
scanf("%d",&p1->zf);
p=head;
if(p==NULL)
{
printf("\n未找到总分大于等于%d的同学!\n",p1->zf);
}
else
{
do
{
if(p->zf>=p1->zf)
{
printf("\n%12s%12s%4d%4d%4d\n",p->xh,p->xm,p->sxcj,p->cxsj,p->zf);
tag=1; //修改标记
}
p=p->next;
}
while(p!=NULL);
if(tag==0)
{
printf("\n未找到总分大于等于%d的同学!\n",p1->zf);
}
}
}
void addstudent() //添加学生
{
struct student *p;
printf("\n请按照:学号 姓名 数学成绩 程序设计成绩 结束请输入0!\n");
p=(struct student * )malloc(LEN);
scanf("%s%s%d%d",p->xh,p->xm,&(p->sxcj),&(p->cxsj));
(p->zf)=(p->sxcj)+(p->cxsj);
if(nodes==0)
{
head=p;
tail=p;
p->prev=NULL;
p->next=NULL;
nodes+=1;
}
else
{
if(select(p))
{
p->prev=tail;
tail->next=p;
tail=p;
tail->next=NULL;
nodes+=1;
}
else
{
printf("\n请不重复录入学号为");
puts(p->xh);
printf("学生的成绩!\n");
}
}
}
void delstudent() //删除记录
{
struct student *p;
current=NULL;
p=(struct student * )malloc(LEN);
printf("\n请输入需要删除的学生的学号:");
scanf("%s",p->xh);
if(select(p))
{
printf("\n\n数据库中未找到该学生资料!\n");
}
else
{
if(current==head) //在链表表头找到学生
{
head=current->next;
if(head!=NULL)
{
head->prev=NULL;
}
free(current);
printf("\n删除成功!\n");
orderprint();
}
else if(current==tail) //在链表表尾找到学生
{
tail=current->prev;
tail->next=NULL;
free(current);
printf("\n删除成功!\n");
orderprint();
}
else
{
(current->prev)->next=current->next;
(current->next)->prev=current->prev;
free(current);
printf("\n删除成功!\n");
orderprint();
}
nodes-=1;
}
current=NULL;
}
void creatnewlist()
{
int goon=1;
nodes=0;
while(1)
{
if(goon)
{
addstudent();
printf("\n继续输入请按1、输入完成请按0:\n");
scanf("%d",&goon);
}
else
{
break;
}
}
}
void main()
{
load();
int menu; //1级菜单
int menu1; //2级菜单
int menu2; //2级菜单
while(1)
{
printf("\n1.新建数据 2.添加数据 3.删除数据 4.查看记录 5.排序 6查询 7.退出\n");
printf("\n请选择:");
scanf("%d",&menu);
if(menu==1)
{
creatnewlist();
}
else if(menu==2)
{
addstudent();
}
else if(menu==3)
{
delstudent();
}
else if(menu==4)
{
orderprint();
}
else if(menu==5)
{
while(1)
{
printf("\n1.数学成绩排序 2.程序设计成绩排序 3.总分排序。4.返回主菜单\n");
printf("\n请选择:");
scanf("%d",&menu1);
if(menu1==1)
{
order(menu1);
}
else if(menu1==2)
{
order(menu1);
}
else if(menu1==3)
{
order(menu1);
}
else if(menu1==4)
{
break;
}
}
}
else if(menu==6)
{
while(1)
{
printf("\n1.按学号查询 2.按姓名查询 3.按数学成绩查询。4.按程序设计成绩查询 5.按总分查询 6.返回主菜单\n");
printf("\n请选择查询方式:");
scanf("%d",&menu2);
if(menu2==1)
{
selectbyxh();
}
else if(menu2==2)
{
selectbyxm();
}
else if(menu2==3)
{
selectbysxcj();
}
else if(menu2==4)
{
selectbycxsj();
}
else if(menu2==5)
{
selectbyzf();
}
else if(menu2==6)
{
break;
}
}
}
else if(menu==7)
{
if(nodes!=0)
{
save(menu);
}
exit(0);
}
else
{
printf("\n请重新选择:\n");
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
#include <stdlib.h>
#define MAX 100//数组最大边界值
void getScore(int a[],int n)
{
int i;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
}
/*
void sort(int a[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}*/
void sort(int a[],int n,char style)//改进后
{
int i,j,k;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
{
if((style=='a' && a[i]<a[j]) || (style=='d' && a[i]>a[j]))
{
//判断升降序
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
int foundScore(int a[],int n,int score)
{
int i;
for(i=0; i<n; i++)
if(a[i]==score)return i;
return -1;
}
void insertScore(int a[],int *n,int score)
{
if(*n>MAX)printf("数组已满!\n");
else a[(*n)++]=score;
}
void deleteScore(int a[],int *n,int score)
{
int s,i;
if(*n<0)printf("数组为空!\n");
else
{
s=foundScore(a,*n,score);
if(s>=0)
{
for(i=s; i<*n-1; i++)a[i]=a[i+1];
(*n)--;
}
else printf("未找到成绩为%d的元素",score);
}
}
void displayScore(int a[],int n)
{
int i;
for(i=0; i<n; i++)printf("%d ",a[i]);
printf("\n");
}
int main()
{
int a[MAX],tag,n,score;
char style;
while(1)
{
printf("1,输入学生成绩\n2,学生成绩排序\n3,插入学生成绩\n4,删除学生成绩\n5,显示学生成绩\n6,退出\n");
scanf("%d",&tag);
switch(tag)
{
case 1:
printf("请输入学生成绩数量\n");
scanf("%d",&n);
printf("请输入学生成绩\n");
getScore(a,n);
break;
case 2:
printf("请输入排序标识,升序为a,降序为d\n");
//while((style=getchar())!='\n');//如果是输一个数值就按回车,请加上这一行
scanf("%c",&style);
sort(a,n,style);
break;
case 3:
printf("请输入要插入的成绩!\n");
scanf("%d",&score);
insertScore(a,&n,score);
break;
case 4:
printf("请输入要删除的成绩\n");
scanf("%d",&score);
deleteScore(a,&n,score);
break;
case 5:
displayScore(a,n);
break;
case 6:
break;
default:
printf("未识别标识,请重新输入\n");
}
if(tag==6)break;
if(tag!=5)system("cls");
}
return 0;
}
//此代码未经严格测试,请慎重选择
#include <stdlib.h>
#define MAX 100//数组最大边界值
void getScore(int a[],int n)
{
int i;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
}
/*
void sort(int a[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}*/
void sort(int a[],int n,char style)//改进后
{
int i,j,k;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
{
if((style=='a' && a[i]<a[j]) || (style=='d' && a[i]>a[j]))
{
//判断升降序
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
int foundScore(int a[],int n,int score)
{
int i;
for(i=0; i<n; i++)
if(a[i]==score)return i;
return -1;
}
void insertScore(int a[],int *n,int score)
{
if(*n>MAX)printf("数组已满!\n");
else a[(*n)++]=score;
}
void deleteScore(int a[],int *n,int score)
{
int s,i;
if(*n<0)printf("数组为空!\n");
else
{
s=foundScore(a,*n,score);
if(s>=0)
{
for(i=s; i<*n-1; i++)a[i]=a[i+1];
(*n)--;
}
else printf("未找到成绩为%d的元素",score);
}
}
void displayScore(int a[],int n)
{
int i;
for(i=0; i<n; i++)printf("%d ",a[i]);
printf("\n");
}
int main()
{
int a[MAX],tag,n,score;
char style;
while(1)
{
printf("1,输入学生成绩\n2,学生成绩排序\n3,插入学生成绩\n4,删除学生成绩\n5,显示学生成绩\n6,退出\n");
scanf("%d",&tag);
switch(tag)
{
case 1:
printf("请输入学生成绩数量\n");
scanf("%d",&n);
printf("请输入学生成绩\n");
getScore(a,n);
break;
case 2:
printf("请输入排序标识,升序为a,降序为d\n");
//while((style=getchar())!='\n');//如果是输一个数值就按回车,请加上这一行
scanf("%c",&style);
sort(a,n,style);
break;
case 3:
printf("请输入要插入的成绩!\n");
scanf("%d",&score);
insertScore(a,&n,score);
break;
case 4:
printf("请输入要删除的成绩\n");
scanf("%d",&score);
deleteScore(a,&n,score);
break;
case 5:
displayScore(a,n);
break;
case 6:
break;
default:
printf("未识别标识,请重新输入\n");
}
if(tag==6)break;
if(tag!=5)system("cls");
}
return 0;
}
//此代码未经严格测试,请慎重选择
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
貌似不难,只是我电脑上连软件都没装,也忘记罗,等其他人帮你解答吧,不过,估计,没人帮忙写这么多
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
哎…………看到这些东西才知道STL是多么的方便高效
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询