编程题 c语言求解
怎么这么多题啊?学生成绩信息管理软件这个给你吧。这是我专周做的呵呵现在用到了
#include
#include
#include //包含使用strcmp的头文件
void Menu(); //主菜单
void Infobase(); //信息维护
void Find(); //信息查询
void InfoStat(); //成绩统计
void Comp(); //成绩排序
void Find_ID(); //以学号查找
void Find_name(); //以姓名查找
void Infobase_add(); //录入信息
void Infobase_amend(); //修改信息
void Delete(); //删除信息
typedef struct //重命名学生信息结构体
{
char name[10]; //姓名
char sex[3]; //性别
int ID; //学号
int math; //数学成绩
int english; //英语成绩
int computer_C; //计算机C语言成绩
int sum; //成绩总和
}Student;
void main()
{
int chg=1,n;
printf("欢迎使用本管理系统,为了您的正常使用请在Debug下使用
");
while(chg)
{
Menu();
scanf("%d",&n);
switch(n)
{
case 1:
Infobase(); //信息维护
break;
case 2:
Find(); //信息查询
break;
case 3:
InfoStat(); //成绩统计
break;
case 4:
Comp();
break; //成绩排序
case 0:
chg=0; //退出菜单
printf("(^_^)谢谢使用!再见
");
break;
default:
printf("(~_~)选择错误(0~4)?请重新输入
");
}
}
getch();
}
/************************************主菜单画面***********************************************/
void Menu()
{
printf("********************
");
printf("** **
");
printf("** 主菜单 **
");
printf("** **
");
printf("********************
");
printf(" 1 信息维护
");
printf(" 2 信息查询
");
printf(" 3 成绩统计
");
printf(" 4 成绩排序
");
printf(" 0 退出菜单
");
}
/*************************************信息维护***********************************************/
void Infobase()
{
int n,chg=1;
while(chg)
{
printf("1 录入学生信息
");
printf("2 修改学生信息
");
printf("3 删除学生信息
");
printf("0 回到主菜单
");
scanf("%d",&n);
switch(n)
{
case 1:
Infobase_add(); //录入信息
break;
case 2:
Infobase_amend(); //修改信息
break;
case 3:
Delete(); //删除信息
case 0:
chg=0; //退回主菜单
break;
default :
printf("(~_~)选择错误请重新输入
:");
}
}
}
/*******************************录入信息*****************************************************/
void Infobase_add()
{
Student stu[1]; //定义Student型数组变量
FILE* fp=NULL; //声明文件指针
fp=fopen("专周.txt","a"); //以追加方式打开
printf("输入姓名 性别 学号 成绩(数学 外语 C语言)
");
scanf("%s%s%d%d%d%d", //接收输入
stu[0].name,
stu[0].sex,
&stu[0].ID,
&stu[0].math,
&stu[0].english,
&stu[0].computer_C);
stu[0].sum=stu[0].english+stu[0].computer_C+stu[0].math;//计算总分
if(fprintf(fp," %s %s %d %d %d %d %d
",//写入磁盘防错处理
stu[0].name,
stu[0].sex,
stu[0].ID,
stu[0].math,
stu[0].english,
stu[0].computer_C,
stu[0].sum)==0)
{
printf("写入失败");
}
fclose(fp); //关闭文件指针
}
/*********************************修改信息***************************************************/
void Infobase_amend()
{
int i,j;
char ch[10]; //声明字符数组以保存需修改的姓名
Student stu[50]; //声明Student型数组
FILE* fp=NULL; //声明文件指针
printf("输入需修改学生的名字");//提示输入
scanf("%s",ch); //接收输入姓名
fp=fopen("专周.txt","rt+"); //以可读写方式打开
for(i=0;;i++)
{
fscanf(fp," %s %s %d %d %d %d %d ",//从磁盘读入内存
stu[i].name,
stu[i].sex,
&stu[i].ID,
&stu[i].math,
&stu[i].english,
&stu[i].computer_C,
&stu[i].sum);
if(strcmp(stu[i].name,ch)==0) //判断是否查找所需
{
rewind(fp); //指针移到文件开头
printf("输入修改姓名 性别 学号 成绩(数学 外语 C语言)
");
scanf("%s%s%d%d%d%d", //接收输入
stu[i].name,
stu[i].sex,
&stu[i].ID,
&stu[i].math,
&stu[i].english,
&stu[i].computer_C);
j=i;
stu[i].sum=stu[i].english+stu[i].computer_C+stu[i].math;
for(i=0;i<j;i++)
{
fprintf(fp," %s %s %d %d %d %d %d
",//原数据写入磁盘
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum);
}
fprintf(fp," %s %s %d %d %d %d %d ",//将修改数据写入磁盘
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum);
fclose(fp); //关闭文件指针
break;
}
}
}
/**************************************删除信息********************************************/
void Delete()
{
int i,j,k=0;
char ch[10]; //声明字符数组以保存需删除的姓名
Student stu[50]; //声明Student型数组
FILE* fp=NULL,*fp1=NULL; //声明文件指针
printf("输入需删除学生的名字"); //提示输入
scanf("%s",ch); //接收输入姓名
fp=fopen("专周.txt","rt+"); //以可读写方式打开
for(i=0;!feof(fp);i++)
{
fscanf(fp," %s %s %d %d %d %d %d ",//从磁盘读入内存
stu[i].name,
stu[i].sex,
&stu[i].ID,
&stu[i].math,
&stu[i].english,
&stu[i].computer_C,
&stu[i].sum);
if(strcmp(stu[i].name,ch)==0) //判断是否查找所需
j=i;
}
rewind(fp); //指针移动到开头
for(;j<i-1;j++)
{
stu[j]=stu[j+1]; //覆盖需删除的后依次前移
}
for(i=0;i<j;i++)
fprintf(fp," %s %s %d %d %d %d %d
", //写入磁盘
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum);
}
fclose(fp);
/***************************************信息查询***********************************************/
void Find()
{
int n,chg=1; //声明chg变量用以循环
while(chg)
{
printf("1 按学号查询
");
printf("2 按姓名查询
");
printf("0 退回主菜单
");
scanf("%d",&n);
switch(n)
{
case 1:
Find_ID(); //调用以学号查找的函数
break;
case 2:
Find_name(); //调用以姓名查找的函数
break;
case 0:
chg=0; //退回主菜单
break;
default :printf("
(~_~)选择错误请重新输入
");
}
}
}
/*********************************按学号查找***************************************************/
void Find_ID()
{
int n,i;
Student stu[50]; //声明Student型数组变量
FILE* fp=NULL; //声明文件指针
printf("请输入学号"); //提示接收输入
scanf("%d",&n); //接收输入学号
fp=fopen("专周.txt","rt"); //以只读方式打开
for(i=0;!feof(fp);i++)
{
if(fscanf(fp," %s %s %d %d %d %d %d
", //防止读入内存失败
stu[i].name,
stu[i].sex,
&stu[i].ID,
&stu[i].math,
&stu[i].english,
&stu[i].computer_C,
&stu[i].sum)==0)
printf("读取失败");
if(stu[i].ID==n) //判断是否需查找学生
{
printf("查找到:%s 性别%s 学号%d 数学%d 外语%d C语言%d 总分%d
",//输出查找目标
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum);
break;
}
if(feof(fp)) //处理未找到情况
{
printf("无此学生信息
");
}
}fclose(fp); //关闭文件指针
}
/******************************按姓名查找*****************************************************/
void Find_name()
{
int i;
char ch[10]; //声明字符数组以储存查找姓名
Student stu[50]; //声明Student型数组变量
FILE* fp=NULL; //声明文件指针
printf("请输入姓名
"); //提示输入
scanf("%s",ch); //接收输入姓名
fp=fopen("专周.txt","rt"); //以只读方式打开
for(i=0;!feof(fp);i++) //循环,以文件指针到末尾结束循环
{
fscanf(fp," %s %s %d %d %d %d %d ",//从磁盘读入内存
stu[i].name,
stu[i].sex,
&stu[i].ID,
&stu[i].math,
&stu[i].english,
&stu[i].computer_C,
&stu[i].sum);
if(strcmp(stu[i].name,ch)==0) //判断是否查找学生
{
printf("查找到:%s 性别%s 学号%d 数学%d 外语%d C语言%d 总分%d
",//输出查找目标
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum);
break;
}
if(feof(fp)) //处理未找到情况
{
printf("无此学生信息
");
}
}fclose(fp); //关闭文件指针
}
/*********************************信息统计*****************************************************/
void InfoStat()
{
int n,m,i,count=0;
char ch[15]; //声明字符数组保存课程名
Student stu[60]; //声明Student型数组变量
FILE* fp=NULL; //声明文件指针
fp=fopen("专周.txt","rt"); //以只读方式打开
printf("输入课程名(数学 外语 C)和分数段(格式:数学 x1-x2)
");
scanf("%s",ch); //接收输入课程名
scanf("%d-%d",&n,&m); //接收输入分数段
for(i=0;!feof(fp);i++) //以文件指针到文件末尾结束循环
{
if(fscanf(fp," %s %s %d %d %d %d %d
", //防止读入内存失败
stu[i].name,
stu[i].sex,
&stu[i].ID,
&stu[i].math,
&stu[i].english,
&stu[i].computer_C,
&stu[i].sum)==0)
printf("读取失败");
count++;
}
fclose(fp); //关闭文件指针
/****************************以下输出查找目标**********************************************/
printf("姓名 性别 %s 总分
",ch);
for(i=0;i<count;i++)
if(strcmp(ch,"数学")==0 && stu[i].math>=n && stu[i].math<=m)
{
printf("%s%s%d%d
",
stu[i].name,
stu[i].sex,
stu[i].math,
stu[i].sum);
}
for(i=0;i<count;i++)
if(strcmp(ch,"外语")==0 && stu[i].english>=n && stu[i].english<=m)
{
printf("%s%s%d%d
",
stu[i].name,
stu[i].sex,
stu[i].english,
stu[i].sum);
}
for(i=0;i<count;i++)
if(!strcmp(ch,"C") && stu[i].computer_C>=n && stu[i].computer_C<=m)
{
printf("%s%s%d%d
",
stu[i].name,
stu[i].sex,
stu[i].english,
stu[i].sum);
}
}
/******************************成绩排序*******************************************************/
void Comp()
{
int i,k,j,count=0;
char ch[15]; //声明字符数组保存课程名
Student stu[50],temp; //声明Student型变量
FILE *fp=NULL; //声明文件指针
printf("请输入需要排序的课程名"); //提示输入
scanf("%s",ch); //接收输入的课程名
fp=fopen("专周.txt","rt"); //以读方式打开文件
for(i=0;!feof(fp);i++) //以文件指针到末尾结束循环
{
if(fscanf(fp," %s %s %d %d %d %d %d
", //防止读入内存失败
stu[i].name,
stu[i].sex,
&stu[i].ID,
&stu[i].math,
&stu[i].english,
&stu[i].computer_C,
&stu[i].sum)==0)
printf("读取失败");
count++; //记录文件内学生人数
}
fclose(fp); //关闭文件指针
if(strcmp(ch,"数学")==0)
{
for(i=0;i<count-1;i++) //以下为以降序顺序排序
{
k=i;
for(j=i+1;j<count;j++)
if(stu[k].math<stu[j].math)
k=j;
if(i!=k)
{
temp=stu[i];
stu[i]=stu[k];
stu[k]=temp;
}
}
printf("姓名 性别 学号 数学 外语 C语言 总分 数学成绩名次
");
for(i=0;i<count;i++)
{
printf("%-6s %4s %d %d %d %d %d %d
", //输出信息
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum,i+1);
}
}
if(strcmp(ch,"外语")==0)
{
for(i=0;i<count-1;i++) //以下为降序顺序排序
{
k=i;
for(j=i+1;j<count;j++)
if(stu[k].english<stu[j].english)
k=j;
if(i!=k)
{
temp=stu[i];
stu[i]=stu[k];
stu[k]=temp;
}
}
printf("姓名 性别 学号 数学 外语 C语言 总分 外语成绩名次
");
for(i=0;i<count;i++)
{
printf("%-6s %4s %d %d %d %d %d %d
", //输出信息
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum,i+1);
}
}
if(strcmp(ch,"C")==0)
{
for(i=0;i<count-1;i++) //以下为降序顺序排序
{
k=i;
for(j=i+1;j<count;j++)
if(stu[k].computer_C<stu[j].computer_C)
k=j;
if(i!=k)
{
temp=stu[i];
stu[i]=stu[k];
stu[k]=temp;
}
}
printf("姓名 性别 学号 数学 外语 C语言 总分 C语言成绩名次
");
for(i=0;i<count;i++)
{
printf("%-6s %4s %d %d %d %d %d %d
", //输出信息
stu[i].name,
stu[i].sex,
stu[i].ID,
stu[i].math,
stu[i].english,
stu[i].computer_C,
stu[i].sum,i+1);
}
}
}
#include
int count(char *s){
int n=0;
char *p;
p=s;
while(*p!='\0'){
if((*p>='A')&&(*p<='Z')){n++;}
p++;
}
return n;
}
main(){
char *s="This Is a c Program";
printf("%d
",count(s));
}
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#define DEBUG
#include <string.h>
struct scorenode
{
int number;/*学号*/
char name[8];/*姓名*/
float cj1;/*成绩1*/
float cj2;/*成绩2*/
float cj3;/*成绩3 */
struct scorenode *next;
};
typedef struct scorenode score;
int n,k;/*n,k为全局变量,本程序中的函数均可以使用它*/
/*==============================================================================================*/
score *creat(void)
/*函数creat,功能:创建链表,此函数带回一个指向链表头的指针*/
{
score*head;
score *p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
n=0;
p1=p2=p3=(score *)malloc(LEN);head=p3; /*申请一个新单元*/
printf("请输入学生资料,输0退出!\n");
repeat1: printf("请输入学生学号(学号应大于0):");/*输入大于0的学号*/
scanf("%d",&p1->number);
while(p1->number<0)
{
getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);
}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->number==0)
goto end;/*当输入的学号为0时,转到末尾,结束创建链表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++)
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat1;
/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name); /*输入学生姓名*/
printf("请输入cj1(0~100):"); /*输入cj1,成绩应在0-100*/
scanf("%f",&p1->cj1);
while(p1->cj1<0||p1->cj1>100)
{
getchar();
printf("输入错误,请重新输入cj1"); /*输入错误,重新输入成绩1*/
scanf("%f",&p1->cj1);
}
printf("请输入cj2(0~100):"); /*输入cj2,成绩应在0-100*/
scanf("%f",&p1->cj2);
while(p1->cj2<0||p1->cj2>100)
{
getchar();
printf("输入错误,请重新输入cj2"); /*输入错误,重新输入cj2直到正确为止*/
scanf("%f",&p1->cj2);
}
printf("请输入cj3(0~100):");/*输入cj3,成绩应在0-100*/
scanf("%f",&p1->cj3);
while(p1->cj3<0||p1->cj3>100)
{
getchar();
printf("输入错误,请重新输入cj3");
scanf("%f",&p1->cj3);} /*输入错误,重新输入cj3直到正确为止*/
head=NULL;
while(p1->number!=0)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN);
printf("请输入学生资料,输0退出!\n");
repeat2:printf("请输入学生学号(学号应大于0):");
scanf("%d",&p1->number); /*输入学号,学号应大于0*/
while(p1->number<0)
{
getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&p1->number);
}
/*输入学号为字符或小于0时,程序报错,提示重新输入学号*/
if(p1->number==0)
goto end; /*当输入的学号为0时,转到末尾,结束创建链表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++)
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat2;
/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
}
printf("请输入学生姓名:");
scanf("%s",&p1->name);/*输入学生姓名*/
printf("请输入cj1(0~100):");
scanf("%f",&p1->cj1);/*输入cj1,成绩应在0-100*/
while(p1->cj1<0||p1->cj1>100)
{
getchar();
printf("输入错误,请重新输入cj1");
scanf("%f",&p1->cj1);}/*输入错误,重新输入cj1直到正确为止*/
printf("请输入cj2(0~100):");
scanf("%f",&p1->cj2);/*输入cj2,成绩应在0-100*/
while(p1->cj2<0||p1->cj2>100)
{
getchar();
printf("输入错误,请重新输入cj2");
scanf("%f",&p1->cj2);
} /*输入错误,重新输入cj2绩直到正确为止*/
printf("请输入cj3(0~100):");
scanf("%f",&p1->cj3);/*输入cj3,成绩应在0-100*/
while(p1->cj3<0||p1->cj3>100)
{
getchar();
printf("输入错误,请重新输入cj3");
scanf("%f",&p1->cj3);} /*输入错误,重新输入cj3直到正确为止*/
}
end: p1=head;
p3=p1;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->cj1;
max->cj1=p1->cj1;
p1->cj1=fen;
/*交换前后结点中的cj1,使之与学号相匹配*/
fen=max->cj2;
max->cj2=p1->cj2;
p1->cj2=fen;
/*交换前后结点中的cj2,使之与学号相匹配*/
fen=max->cj3;
max->cj3=p1->cj3;
p1->cj3=fen;
/*交换前后结点中的cj3,使之与学号相匹配*/
}
}
max=head;p1=head;/*重新使max,p指向链表头*/
}
p2->next=NULL;/*链表结尾*/
printf("输入的学生数为:%d个!\n",n);
return(head);
}
score *add(score *head,score *stu)
/*函数add,功能:追加学生资料,并且将所有学生资料按学号排序*/
{
score *p0,*p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
p3=stu=(score *)malloc(LEN);/*开辟一个新单元*/
printf("\n输入要增加的学生的资料!");
repeat4: printf("请输入学生学号(学号应大于0):");
scanf("%d",&stu->number);
/*输入学号,学号应大于0*/
while(stu->number<0)
{
getchar();
printf("输入错误,请重新输入学生学号:");
scanf("%d",&stu->number);} /*输入错误,重新输入学号*/
/******************************************************/
if(stu->number==0)
goto end2;/*当输入的学号为0时,转到末尾,结束追加*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number)
p3=p3->next;
else
{
printf("学号重复,请重输!\n");
goto repeat4;
/*当输入的学号已经存在,程序报错,返回前面重新输入*/
}
}
}
}
/******************************************************/
printf("输入学生姓名:");
scanf("%s",stu->name); /*输入学生姓名*/
printf("请输入cj1(0~100):");
scanf("%f",&stu->cj1); /*输入cj1,成绩应在0-100*/
while(stu->cj1<0||stu->cj1>100)
{getchar();
printf("输入错误,请重新输入cj1");
scanf("%f",&stu->cj1);
} /*输入错误,重新输入cj1直到正确为止*/
printf("请输入cj2(0~100):");
scanf("%f",&stu->cj2);/*输入cj2,成绩应在0-100*/
while(stu->cj2<0||stu->cj2>100)
{
getchar();
printf("输入错误,请重新输入cj2");
scanf("%f",&stu->cj2);}/*输入错误,重新输入cj2直到正确为止*/
printf("请输入cj3(0~100):");
scanf("%f",&stu->cj3);/*输入cj3,成绩应在0-100*/
while(stu->cj3<0||stu->cj3>100)
{
getchar();
printf("输入错误,请重新输入cj3");
scanf("%f",&stu->cj3);}/*输入错误,重新输入cj3直到正确为止*/
p1=head;
p0=stu;
if(head==NULL)
{head=p0;p0->next=NULL;}/*当原来链表为空时,从首结点开始存放资料*/
else/*原来链表不为空*/
{
if(p1->next==NULL)/*找到原来链表的末尾*/
{
p1->next=p0;
p0->next=NULL;/*将它与新开单元相连接*/
}
else
{
while(p1->next!=NULL)/*还没找到末尾,继续找*/
{
p2=p1;p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
p1=head;
p0=stu;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交换前后结点中的学号值,使得学号大者移到后面的结点中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交换前后结点中的姓名,使之与学号相匹配*/
fen=max->cj1;
max->cj1=p1->cj1;
p1->cj1=fen;
/*交换前后结点中的cj1,使之与学号相匹配*/
fen=max->cj2;
max->cj2=p1->cj2;
p1->cj2=fen;
/*交换前后结点中的cj2绩,使之与学号相匹配*/
fen=max->cj3;
max->cj3=p1->cj3;
p1->cj3=fen;
/*交换前后结点中的cj3,使之与学号相匹配*/
}
}
max=head;p1=head;/*重新使max,p指向链表头*/
} end2:
printf("现在的学生数为:%d个!\n",n);
return(head);
}
/*========================================================
======================================*/
score *search(score *head)
/*函数search,功能:查询学生成绩*/
{int number;
score *p1,*p2;
printf("输入要查询的学生的学号,");
scanf("%d",&number);
while(number!=0)
{
if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}
printf("-----------------------------------------\n");
printf("|学号\t|姓名\t|cj1\t|cj2\t|cj3\t|\n");
printf("-----------------------------------------\n");/*打印表格域*/
p1=head;
while(number!=p1->number&&p1->next!=NULL)
{p2=p1;p1=p1->next;}
if(number==p1->number)
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cj1,p1->cj2,p1->cj3);
printf("-----------------------------------------\n");}/*打印表格域*/
else
printf("%d不存在此学生!\n",number);
printf("输入要查询的学生的学号,");
scanf("%d",&number);
}
printf("已经退出了!\n");
return(head);
}/*=============================================
=================================================*/
score *del(score *head)/*函数del,功能:删除学生资料*/
{
score *p1,*p2;
int number;
printf("输入要删除的学生的学号(输入0时退出):");
scanf("%d",&number);
getchar();
while(number!=0)/*输入学号为0时退出*/
{
if(head==NULL)
{
printf("\n没有任何学生资料!\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL)
/*p1指向的不是所要找的首结点,并且后面还有结点*/
{
p2=p1;p1=p1->next;
} /*p1后移一个结点*/
if(number==p1->number)
/*找到了*/
{
if(p1==head)
head=p1->next;
/*若p1指向的是首结点,把地二个结点地址赋予head*/
else
p2->next=p1->next;
/*否则将下一个结点地址 赋给前一结点地址*/
printf("已经删除:%d\n",number);n=n-1;
}
else
printf("%d不存在此学生!\n",number);
/*找不到该结点*/
printf("输入要删除的学生的学号:");
scanf("%d",&number);
getchar();
}
#ifdef DEBUG
printf("已经退出了!\n");
#endif
printf("现在的学生数为:%d个!\n",n);
return(head);
} /*==================================================
============================================*/
score *statistics(score *head)
/*函数statistics,功能:统计学生成绩*/
{
float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min;
score *p;
int x,y=0,i=0;
p=head;
printf("1个人总分和平均分\t2单科平均分\t3总分最高分\t4总分最低分\n");
scanf("%d",&x);
getchar();
switch(x)
/*用switch语句实现功能选择*/
{
case 1: if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
else
{
printf("---------------------------------------------------------\n");
printf("|学号\t|姓名\t|cj1\t|cj2\t|cj3\t|总分\t|平均分\t|\n");
printf("---------------------------------------------------------\n");/*打印表格域*/
while(p!=NULL)
{
sum1=p->cj1+p->cj2+p->cj3; /*计算个人总分*/
ave1=sum1/3;/*计算个人平均分*/
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->cj1,p->cj2,p->cj3,sum1,ave1);
/*打印结果*/
printf("---------------------------------------------------------\n");/*打印表格域*/
p=p->next;}
}
return(head); break;
case 2: if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
while(p!=NULL)
{
sum1=sum1+p->cj1;
sum2=sum2+p->cj2;
sum3=sum3+p->cj3;/*计算总分*/
y=y+1;
ave1=sum1/y;
ave2=sum2/y;
ave3=sum3/y;/*计算平均分*/
p=p->next;/*使p指向下一个结点*/
}
printf("cj1平均分是%.1f\n",ave1);
printf("cj2平均分是%.1f\n",ave2);
printf("cj3平均分是%.1f\n",ave3);/*打印结果*/
return(head); break;
case 3:
if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
max=p->cj1+p->cj2+p->cj3;
while(i<n)
{
i=i+1;
sum1=p->cj1+p->cj2+p->cj3; /*计算个人总分*/
if(max<sum1)
max=sum1;
p=p->next;
}
printf("总分最高分:%.1f",max);
printf("\n");
return(head); break;
case 4: if(head==NULL)
{printf("\n没有任何学生资料!\n");return(head);}/*链表为空*/
while(p!=NULL)
{
min=p->cj1+p->cj2+p->cj3;
while(p!=NULL)
{sum2=p->cj1+p->cj2+p->cj3;
if(min>sum2)
min=sum2;
p=p->next;
}
}
printf("总分最低分:%.1f",min);
printf("\n");
return(head); break;
default :printf("输入错误,请重试!\n");
}
return(head);
}
/*===========================================================
===================================*/
int save(score *p1)
/*函数save,功能:保存学生的资料*/
{
FILE *fp;
char filepn[20];/*用来存放文件保存路径以及文件名*/
printf("请输入文件路径及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"w+"))==NULL)
{
printf("不能打开文件!\n");
return 0;
}
fprintf(fp," 学生成绩管理系统 \n");
fprintf(fp,"-------------------------------------------------------\n");
fprintf(fp,"| 学号\t| 姓名\t| cj1\t| cj2\t| cj3\t|\n");
fprintf(fp,"-------------------------------------------------------\n");
/*打印表格域*/
while(p1!=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->cj1,p1->cj2,p1->cj3);
p1=p1->next;/*下移一个结点*/
}
fclose(fp);
printf("文件已经保存!\n");
return 0;
}
int menu()/*函数menu,功能:菜单选择界面*/
{
int i,k;
printf("\t\t\t\t学生成绩管理系统\n");
for(i=0;i<80;i++)
printf("*");
printf("\t\t1创建资料\t\t\t2查询成绩\t\t\n");
printf("\t\t3删除资料\t\t\t4追加资料\t\t\n");
printf("\t\t5统计成绩\t\t\t6保存资料\t\t\n");
/*菜单选择界面*/
for(i=0;i<80;i++)
printf("*");
printf("请选择您所要的操作(选择(0)退出):");
scanf("%d",&k);/*选择操作*/
getchar();
return (k);}
/*==============================================================================================*/
main() /*主函数main,功能:通过调用creat,search,del,add,print,ststistics,save,taxis等函数,实现学生成绩查询系统功能*/
{
score *head=0,*stu=0;
while(1)
{
k=menu();
switch(k)/*用switch语句实现功能选择*/
{
case 1: head=creat();break;/*调用创建链表函数*/
case 2: head=search(head);break;/*调用查询函数*/
case 3: head=del(head); break;/*调用删除函数*/
case 4: head=add(head,stu);break;/*调用追加函数*/
case 5: statistics(head); break;/*调用统计函数*/
case 6: save(head);break;/*调用保存函数*/
case 0: exit(0);/*退出系统,返回主界面*/
default: printf("输入错误,请重试!\n");
}
}
}
//纯结构体。上面有位仁兄,链表。不过课程数给限定3了。。不符合要求啊。
to 楼主:你至少要学到结构体再来做这个题。
数组都不够。 纯数组可以实现不过代码n长。
我这个只用了基本的结构体。
做这个已经可以了。
如果高级点的就 用到专门的数据结构 ,
线性表链表(基本原型还是结构体)什么的来实现,那个功能上更灵活。
//Bugfix!
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NN 50 // 是学生人数上限 。可自己调整。
#define SCMAX 50 // 课程 数上限
int SCLoad;
typedef struct student{
char no[10];
char name[11];
double score[SCMAX];
double total;
double avg;
};
student stu[NN+1];
int display(int n,int m,int SC) //综合显示函数。
{
int i,j,temp,flag=0;
temp=n;
n>m?n=m,m=temp:1 ;
printf(" 序号 | 学 号 | 姓 名 |");
for(j=1;j<=SC;j++)
printf("课程%2d|",j);
printf(" 总 分 | 平均分 \n");
if((n==0&&m==0) || (!n&&!m))n=1,m=1;
if((n==0&&m!=0) || (n!=0&&m==0))
{ n=0?n=m:m=n;flag=stu[n].total==0?1:0;}
if(stu[1].total==0 || flag){printf("没有学生信息!");return 0;}
for(i=n;i<=m;i++)
if(stu[i].total>0)
{ printf(" %4d | %6s | %6s |",i,stu[i].no,stu[i].name);
for(j=0;j<SC;j++)
printf("%3.1lf ",stu[i].score[j]);
printf("| %3.2lf | %3.2lf \n",stu[i].total,stu[i].avg);
}
}
int searchmax(int n,int SC) //找最高分,并输出这个学生信息。
{ int i,j,k=1;
double max;
max=0;
for(i=1;i<=n;i++)
for(j=0;j<SC;j++)
if(stu[i].score[j]>max){
max=stu[i].score[j];
k=i;
}
display(k,k,SC);
printf(">>>最高分数:%3.1lf\n",max);
return k;
}
double avgsi(int n,int scorenum) //求 单科平均分
{ int i,j;
double s=0,avg;
for(i=1;i<=n;i++)s+=stu[i].score[scorenum-1];
return s/n;
}
int input(int i,int SC) //信息录入
{ int j;
flag: printf("输入第%d个学生学号:",i);
scanf("%s",stu[i].no);
printf("输入第%d个学生姓名:",i);
fflush(stdin);
gets(stu[i].name);
printf("输入第%d个学生成绩依次为(1 2 3....)空格隔开\n ",i);
stu[i].total=0;
stu[i].avg=0;
for(j=0;j<SC;j++){
scanf("%lf",&stu[i].score[j]);
//
stu[i].total+=stu[i].score[j];
}
stu[i].avg=stu[i].total/SC;
if(stu[i].no&&stu[i].name&&stu[i].total&&stu[i].avg)return 1;
else {printf("输入信息不完整,请重新输入!");goto flag;}
return 1;
}
void sortbyavg(int n) //按平均分高到低排序
{
int i,j;
student temp;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(stu[i].avg<stu[j].avg){
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
printf("排序完成!");
return;
}
int sortbyscid(int n,int SC) //按输入的课程名,分数从高到低排序
{
int i,j,k;
int p;
student temp;
printf("请输入排序参考课程id:");
scanf("%d",&p);
if(p>SC||p<=0){printf("无法排序,原因没有这门课!\n");
return 0;}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(stu[i].score[p-1]<stu[j].score[p-1]){temp=stu[i];stu[i]=stu[j];stu[j]=temp;}
printf("排序完成!");
return 1;
}
void displaysample(int n) //显示总分和平均分
{ int i;
printf(" 序 号 | 姓 名 | 总分 | 平均分 \n");
for(i=1;i<=n;i++)
if(stu[i].total!=0)printf(" %5d %s %.2lf %.2lf\n",i,stu[i].name,stu[i].total,stu[i].avg);
return;
}
void dispsavg(int n) //显示各科的平均分
{ int i;
double k;
for(i=1;i<=SCMAX;i++){
k=avgsi(n,i);
if(k==0)return;
printf("<课程%2d > 平均分:%.2lf\n",i,k);
}
}
void help()
{
printf(" +++++++++欢迎使用本帮助!++++++++ \n");
printf(" 以下是功能菜单\n");
printf(" 在提示符\">>\"下有以下命令可用!\n");
printf(" A 显示所有信息;\n B 显示总分,平均分;\n C 平均分排序;\n D显示各科平均分;\n");
printf(" E 按输入课程名排序;\n F找最高分学生输出;\n S 将信息保存到文件;\n O 打开已存在的数据文件;\n");
printf(" I 学生信息输入;\n H 显示本帮助。\n Z 结束程序!\n");
printf("\n>>");}
int save(int n) //将信息保存在一个文件中。
{
FILE *fp;
int i;
char stu_msg[20];
printf("输入要保存的文件名:");
scanf("%s",stu_msg);
if((fp=fopen(stu_msg,"w"))==NULL)
{
printf("无法打开文件!\n");
return 0;
}
for(i=1;i<=n;i++)
if(fwrite(&stu[i],sizeof(student),1,fp)!=1)
printf("文件写入错误!");
fclose(fp);
printf("保存成功!");
}
int openf() //文件放在程序同目录下。
{
FILE *fp;
int i;
char stu_msg[20];
printf("输入要打开的文件名:");
scanf("%s",stu_msg);
if((fp=fopen(stu_msg,"r"))==NULL)
{printf("无法打开文件!\n");return 0;}
for(i=1;i<=NN;i++)
if(fread(&stu[i],sizeof(student),1,fp)!=1 )
{ SCLoad=0;
while(stu[1].score[SCLoad++]!=0);
printf("读入结束!\n");
return i;}
fclose(fp);
}
int main()
{
int i,j,n;
int SC ;
char cc,runfirst;
printf("\n\n\n\n是否从已有文件中获得学生信息?Y/N:");
runfirst=getchar();
if(runfirst=='Y'||runfirst=='y'){n=openf();SC=SCLoad-1;}
else {
flag: printf("输入学生人数( <=%d ):",NN);
scanf("%d",&n);
printf("输入课程数( <=%d ):",SCMAX);
scanf("%d",&SC);
while(n>NN){
printf("超出允许范围(<=%d),请重新输入:",NN);
scanf("%d",&n);}
for(i=1;i<=n;i++)input(i,SC);
printf("输入完毕!\n");
}
system("pause");
system("cls");
printf("\n\n\n");
help();
printf("你想进行什么操作?\n");
printf(">>");
while(cc=getchar())
{
switch(cc)
{
case 'I':case 'i':goto flag;break;
case 'A':case 'a':display(1,n,SC);break;
case 'B':case 'b':displaysample(n);break;
case 'C':case 'c':sortbyavg(n);break;
case 'D':case 'd':dispsavg(n);break;
case 'E':case 'e':sortbyscid(n,SC);break;
case 'F':case 'f':searchmax(n,SC);break;
case 'H':case 'h':help();break;
case 'S':case 's':save(n);break;
case 'O':case 'o':n=openf();SC=SCLoad-1;break;
case 'Z':case 'z':printf("谢谢!\n");return 0;
}
printf("\n>>");
fflush(stdin);
}
return 0;
}
用struct类型解,不过你学C语言才48小时就好好练练基础吧,这种题目不适合你
c++行不?C有点麻烦,好久没动了
仍育重组: 题目没说清.1.输入仅限于小写字母还是所有字符;2 y,z输出a,b还是也按ASCII码向后推两位.#include <stdio.h>#include <string.h> int main() { char iword; char oword; while(iword = getchar()) { if(iword == '\n') break; oword = (iword - 95) % 26 + 97; printf("%c",oword); } printf("\n"); return 0; } 输入:abcdefxyz 输出:cdefghzab 此程序仅限输入小写字母.
珲春市18031746008: 求解答一下C语言编程题,万分感谢 - ?
仍育重组: 1)原代码x没声明,算法有错误.#include "stdio.h" int main(void){ int i,n; float s=0.0,x,t1=0.0,t2=1.0; printf("x,n=?"); scanf("%f,%d",&x,&n); for(i=1;i<=n;i++){ t1=t1+x; t2=t2/i; s=s+t1*t2; } printf("s=%f\n",s); return 0; }2)原代码书写不规范...
珲春市18031746008: 求解C语言题目编程序输入一个给定的数n后,输出的所有不超过n的,其平方由左右对称的数字组成的数.如输入30,输出1,2,3,11,22,26,因为它们的平方是1... - ?
仍育重组:[答案] 需要判断回文,我已经尽量简单 #include int fun(int n) { int i, j, a[20]={0}; for(i=0; n; i++, n/=10) a[i] = n%10; for(j=0, i--; j
珲春市18031746008: 求解C语言编程题. - ?
仍育重组: 1.#include "stdio.h"#include "stdlib.h"#include "math.h" double func(double *content,int n) { double ave=0,s=0; int i; for(i=0;i<n;i++) ave+=*(content+i); ave/=n; for(i=0;i<n;i++) s+=pow(ave-*(content+i),2); s/=n; return s; } int main() { int n,i; ...
珲春市18031746008: C语言编程题,求解?
仍育重组: #include<stdio.h> int switc(int x) { if (x<0&&x>=-5) return 1; else if (x<10&&x>=0) return 0; } int main(int argc, char* argv[]) { int x,y; scanf("%d",&x); switch (switc(x)) { default: case 1:y='x';break; case 0:y='x-1';break; } putchar(y); return 0; }
珲春市18031746008: c语言编程问题求详解 - ?
仍育重组: #include <stdio.h> int sum(int n) { int i, s = 0; for (i = 1; i <= n; i++) s += i; return s; } int main() { printf("1 + 2 + ... + 300 = %d\n", sum(300)); return 0; } #include <stdio.h> int main() { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) printf("%d*%d=%-...
珲春市18031746008: C语言编程题求解 - ?
仍育重组: #include<stdio.h>#include<math.h>#include<stdlib.h>/* 建立n个随机数序列d【】 */ int creat_random(int d[],int n) { int i,k; FILE *fp; srand((unsigned)time(NULL));for(i=0;i<n;i++) { d[i]=rand(); for(k=0;k<i;k++) if(d[k]==d[i]) { k=0; d[i]=rand(); } /*去...
珲春市18031746008: 求解一道C语言编程题 - ?
仍育重组: #include #define ARR_LEN 30 //数组长度 void main() { int num[ARR_LEN]; //数组 用来保存1到40之间的数 int index; //循环索引 int minNum=40; //将最小值初始化为40 int place; //位置 for(index=1;index { //如果输入的数不在范围内 则重新输...
珲春市18031746008: C语言编程题求解?
仍育重组: D 因为s是数组名,是个常量,不能对它进行赋值. 除非直接初始化就行:char s[10]="abcd";
珲春市18031746008: C语言题目求解. - ?
仍育重组: 程序1:#include#include void main() { double f,max=-999999; int x; for(x=1;x { f=x*x-5*x+sin(x); if(f>max)max=f; } printf("Max=%lf\n",max); } 程序2:#include#include void main() { int i,j,k=0,s; for(i=1999;i { j=i; s=0; while(j>0) {if(j%10==9)s++; j/=10; } ...