实验4:指针与结构体专题1(HZAU)

1.编写函数int Read(int *p); 录入数组元素,返回值代表元素个数。录入数据时输入0代表数据录入的结束。编写函数void Print(int *p, int n); 负责输出数组中的元素,n代表数组大小。编写函数void Swap(int *p, int m, int *q, int n);  交换主函数里的两个整形数组里的数据值,其中数组的元素个数分别传递给形参m和n。编写选择排序的函数void MySort(int *p, int n); 负责实现数组元素从小到大的排序。

#define _CRT_CESURE_NO_WARNINGS
//编写函数int Read(int* p); 录入数组元素,返回值代表元素个数。录入数据时输入0代表数据录入的结束。
//编写函数void Print(int* p, int n); 负责输出数组中的元素,n代表数组大小。
//编写函数void Swap(int* p, int m, int* q, int n);  
//交换主函数里的两个整形数组里的数据值,其中数组的元素个数分别传递给形参m和n。
//编写选择排序的函数void MySort(int* p, int n); 负责实现数组元素从小到大的排序。
#include<stdio.h>
#include<iostream>
using namespace std;
int Read(int* p)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = 0;
		scanf("%d", p + i);
		if (*(p + i))
		{
			count++;
			continue;
		}
		else
			break;
	}
	return count;
}
void Swap(int* a, int m, int* b, int n)
{
	int i = 0;
	if (m > n)
	{
		for (i = 0; i < m; i++)
		{
			if (i < n)
			{
				int tmp = *(a + i);
				*(a + i) = *(b + i);
				*(b + i) = tmp;
			}
			else
			{
				int tmp = *(a + i);
				*(a + i) = *(b + i);
				*(b + i) = tmp;
			}
			
		}
	}
	else
	{
		for (i = 0; i < n; i++)
		{
			if (i < n)
			{
				int tmp = *(a + i);
				*(a + i) = *(b + i);
				*(b + i) = tmp;
			}
			else
			{
				int tmp = *(b + i);
				*(b + i) = *(a + i);
				*(a + i) = tmp;
			}
		}
	}
}
void Print(int* a, int m)
{
	int i = 0;
	for (i = 0; i < m; i++)
	{
		if (*(a + i) != 0)
		{
			printf("%d ", *(a + i));
		}
	}
	printf("\n");
}
void MySort(int* a, int m)
{
	int i = 0;
	for (i = 0; i < m - 1; i++)
	{
		int j = 0;
		for (j = 0; j < m - i - 1; j++)
		{
			if (*(a + j) > *(a + j + 1))
			{
				int tmp = *(a + j);
				*(a + j) = *(a + j + 1);
				*(a + j + 1) = tmp;
			}
		}
	}
}
int main()
{
	int a[10] = { 0 };
	int b[10] = { 0 };
	int m = Read(a);
	int n = Read(b);
	Swap(a, m, b, n);
	Print(a, n);
	Print(b, m);
	MySort(a, n);
	MySort(b, m);
	Print(a, n);
	Print(b, m);
	return 0;
}

2.定义函数reverse,实现字符串的逆序存储,函数原型为: void  reverse(char *s)。并在主函数中实现字符串的输入以及逆序后的输出。

#include<stdio.h>
#include<string.h>
//定义函数reverse,实现字符串的逆序存储,
//函数原型为: void  reverse(char *s)。并在主函数中实现字符串的输入以及逆序后的输出。
void reverse(char* s)
{
	int len = strlen(s);
	int i = 0;
	for (i = 0; i < len / 2; i++)
	{
		char tmp = *(s + i);
		*(s + i) = *(s + len - 1- i);
		*(s + len - 1 - i) = tmp;
	}
}
int main()
{
	//字符串的输入
	char s[100] = { 0 };
	gets(s);
	reverse(s);
	printf("%s", s);
	return 0;
}

3.设计一个矩阵结构体类型aRectangle,该类型有长和宽两个double类型成员。编写函数void  Read(aRectangle &a):输入一个矩形的长和宽的值,并确保长宽都在(0,50)范围之内,如果不在范围内设置它们的默认值为1。编写函数double Perimeter(aRectangle &a):求该矩阵的周长。编写函数void Print(aRectangle &a):输出矩阵的周长。

#include<stdio.h>
#include<iostream>
using namespace std;
//设计一个矩阵结构体类型aRectangle,该类型有长和宽两个double类型成员.
//编写函数void  Read(aRectangle& a):输入一个矩形的长和宽的值,
//并确保长宽都在(0, 50)范围之内,如果不在范围内设置它们的默认值为1。
//编写函数double Perimeter(aRectangle & a):求该矩阵的周长。
//编写函数void Print(aRectangle & a):输出矩阵的周长。
typedef struct aRectangle
{
	double length;
	double width;
}aRectangle;
void Read(aRectangle& a)
{
	cin >> a.length>>a.width;
	//scanf_s("%d %d", &(a.length), &(a.width));
	if (a.length >= 50 || a.length <= 0)
	{
		a.length = 1;
	}
	if (a.width >= 50 || a.length <= 0)
	{
		a.width = 1;
	}
}
double Perimeter(aRectangle& a)
{
	return (a.length + a.width) * 2;
}
void Print(double ret)
{
	cout << ret;
	//printf("%lf", ret);
}
int main()
{
	aRectangle a = { 0,0 };
	Read(a);
	double ret = Perimeter(a);
	Print(ret);
	return 0;
}

4.定义一个坐标点的结构体类型Point,该类型有两个double类型成员,分别代表横纵两个坐标;然后再设计一个矩形结构体类型bRectangle,该类型有两个Point类型成员,分别代表左下角与右上角两个点。编写函数void Read(bRectangle &rec):输入一个矩形的的左下角与右上角两个点的值,并判断该矩形的两个点是否能够构成一个矩形。如果不能构成矩形,则将矩形的两点初始化为(0,0)和(1,1)。编写函数double Area(bRectangle &rec):计算该矩形的面积。编写函数void bPrint(bRectangle &rec):输出矩阵的面积。

#include<stdio.h>
#include<iostream>
using namespace std;
//定义一个坐标点的结构体类型Point,该类型有两个double类型成员,
//分别代表横纵两个坐标;然后再设计一个矩形结构体类型bRectangle,
//该类型有两个Point类型成员,分别代表左下角与右上角两个点。
//编写函数void Read(bRectangle& rec) :输入一个矩形的的左下角与右上角两个点的值,
//并判断该矩形的两个点是否能够构成一个矩形。
//如果不能构成矩形,则将矩形的两点初始化为(0,0)和(1, 1)。
//编写函数double Area(bRectangle & rec):计算该矩形的面积。
//编写函数void bPrint(bRectangle & rec):输出矩阵的面积。
typedef struct Point
{
	double x;
	double y;
}Point;

typedef struct bRectangle
{
	Point a1;
	Point a2;
}bRectangle;

void Read(bRectangle& rec)
{
	//输入矩形左下角和右上角的坐标
	cin >> rec.a1.x >> rec.a1.y;
	cin >> rec.a2.x >> rec.a2.y;
	if (rec.a1.x == rec.a2.x || rec.a1.y == rec.a2.y)
	{
		rec.a1.x = 0;
		rec.a1.y = 0;
		rec.a2.x = 1;
		rec.a2.y = 1;
	}
}
double Area(bRectangle& rec)
{
	double x1 = (rec.a2.x) - (rec.a1.x);
	double y1 = (rec.a2.y) - (rec.a1.y);
	return (x1*y1);
}
void bPrint(double ret)
{
	cout << ret;
}
int main()
{
	bRectangle rec = { 0,0 };
	Read(rec);
	double ret = Area(rec);
	bPrint(ret);
	return 0;
}

5.设计相应的结构体类型数组,完成一个班(为方便输入,设定为5人)学生的学号、姓名、语文成绩、数学成绩、外语成绩的输入;计算每位同学的总分及平均分,并按表格形式输出学生的所有信息;将上述表格按照学生的平均分排序并按表格形式输出。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAX 5
#include<assert.h>
#include<string.h>
typedef struct PeoInfo
{
	char id[15];
	char name[15];
	double chin;
	double math;
	double eng;
	double socre;
	double aver;
}PeoInfo;

//分装到一层
typedef struct Student
{
	PeoInfo data[MAX];//存放多个人的信息
	int count;//计数记录当前的人的信息
}Student;

void InitStudent(Student* pc)
{
	assert(pc);
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}
void AddStudent(Student* pc)
{
	assert(pc);
	if (pc->count >= MAX)
	{
		printf("表格已满,无法添加\n");
		return;
	}
	printf("请输入学生学号:");
	scanf("%s", pc->data[pc->count].id);
	printf("请输入学生姓名:");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入语文成绩:");
	scanf("%lf", &(pc->data[pc->count].chin));
	printf("请输入数学成绩:");
	scanf("%lf", &(pc->data[pc->count].math));
	printf("请输入英语成绩:");
	scanf("%lf", &(pc->data[pc->count].eng));
	pc->data[pc->count].socre = (pc->data[pc->count].chin + pc->data[pc->count].math + pc->data[pc->count].eng);
	pc->data[pc->count].aver = (pc->data[pc->count].socre) / 3.0;
	pc->count++;
	printf("增加成功\n");
}

void ShowStudent(const Student* pc)
{
	assert(pc);
	//printf("  ________________________________________________________________________________________________________________\n");
	printf("—————————————————————————————————————————————————————————————\n");
	printf("%-15s\t\t%-15s\t\t%-2s\t%-2s\t%-2s\t%-2s\t\t%-2s\n ", "|学号"," |姓名"," |语文成绩",
		" |数学成绩"," |英语成绩"," |总分"," |平均成绩|");
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		printf("—————————————————————————————————————————————————————————————\n");
		printf("|%-15s\t |%-15s\t |%-.2lf\t\t |%-.2lf\t\t |%-.2lf\t\t |%-.2lf\t |%-.2lf\t  |\n ", pc->data[i].id, pc->data[i].name, pc->data[i].chin,
			pc->data[i].math, pc->data[i].eng, pc->data[i].socre, pc->data[i].aver);
	}
	//printf(" ________________________________________________________________________________________________________________\n");
	printf("—————————————————————————————————————————————————————————————\n");
}
int main()
{
	Student Stu;//Stu就是学生信息
	//初始化学生信息,模块化的工作,不直接进行初始化
	InitStudent(&Stu);
	do
	{
		//增加学生信息
		AddStudent(&Stu);
	} while (Stu.count < MAX);
	//显示学生信息
	ShowStudent(&Stu);
	return 0;
}

6.第六题还存在着小问题,先拿来应应急,过几天发另改正后的一个版本

(1)主界面为

    *********************

     1.输入一名学生信息

     2.删除一名学生信息

     3.修改一名学生信息

     4.查找一名学生信息

     5.输出全部学生信息

     6.排序

    *********************

(2)“1.输入一名学生信息”的要求:若输入1,则清屏后显示表头,并输出提示信息:“请输入一名学生信息”,输入一名学生信息后(注意:此时应计算出该学生的总分及平均分),输出提示信息:“是否输入下一名学生信息(y/n)”,若输入'y'则继续输入下一名学生信息,若输入'n',则返回主界面。

(3)“2.删除一名学生信息”的要求:若输入2,则清屏,并输出子界面1

    *************************

     1.输入待删除学生的学号

     2.输入待删除学生的姓名

     3.返回主界面

    *************************

    若输入1,则清屏并输出提示信息:“请输入待删除学生的学号”,输入一名学生学号后,若学生学号正确,则输出“删除成功,并返回子界面1;若学生学号不正确,则输出“该学生不存在”,并返回子界面1;

    若输入2,则清屏并输出提示信息:“请输入待删除学生的姓名”,输入一名学生姓名后,若学生姓名正确,则输出“删除成功,并返回子界面1;若学生姓名不正确,则输出“该学生不存在”,并返回子界面1;

    若输入3,则返回主界面

(4)“3.修改一名学生信息”的要求:若输入3,则清屏,并输出提示信息:“请输入待删除学生的学号”,输入一名学生学号后,若正确,则输出如下子界面2;若输入不正确,则输出“该学生不存在”,并清屏及输出提示信息:“请输入待删除学生的学号”。

    子界面2如下:

    *************************

     1.修改学生的学号

     2.修改学生的姓名

     3.修改学生的语文成绩

     4.修改学生的数学成绩

     5.修改学生的英语成绩

     6.返回主菜单

    *************************

    若输入1,则清屏并输出提示信息:“请输入修改后的学号:”,输入后,返回子界面2;

    若输入2,则清屏并输出提示信息:“请输入修改后的姓名:”,输入后,返回子界面2;

    若输入3,则清屏并输出提示信息:“请输入修改后的语文成绩:”,输入后,返回子界面2;

    若输入4,则清屏并输出提示信息:“请输入修改后的数学成绩:”,输入后,返回子界面2;

    若输入5,则清屏并输出提示信息:“请输入修改后的英语成绩:”,输入后,返回子界面2;

(5)“4.查找一名学生信息”的要求:若输入4,则清屏,并输出子界面3

   子界面3如下:

    *************************

     1.查找学生的学号

     2.查找学生的姓名

     3.返回主菜单

    *************************

    若输入1,则清屏并输出提示信息:“请输入待查找学生的学号”,输入一名学生学号后,若学生学号正确,则分行输出该学生的各项信息后,输出一行提示信息“是否返回上级界面?(y/n)”,若输入y则返回界面3,否则继续停留在该界面;若学生学号不正确,则输出“该学生不存在”,并返回子界面3;

    若输入2,则清屏并输出提示信息:“请输入待查找学生的姓名”,输入一名学生姓名后,若学生姓名正确,则分行输出该学生的各项信息后,输出一行提示信息“是否返回上级界面?(y/n)”,若输入y则返回界面3,若输入n则继续停留在该界面;若学生姓名不正确,则输出“该学生不存在”,并返回子界面3;

    若输入3,则返回主界面

(6)“5.输出全部学生信息”的要求:若输入5,则清屏,并按第5题要求按表格方式输出表格

(7)“6.排序”的要求:若输入6,则清屏,并输出子界面4

    子界面4如下:

    *************************

     1.按照学生的学号排序

     2.按照学生的语文成绩排序

     3.按照学生的数学成绩排序

     4.按照学生的英语成绩排序

     5.按照学生的总分排序

     6.返回主菜单

    *************************

    若输入1,则清屏,并按第5题要求按表格方式输出排序后的表格

    若输入2,则清屏,并按第5题要求按表格方式输出排序后的表格

    若输入3,则清屏,并按第5题要求按表格方式输出排序后的表格

    若输入4,则清屏,并按第5题要求按表格方式输出排序后的表格

    若输入5,则清屏,并按第5题要求按表格方式输出排序后的表格

    若输入6,则清屏,并返回主菜单

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define MAX 100
using namespace std;
#include<assert.h>
typedef struct PeoInfo
{
	char id[15];
	char name[15];
	double chin;
	double math;
	double eng;
	double score;
	double aver;
}PeoInfo;

typedef struct Student
{
	PeoInfo data[MAX];
	int count;
}Student;

void menu()
{
	printf("******************\n");
	printf("1.输入一名学生信息\n");
	printf("2.删除一名学生信息\n");
	printf("3.修改一名学生信息\n");
	printf("4.查找一名学生信息\n");
	printf("5.输出全部学生信息\n");
	printf("6.排序\n");
	printf("******************\n");
}
int menu1()
{
	printf("是否输入下一名学生信息(y/n)");
	char i = 0;
	cin >> i;
	if (i == 'n')
		return 0;
	else if (i == 'y')
		return 1;
	else
	{
		printf("输入错误,请重新选择\n");
		return menu1();
	}
}
int Find(Student* pc, char s[])
{
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (strcmp(pc->data[i].id, s) == 0)
			return i;
		if (strcmp(pc->data[i].name, s) == 0)
			return i;
	}
	return -1;
}
void DelStudent(Student* pc)
{
	int input = 0;
	char id[15];
	char name[15];
	while (input != 3)
	{
		printf("********************\n");
		printf("1.输入待删除学生的学号\n");
		printf("2.输入待删除学生的姓名\n");
		printf("3.返回主界面\n");
		printf("********************\n");
		int pos1 = 0;
		int pos2 = 0;
		int i = 0;
		cin >> input;
		if (pc->count == 0)
		{
			printf("表格为空,没有信息可以删除\n");
			return;
		}
		switch (input)
		{
		case 1:
			system("cls");
			printf("输入待删除学生的学号:");
			scanf("%s", id);
			//删除1:查找2:删除
			pos1 = Find(pc, id);
			if (pos1 == -1)
			{
				printf("该学生不存在\n");
				return;
			}
			else
			{
				for (i = pos1; i < pc->count - 1; i++)
				{
					pc->data[i] = pc->data[i + 1];
				}
				pc->count--;
				printf("删除成功\n");
			}
			break;
		case 2:
			system("cls");
			printf("输入待删除学生的姓名:");
			scanf("%s", name);
			pos2 = Find(pc, name);
			if (pos2 == -1)
			{
				printf("该学生不存在\n");
				return;
			}
			else
			{
				for (i = pos2; i < pc->count - 1; i++)
				{
					pc->data[i] = pc->data[i + 1];
				}
				pc->count--;
				printf("删除成功\n");
			}
			break;
		case 3:
			system("cls");
			break;
		}
	}
}
void InitStudent(Student* pc)
{
	//确保pc不是一个空指针
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));
}
void AddStudent(Student* pc)
{
	if (pc->count >= MAX)
	{
		printf("表格已满,无法添加\n");
		return;
	}
	printf("请输入学生学号:");
	scanf("%s", pc->data[pc->count].id);
	printf("请输入学生姓名:");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入语文成绩:");
	scanf("%lf", &(pc->data[pc->count].chin));
	printf("请输入数学成绩:");
	scanf("%lf", &(pc->data[pc->count].math));
	printf("请输入英语成绩:");
	scanf("%lf", &(pc->data[pc->count].eng));
	pc->data[pc->count].score = (pc->data[pc->count].chin + pc->data[pc->count].math + pc->data[pc->count].eng);
	pc->data[pc->count].aver = (pc->data[pc->count].score) / 3.0;
	pc->count++;
	printf("增加成功\n");
}

//修改id和name
void Change1(struct Student* pc, char s[], int pos, int input)
{
	//字符串拷贝
	if (input == 1)
		strcpy(pc->data[pos].id, s);
	if (input == 2)
		strcpy(pc->data[pos].name, s);
}
void Change2(struct Student* pc, double l, int pos, int input)
{
	if (input == 3)
		pc->data[pos].chin = l;
	else if (input == 4)
		pc->data[pos].math = l;
	else if (input == 5)
		pc->data[pos].eng = l;
}

int menu3()
{
	printf("********************\n");
	printf("1.修改学生的学号\n");
	printf("2.修改学生的姓名\n");
	printf("3.修改学生的语文成绩\n");
	printf("4.修改学生的数学成绩\n");
	printf("5.修改学生的英语成绩\n");
	printf("6.返回主菜单\n");
	printf("********************\n");
	int input = 0;
	scanf("%d", &input);
	return input;
}
void Midfy(struct Student* pc)
{
	char s[15];
	double chin = 0;
	double math = 0;
	double eng = 0;
	int input = 0;
	while (input != 6)
	{
		printf("请输入待修改学生的学号:");
		scanf("%s", s);
		int pos = Find(pc, s);
		if (pc->count == 0)
		{
			printf("没有录入学生信息,无法修改\n");
			return;
		}
		if (pos == -1)
		{
			printf("该学生不存在\n");
			//system("cls");
		}
		if (pos != -1)
		{
			input = menu3();
			switch (input)
			{
			case 1:
				system("cls");
				printf("请输入修改后的学号:");
				scanf("%s", s);
				Change1(pc, s, pos, input);
				printf("修改成功\n");
				input = menu3();
				break;
			case 2:
				system("cls");
				printf("请输入修改后的姓名:");
				scanf("%s", s);
				Change1(pc, s, pos, input);
				printf("修改成功\n");
				input = menu3();
				break;
			case 3:
				system("cls");
				printf("请输入修改后的语文成绩:");
				scanf("%lf", &chin);
				Change2(pc, chin, pos, input);
				printf("修改成功\n");
				input = menu3();
				break;
			case 4:
				system("cls");
				printf("请输入修改后的数学成绩:");
				scanf("%lf", &math);
				Change2(pc, math, pos, input);
				printf("修改成功\n");
				input = menu3();
				break;
			case 5:
				system("cls");
				printf("请输入修改后的英语成绩:");
				scanf("%lf", &eng);
				Change2(pc, eng, pos, input);
				printf("修改成功\n");
				input = menu3();
				break;
			case 6:
				system("cls");
				return;
				break;
			}
		}
	}
}
void menu4()
{
	printf("****************\n");
	printf("1.查找学生的学号\n");
	printf("2.查找学生的姓名\n");
	printf("3.返回主菜单\n");
	printf("****************\n");
}
void Search(struct Student* pc)
{
	int input = 0;
	char i = 0;
	char s[15];
	int pos = 0;
	int flag = 1;
	do
	{
		if (flag)
			menu4();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入待查找学生的学号:");
			scanf("%s", s);
			pos = Find(pc, s);
			if (pc->count == 0)
				printf("学生信息未录入\n");
			if (pos == -1)
				printf("该学生不存在\n");
			else
			{
				printf("%-15s\t%-15s\t%-.2lf\t%-.2lf\t%-.2lf\n", pc->data[pos].id, pc->data[pos].name,
					pc->data[pos].chin, pc->data[pos].math, pc->data[pos].eng);
				printf("是否返回上级界面?(y/n)");
				scanf("%s", &i);
				if (i == 'n')
					flag = 0;
			}
			break;
		case 2:
			printf("请输入待查找学生的姓名:");
			scanf("%s", s);
			pos = Find(pc, s);
			if (pc->count == 0)
				printf("学生信息未录入\n");
			if (pos == -1)
				printf("该学生不存在\n");
			else
			{
				printf("%-15s\t%-15s\t%-.2lf\t%-.2lf\t%-.2lf\n", pc->data[pos].id, pc->data[pos].name,
					pc->data[pos].chin, pc->data[pos].math, pc->data[pos].eng);
				printf("是否返回上级界面?(y/n)");
				scanf("%s", &i);
				if (i == 'n')
					flag = 0;
			}
			break;
		case 3:
			system("cls");
			menu();
			break;
		}
	} while (input != 3);
}
void Show(struct Student* pc)
{
	assert(pc);
	//printf("  ________________________________________________________________________________________________________________\n");
	printf("—————————————————————————————————————————————————————————————\n");
	printf("%-15s\t\t%-15s\t\t%-2s\t%-2s\t%-2s\t%-2s\t\t%-2s\n ", "|学号", " |姓名", " |语文成绩",
		" |数学成绩", " |英语成绩", " |总分", " |平均成绩|");
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		printf("—————————————————————————————————————————————————————————————\n");
		printf("|%-15s\t |%-15s\t |%-.2lf\t\t |%-.2lf\t\t |%-.2lf\t\t |%-.2lf\t |%-.2lf\t  |\n ", pc->data[i].id, pc->data[i].name, pc->data[i].chin,
			pc->data[i].math, pc->data[i].eng, pc->data[i].score, pc->data[i].aver);
	}
	//printf(" ________________________________________________________________________________________________________________\n");
	printf("—————————————————————————————————————————————————————————————\n");
}
void menu5()
{
	printf("******************\n");
	printf("1.按照学生学号排序\n");
	printf("2.按照语文成绩排序\n");
	printf("3.按照数学成绩排序\n");
	printf("4.按照英语成绩排序\n");
	printf("5.按照总分排序\n");
	printf("6.返回主菜单\n");
	printf("******************\n");
}
int cmp_stu_by_id(const void* e1, const void* e2)
{
	return strcmp(((PeoInfo*)e1)->id, ((PeoInfo*)e2)->id);
}
void Swap(double* num)
{
	double chin = *num;
	*num = *(num + 1);
	*(num + 1) = chin;
}
void my_sort(struct Student* pc, int input)
{
	int i = 0;
	for (i = 0; i < pc->count - 1; i++)
	{
		int j = 0;
		for (j = 0; j < pc->count - i - 1; j++)
		{
			if (input == 2)
			{
				if (pc->data[i].chin > pc->data[i + 1].chin)
				{
					Swap(&(pc->data[i].chin));
				}
			}
			else if (input == 3)
			{
				if (pc->data[i].math > pc->data[i + 1].math)
				{
					Swap(&(pc->data[i].math));
				}
			}
			else if (input == 4)
			{
				if (pc->data[i].eng > pc->data[i + 1].eng)
				{
					Swap(&(pc->data[i].eng));
				}
			}
			else if (input == 5)
			{
				if (pc->data[i].score > pc->data[i + 1].score)
				{
					Swap(&(pc->data[i].score));
				}
			}
		}
	}
}
void Sort(struct Student* pc)
{
	assert(pc);
	int input = 0;
	do
	{
		menu5();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			system("cls");
			qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_stu_by_id);
			Show(pc);
			break;
		case 2:
			system("cls");
			my_sort(pc, input);
			Show(pc);
			break;
		case 3:
			system("cls");
			my_sort(pc, input);
			Show(pc);
			break;
		case 4:
			system("cls");
			my_sort(pc, input);
			Show(pc);
			break;
		case 5:
			system("cls");
			my_sort(pc, input);
			Show(pc);
			break;
		case 6:
			menu();
			break;
		}
	} while (input != 6);
}
int main()
{
	int input = 0;
	Student Stu;
	InitStudent(&Stu);
	do
	{
		menu();
		//结构体元素初始化
		cin >> input;
		switch (input)
		{
		case 1:
		{
			system("cls");
			int ch = 0;
			do
			{
				//增加学生信息
				AddStudent(&Stu);
				ch = menu1();
			} while (ch);
			break;
		}
		case 2:
		{
			system("cls");
			DelStudent(&Stu);
			break;
		}
		case 3:
			system("cls");
			Midfy(&Stu);
			break;
		case 4:
			system("cls");
			Search(&Stu);
			break;
		case 5:
			system("cls");
			Show(&Stu);
			break;
		case 6:
			system("cls");
			Sort(&Stu);
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;
		}
	} while (input);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一份实验报告,主要涉及指针结构体。 ## 实验名称:指针结构体 ## 实验目的 - 理解指针结构体的概念 - 学会使用指针结构体进行编程 - 掌握指针结构体的常见用法 ## 实验内容 ### 1. 指针 指针是一种特殊的变量,它存储了一个地址,该地址指向内存中的另一个变量。指针可以用于传递变量的地址,从而实现函数间的参数传递和数据共享。 指针的声明方式为: ```c type *pointer_name; ``` 其中,`type`表示指针所指向的变量类型,`pointer_name`表示指针的名称。 指针的初始化方式为: ```c type var_name; type *pointer_name = &var_name; ``` 其中,`&`表示取地址符,`var_name`表示要指向的变量名称。 指针的使用方式为: ```c type var_name; type *pointer_name = &var_name; *pointer_name = value; ``` 其中,`*`表示解引用符,`value`表示要赋给变量的值。 ### 2. 结构体 结构体是一种用户自定义的数据类型,可以包含多个不同类型的成员变量。结构体的声明方式为: ```c struct struct_name { type member1; type member2; ... }; ``` 其中,`struct_name`表示结构体的名称,`member1`和`member2`表示结构体的成员变量,可以是任意类型。 结构体的初始化方式为: ```c struct struct_name var_name = {value1, value2, ...}; ``` 其中,`value1`和`value2`表示结构体的成员变量的值。 结构体的使用方式为: ```c struct struct_name var_name = {value1, value2, ...}; var_name.member1 = new_value1; var_name.member2 = new_value2; ``` 其中,`new_value1`和`new_value2`表示要赋给成员变量的新值。 ## 实验结果 本次实验我们使用指针结构体编写了一个程序,实现了以下功能: 1. 定义了一个名为`student`的结构体,包含学生的姓名、年龄和成绩三个成员变量。 2. 使用指针动态分配了一个`student`结构体对象,并对其进行初始化。 3. 使用指针访问结构体成员变量,并输出结果。 4. 释放动态分配的内存。 程序代码如下: ```c #include <stdio.h> #include <stdlib.h> struct student { char name[20]; int age; float score; }; int main() { struct student *p = (struct student *)malloc(sizeof(struct student)); if (p == NULL) { printf("Memory allocation failed!\n"); return -1; } strcpy(p->name, "Jack"); p->age = 18; p->score = 90; printf("Name: %s\n", p->name); printf("Age: %d\n", p->age); printf("Score: %.2f\n", p->score); free(p); return 0; } ``` ## 实验结论 本次实验我们深入学习了指针结构体的概念,并掌握了指针结构体的常见用法。通过实现一个简单的程序,我们进一步加深了对指针结构体的理解,为以后的编程工作打下了坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值