1.学生信息处理问题
char name[25];要写成字符数组scanf_s(%s", stu_arr[i].name, 25, );数组名的本质是 “指向数组首元素的指针”,所以不需要加&符号;并且这个25必须要加(如果是scanf_s)- 冒泡排序
- for (int i = 0; i <
len-1; i++) 外 - for (int j = 0; j <
len-1-i; j++)内
- for (int i = 0; i <
%.2f保留两位小数
#include<stdio.h>
#include<stdlib.h>
//学生信息
typedef struct student_s {
int stu_id;
char name[25];// 要写成字符数组
float chinese_score;
float math_score;
float english_score;
}student_t;
void info_input(student_t* stu_arr, int len); //输入学生信息
void sort_by_id(student_t* stu_arr,int len);//按照学号排序
void print_arr(student_t* stu_arr, int len); // 数组输出
void find_chinese_top(student_t *stu_arr,int len);//语文最高分的学生信息
void find_math_top(student_t* stu_arr, int len);//数学最高分的学生信息
void find_english_top(student_t* stu_arr, int len);//英语最高分的学生信息
void course_average_score(student_t* stu_arr, int len);//输出每门课程的平均分
void sort_sum_score(student_t* stu_arr, int len);//按照总分排序
int main() {
student_t stu_arr[5];// 结构体数组
info_input(stu_arr, 5);//输入
sort_by_id(stu_arr, 5);
print_arr(stu_arr, 5);
find_chinese_top(stu_arr, 5);
find_math_top(stu_arr, 5);
find_english_top(stu_arr, 5);
course_average_score(stu_arr, 5);
sort_sum_score(stu_arr, 5);
print_arr(stu_arr, 5);
return 0;
}
//输入
void info_input(student_t* stu_arr, int len) {
for (int i = 0; i < len; i++) {
scanf_s("%d%s%f%f%f",
&stu_arr[i].stu_id,
stu_arr[i].name, 25,
&stu_arr[i].chinese_score,
&stu_arr[i].math_score,
&stu_arr[i].english_score);
printf("-----------------------\n");
}
}
//输出
void print_arr(student_t* stu_arr, int len) {
for (int i = 0; i < len; i++) {
printf("学号:%d 姓名:%s 语文:%.1f 数学:%.1f 英语:%.1f\n",
stu_arr[i].stu_id,
stu_arr[i].name,
stu_arr[i].chinese_score,
stu_arr[i].math_score,
stu_arr[i].english_score);
printf("-----------------------\n");
}
}
// 按照学号排序(冒泡)
void sort_by_id(student_t* stu_arr,int len) {
for (int i = 0; i < len-1; i++) {
for (int j = 0; j < len-1-i; j++) {
if (stu_arr[j].stu_id > stu_arr[j+1].stu_id) {
student_t temp = stu_arr[j];
stu_arr[j] = stu_arr[j+1];
stu_arr[j+1] = temp;
}
}
}
}
// 最高分的学生信息
void find_chinese_top(student_t* stu_arr, int len) {
int max_score = 0;
int max_i = 0;
for (int i = 0; i < len; i++) {
if (stu_arr[i].chinese_score > max_score) {
max_score = stu_arr[i].chinese_score;
max_i = i;
}
}
printf("语文状元是:学号:%d 姓名:%s 语文:%.1f 数学:%.1f 英语:%.1f\n",
stu_arr[max_i].stu_id,
stu_arr[max_i].name,
stu_arr[max_i].chinese_score,
stu_arr[max_i].math_score,
stu_arr[max_i].english_score);
}
void find_math_top(student_t* stu_arr, int len) {
int max_score = 0;
int max_i = 0;
for (int i = 0; i < len; i++) {
if (stu_arr[i].math_score > max_score) {
max_score = stu_arr[i].math_score;
max_i = i;
}
}
printf("数学状元是:学号:%d 姓名:%s 语文:%.1f 数学:%.1f 英语:%.1f\n",
stu_arr[max_i].stu_id,
stu_arr[max_i].name,
stu_arr[max_i].chinese_score,
stu_arr[max_i].math_score,
stu_arr[max_i].english_score);
}
void find_english_top(student_t* stu_arr, int len) {
int max_score = 0;
int max_i = 0;
for (int i = 0; i < len; i++) {
if (stu_arr[i].english_score > max_score) {
max_score = stu_arr[i].english_score;
max_i = i;
}
}
printf("英语状元是:学号:%d 姓名:%s 语文:%.1f 数学:%.1f 英语:%.1f\n",
stu_arr[max_i].stu_id,
stu_arr[max_i].name,
stu_arr[max_i].chinese_score,
stu_arr[max_i].math_score,
stu_arr[max_i].english_score);
}
//输出每门课程的平均分
void course_average_score(student_t* stu_arr, int len) {
float sum_chinese = 0;
float sum_math = 0;
float sum_english = 0;
for (int i = 0; i < len; i++) {
sum_chinese += stu_arr[i].chinese_score;
sum_math += stu_arr[i].math_score;
sum_english += stu_arr[i].english_score;
}
printf("avg chinese = %.2f, avg math = %.2f, avg english = %.2f\n", sum_chinese / len, sum_math / len, sum_english / len);
}
// 总分排序
void sort_sum_score(student_t* stu_arr, int len) {
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (stu_arr[j].chinese_score+ stu_arr[j].math_score+ stu_arr[j].english_score< stu_arr[j+1].chinese_score + stu_arr[j+1].math_score + stu_arr[j+1].english_score) {
student_t temp = stu_arr[j];
stu_arr[j] = stu_arr[j + 1];
stu_arr[j + 1] = temp;
}
}
}
}
2. 合并有序链表
假设存在两个链表,链表的各个结点数据域都是有序的。要求合并这两个链表,并且合并之后也是有序的。本题中不能重新申请堆空间。