sort对结构体数组排序(学生成绩管理系统)

本文目录
- 学生成绩管理系统
- sort排序的时候遇到两个数相等怎么处理
- c++以一个数组为关键字对多个数组排序
- C++程序题结构体和sort排序问题E:进步最快
- php数据结构与算法(PHP描述) 快速排序 quick sort
- c++中数组如何排序
- 如何给字符串排序
- 对结构体sort排序说引用非法内存 sort(p+1,p+n+1,cmp);(p是已经读好的结构体数组,从p[1]到p[n])
- 在vba中,使用union选择不同单元格,然后组成数组,结果数组里元素的顺序和希望的不一样希望大神指教
- c++ 如何用sort为struct排序
学生成绩管理系统
#include《stdio.h》
#define N 40
#include《string.h》
#include《conio.h》
#include《stdlib.h》
struct student{
long num;
char name;
float score;
float sum;
}st;
FILE *fp;
void menu()
{
printf(" \t****************************************\n");
printf(" \t\t1--------------查询\n");
printf(" \t\t2--------------排序\n");
printf(" \t\t3--------------插入\n \t\t4--------------删除\n");
printf(" \t\t0--------------退出\n");
printf(" \t****************************************\n");
}
void input(struct student s,int *n)
{
printf("请输入您所要添加的学生数目\n");
int x,i,j,b,flag=0;
scanf("%d",&x);
b=*n+x;
for(i=*n+1;i《=b;i++)
{
flag=1;
printf("请输入学生学号:\n");
scanf("%ld",&s.num);
for(j=1;j《i;j++)
if(s.num&&i》1)
{ printf("输入有误\n");flag=0;i--;b--;break;}
if(flag)
{
printf("请输入学生姓名:\n");
scanf("%s",s.name);
printf("请依次输入该生高数、英语读写、英语听说、计算计导论、程序设计(一)的分数:\n");
for(j=1;j《=5;j++)
scanf("%f",&s);
}
}
*n=b;if(flag) printf("添加成功\n");
printf("输入完毕!按任意键返回主菜单!"); getch();
}
void Delete(struct student s,int *n)
{
printf("请输入您所要删除的学生的姓名\n");
char m;int j;
scanf("%s",m);
for(j=1;j《=*n;j++)
if(strcmp(s.name,m)==0)
{
*n=*n-1;
for(;j《=*n;j++)
s;
break;
}
printf("删除成功!\n");
printf("输入完毕!按任意键返回主菜单!"); getch();
}
void find(struct student s,int n)
{
long b=0;char c;
printf(" \t****************************************\n");
printf(" \t\t1.1----------按学号查询\n");
printf(" \t\t1.2----------按姓名查询\n");
printf(" \t\t1.3----------按成绩查询\n");
printf(" \t****************************************\n");
int j,e,flag=0;
float soc;
scanf("%s",kk);
if(strcmp(kk,"1.1")==0){
printf("请输入学生学号\n");
scanf("%s",c);
{
for(j=0,e=strlen(c);j《e;j++)
b=b*10+c-48;
printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n");
for(j=1;j《=n;j++)
if(b==s.num)
{
flag=1;
printf("%ld\t%s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",s.sum);
}
if(!flag)
printf("未找到相关学生信息\n");
}
}
else if(strcmp(kk,"1.2")==0)
{
printf("请输入学生姓名\n");
scanf("%s",c);
printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n");
for(j=1;j《=n;j++)
if(strcmp(s.name,c)==0)
{
flag=1;
printf("%ld\t%s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",s.sum);
}
if(!flag)
printf("未找到相关学生信息\n");
}
else if(strcmp(kk,"1.3")==0)
{
printf("请输入学生分数\n");
scanf("%f",&soc);
printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n");
for(j=1;j《=n;j++)
if(s.sum==soc)
{
flag=1;
printf("%ld\t%s\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\t%-0.2f\n",s.sum);
}
if(!flag)
printf("未找到相关学生信息\n");
}
else
printf("输入有误.....\n");
printf("查找完毕!按任意键返回主菜单!"); getch();
}
void sort(struct student s,int n)
{
int j,f,g,h;
for(j=1;j《=n;j++)
for(f=1,s.sum=0;f《=5;f++)
s;
struct student temp;
for(j=1;j《n;j++)
for(g=1;g《=n-j;g++)
if(s.sum )
{
temp=s;
s;
s=temp;
}
}
void print1(struct student s,int n)
{
printf("学号\t姓名\t高数\t英语读写 英语听说 计导 程序(一) 总分\n");
for(;n》0;n--)
printf("%ld\t%s\t%-0.2f\t%0.2f\t %0.2f\t %0.2f\t %0.2f\t %0.2f\n",s.sum );
printf("输出完毕!按任意键返回主菜单!"); getch();
}
void dataSave() /*文件保存*/
{
int i;
fp=fopen("student.dat","w");
for(i=0;i《N;i++)
if(fwrite(&st,sizeof(st),1,fp)!=1)
{
fclose(fp); /*关闭文件指针*/
printf("file write error\n");
getch();
}
}
int main()
{
menu();
int x,n=0;
while(scanf("%d",&x)!=EOF&&x!=0)
{
switch(x)
{
case 1:find(st,n);break;
case 2:sort(st,n);print1(st,n);break;
case 3:input(st,&n);sort(st,n);dataSave();break;
case 4:Delete(st,&n);dataSave();break;
default:printf("Input error!\n");
}
system("cls"); /*清屏*/
menu();
}
return 0;
sort排序的时候遇到两个数相等怎么处理
sort排序的时候遇到两个数相等, 序列里保留这两个数,并且不交换这两个数的位置。
如果你有附加条件,例如这组数的每个数都有一个量与它有联系(例如id), 对相等的两个数,考虑它们的id大小进一步sort,那就要做另一次有条件的处理。
例如 网站IP 地址 排序
202.108.22.44
202.108.22.45
202.18.122.45
。。。
要分4个部分来排序
或做处理后排序
20210802244
20210802245
20201812245
。。。
c++以一个数组为关键字对多个数组排序
最傻瓜的办法就是单用一个数组d,内容初始化成0 1 2 3,然后sort(d, d + 4, ; });
这样虽然a b c并没直接被排序,但是以c作为索引就可以得到a b的新顺序
C++程序题结构体和sort排序问题E:进步最快
我平时有刷类似算法题,如图leetcode上我的记录。此题的思想很简单:原编号就是原排名,自己写个比较函数用sort进行索引排序!这样就能轻松比较排名变化。
程序如下,有详细注释
#include《stdio.h》
#include《iostream》
#include《vector》
#include《algorithm》
using namespace std;
typedef union G_sort{
char grade;
int id;
}G_sort;
bool greater(const G_sort &a, const G_sort &b) {
return a.grade;//成绩(高8位)
}
int main() {
//输入
int n;cin 》》 n;//第一行一个整数n,表示学生总数。
vector《G_sort》 grade(n);//表示每个学生的 编号(高24位)|成绩(低8位)
for (int i = 0; i 《 n; i++) {//n ≤ 100, 000
scanf("%d", &grade);//成绩(高8位)
//cin 》》 grade;★这种输入会出错
grade.id |= i;//编号(低24位)
}
//排序
sort(grade.begin(), grade.end(), greater);//根据学号排序
int d_sort = 0, now_sort;//排名上升多少,现排名
for (int i = 0; i 《 n; i++) {
int d = (grade.id & 0xffffff) - i;//原排名-现排名
if (d 》 d_sort) {//若两位同学名次上升幅度相同,输出名次靠前的,也就是编号较小的。(不能取=)
d_sort = d;
now_sort = i + 1;//注意!下标从0数起 比排名少1
}
}
//输出
/*
//16进制查看 grade 数据
for (int i = 0; i 《 n; i++) {
printf("%x\n", grade.id);
}*/
cout 《《 now_sort 《《 endl 《《 now_sort+ d_sort 《《 endl;
system("pause");
return 0;
}
php数据结构与算法(PHP描述) 快速排序 quick sort
复制代码
代码如下:
《?php
/**
*
快速排序
quick
sort
*
**/
function
sort_quick($arrData)
{
if(empty($arrData)
||
!is_array($arrData))
return
false;
$flag
=
$arrData;
$len
=
count($arrData)
-
1;
if($len
==
0)
return
$arrData;
//
如果只有一个数据的数组直接返回
$arrLeft
=
array();
$arrRight
=
array();
$len_l
=
0;
$len_r
=
0;
for($i
=
1;
$i
《=
$len;$i++)
{
if($arrData
《
$flag)
{
$arrLeft
=
$arrData;
//
小于的放左边
$len_l++;
}
else
{
$arrRight
=
$arrData;
//
大于等于的放右边
$len_r++;
}
}
//
合并数组
$arrResult
=
array();
if($len_l)
{
$arrLeft
=
sort_quick($arrLeft);
for($i
=
0;$i
《=
$len_l
-
1;
$i++
)
{
$arrResult
=
$arrLeft;
}
}
$arrResult
=
$flag;
$len_l++;
if($len_r)
{
$arrRight
=
sort_quick($arrRight);
for($i
=
0;$i
《=
$len_r
-
1;
$i++
)
{
$arrResult
=
$arrRight;
$len_l++;
}
}
echo
"==
",$flag,"
==========================================《br/》";
echo
"data
:
",print_r($arrData),"《br/》";
echo
"filter
left:
",print_r($arrLeft),"《br/》";
echo
"filter
right:
",print_r($arrRight),"《br/》";
echo
"return
:
",print_r($arrResult),"《br/》";
return
$arrResult;
}
//$list
=
array(4,3,2,1,5,7,3,7);
$list
=
array(4,51,6,73,2,5,9,33,50,3,4,6,1,4,67);
$list
=
sort_quick($list);
echo
"《pre》";print_r($list);
c++中数组如何排序
//排序是一种极其重要的算法。常见的排序有冒泡排序(O(n^2))、选择排序(O(n^2))、插入排序(O(n^2))、快速排序(O(nlog(n)))、堆排序(O(nlog(n)))、归并排序(O(nlog(n)))、桶排序(O(n))等
***隐藏网址***
int temp=0;
int a={7,8,5,4,3,2,6,9,0,1};
for(int n=0;n《10;++n)
{
cout《《a《《endl;
}//输出,仅用来测试
for(int i=0;i《9;++i)//只需要冒泡9个数最后一个就已经有序了
for(int j=0;j《9-i;++j)//j的取值需《10-i-1;为何-1,
//下面的下标含有j+1,所以要-1防止下标越界,此外,根本原因是因为,2个数比较,第一次开始比较时候,所有数只需比较N-1次。
if(a)
{
temp=a;
a;
a=temp;
}
for(int n=0;n《10;++n)
{
cout《《a《《endl;
}//输出
***隐藏网址***
***隐藏网址***
***隐藏网址***
//快排在C++中有一种直接调用的方法
#include《algorithm》
//...
int a,i,j;
//...
sort(a+i,a+j);//这里i《=j,表示将数组a从a进行快排
***隐藏网址***
//堆在C++中也有一种直接调用的方法,包含在《algorithm》库中,具体函数有make_heap,push_heap,pop_heap,sort_heap等
//另外还可以通过《set》库来充当堆,实现如下:
#define REP(start,end) for(int I=start;I《=end;I++)
#include《set》
#include《cstdio》
using namespace std;
multiset《int》 tree;
int n,x;
int main()
{
scanf("%d",&n);
REP(1,n)
{
scanf("%d",&x);
tree.insert(x);
}
REP(1,n)
{
printf("%d\n",*tree.begin());
tree.erase(tree.begin());
}
return 0;
}
//但要注意的是,《set》库并不是通过堆实现的,而是一种叫做“红黑树”的数据结构
如何给字符串排序
结构体 捆绑 弄个结构体数组 ...............
方法一 结构体数组排序
/////////////////////////////////////////
// C-Free 4.1
// MinGW 3.4.5
// veket的小号
/////////////////////////////////////////
#include 《stdio.h》
#include 《string.h》
typedef struct data
{
char s;
int x;
int y;
}DATA;
int main()
{
DATA d;
DATA temp;
int i;
int j;
strcpy(d.s, "ASD");
d.x = 25;
d.y = 4;
strcpy(d.s, "ZXC");
d.x = 36;
d.y = 9;
strcpy(d.s, "QWE");
d.x = 10;
d.y = 2;
printf("Array before sort:\n");
for(i=0;i《3;i++)
{
printf("%s\t%d\t%d\n", d.y);
}
for(i=0;i《2;i++)
{
for(j=i+1;j《3;j++)
{
if(d.x)
{
strcpy(temp.s, d.s);
temp.x = d.x;
temp.y = d.y;
strcpy(d.s);
d.x;
d.y;
strcpy(d.s, temp.s);
d.x = temp.x;
d.y = temp.y;
}
}
}
printf("\n\nArray after sort:\n");
for(i=0;i《3;i++)
{
printf("%s\t%d\t%d\n", d.y);
}
return 0;
}
方法二 结构体不排序 建个指针数组 每个元素 依次指向 结构体数组的元素
然后 对指针数组 进行排序
#include 《stdio.h》
#include 《string.h》
typedef struct data
{
char s;
int x;
int y;
}DATA;
int main()
{
DATA d;
DATA *p;
DATA *temp;
int i;
int j;
strcpy(d.s, "ASD");
d.x = 25;
d.y = 4;
strcpy(d.s, "ZXC");
d.x = 36;
d.y = 9;
strcpy(d.s, "QWE");
d.x = 10;
d.y = 2;
printf("Array before sort:\n");
for(i=0;i《3;i++)
{
p;
printf("%s\t%d\t%d\n", p-》y);
}
for(i=0;i《2;i++)
{
for(j=i+1;j《3;j++)
{
if(p-》x)
{
temp = p;
p;
p = temp;
}
}
}
printf("\n\nArray after sort:\n");
for(i=0;i《3;i++)
{
printf("%s\t%d\t%d\n", p-》y);
}
return 0;
}
对结构体sort排序说引用非法内存 sort(p+1,p+n+1,cmp);(p是已经读好的结构体数组,从p[1]到p[n])
楼上是sx,楼主别理他。
stl默认是小于号排序,严格小于。
自定义的cmp也该是当x、y相等时返回0才行,否则排序无法退出
推荐写法如下:
struct pii{int a,b;};
bool cmp(const pii &x,const pii &y){return x.b《y.b;}
sort(1+p,1+n+p,cmp);
如果按以下写法,大多数编译器下会更快(内联)
bool operator《(const pii &x,const pii &y){return x.b《y.b;}
sort(1+p,1+n+p);
在vba中,使用union选择不同单元格,然后组成数组,结果数组里元素的顺序和希望的不一样希望大神指教
## 结构体与sort排序的完美结合 ##
各位正在学习语言的小伙伴们大家好,本期栏目,小编将带领正在学习结构体的同学,一起深入地学习他们!
在实际问题中,一组数据往往具有不同的数据类型。例如, 在学生登记表中,姓名应为字符型;学号可为整型或字符型; 年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C++语言中给出了另一种构造数据类型——“结构”。 它相当于其它高级语言中的记录。
C++中定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic type)。还有空类型:关键字void,不能用于普通变量的声明和普通的操作,只能用于指针型变量,函数返回值和函数参数。这些统称为预定义类型。
另一类为自定义类型:数组、结构体(struct)、联合体(union)、枚举(enum)。
c++ 如何用sort为struct排序
只要你的结构体定义好了operator《 operator》和operator==与operator!=就可以用sort来给结构体数组排序了。

更多文章:
teammate(teammate,company,partner)
2026年10月11日 06:10
javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)
2026年10月11日 04:00
text函数公式(excel中round和text函数的区别是什么)
2026年10月11日 03:50
google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)
2026年10月11日 02:00
websocket整合springboot(Springboot整合Websocket遇到的坑)
2026年10月11日 01:40
drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)
2026年10月10日 19:20
xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)
2026年10月10日 17:50
perl数组中最多的元素(用perl实现,得到一个数组中重复次数最多的元素)
2026年10月10日 17:00






