数据结构课程--学习鹏哥通讯录代码
其中为xitong.h
#define _CRT_SECURE_NO_WARNINGS //可以将scanf进行使用,不用scanf_s
#include<stdio.h>
#include<stdlib.h>
#include<errno.h> //显示错误,如果出错 则显示其后面的语句
#include<string.h>
#include<assert.h> //本程序中用来检查信息是否为空,为空则终止程序
#include<windows.h> //使用光标
#define MAX 20
#define NAME 20
#define SEX 10
#define Size 2
#define Dest 3
//学生信息的录入:包括学号、姓名、性别、年龄、专业、班级等。
typedef struct PeoInfo{ //利用typedef将struct PeoInfo 转换为PeoInfo
char xuehao[MAX]; //学号
char name[NAME]; //姓名
char sex[SEX]; //性别
int age; //年龄
char zhuangye[MAX]; //专业
int class; // 班级
int Chinese; //语文
int Math; //数学
int English; //英语
int otherclass; //其它课程
}PeoInfo;
typedef struct Zhuti
{
PeoInfo* data;
int count; //栈顶
int capacity; //容量
}Zhuti;
int InitZhuti(Zhuti* pc); //初始化
void AddZhuti(Zhuti* pc); //添加学生信息
void DelZhuti(Zhuti* pc); //删除学生信息
void SearchZhuti(Zhuti* pc); //搜索学生信息
void ShowZhuti(Zhuti* pc); //显示学生信息
void ModifyZhuti(Zhuti* pc); //修改学生信息
void SortZhuti(Zhuti* pc); //对学生信息排序
void ScoreZhuti(Zhuti* pc); //对学生分析排序
void Destory(Zhuti* pc); //结束信息
void SaveZhuti(const Zhuti* pc); //保存学生信息
void LoadZhuti(Zhuti* pc); //将学生信息放在文本中
zhuti.c代码
#define CRT_SECURE_NO_WARNINGS
#include"xitong.h" //引用头文件中的库函数
void gotoxy(int x, int y)
{
COORD p;//定义结构体变量p
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取当前函数句柄
p.X = x;//将光标移动位置传递给结构体
p.Y = y;
SetConsoleCursorPosition(handle, p);//移动光标
}
void menu() //目录
{
gotoxy(45, 10);
printf("----------------------------------\n");
gotoxy(45, 11);
printf("------------学生管理系统----------\n");
gotoxy(45, 12);
printf("------------1.录入学生信息--------\n");
gotoxy(45, 13);
printf("------------2.删除学生信息--------\n");
gotoxy(45, 14);
printf("------------3.搜索学生信息--------\n");
gotoxy(45, 15);
printf("------------4.展现学生信息--------\n");
gotoxy(45, 16);
printf("------------5.修改学生信息--------\n");
gotoxy(45, 17);
printf("------------6.将学生信息排序------\n");
gotoxy(45, 18);
printf("------------7.学生成绩记录--------\n");
gotoxy(45, 19);
printf("------------0.退出系统------------\n");
gotoxy(45, 20);
printf("----------------------------------\n");
}
enum option //使用枚举排序
{
Exit,
Add,
Del,
Search,
Show,
Modify,
Sort,
Score,
};
int main()
{
int input = 0;
Zhuti uti;
InitZhuti(&uti); //初始化栈
do
{
menu();
gotoxy(45, 20);
printf("请输入功能序号");
scanf("%d",&input);
system("cls");
switch (input)
{
case Add:
AddZhuti(&uti);
break;
case Del:
DelZhuti(&uti);
break;
case Search:
SearchZhuti(&uti);
break;
case Show:
ShowZhuti(&uti);
break;
case Modify:
ModifyZhuti(&uti);
break;
case Sort:
SortZhuti(&uti);
break;
case Score:
ScoreZhuti(&uti);
break;
case Exit:
SaveZhuti(&uti);
Destory(&uti);
break;
default:
printf("输入错误");
break;
}
} while (input);
return 0;
}
gonnen.c
#define CRT_SECURE_NO_WARNINGS
#include"xitong.h"
void CheckCapition(Zhuti* pc)
{
if (pc->count == pc->capacity)
{ //重新调整之前的内存块大小加2
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + Size) * sizeof(PeoInfo));
if (ptr == NULL)
{
printf("%s\n", strerror(errno));
return;
}
else {
pc->data = ptr; //扩容后放到指针指向的信息中
pc->capacity += Size;
printf("增容成功\n");
}
}
}
void LoadZhuti(Zhuti* pc)
{
FILE* pfRead = fopen("zhuti.txt", "rb"); //打开其文本
if (pfRead == NULL)
{
perror("LoadZhuti");
return;
}
PeoInfo tmp = { 0 };
while (fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1) //读取文件显示数据,从pfRead输入流到到其指向指针读取sizeof(PeoInfo)次
{
CheckCapition(pc); //扩容
pc->data[pc->count] = tmp; //读取后的数据转移到数组信息中
pc->count++; //一个一个转移
}
fclose(pfRead); //关闭文本
pfRead = NULL;
}
//动态版本
int InitZhuti(Zhuti* pc)
{
assert(pc);
pc->count = 0;
pc->data = (PeoInfo*)calloc(Dest, sizeof(PeoInfo)); //分配内存空间,将其初始化为零,返回其指针
if (pc->data == NULL) //判断分配是否成功
{
printf("%s\n", strerror(errno));
return 1;
}
pc->capacity = Dest; //将容量设定为3
LoadZhuti(pc);
return 0;
}
//动态的版本
void AddZhuti(Zhuti* pc)
{
assert(pc);
//增容
CheckCapition(pc);
printf("输入学生学号:\n");
scanf("%s",pc->data[pc->count].xuehao);
printf("请输入姓名:\n");
scanf("%s",pc->data[pc->count].name); //pc->count 代表为零输入在data的姓名信息中
printf("请输入年龄:\n");
scanf("%d",&(pc->data[pc->count].age)); //&是因为姓名是数组,本身数组名就是地址,而age是int,需要&地址名的引用
printf("请输入性别:\n");
scanf("%s",pc->data[pc->count].sex);
printf("请输入专业:\n");
scanf("%s",pc->data[pc->count].zhuangye);
printf("请输入班级:\n");
scanf("%d",&(pc->data[pc->count].class));
printf("请输入语文成绩:\n");
scanf("%d", &(pc->data[pc->count].Chinese));
printf("请输入数学成绩:\n");
scanf("%d", &(pc->data[pc->count].Math));
printf("请输入英语成绩:\n");
scanf("%d", &(pc->data[pc->count].English));
printf("课程的选择有:考古--1,植物学--2,海洋学--3,不想选0\n");
scanf("%d", &(pc->data[pc->count].otherclass));
//学生信息的录入:包括学号、姓名、性别、年龄、专业、班级等。
pc->count++; //栈中的数量增加一位
printf("增加成功\n");
}
void ShowZhuti(const Zhuti* pc)
{
assert(pc);
int i = 0;
printf("%-10s\t%-10s\t%-5s\t%-10s\t%-10s\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "学号","姓名", "年龄", "性别", "专业","班级","语文","数学","英语","其他课程");
for (i = 0; i < pc->count; i++) //出栈
{
printf("%-10s\t%-10s\t%-5d\t%-10s\t%-10s\t%-5d\t%-5d\t%-5d\t%-5d\t%-5d\t\n", pc->data[i].xuehao,
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].zhuangye,
pc->data[i].class,
pc->data[i].Chinese,
pc->data[i].Math,
pc->data[i].English,
pc->data[i].otherclass);
}
}
static int FindByName(Zhuti* pc, char name[]) //使用static将局部变量中姓名生命周期延长
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (strcmp(pc->data[i].name, name) == 0) //判断输入姓名与信息中的姓名是否一致
{
return i;
}
}
return -1;
}
void DelZhuti(Zhuti* pc)
{
char name[NAME] = { 0 };
assert(pc);
int i = 0;
if (pc->count == 0)
{
printf("管理系统为空,没有信息可以删除\n");
}
printf("请输入要删除人的姓名");
scanf("%s",name);
int pos = FindByName(pc, name); //查明联系人姓名
if (pos == -1)
{
printf("要删除的人不存在\n");
return;
}
for (i = pos; i < pc->count - 1; i++) //删除
{
pc->data[i] = pc->data[i + 1];
}
pc->count--; //栈中的数据删除一位
printf("删除成功\n");
}
void SearchZhuti(Zhuti* pc)
{
assert(pc);
int i = 0;
char name[NAME] = { 0 };
printf("输入查找人的姓名");
scanf("%s",&name);
int pos = FindByName(pc, name); //查明联系人姓名
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
else {
printf("%-10s\t%-10s\t%-5s\t%-10s\t%-10s\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\t\n", "学号", "姓名", "年龄", "性别", "专业", "班级","语文","数学","英语","其他课程");
printf("%-10s\t%-10s\t%-5d\t%-10s\t%-10s\t%-5d\t%-5d\t%-5d\t%-5d\t%-5d\t\n", pc->data[pos].xuehao,
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].zhuangye,
pc->data[pos].class,
pc->data[pos].Chinese,
pc->data[pos].Math,
pc->data[pos].English,
pc->data[pos].otherclass);
}
}
void ModifyZhuti(Zhuti* pc)
{
assert(pc);
char name[NAME] = { 0 };
printf("输入修改人的姓名");
scanf("%s",name);
int pos = FindByName(pc, name); //查明联系人姓名
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
else
{
printf("请输入姓名:\n");
scanf("%s",pc->data[pos].name); //pc->count 代表为零输入在data的姓名信息中
printf("请输入年龄:\n");
scanf("%d",&(pc->data[pos].age)); //&是因为姓名是数组,本身数组名就是地址,而age是int,需要&地址名的引用
printf("请输入性别:\n");
scanf("%s",pc->data[pos].sex);
printf("请输入学号:\n");
scanf("%s",pc->data[pos].xuehao);
printf("请输入专业:\n");
scanf("%s",pc->data[pos].zhuangye);
printf("请输入班级:\n");
scanf("%d",&(pc->data[pos].class));
printf("请输入语文成绩:\n");
scanf("%d", &(pc->data[pos].Chinese));
printf("请输入数学成绩:\n");
scanf("%d", &(pc->data[pos].Math));
printf("请输入英语成绩:\n");
scanf("%d", &(pc->data[pos].English));
printf("请输入其它课程:\n");
scanf("%d", &(pc->data[pos].otherclass));
}
printf("修改成功");
}
int by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); //排序方式由姓名从小到大
}
void SortZhuti(Zhuti* pc)
{
assert(pc);
qsort(pc->data, pc->count, sizeof(PeoInfo), by_name); //C语言排序万能工具 数组名 元素个数,元素字节数 排序方式
printf("排序成功,再输入4");
}
void ScoreZhuti(Zhuti* pc)
{
assert(pc);
char name[NAME] = { 0 };
printf("输入学生的姓名");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("寻找的人不存在");
return;
}
else {
if(pc->data[pos].Chinese<60)
{
printf("该学生语文成绩差\n");
}
if (pc->data[pos].Math < 60)
{
printf("该学生数学成绩差\n");
}
if (pc->data[pos].English<60)
{
printf("该学生英语成绩差\n");
}
if ((pc->data[pos].Chinese + pc->data[pos].Math + pc->data[pos].English) >= 180)
{
printf("该学生成绩合格\n");
}
}
printf("该学生分析完成\n");
}
void Destory(Zhuti* pc)
{
assert(pc);
free(pc->data); //将信息清空
pc->data = NULL;
}
void SaveZhuti(const Zhuti* pc)
{
assert(pc);
FILE* pfWrite = fopen("zhuti.txt", "wb");
if (pfWrite == NULL)
{
perror("SaveZhuti");
return;
}
int i = 0;
for (i = 0; i < pc->count; i++)
{
fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite); //将数组中数据给定到输出流中
}
fclose(pfWrite);
pfWrite = NULL;
}
设定好头文件,源文件可以运行