#include<stdio.h>
#include<stdlib.h>
#define N 100
int current;
typedef struct student
{
char *num;
char *nam;
float chinese;
float english;
float math;
double average;
float sum;
}STU;
STU stu[N]; //定义结构体数组
int main(){
int i,j,k,r,n,m,t;
int pass;
float hold,temp,temp1,temp4;
char *temp2;
char *temp3;
double temp5;
for(n=0;n<current;n++){
stu[n].num=malloc(10*sizeof(char));
stu[n].nam=malloc(5*sizeof(char));
}
//为结构体动态分配内存
printf("请输入学生人数 :\n");
scanf("%d",¤t);
for(i=0;i<current;i++){
printf("请输入学生的学号:\n");
scanf("%s",&stu[i].num);
printf("请输入学生的姓名:\n");
scanf("%s",&stu[i].nam);
printf("请输入学生的语文成绩:\n");
scanf("%f",&stu[i].chinese);
printf("请输入学生的数学成绩:\n");
scanf("%f",&stu[i].math);
printf("请输入学生的英语成绩:\n");
scanf("%f",&stu[i].english);
} //录入学生成绩
for(j=0;j<current;j++){
stu[j].average=(stu[j].chinese+stu[j].math+stu[j].english)/3.0;
printf("学生%s的平均成绩为:%.2f\n",stu[j].nam,stu[j].average);
} //输出每个学生的平均成绩
for(k=0;k<current;k++){
stu[k].sum=(stu[k].chinese+stu[k].math+stu[k].english);
printf("学生%s的总成绩为:%f\n",stu[k].nam,stu[k].sum);
} //输出每个学生的总成绩
for(pass=0;pass<current;pass++){
for(t=0;t<current-1-pass;t++){
if(stu[t].sum<stu[t+1].sum){
hold = stu[t].chinese;
stu[t].chinese=stu[t+1].chinese;
stu[t+1].chinese=hold; // 语文
temp = stu[t].english;
stu[t].english=stu[t+1].english;
stu[t+1].english=temp; //英语
temp1 = stu[t].math;
stu[t].math=stu[t+1].math;
stu[t+1].math=temp1; //数学
temp2 = stu[t].num;
stu[t].nam = stu[t+1].nam;
stu[t+1].nam=temp2; //学号
temp3 = stu[t].nam;
stu[t].nam=stu[t+1].nam;
stu[t+1].nam=temp3; //姓名
temp4 = stu[t].sum;
stu[t].sum=stu[t+1].sum;
stu[t+1].sum=temp4; //总分
temp5 = stu[t].average;
stu[t].average=stu[t+1].average;
stu[t+1].average=temp5; //平均分
}
}
} //冒泡排序对总分由高到低排序
printf("按总分由高到低输出学生的信息为:\n");
for(r=0;r<current;r++){
printf("学生姓名:%s 学生学号:%s 语文:%f 英语:%f 数学:%f 总分:%.2lf 平均分:%f\n ",
stu[r].nam,stu[r].num,stu[r].chinese,stu[r].english,stu[r].math,stu[r].sum,stu[r].average);
}
for(m=0;m<current;m++){
free(stu[m].num);
free(stu[m].nam);
}
return 0;
}
指针开辟空间的方法有问题
变量用错,current没有赋值就用在循环里了。
scanf读入时的后面是加指针,字符串名本来就是指针,不需要&符号。
冒泡排序方法有问题。
正确的代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 100
int current;
typedef struct student
{
char *num;
char *nam;
float chinese;
float english;
float math;
double average;
float sum;
}STU;
STU stu[N]; //定义结构体数组
void bubbleSort(STU *arr, int n)
{
int i,j;
STU m;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(arr[j].sum < arr[j+1].sum)
{
m=arr[j];
arr[j]=arr[j+1];
arr[j+1]=m;
}
}
}
return;
}
int main(){
int i,t;
printf("请输入学生人数 :\n");
scanf("%d",&t);
for(i=0; i<t; i++){
printf("请输入学生的学号:\n");
stu[i].num = (char *)malloc(sizeof(char)*10);
scanf("%s",stu[i].num);
printf("请输入学生的姓名:\n");
stu[i].nam = (char *)malloc(sizeof(char)*10);
scanf("%s",stu[i].nam);
printf("请输入学生的语文成绩:\n");
scanf("%f",&stu[i].chinese);
printf("请输入学生的数学成绩:\n");
scanf("%f",&stu[i].math);
printf("请输入学生的英语成绩:\n");
scanf("%f",&stu[i].english);
//输出每个学生的平均成绩
stu[i].average=(stu[i].chinese + stu[i].math + stu[i].english)/3.0;
printf("学生%s的平均成绩为:%.2f\n",stu[i].nam,stu[i].average);
//输出每个学生的总成绩
stu[i].sum=(stu[i].chinese + stu[i].math + stu[i].english);
printf("学生%s的总成绩为:%f\n",stu[i].nam,stu[i].sum);
} //录入学生成绩
bubbleSort(stu, t);
printf("按总分由高到低输出学生的信息为:\n");
for(i=0; i<t; i++){
printf("学生姓名:%s 学生学号:%s 语文:%f 英语:%f 数学:%f 总分:%.2lf 平均分:%f\n ",
stu[i].nam,stu[i].num,stu[i].chinese,stu[i].english,stu[i].math,stu[i].sum,stu[i].average);
}
for(i=0; i<t; i++){
free(stu[i].num);
free(stu[i].nam);
}
return 0;
}
stu[n].num=malloc(10*sizeof(char));——错误,malloc返回void *型指针,必须在malloc前加强制转换操作变为与stu[n].num相兼容的类型。
stu[n].nam=malloc(5*sizeof(char));——错误,同上。
scanf("%d",¤t);——¤是啥东西?
后面打印时,打印的是指针,不是指针的所指的值
要把指针理解清楚了