数据结构练习——简单学生成绩管理系统的操作(动态表C语言代码)

赶在最后一天完成了数据结构作业,边学C边学数据结构真的蛋疼

编程实现一个简单学生成绩表的操作
此系统的功能包括:
查询:按特定的条件查找学生
修改:按学号对某个学生的某门课程成绩进行修改
插入:增加新学生的信息
删除:按学号删除已退学的学生的信息。
学生成绩表的数据如下:

学号	姓名	性别	大学英语	高等数学
2008001	Alan	F	93	88
2008002	Danie	M	75	69
2008003	Helen	M	56	77
2008004	Bill	F	87	90
2008005	Peter	M	79	86
2008006	Amy	F	68	75

要求采用顺序存储结构来实现对上述成绩表的相关操作。
增删查的方法都是按照书上的改的,直接用发现一堆报错,原因如图
在这里插入图片描述C语言错误:request for member ‘xxx’ in something not a structure or union
经过调试才发现是 . 与->使用错了如果他是地址就在使用->给结构体赋值 如果不是地址就使用 . 来赋值

下面是最终代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTCREAMENT 10
#define  OVERFLOW    -2
//typedef int Student;
typedef  int  Status;

typedef struct {       //定义一个学生结构体
	char no[20];       // 学号
	char name[20];    // 姓名
	char sex[20];        //性别
	int price;       // 英语成绩
	int score;       //高数成绩
} Student;
typedef struct {
	Student * elem;
	int length;
	int listsize;
} SqList;
//初始化
Status InitIist(SqList *L) {
	L->elem = (Student*)malloc(LIST_INIT_SIZE * sizeof(Student));
	if(!L->elem)
		exit(OVERFLOW);
	L->length = 0;
	L->listsize = LIST_INIT_SIZE;
	return 1;
}

Status InsList(SqList *L, int i, Student e) { //插入学生信息
	Student * newbase;
	if(i<1||i>L->length+1)  //检查i是否合法
		return 0;
	//动态增加空间
	if(L->length >= L->listsize){
		newbase=(Student*)realloc(L->elem,(L->listsize+LISTCREAMENT)*sizeof(Student));
		if(!newbase){
			exit(OVERFLOW);
		}
		L->elem=newbase;
		L->listsize+=LISTCREAMENT;
	}
	//执行插入循环,用j标识,将i后面的数后移一位
	int j = 0;
	for(j = L->length-1; j>=i-1; j--){
 		L->elem[j+1] = L->elem[j];
 	} 
 	L->elem[i-1] = e;
 	L->length++;
 	return 1;
}

Status DelList(SqList *L, int i) { //删除指定位置学生记录
	if(i<1||i>L->length+1)  //检查i是否合法
		return 0;

	//执行删除循环,用j标识,将i后面的数前移一位
	int j = 0;
	for(j = i; j<=L->length; j++){
		L->elem[j-1] = L->elem[j]; //将后面元素依次前移
	}
	--L->length;
	return 1;
}

int Locatename(SqList *L, Student e) { //按照姓名查找
	/*用e返回L中第i个数据元素的值*/
	int i;
	for(i=0; i<L->length+1; i++) {
		if(!strcmp(L->elem[i].name,e.name))
		{ //比较两个字符串是否相同
			return i+1;
			break;
		}
	}
	return 0;
}

int Locateno(SqList *L, Student e) { //按照学号查找
	/*用e返回L中第i个数据元素的值*/
	int i;
	for(i=0; i<L->length+1; i++) {
		if(!strcmp(L->elem[i].no,e.no)) 
		{ //比较两个字符串是否相同
			return i+1;
			break;
		}
	}
	return 0;
}

int main() {
	int i,num,a,temp,select,sum=0,c;
	SqList L;
	InitIist(&L);
	Student m,e;

	printf("Reading student information:\n");
	num = 6;
	sum=num;
	FILE * fp;

	fp = fopen ("file.txt", "w+");
	fputs("2008001 Alan F 93 88\r\n", fp);
	fputs("2008002 Danie M 75 69\r\n", fp);
	fputs("2008003 Helen M 56 77\r\n", fp);
	fputs("2008004 Bill F 87 90\r\n", fp);
	fputs("2008005 Peter M 79 86\r\n", fp);
	fputs("2008006 Amy F 68	75\r\n", fp);

	rewind(fp);

	for(i=0; i<num; i++)
	{
	fscanf(fp,"%s %s %s %d %d",L.elem[i].no,L.elem[i].name,L.elem[i].sex,&L.elem[i].price,&L.elem[i].score);
	}
	fclose(fp);
	L.length=num;
	printf("\n");




	printf("所有学生的相关信息为:\n\n");
	for(i=0; i<L.length; i++) {
		printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
	}
	printf("\n");


	while(1) {
		printf("------------------菜单------------------\n");
		printf("  1-姓名查找\n");
		printf("  2-学号查找\n");
		printf("  3-插入\n");
		printf("  4-删除\n");
		printf("  5-修改学生成绩\n");
		printf("  6-退出系统\n");
		printf("------------------菜单------------------\n");
		scanf("%d",&num);
		switch(num) {
			case 1:
				printf("请输入你要查找的姓名:");
				scanf("%s",e.name);
				temp=Locatename(&L,e);
				if(temp!=0)
					printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].name,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
				else
					printf("查找失败!\n\n");
				break;
			case 2:
				printf("请输入你要查询的学号:");
				scanf("%s",e.no);
				temp=Locateno(&L,e);
				if(temp!=0){
					printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].name,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
				}else{
					printf("查找失败!\n\n");
				}
				break;
			case 3:
				printf("请输入你要插入的位置:");
				scanf("%d",&a);
				printf("请输入插入学生信息:\n");
				printf("学号:");
				scanf("%s",m.no);
				printf("姓名:");
				scanf("%s",m.name);
				printf("性别:");
				scanf("%s",m.sex);
				printf("英语成绩:");
				scanf("%d",&m.price);
				printf("高数成绩:");
				scanf("%d",&m.score);
				if(InsList(&L,a,m)) {
					sum++;
					printf("插入成功!\n\n");
				} else{
					printf("插入失败!\n\n");
				}
				printf("所有学生的相关信息为:\n\n");
				for(i=0; i<L.length; i++) {
					printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
				}
				printf("\n");
				break;
			case 4:
				printf("请输入要删除学生的学号:");
				scanf("%s",e.no);
				temp=Locateno(&L,e);
				if(temp!=0){
					if(DelList(&L,temp)) {
						sum--;
						printf("删除成功!\n\n");
					} else{
						printf("删除失败!\n\n");
					}
				}else{
					printf("查找失败!\n\n");
				}
				printf("所有学生的相关信息为:\n\n");
				for(i=0; i<L.length; i++) {
					printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
				}
				printf("\n");
				break;

			case 5: {
				printf("请输入你要修改成绩的学生学号:");
				scanf("%s",e.no);
				temp=Locateno(&L,e);
				if(temp!=0) {
					printf("请依次输入英语成绩和高数成绩: ");
					int a,b;
					scanf("%d%d",&a,&b);
					L.elem[temp-1].price=a;
					L.elem[temp-1].score=b;
					printf("修改成功!\n");
					printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].name,L.elem[temp-1].sex,L.elem[temp-1].price,L.elem[temp-1].score);
				} else {
					printf("输入学号有误,请重新输入\n");
				}

			}
			break;

			case 6: {
				printf("当前总学生个数为:%d\n\n",sum);
			}

			printf("当前所有学生的相关信息为:\n\n");
			for(i=0; i<L.length; i++) {
				printf("学号:%s 姓名:%s 性别:%s 英语成绩:%d 高数成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].sex,L.elem[i].price,L.elem[i].score);
			}
			printf("\n");
			printf("退出成功\n");
			return 0;
			default:
				printf("ERROR!\n");
		}
		printf("\n");
	}


	return 1;
}


程序截图
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值