假设某班级n个同学的选课表,设计计算某位同学学分的函数 思路:动态内存分配+结构体数组+结构体指针变量 选课表组成:{学号,课程号,学分}。注:学号为字符串;一个学号可以对应多门课程 例如: {“1001”,”c language”,3.5; “1001”,”math”,6;”1001”,”english”, 5;”1002”,”c language”, 3.5}C语言
时间: 2024-03-21 17:39:35 浏览: 21
好的,关于计算某位同学学分的函数,可以按照以下步骤实现:
1. 定义结构体类型,包含学号、课程号、学分三个成员变量。
```
typedef struct{
char stu_id[10];
char course_id[20];
float credit;
} COURSE;
```
2. 动态分配一个结构体数组存储选课信息,数组长度为n。
```
COURSE *courses = (COURSE *)malloc(n * sizeof(COURSE));
```
3. 通过指针变量courses访问结构体数组中的元素,读取每个同学的选课信息(假设要计算学号为"1001"的同学学分)。
```
float sum_credit = 0;
for(int i = 0; i < n; i++){
if(strcmp(courses[i].stu_id, "1001") == 0){
sum_credit += courses[i].credit;
}
}
```
4. 最后记得释放动态分配的内存。
```
free(courses);
```
以上就是计算某位同学学分的函数实现思路。
相关问题
C语言假设某班级n个同学的选课表,设计计算某位同学学分的函数 思路:动态内存分配+结构体数组+结构体指针变量 选课表组成:{学号,课程号,学分}。注:学号为字符串;一个学号可以对应多门课程 例如: {“1001”,”c language”,3.5; “1001”,”math”,6;”1001”,”english”, 5;”1002”,”c language”, 3.5}代码
以下是一个实现计算某位同学学分的函数的示例代码:
```c
#include <stdio.h>
#include <stdlib>
#include <string.h>
// 选课表结构体
struct course {
char id[10]; // 学号
char name[20]; // 课程号
float credit; // 学分
};
// 计算学生学分的函数,参数为学号和选课表指针
float calculate_credit(char* id, struct course* courses, int n) {
float credit = 0;
// 遍历选课表,累加学生选修的课程学分
for (int i = 0; i < n; i++) {
if (strcmp(id, courses[i].id) == 0) {
credit += courses[i].credit;
}
}
return credit;
}
int main() {
int n = 4; // 学生数
// 动态分配选课表内存
struct course* courses = (struct course*) malloc(n * sizeof(struct course));
// 初始化选课表
strcpy(courses[0].id, "1001");
strcpy(courses[0].name, "c language");
courses[0].credit = 3.5;
strcpy(courses[1].id, "1001");
strcpy(courses[1].name, "math");
courses[1].credit = 6;
strcpy(courses[2].id, "1001");
strcpy(courses[2].name, "english");
courses[2].credit = 5;
strcpy(courses[3].id, "1002");
strcpy(courses[3].name, "c language");
courses[3].credit = 3.5;
// 计算学生学分
float credit = calculate_credit("1001", courses, n);
printf("学号为1001的学生学分为%.1f\n", credit);
// 释放选课表内存
free(courses);
return 0;
}
```
这个示例代码中,首先定义了一个选课表的结构体 `struct course`,包含了学号、课程号和学分三个属性。然后定义了一个计算学生学分的函数 `calculate_credit`,参数为学号和选课表指针,函数遍历选课表,累加学生选修的课程学分,最终返回学分总和。在 `main` 函数中,动态分配选课表内存,初始化选课表,调用计算学分函数,最后释放选课表内存。
用c语言写学生选修课管理 要求: 3 (1)数据结构:创建学生信息结点类型以及学生信息结构体; (2)存储结构:选择单链表存储学生和课程信息。 (3)实现功能(以函数方式实现):选课信息链表创建、选课信息输入、选课信息 查询、选课信息修改、选课信息删除、选课信息输出(全部或部分输出)或保存到文件, 选课相关排序。 附:字段信息包括:学号,姓名,性别,专业,选课名称,学分,上课时间等。
好的,以下是C语言实现学生选修课管理的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 学生信息结构体
typedef struct student_info {
char id[20]; // 学号
char name[20]; // 姓名
char gender[5]; // 性别
char major[20]; // 专业
struct course_info *courses; // 指向课程信息链表的指针
} StudentInfo;
// 课程信息结构体
typedef struct course_info {
char course_name[20]; // 选课名称
int credit; // 学分
char time[20]; // 上课时间
struct course_info *next; // 指向下一个课程信息结点的指针
} CourseInfo;
// 学生和课程信息链表结点结构体
typedef struct node {
StudentInfo student; // 学生信息
CourseInfo course; // 课程信息
struct node *next; // 指向下一个结点的指针
} Node;
// 全局变量:指向学生和课程信息链表头结点的指针
Node *head = NULL;
// 选课信息链表创建
void create() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
Node *p, *q;
p = q = (Node*)malloc(sizeof(Node));
printf("请按照以下格式输入学生和课程信息:\n");
printf("学号 姓名 性别 专业 选课名称 学分 上课时间\n");
for (int i = 0; i < n; i++) {
scanf("%s %s %s %s %s %d %s", p->student.id, p->student.name, p->student.gender, p->student.major, p->course.course_name, &p->course.credit, p->course.time);
p->student.courses = &p->course;
if (i == 0) {
head = p;
} else {
q->next = p;
}
q = p;
p = (Node*)malloc(sizeof(Node));
}
q->next = NULL;
}
// 选课信息输入
void insert() {
Node *p, *q;
p = q = head;
while (p->next != NULL) {
p = p->next;
}
p->next = (Node*)malloc(sizeof(Node));
p = p->next;
printf("请输入学生和课程信息:\n");
printf("学号 姓名 性别 专业 选课名称 学分 上课时间\n");
scanf("%s %s %s %s %s %d %s", p->student.id, p->student.name, p->student.gender, p->student.major, p->course.course_name, &p->course.credit, p->course.time);
p->student.courses = &p->course;
p->next = NULL;
}
// 选课信息查询
void search() {
char id[20];
printf("请输入要查询的学生的学号:");
scanf("%s", id);
Node *p = head;
while (p != NULL) {
if (strcmp(p->student.id, id) == 0) {
printf("学号:%s\n", p->student.id);
printf("姓名:%s\n", p->student.name);
printf("性别:%s\n", p->student.gender);
printf("专业:%s\n", p->student.major);
printf("选课名称:%s\n", p->course.course_name);
printf("学分:%d\n", p->course.credit);
printf("上课时间:%s\n", p->course.time);
return;
}
p = p->next;
}
printf("未找到该学生!\n");
}
// 选课信息修改
void modify() {
char id[20];
printf("请输入要修改的学生的学号:");
scanf("%s", id);
Node *p = head;
while (p != NULL) {
if (strcmp(p->student.id, id) == 0) {
printf("请输入新的选课信息:\n");
printf("选课名称 学分 上课时间\n");
scanf("%s %d %s", p->course.course_name, &p->course.credit, p->course.time);
printf("修改成功!\n");
return;
}
p = p->next;
}
printf("未找到该学生!\n");
}
// 选课信息删除
void remove() {
char id[20];
printf("请输入要删除的学生的学号:");
scanf("%s", id);
Node *p = head, *q = NULL;
while (p != NULL) {
if (strcmp(p->student.id, id) == 0) {
if (q == NULL) {
head = p->next;
} else {
q->next = p->next;
}
free(p);
printf("删除成功!\n");
return;
}
q = p;
p = p->next;
}
printf("未找到该学生!\n");
}
// 选课信息输出
void output() {
int choice;
printf("请选择输出方式:\n");
printf("1. 全部输出\n");
printf("2. 按学号输出\n");
scanf("%d", &choice);
if (choice == 1) {
Node *p = head;
while (p != NULL) {
printf("学号:%s\n", p->student.id);
printf("姓名:%s\n", p->student.name);
printf("性别:%s\n", p->student.gender);
printf("专业:%s\n", p->student.major);
printf("选课名称:%s\n", p->course.course_name);
printf("学分:%d\n", p->course.credit);
printf("上课时间:%s\n", p->course.time);
p = p->next;
}
} else if (choice == 2) {
char id[20];
printf("请输入要输出的学生的学号:");
scanf("%s", id);
Node *p = head;
while (p != NULL) {
if (strcmp(p->student.id, id) == 0) {
printf("学号:%s\n", p->student.id);
printf("姓名:%s\n", p->student.name);
printf("性别:%s\n", p->student.gender);
printf("专业:%s\n", p->student.major);
printf("选课名称:%s\n", p->course.course_name);
printf("学分:%d\n", p->course.credit);
printf("上课时间:%s\n", p->course.time);
return;
}
p = p->next;
}
printf("未找到该学生!\n");
} else {
printf("输入有误!\n");
}
}
// 选课相关排序(按学号排序)
void sort() {
Node *p, *q;
p = head;
while (p != NULL) {
q = p->next;
while (q != NULL) {
if (strcmp(p->student.id, q->student.id) > 0) {
StudentInfo temp_student = p->student;
p->student = q->student;
q->student = temp_student;
CourseInfo temp_course = p->course;
p->course = q->course;
q->course = temp_course;
}
q = q->next;
}
p = p->next;
}
}
int main() {
int choice;
while (1) {
printf("\n请选择操作:\n");
printf("1. 选课信息链表创建\n");
printf("2. 选课信息输入\n");
printf("3. 选课信息查询\n");
printf("4. 选课信息修改\n");
printf("5. 选课信息删除\n");
printf("6. 选课信息输出\n");
printf("7. 选课相关排序\n");
printf("8. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
create();
break;
case 2:
insert();
break;
case 3:
search();
break;
case 4:
modify();
break;
case 5:
remove();
break;
case 6:
output();
break;
case 7:
sort();
printf("排序成功!\n");
break;
case 8:
return 0;
default:
printf("输入有误!\n");
break;
}
}
}
```
此代码实现了选课信息链表的创建、选课信息输入、选课信息查询、选课信息修改、选课信息删除、选课信息输出(全部或部分输出)或保存到文件,以及选课相关排序(按学号排序)等功能。