73.输出平均分最高的学生信息。假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩。输入n个学生的成绩信息,计算并输出平均分最高的学生信息。
/*输出平均分最高的学生信息*/
#include<stdio.h>
struct student{
int num;
char name[10];
int math,english,computer;
double average;
};
int main(void){
int n;
struct student max,stu;
printf("请输入一个正整数n:");
scanf("%d",&n);
printf("请输入学生的学号、姓名和数学、英语、计算机成绩:\n");
for(int i=1;i<=n;i++){
printf("NO.%d: ",i);
scanf("%d%s%d%d%d",&stu.num,&stu.name,&stu.math,&stu.english,&stu.computer);
stu.average=(stu.math+stu.english+stu.computer)/3.0;
if(i==1){
max=stu;
}
else if(max.average<stu.average){
max=stu;
}
}
printf("平均分最高的学生信息如下:\n学号:%d,姓名:%s,平均分:%.2lf\n数学:%d,英语:%d,计算机:%d",
max.num,max.name,max.average,max.math,max.english,max.computer);
return 0;
}
74.学生成绩排序。输入n(n<50)个学生的成绩信息,按照学生的个人平均成绩从高到低输出他们的信息。
/*学生成绩排序*/
#include<stdio.h>
struct student{
int num;
char name[10];
int computer,english,math;
double average;
};
int main(void){
int i,j,n,index;
struct student students[50],temp;
/*输入*/
printf("请输入学生人数:");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("请输入第%d个学生的信息:",i+1);
printf("学号:");
scanf("%d",&students[i].num);
printf("姓名:");
scanf("%s",&students[i].name);
printf("数学、英语、计算机成绩:");
scanf("%d%d%d",&students[i].math,&students[i].english,&students[i].computer);
students[i].average=(students[i].math+students[i].english+students[i].computer)/3.0;
}
/*选择排序法排序*/
for(i=0;i<n-1;i++){
index=i;
for(j=i+1;j<n;j++){
if(students[j].average>students[index].average){
index=j;
}
}
temp=students[index];
students[index]=students[i];
students[i]=temp;
}
/*输出*/
printf("学号\t姓名\t平均分\n");
for(i=0;i<n;i++){
printf("%d\t%s\t%.2lf\n",students[i].num,students[i].name,students[i].average);
}
return 0;
}
75.修改学生成绩。输入n(n<50)个学生的成绩信息,再输入一个学生的学号、课程以及成绩,在自定义函数中修改学生指定课程的成绩。
/*修改学生成绩,结构指针作为函数参数*/
#include<stdio.h>
struct student{//学生信息结构定义
int num;//学号
char name[10];//姓名
int math,english,computer;//成绩
double average;//个人平均成绩
};
//函数声明
int update_score(struct student *p,int n,int num,int course,int score);
int main(void){
int course,i,n,num,pos,score;
struct student students[50];//定义结构数组
/*输入*/
printf("请输入学生人数:");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("请输入第%d的学生的信息:\n",i+1);
printf("学号:");
scanf("%d",&students[i].num);
printf("数学:");
scanf("%d",&students[i].math);
printf("英语:");
scanf("%d",&students[i].english);
printf("计算机:");
scanf("%d",&students[i].computer);
}
//输入待修改学生的信息
printf("请输入待修改信息学生的学号:");
scanf("%d",&num);
printf("请选择课程序号:1.数学 2.英语 3.计算机\n");
scanf("%d",&course);
printf("请输入新成绩:");
scanf("%d",&score);
//调用函数修改学生成绩
pos=update_score(students,n,num,course,score);
//输出修改后的学生信息
if(pos==-1){
printf("未找到该学生!\n");
}
else{
printf("更新后信息:\n");
printf("学号\t数学\t英语\t计算机\n");
printf("%d\t %d\t %d\t %d\n",students[pos].num,
students[pos].math,students[pos].english,
students[pos].computer);
}
return 0;
}
//自定义函数,修改学生成绩
int update_score(struct student *p,int n,int num,int course,int score){
int i,pos;
for(i=0;i<n;i++,p++){//按学号查找
if(p->num==num)break;
}
if(i<n){
switch (course) {
case 1:
p->math=score;
break;
case 2:
p->english=score;
break;
case 3:
p->computer=score;
break;
}
pos=i;//被修改学生在数组中的下标
}else{
pos=-1;//无此学号
}
return pos;
}
补充:结构指针的使用有两种方式,①用*p访问结构成员②用指向运算符->访问指向的结构成员
①(*p).num=101;
//*p表示的是p指向的结构变量,括号是不可少的,因为.的优先级高于*
②p->num=101;
以上两种形式最终得到的效果是一样的,但在使用结构指针访问结构成员时,通常使用第二种指向运算符。
76.有序表的增删查操作。首先输入一个无重复元素的、从小到大排列的有序表,并在屏幕上显示以下菜单(编号和选项),用户可以反复对该有序表进行插入、删除和查找操作,也可以选择结束。当用户输入编号1-3和相关参数时,将分别对该有序表进行插入、删除和查找操作,输入其他编号,则结束操作。
[1]Insert
[2]Delete
[3]Query
[Other option]End
//有序表的增删查操作
#include<stdio.h>
#define MAXN 100//定义符号常量表示数组a的长度
int count=0;//用全局变量count表示数组a中待处理的元素个数
//函数声明
//选择操作的控制函数
void select(int a[],int option,int value);
//输入有序数组的函数
void input_array(int a[]);
//输出有序数组的函数
void print_array(int a[]);
//在有序数组a中插入一个值为value的元素的函数
void insert(int a[],int value);
//删除有序数组a中值等于value的元素的函数
void del(int a[],int value);
//用二分法在有序数组a中查找值为value的元素的函数
void query(int a[],int value);
//主函数
int main(void){
int option,value,a[MAXN];
input_array(a);
printf("[1] Insert\n");
printf("[2] del\n");
printf("[3] Query\n");
printf("[Other option] End\n");
while(1){
printf("Input option:");//提示输入编号
scanf("%d",&option);
if(option<1||option>3){
break;
}
printf("Input an element:");//提示输入参数
scanf("%d",&value);
select(a,option,value);
printf("\n");
}
printf("Thanks!");
return 0;
}
//控制函数
void select(int a[],int option,int value){
switch (option) {
case 1:
insert(a,value);
break;
case 2:
del(a,value);
break;
default:
query(a,value);
break;
}
}
//有序表输入函数
void input_array(int a[]){
printf("Input the number of array elements:");
scanf("%d",&count);
printf("Input an orderd array element:");
for(int i=0;i<count;i++){
scanf("%d",&a[i]);
}
}
//有序表输出函数
void print_array(int a[]){
printf("The ordered array a is:");
for(int i=0;i<count;i++){
if(i==0){
printf("%d ",a[i]);
}else{
printf("%d ",a[i]);
}
}
}
//有序表插入函数
void insert(int a[],int value){
int i,j;
for(i=0;i<count;i++){
if(value<a[i]){
break;
}
}
for(j=count-1;j>=i;j--){
a[j+1]=a[j];
}
a[i]=value;
count++;
print_array(a);
}
//有序表删除函数
void del(int a[],int value){
int i,index=-1;
for(i=0;i<count;i++){
if(value==a[i]){
index=i;
break;
}
}
if(index==-1){
printf("Failed to find the data,deletion falied.");
}else{
for(i=index;i<count-1;i++){
a[i]=a[i+1];
}
}
count--;
print_array(a);
}
//有序表二分法查询函数
void query(int a[],int value){
int mid,left=0,right=count-1;
while(left<=right){
mid=(left+right)/2;
if(value==a[mid]){
printf("The index is: %d",mid);
return;
}
else if(value<a[mid]){
right=mid-1;
}
else{
left=mid+1;
}
}
printf("This element dose not exist.");
}