C语言代码1、输入查询学生学号 2、通过顺序表二分法查找到records.txt中学生基本信息及各科目信息 3、输入一个学号时,查询出此生的基本信息及所有课程情况,格式如下: 学号:xx 姓名:xxx 性别:x 宿舍号码:xxx 电话号码xxx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分:xx 课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx … 共修:xx科,实得总学分为: xxx
时间: 2023-07-30 17:11:48 浏览: 188
pt1000采用二分法查询温度表C代码实现.rar
好的,以下是一个基于顺序表二分法的C语言代码示例,可以实现学生信息查询的功能:
```c
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 1000 // 定义顺序表的最大长度
#define FILENAME "records.txt" // 定义文件名
// 定义学生信息结构体
typedef struct {
char id[20]; // 学号
char name[20]; // 姓名
char gender; // 性别
char dorm[10]; // 宿舍号码
char phone[20]; // 电话号码
} Student;
// 定义课程信息结构体
typedef struct {
char id[20]; // 课程编号
char name[50]; // 课程名称
int score; // 综合成绩
int credit; // 实得学分
} Course;
// 定义学生选课信息结构体
typedef struct {
char id[20]; // 学号
Course courses[10]; // 选课信息(最多10门课程)
int num_courses; // 选课门数
} Selection;
// 定义全局变量
Student students[MAX_SIZE]; // 学生信息顺序表
int num_students; // 学生信息顺序表实际长度
Selection selections[MAX_SIZE]; // 选课信息顺序表
int num_selections; // 选课信息顺序表实际长度
// 读取文件中的学生信息和选课信息
void read_file() {
FILE *fp;
fp = fopen(FILENAME, "r");
if (fp == NULL) {
printf("打开文件失败!\n");
return;
}
char line[200];
while (fgets(line, 200, fp) != NULL) {
if (line[strlen(line)-1] == '\n') {
line[strlen(line)-1] = '\0'; // 去掉行末的换行符
}
char *token = strtok(line, ",");
if (strcmp(token, "S") == 0) { // 学生信息
Student s;
strcpy(s.id, strtok(NULL, ","));
strcpy(s.name, strtok(NULL, ","));
s.gender = strtok(NULL, ",")[0];
strcpy(s.dorm, strtok(NULL, ","));
strcpy(s.phone, strtok(NULL, ","));
students[num_students++] = s;
} else { // 选课信息
Selection sel;
strcpy(sel.id, strtok(NULL, ","));
sel.num_courses = 0;
while (token = strtok(NULL, ",")) {
strcpy(sel.courses[sel.num_courses].id, token);
strcpy(sel.courses[sel.num_courses].name, strtok(NULL, ","));
sel.courses[sel.num_courses].score = atoi(strtok(NULL, ","));
sel.courses[sel.num_courses].credit = atoi(strtok(NULL, ","));
sel.num_courses++;
}
selections[num_selections++] = sel;
}
}
fclose(fp);
}
// 二分查找指定学号的学生信息在学生信息顺序表中的位置
int search_student(char *id) {
int left = 0, right = num_students - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (strcmp(students[mid].id, id) == 0) {
return mid;
} else if (strcmp(students[mid].id, id) < 0) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 没有找到
}
// 查询指定学号的学生信息及选课情况
void query_student(char *id) {
int pos = search_student(id);
if (pos == -1) {
printf("没有找到学号为%s的学生\n", id);
return;
}
// 输出学生基本信息
printf("学号:%s 姓名:%s 性别:%c 宿舍号码:%s 电话号码:%s\n",
students[pos].id, students[pos].name, students[pos].gender,
students[pos].dorm, students[pos].phone);
// 输出学生选课信息
printf("选课情况:\n");
int total_credit = 0;
for (int i = 0; i < num_selections; i++) {
if (strcmp(selections[i].id, id) == 0) {
for (int j = 0; j < selections[i].num_courses; j++) {
printf("课程编号:%s 课程名称:%s 综合成绩:%d 实得学分:%d\n",
selections[i].courses[j].id, selections[i].courses[j].name,
selections[i].courses[j].score, selections[i].courses[j].credit);
total_credit += selections[i].courses[j].credit;
}
}
}
printf("共修:%d科,实得总学分为:%d\n", total_credit / 2, total_credit);
}
int main() {
read_file(); // 读取文件中的学生信息和选课信息
char id[20];
printf("请输入学号:");
scanf("%s", id);
query_student(id);
return 0;
}
```
以上代码实现了从文件中读取学生信息和选课信息,然后通过顺序表实现二分查找指定学号的学生信息,并输出学生基本信息和选课情况。
阅读全文