【C语言】结构体数组作为函数参数的排序问题

题目:
设计一个程序,统计一个班(最多50人)的学生成绩,要求能实现如下3个功能:
(1) 由键盘或文件输入每个学生的学号和四门课程的成绩;
(2) 计算每个学生的平均成绩和总成绩;
(3) 按总成绩从高到低排名,并按名次输出每个学生的情况,包括:
学号,各科成绩,平均成绩,总成绩,排名

我写的代码如下
问题在于,输入、计算部分都没有问题,但是,运行结果显示,**并没有进行排序操作,也就是说**,排序代码并未生效。
麻烦各位大佬帮忙看看哪里出了问题,感激不尽
 #include <stdio.h>
#include <stdlib.h>

struct student{
    char id[10];
    float sub_1;
    float sub_2;
    float sub_3;
    float sub_4;
    float sum;
    float aver;
    //int order;
};

//函数原型 
void order_stu(struct student stu[],int sum_stu);
void aver_stu(struct student *pt_1);

void main()
{
    int sum_stu;//学生的人数 
    printf("Please input the sum of students in this class:");
    scanf("%d",&sum_stu);
    getchar();

    struct student stu[sum_stu];
    //从键盘读取学生学号和四门课的成绩
    int i;
    for(i=0;i<sum_stu;i++)
    {
        printf("请分别输入第%d名学生的学号、四门课的成绩,以空格隔开:",i);
        scanf("%s %f %f %f %f",&stu[i].id,&stu[i].sub_1,&stu[i].sub_2,&stu[i].sub_3,&stu[i].sub_4);
        getchar();
        aver_stu(&stu[i]);
    }

    order_stu(stu,sum_stu);


}

//计算总分和平均值 
//利用指针,目的在于在本函数内为结构体内的aver和sum赋值,即改变结构体的内容 
void aver_stu(struct student *pt_1)
{
    pt_1->sum=pt_1->sub_1+pt_1->sub_2+pt_1->sub_3+pt_1->sub_4;
    pt_1->aver=(pt_1->sum)/4;
}

//排名次 
void order_stu(struct student stu[],int sum_stu)
{
    float sum_score;//总分 
    float aver;
    int i,j;
    struct student *p[sum_stu];//定义一个指针数组
    //使每个指针指向一个结构体数组元素 
    for(i=0;i<sum_stu;i++)
    {
        p[i]=&stu[i];
    }
    struct student *temp;
    //用冒泡排序法排序(从大到小) 
    for(i=0;i<sum_stu-1;i++)
    {//遍历sum_stu-1轮 
        for(j=0;j<sum_stu-i-1;j++)
        {//每过一轮,遍历的元素数目-1 
            if((p[j]->sum)<(p[j+1]->sum))
            {
                temp=p[j+1];//交换两结构体在结构体数组中的位置 
                p[j+1]=p[j];
                p[j]=temp;
            }
        }
    }
    //将结果通过列表的方式打印在屏幕上 
    printf("id           sub_1     sub_2     sub_3     sub_4     average    order\n");
    for(i=0;i<sum_stu;i++)
     printf("%s   %5f  %5f  %5f  %5f  %7f  %5d\n",stu[i].id,stu[i].sub_1,stu[i].sub_2,stu[i].sub_3,stu[i].sub_4,stu[i].aver,i+1);

}

运行结果如图所示
图片说明

0

1个回答

你排序后放在p里,但是输出的还是stu数组

printf("%s %5f %5f %5f %5f %7f %5d\n",stu[i].id,stu[i].sub_1,stu[i].sub_2,stu[i].sub_3,stu[i].sub_4,stu[i].aver,i+1);

// Q714179.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


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

struct student{
    char id[10];
    float sub_1;
    float sub_2;
    float sub_3;
    float sub_4;
    float sum;
    float aver;
    //int order;
};

//函数原型 
void order_stu(struct student stu[],int sum_stu);
void aver_stu(struct student *pt_1);

void main()
{
    int sum_stu;//学生的人数 
    printf("Please input the sum of students in this class:");
    scanf("%d",&sum_stu);
    getchar();

    student * stu = (student *)malloc(sizeof(student) * sum_stu);
    //从键盘读取学生学号和四门课的成绩
    int i;
    for(i=0;i<sum_stu;i++)
    {
        printf("请分别输入第%d名学生的学号、四门课的成绩,以空格隔开:",i);
        scanf("%s %f %f %f %f",&stu[i].id,&stu[i].sub_1,&stu[i].sub_2,&stu[i].sub_3,&stu[i].sub_4);
        getchar();
        aver_stu(&stu[i]);
    }

    order_stu(stu,sum_stu);


}

//计算总分和平均值 
//利用指针,目的在于在本函数内为结构体内的aver和sum赋值,即改变结构体的内容 
void aver_stu(struct student *pt_1)
{
    pt_1->sum=pt_1->sub_1+pt_1->sub_2+pt_1->sub_3+pt_1->sub_4;
    pt_1->aver=(pt_1->sum)/4;
}

//排名次 
void order_stu(struct student stu[],int sum_stu)
{
    float sum_score;//总分 
    float aver;
    int i,j;
    student **p = (student **)malloc(sizeof(student *) * sum_stu);//定义一个指针数组
    //使每个指针指向一个结构体数组元素 
    for(i=0;i<sum_stu;i++)
    {
        p[i]=&stu[i];
    }
    student *temp;
    //用冒泡排序法排序(从大到小) 
    for(i=0;i<sum_stu-1;i++)
    {//遍历sum_stu-1轮 
        for(j=0;j<sum_stu-i-1;j++)
        {//每过一轮,遍历的元素数目-1 
            if((p[j]->sum)<(p[j+1]->sum))
            {
                temp=p[j+1];//交换两结构体在结构体数组中的位置 
                p[j+1]=p[j];
                p[j]=temp;
            }
        }
    }
    //将结果通过列表的方式打印在屏幕上 
    printf("id           sub_1     sub_2     sub_3     sub_4     average    order\n");
    for(i=0;i<sum_stu;i++)
     printf("%s   %5f  %5f  %5f  %5f  %7f  %5d\n",p[i]->id,p[i]->sub_1,p[i]->sub_2,p[i]->sub_3,p[i]->sub_4,p[i]->aver,i+1);

}


图片说明

如果问题得到解决,请点我回答左上角的采纳和向上的箭头,谢谢

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
初学C-结构体和结构体数组作为函数的参数
2018年5月25日17:49:52*结构体变量作函数参数时,函数内的操作不会改变结构体的值,结构体的各成员作为实参传递给了函数的形参,实际操作的是形参,不会影响实参;*结构体数组作为函数参数时,实际上是将结构体数组的第一个数组成员的地址传递给了形参,用对应的指针或者直接用结构体数组的名称作为实参效果是一样的,操作都直接对结构体数组进行,可以改变其值下面程序中aver(stu+i)中的stu+i的...
结构体数组作为函数参数
把结构体数组名作为函数的一个参数,然后在这个函数的函数里面继续作为参数,把一个值赋给这个结构体数组的一个变量,我再赋值的地方是有值的,在函数里面也是有值的,但是出了这个函数回到主函数时,这个结构体数组的变量的值就为空了。为什么呢?因为我在使用这个函数是这样的, iReturn = ParseAllEitSection(&amp;amp;stTransportParameter,pfTsFile,iTsP...
C语言---(一)指针做函数参数/数组/结构体的问题及
先给一个连接,我觉得总结的特别好:https://blog.csdn.net/tsfkurry/article/details/42027407指针最重要理解下面几句话:1.编译器总是要为函数的每一个参数制作临时副本,指针参数p的副本是_p,编译器使_p=p.如果函数体内的程序修改了_p的内容,就导致参数p的内容做相应的修改。这就是指针可以作为输出参数的原因。在例子中,_p申请了新的内存,只是把_...
结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析  struct stud {  long int num;   float score; }; /*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/ void funvr(struct stud t) {  t.num=2000101; t.score=71.0;  } /*结构体数组作为函数的参数,
2.关于结构体以及结构体数组作为函数入口参数的方法(学习笔记)
用VC6.0的MFC编程,一直对结构体作为函数参数的问题比较头疼,一直回避,今天又遇到了,于是查找资料解决一下心头的疑问,一直用指针来处理结构体,所以对于函数的形参也用指向结构体的指针来传递。 完成目的:初始化结构体数组中的bProcess都为0 1:定义结构体 struct NODE {      int x;      int y;      int bProcess;
C++基础知识复习--结构体类数组作为函数参数
//结构体数组,类数组,普通数组,作为函数参数 #include #include using namespace std; class CT { int T1; string T2; public: CT(int T1 = 0, string T2 = "u") {} friend istream & operator >>(istream & in, CT
C++ 如何引用结构体数组作为函数形参
最近使用VS2008编写程序时,遇到了如何引用结构体数组作为函数形参问题。 现将主要代码粘贴如下(结果如图所示),来达到传递结构体数组到函数中的目的: ////--main.cpp--///// #include "Point.h"#include#include using namespace std;typedef struct      //定义结构体 { int num
菜鸟学习-C语言函数参数传递详解-结构体与数组
C语言中结构体作为函数参数,有两种方式:传值和传址。 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响。 例子: typedef struct tagSTUDENT{ char name[20]; int age; }
用结构体类型的数据作函数参数
2018年4月5日   19:201.用结构体变量作函数参数:运行结果:用结构体变量作实参时,采取的也是“值传递”方式,将  结构体变量所占的内存单元的内容(结构体变量成员列表)    全部顺序传递给形参,这里形参也得是结构体变量。但是,这种传递方式下,函数调用期间形参也要占用内存单元(个人理解意思就是 跟要传递的实参一样,系统也要给形参分配空间。)。并且,这种传递方式是单向的,如果在执行被调函数...
(struct)结构体变量作为函数参数调用的方法小结
结构体变量作为函数参数传递的3种方法 将一个结构体变量中的数据传递给另一个函数,有下列3种方法: 用结构体变量名作参数。一般较少用这种方法。 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 用结构体变量的引用变量作函数参数。
C语言经典例题--结构体指针变量作为函数参数的传递
#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; struct student { int age; char sex; char name[30]; }; void inputstudent(struct student *ps)//对结构体变量输入时必须传地址 { (*ps).age = 10; strcpy(ps-&amp;gt;n...
结构体作为函数参数-malloc操作
#define _CRT_SECURE_NO_WARNINGS #include #include #include //定义一个结构体 typedef struct _Teacher { char name[64]; int age; }Teacher; int printfArr(Teacher *to,int len) { int i = 0; for ( i = 0; i <
使用数组作为函数的参数,并将数组内容以ASC||码排序输出。
使用数组作为函数的参数,并将数组内容以ASC||码排序输出。 1. public class One{ public String[] Sort(String[] first) { String[] other=new String[first.length]; for (int i = 0; i &amp;amp;lt; name.length; i++) { other[i]=first[i]; } for ...
根据结构体数组中某一数据项对结构体数组排序
/* *copyright(c) 2018,HH *All rights reserved. *作 者:HH *完成日期:2018年8月17日 *版本号:v1.0 * *问题描述:输入结构体数组,并根据结构体中的某一数据项对整个结构体数组进行排序 *输入描述:; *程序输出: */ #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;string.h&amp;gt; struc...
C语言之数组作为函数的参数的用法
今天自己写卷积神经网络的时候用到了数组,忘了怎么用了怎么把数组传到函数里了。又复习了一遍。顺便记下来一边日后再次往~ 详细代码省略了,就把结构写下: void fun1( unsigned char array[9] ) { //.... } int main(int argc, char* argv[]) { unsigned char array[9] = {1,0,1,0
C语言结构体及函数传递数组参数示例
注:makeSphere()函数返回Sphere结构体,main函数中,调用makeSphere()函数,传递的第一个参数为数组,传递的数组作为指针。
C语言编程——次数排序--结构体数组及冒泡排序法
题目:从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数。#include <stdio.h> #include <string.h>// 计算字符出现的次数 int jiShu(char test[], char a) { // 统计字符数 int n = 0; // 遍历字符串 for (int i = 0; i<strl
C语言以数组和结构体传参
C语言函数调用时的传参操作在32位x86机器上依赖栈进行.而在x86_64的机器上使用了部分寄存器作为辅助,但如果参数过多,寄存器不够使用,此时也必须借助于栈操作实现传参.尽管C语言对函数传递参数的个数没有明确限制(依编译器实现而定:http://stackoverflow.com/questions/9034787/function-parameters-max-number),但过多的参数传递势必影响代码执行效率.
go语言结构体数组的指针作为参数。。。
package main import ( &quot;fmt&quot; ) type XCDataStu struct { Id int `json:&quot;id&quot; xorm:&quot;id&quot;` Name string `json:&quot;name&quot; xorm:&quot;name&quot;` } func testStruct(xcdata *[]XCDataStu) { fmt.Println(*xcdata) } ...
C语言结构体+数组实现学生学号成绩的统计、排序
C语言结构体+数组实现学生学号成绩的统计、冒泡排序
c语言结构体成员作为函数参数
#include #include struct Worker{ char name[10]; char num[8]; }; void Sort(struct Worker wk[]){ //排序函数 struct Worker temp; for(int i=0;i<5;i++){ int k = i; for(int j=i+1;j<5;j++){ if(
结构体数组(C)
编写通讯录管理程序。每个人有姓名、电话、移动电话、邮编和通讯地址信息可以, 要求: (1)至多存储 50 个人的信息; (2)提供录入、删除、修改和查询的功能; (3)删除、修改和查询的时提示用户输入姓名,找到对应位置后进行相关操作     /*==========================================================================...
c语言的一级指针和二级指针作为函数参数,链表,malloc中的分配等等总结
主要内容: 1、一级指针和二级指针 2、函数指针传递的例子 3、什么时候需要传递二级指针? 4、二级指针在链表中的使用 1、一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址; 二级指针:指向指针的指针,就是地址的地址; 如: int a=1; int *p=&amp;amp;a;  // p为a变量的地址,通过*p可以得到a的值 int **q=&amp;amp;p;   //...
C语言结构体内含有数组,该结构体作为参数传递时需用指针,否则对数组的修改不会被记录
在C语言编程时,常常会定义结构体,而且结构体里面常常会有数组,比如如下所示: typedef struct  { int data[MAX_HEAP_SIZE]; unsigned int heap_size; }HeapType;     这是一个堆的数据结构,包含堆的元素(数组)和堆的大小。在建大顶堆时会给建堆的函数传递参数,建堆函数如下: void Build_Max_He
利用sort对结构体数组排序
刷了杭电的2道题都用了结构体排序,总结下:    #include "algorithm"      ///////头文件 struct Arr {        int a;        int b; }; Arr arr[10]; bool cmp(const Arr &a, const Arr &b)            ///////当return
C语言中数组作为参数传递
数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数: 1、整个数组当作函数参数,即把数组名称传入函数中,例如:       2、数组中的元素当作函数参数,即把数组中的参数传入函数中,例如: 数组作为函数参数时注意以下事项: 1、数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度...
【C】指针(六)字符指针做函数参数
这里来说说,三种在函数中调用字符数组的方法:1. 以字符数组作为形参与实参调用2. 以字符数组作为形参,以指针作为实参调用3. 以指针作为形参与实参调用方法1:这是最常规的手段,没学指针前可以用这种很没有效率的方式,值得注意的是,由于b的长度比a长,这种方法其实是把a的元素赋值到了b的前10位,并且将第11位赋值为‘\0’,在输出的时候由于用的是 \s,所以在遇到   '\0'之后就停止输出。方法...
结构体作为参数传入函数错误
结构体作为参数传递的错误! 如下代码:定义了一个结构体变量,将该结构体变量作为参数传递给函数func2,此时传递给函数func2的是结构体变量my_sis的拷贝,函数func2中对所传入的结构体的修改不影响main函数中定义的结构体,所修改的只是传入的拷贝的副本。 1 #include 2 3 struct score 4 { 5 int math;
分别用结构体指针变量和结构体引用作为函数参数,计算一组学生的平均成绩和不及格人数。
#include #include using namespace std; typedef struct Student { int ID; string name; double score; } stu; stu s[100]; void calculate(stu p[],int n,double &amp;aver,int &amp;number) { double sum=0; fo...
引用作为函数参数返回值
说明: (1)以引用返回函数值,定义函数时需要在函数名前加& (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。 例如: #include float temp; //定义全局变量temp float fn1(float r); //声明函数fn1 float &fn2(float r); //声明函数fn2 float fn1(float r)
根据结构体中某一组成部分对结构体数组的排序
在按照某一成分对结构体进行排序时,其基本思路和数组排序一样,可以利用指针进行简化,也可以直接利用结构体名进行排序,如下实例,是利用平均分数对学生这一结构体进行排序的1、定义结构体struct student//定义结构体 { int num; char name[10]; int score[3]; float ave; }stu[5];2、输入数据int i,j,sum,t; FI...
结构体数组排序 (学生信息 按成绩排序 )
/* name:学生信息结构体  按总分排序 (降序) */ #include int main() {   int i,j; typedef struct{ int grade; int age; char name[10];/*其他信息就不列举了*/ }Student;  Student temp; Student student[3]={/*分成多条初
C语言数组元素地址作为函数参数
今天首先来做一个题,值得借鉴。#include<stdio.h> void fun(int *p){ printf("%d",p[5]);//打印第六个元素,但是地址传入的第四个元素, getchar(); } void main() { int a[10] = {1,2,3,4,5,6,7,8,9,10}; fun(&a[3]); //把数组的第4个元素的地址传
数组作函数参数:将数组逆序排列
数组作为函数参数的时候,没有办法通过指针来获取数组长度,数组长度要作为参数传递给函数。 在函数定义中 int a[10] 这样的形参定义方式会被转化为int * a不管是int a[10]还是int a[],都不会创建出一个数组,编译器也不会为他们分配内存,这些形式只能说明用户期望传递的数组有10个元素,最后sizeof(a) 长度只有4位,一个指针变量所占内存大小。
qsort对多维数组和结构体的排序
多维数组对于malloc动态申请的多维数组(指针数组)以一个例子解析: 要求—— 打算操作一个数组,数组的每个元素是一个指针,指向2个元素的数组。元素的大小关系为先比较第一个元素,第一个元素相同比较第二个元素。 首先,通过malloc对指针数组进行分配: 先分配一个指向元素为int *的一维数组,所以数组类型为int **; 然后,针对每一个数组里的int *型指针,分配一个一维数组,数组类型
c语言指针作为函数的参数
  在c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。 #include &amp;lt;stdio.h&amp;gt; void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py); int main(vo...
【C语言笔记】二维数组作为函数参数
本文更好的排版方式:二维数组作为函数参数 偶然间发现C语言二维数组作为函数的参数是个比较容易出错的问题。例如我写了一个这样子的函数: void func1(int **array, int m, int n) { int i = 0, j = 0; for ( i = 0; i &amp;lt; m; i++ ) { for ( j = 0; j &amp;lt; n; j++ ) {...
C语言 对结构体变量进行冒泡排序
C语言:对结构体变量进行冒泡排序 我是一名在校大学生,初次写博客,希望各位大佬不喜勿喷,这个小程序,仅供参考,希望对大家有所帮助。 分析题意: 1.定义结构体变量,并给变量赋值 2.使用冒泡排序进行排序。 定义: 1.Input()函数,接收用户输入的值。 2.Output()函数,输出排序结果。 3.SortBubble()函数,冒泡排序。 4.Swap()函数,交换两个数的值。 #includ...
结构体数组排序
在对结构体数组排除时,首先确定需要排序数组的关键字,并且在排序过程中不是交换关键字的顺序,而是应该交换这个结构的地址,从而使得结构体中的每项能够对应的改变;其中对应的代码如下: #include #include struct Line { int low; int high; }; void quicksort(struct Line a[],int l,int h) {
C/C++语言 二维数组作为函数的参数总结
C/C++语言 二维数组作为函数的参数总结 实参形参之间进行传递的实质:始终传递的是指针,不可能是数组。
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 区块链问题 ios视频开发问题