C语言-对一个结构体中的字段进行排序

这是帮别人做的一个题目,好久没有接触过C语言了。有点发怵,只是似乎找回点当时学C语言,做课程设计的感觉。

题目:定义一个数组(学生结构体数组),里面包括学号、姓名、身份证和三科学生成绩。要求写一个函数,依据学生不论什么一个字段(如学号、姓名、身份证),进行排序。

源代码:

//// stu.cpp : Defines the entry point for the console application.
////
//
#include "stdafx.h"
//------------------------------------------指针排序-------------------------------------------------------------------------------

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 3

//学生结构体
struct student{
	long stuNum; //学号
	char name[20];//姓名
	char idCard[18];//身份证
	float score[3];//三门成绩
};

//依据学生姓名排序
void name_sort(student *stu,int n)
{
	student temp;
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-1-i;j++)
		{
			if(strcmp(stu[j].name,stu[j+1].name)>0)
			{
				temp =stu[j+1];
				stu[j+1]=stu[j];
				stu[j]=temp;

			}
		}
	}

	printf("\n");
	printf("*依据学生姓名排序后的学生情况:\n\n");

	for(int i=0;i<N;i++)
	{
		printf("第 %d 个学生信息:\n学号:%ld\t姓名:%s\t身份证:%s\t语文:%.2f\t数学:%.2f\t英语:%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);

	}
}
//依据身份证进行排序
void idCard_sort(student *stu,int n)
{
	student temp;
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-1-i;j++)
		{
			if(strcmp(stu[j].idCard,stu[j+1].idCard)>0)
			{
				temp =stu[j+1];
				stu[j+1]=stu[j];
				stu[j]=temp;

			}
		}
	}

	printf("\n");
	printf("*依据学生身份证排序后的学生情况:\n\n");

	for(int i=0;i<N;i++)
	{
		printf("第 %d 个学生信息:\n学号:%ld\t姓名:%s\t身份证:%s\t语文:%.2f\t数学:%.2f\t英语:%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);

	}

}

//依据学号进行排序

void stuNum_sort(student *stu,int n)
{

	student temp;
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-1-i;j++)
		{
			if(stu[j].stuNum>stu[j+1].stuNum)
			{
				temp =stu[j+1];
				stu[j+1]=stu[j];
				stu[j]=temp;

			}
		}
	}

	printf("\n");
	printf("*依据学生学号排序后的学生情况:\n\n");

	for(int i=0;i<N;i++)
	{
		printf("第 %d 个学生信息:\n学号:%ld\t姓名:%s\t身份证:%s\t语文:%.2f\t数学:%.2f\t英语:%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);

	}

}

//main函数

int main()
{

	struct student stu[N],*pStu;

	//控制台屏幕变为蓝色背景
	system("color 1f");

	printf("请依次输入学生的学号,姓名,身份证,三门成绩(空格分开)\n");
	for(int i=0;i<N;i++)
	{
		printf("输入第 %d 个学生的信息\n",i+1);
		scanf("%ld%s%s%f%f%f",&stu[i].stuNum,stu[i].name,stu[i].idCard,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);

	}

	pStu=stu;

	//清屏
	system("cls");

	printf("\n*** 输入1 依照学生学号排序 ***\n*** 输入2 依照学生姓名排序 ***\n*** 输入3 依照学生身份证排序 ***\n*** 输入0 退出 ***\n\n");

	printf("请输入:");
	int t;
	scanf("%d",&t);

	//循环
	do{
		//依据用户输入的值选择排序的字段
		switch (t)
		{
		case 1:
			stuNum_sort(pStu,N);//学号排序
			break;
		case 2:
			name_sort(pStu,N);//姓名排序
			break;

		case 3:
			idCard_sort(pStu,N);//身份证排序
			break;

		default:
			name_sort(pStu,N);
		}

		printf("\n请输入:");
		scanf("%d",&t);

	}while(t!=0);

	return 1;
}

//------------------没有指针--------------------------------------------------------------------------------------------------

//
//#include<stdio.h>
//#include<stdlib.h>
//#include<string.h>
//
//#define N 5
//
////学生结构体
//struct student{
//	long stuNum; //学号
//	char name[20];//姓名
//	char idCard[18];//身份证
//	float score[3];//三门成绩
//};
//
//
////依据学生姓名排序
//void name_sort(student stu[],int n)
//{
//	student temp;
//	for(int i=0;i<n-1;i++)
//	{
//		for(int j=0;j<n-1-i;j++)
//		{
//			if(strcmp(stu[j].name,stu[j+1].name)>0)
//			{
//				temp =stu[j+1];
//				stu[j+1]=stu[j];
//				stu[j]=temp;
//
//			}
//		}
//	}
//
//
//	printf("\n");
//	printf("*依据学生姓名排序后的学生情况:\n\n");
//
//	for(int i=0;i<N;i++)
//	{
//		printf("第 %d 个学生信息:\n学号:%ld\t姓名:%s\t身份证:%s\t语文:%.2f\t数学:%.2f\t英语:%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
//
//	}
//
//
//}
////依据身份证进行排序
//void idCard_sort(student stu[],int n)
//{
//	student temp;
//	for(int i=0;i<n-1;i++)
//	{
//		for(int j=0;j<n-1-i;j++)
//		{
//			if(strcmp(stu[j].idCard,stu[j+1].idCard)>0)
//			{
//				temp =stu[j+1];
//				stu[j+1]=stu[j];
//				stu[j]=temp;
//
//			}
//		}
//	}
//
//
//	printf("\n");
//	printf("*依据学生身份证排序后的学生情况:\n\n");
//
//	for(int i=0;i<N;i++)
//	{
//		printf("第 %d 个学生信息:\n学号:%ld\t姓名:%s\t身份证:%s\t语文:%.2f\t数学:%.2f\t英语:%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
//
//	}
//
//
//}
//
////依据学号进行排序
//
//void stuNum_sort(student stu[],int n)
//{
//	student temp;
//
//	for(int i=0;i<n-1;i++)
//	{
//		for(int j=0;j<n-1-i;j++)
//		{
//			if(stu[j].stuNum>stu[j+1].stuNum)
//			{
//				temp =stu[j+1];
//				stu[j+1]=stu[j];
//				stu[j]=temp;
//
//			}
//		}
//	}
//
//
//	printf("\n");
//	printf("*依据学生学号排序后的学生情况:\n\n");
//
//	for(int i=0;i<N;i++)
//	{
//		printf("第 %d 个学生信息:\n学号:%ld\t姓名:%s\t身份证:%s\t语文:%.2f\t数学:%.2f\t英语:%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
//
//	}
//
//
//}
//
////main函数
//
//int main()
//{
//
//	struct student stu[N];
//
//	//控制台屏幕变为蓝色背景
//	system("color 1f");
//
//	printf("请依次输入学生的学号,姓名,身份证,三门成绩(空格分开)\n");
//	for(int i=0;i<N;i++)
//	{
//		printf("输入第 %d 个学生的信息\n",i+1);
//		scanf("%ld%s%s%f%f%f",&stu[i].stuNum,stu[i].name,stu[i].idCard,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
//
//	}
//
//	//清屏
//	system("cls");
//
//
//	//printf("*你所输入的学生信息情况:\n");
//	//for(i=0;i<N;i++)
//	//{
//	//	printf("第 %d 个学生信息:\n学号:%ld\t姓名:%s\t身份证:%s\t语文:%.2f\t数学:%.2f\t英语:%.2f\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
//	//
//	//}
//
//
//	printf("\n*** 输入1 依照学生学号排序 ***\n*** 输入2 依照学生姓名排序 ***\n*** 输入3 依照学生身份证排序 ***\n*** 输入0 退出 ***\n\n");
//
//	printf("请输入:");
//	int t;
//	scanf("%d",&t);
//
//	//循环
//	do{
//		//依据用户输入的值选择排序的字段
//		switch (t)
//		{
//		case 1:
//				stuNum_sort(stu,N);//学号排序
//				break;
//		case 2:
//				name_sort(stu,N);//姓名排序
//				break;
//
//		case 3:
//				idCard_sort(stu,N);//身份证排序
//				break;
//
//		default:
//			name_sort(stu,N);
//		}
//
//
//		printf("\n请输入:");
//		scanf("%d",&t);
//
//	}while(t!=0);
//
//
//	return 1;
//}

首页效果图:

资源下载:

http://download.csdn.net/my/uploads

时间: 2024-11-01 18:43:10

C语言-对一个结构体中的字段进行排序的相关文章

结构体中某字段的偏移值

1.头文件 #include <stddef.h> 2. size_t offsetof(结构体名, 字段名); 举例子: size_t iOffset = offsetof(IMAGE_DOS_HEADER, e_lfanew); 3.

C结构体中数据的内存对齐问题

转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一般默认8字节对齐(64位机机器字长8字节) 1.先看下面的例子:struct A{   char c1;   int i;   short s;   int j;}a; struct B{   int i;   int j;     short s;   char c1;}b; 结构A没有遵守字节对

9.Go语言基础之结构体

Go语言中没有类的概念,也不支持"类"的继承等面向对象的概念. Go语言中通过结构体的内嵌再配合接口,比面向对象具有更高的扩展性和灵活性. 1.类型别名和自定义类型 1.1自定义类型 在Go语言中有一些基本的数据类型,如string,整型,浮点型,布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义. //将MyInt定义为int类型 type MyInt int 通过Type关

Go语言基础之结构体

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义.例如: //将MyInt定义为int类型 type MyInt int 通过Type关键字的定义,

对于结构体中内存对齐的简单说明

结构体内存对齐的原因: 在运行一个结构体时,编译器需要给结构体中的每个变量成员分配内存空间,如这样一个结构体中 typedef struct A { char c1; int i; int j; }A; 对其内存空间分配问题进行分析,如若不进行内存对齐,它的内存空间是: char类型变量c1占1个字节,紧接着int类型变量i与j分别占4个字节,总有9个字节,在访问时,如图1,访问次数较多:在图2中,总有12个字节空间,虽然浪费了c1后的三个字节空间,访问次数却变少,会很大程度上节省了时间,提高了

linux 中 C 语言的使用 -- 结构体多态

在 Linux 内核代码,特别是驱动代码中经常见到的用法是使用一个标准结构,后面的代码基于这个结构来实现,类似面向对象的多态特性. 在 C 语言里面借助结构体和函数指针实现的这个功能,这里我们写了个例子,提取了关键代码: #include <stdio.h> struct s_new{ char name[10]; char* (* my_method)(char *name); }; char* powerful(char *name){ printf("%s is powerfu

在C语言结构体中添加成员函数

我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结构体中添加成员变量呢 在C语言的结构体中是不能直接定义成员函数的,这点和C++不同,但是我们可以通过定义一个函数指针的方式来指向一个方法. 示例代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct node 4

C语言 结构体中的成员域偏移量

//C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct _student{ char name[30];//32 int num; }Student; void main(){ Student *p = NULL; printf("%x\n", p);//打印 0 p

C语言结构体中的函数指针

这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in-c-struct.html,转载请注明源地址. 引言 指针是C语言的重要组成部分, 于是深入理解指针并且高效地使用指针可以使程序员写出更加老练的程序.我们要记住指针是一个指向内存地址的变量.指针可以引用如int.char……常见的数据类型,例如: int * intptr; // 声明一个指向整型值的