【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条回答

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申请了新的内存,只是把_...
2.关于结构体以及结构体数组作为函数入口参数的方法(学习笔记)
用VC6.0的MFC编程,一直对结构体作为函数参数的问题比较头疼,一直回避,今天又遇到了,于是查找资料解决一下心头的疑问,一直用指针来处理结构体,所以对于函数的形参也用指向结构体的指针来传递。 完成目的:初始化结构体数组中的bProcess都为0 1:定义结构体 struct NODE {      int x;      int y;      int bProcess;
结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析  struct stud {  long int num;   float score; }; /*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/ void funvr(struct stud t) {  t.num=2000101; t.score=71.0;  } /*结构体数组作为函数的参数,
(struct)结构体变量作为函数参数调用的方法小结
结构体变量作为函数参数传递的3种方法 将一个结构体变量中的数据传递给另一个函数,有下列3种方法: 用结构体变量名作参数。一般较少用这种方法。 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 用结构体变量的引用变量作函数参数。
菜鸟学习-C语言函数参数传递详解-结构体与数组
C语言中结构体作为函数参数,有两种方式:传值和传址。 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响。 例子: typedef struct tagSTUDENT{ char name[20]; int age; }
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语言:数组作为函数参数举例
替换指定数组中的最大元素。要求指定整数为数组arr2中的第一个元素arr2[0]。使运行结果为:#include &amp;lt;stdio.h&amp;gt;void replaceMax(int arr[],int value){    int max = arr[0];    int index = 0;    int i;    for(i=1;i&amp;lt;5;i++)    {        if(arr...
C++引用数组,函数指针,函数指针数组,结构体数组等学习
这篇博文主要介绍了如何在C++11  VS2013编译器上去实现各种引用,避免因为编译器不同造成的语法困难 1:引用数组,二维数组 ,数组指针 #include using namespace std; void main1(){ /*int a[3]{1,2,3}; int aa[2][3]{1,2,3,4,5,6}; int*pa(new int[3]{1,2,3});
结构体数组排序 (学生信息 按成绩排序 )
/* name:学生信息结构体  按总分排序 (降序) */ #include int main() {   int i,j; typedef struct{ int grade; int age; char name[10];/*其他信息就不列举了*/ }Student;  Student temp; Student student[3]={/*分成多条初
C语言结构体内含有数组,该结构体作为参数传递时需用指针,否则对数组的修改不会被记录
在C语言编程时,常常会定义结构体,而且结构体里面常常会有数组,比如如下所示: typedef struct  { int data[MAX_HEAP_SIZE]; unsigned int heap_size; }HeapType;     这是一个堆的数据结构,包含堆的元素(数组)和堆的大小。在建大顶堆时会给建堆的函数传递参数,建堆函数如下: void Build_Max_He
C++ 如何引用结构体数组作为函数形参
最近使用VS2008编写程序时,遇到了如何引用结构体数组作为函数形参问题。 现将主要代码粘贴如下(结果如图所示),来达到传递结构体数组到函数中的目的: ////--main.cpp--///// #include "Point.h"#include#include using namespace std;typedef struct      //定义结构体 { int num
结构体作为函数参数-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 <
C语言结构体+数组实现学生学号成绩的统计、排序
C语言结构体+数组实现学生学号成绩的统计、冒泡排序
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
go语言 数组做函数参数和数组指针做函数参数
一、数组做函数参数    数组做函数参数:在传递过程中,传递的是实参中每个元素的拷贝,如果实参数组较大,效率比较低 package main import &quot;fmt&quot; //数组作为函数的参数,是进行值传递 //实参数组的每一个元素,在传递的时候,都给形参拷贝一份,因此当实参数组较大,效率就比较低 //简而言之:形参数组是实参数组的复制品 func transferAndModify(a...
C语言结构体及函数传递数组参数示例
注:makeSphere()函数返回Sphere结构体,main函数中,调用makeSphere()函数,传递的第一个参数为数组,传递的数组作为指针。
使用数组作为函数的参数,并将数组内容以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 ...
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/C++语言 二维数组作为函数的参数总结
C/C++语言 二维数组作为函数的参数总结 实参形参之间进行传递的实质:始终传递的是指针,不可能是数组。
C++ 字符串 14-- 18.40.结构体与函数 结构体作为函数参数、结构体指针作为函数返回值
#include &amp;lt;iostream&amp;gt;#include &amp;lt;string&amp;gt;using namespace std;/*---------------------------------18.40.结构体与函数 结构体作为函数参数、结构体指针作为函数返回值---------------------------------*/struct time{ int hour; int ...
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...
结构体变量作为函数参数
推荐使用引用的方式。因为传递的是变量的地址,因而效率较高,并且可读性也高 #include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; using namespace std; struct Student { int num; string name; float score[3]; }stu={12345,&quot;Li Li&quot;,67.5...
C语言关于结构体做参数传递
水平有限,谈谈自己的看法 首先结构体
C语言之数组作为函数的参数的用法
今天自己写卷积神经网络的时候用到了数组,忘了怎么用了怎么把数组传到函数里了。又复习了一遍。顺便记下来一边日后再次往~ 详细代码省略了,就把结构写下: void fun1( unsigned char array[9] ) { //.... } int main(int argc, char* argv[]) { unsigned char array[9] = {1,0,1,0
数组作函数参数:将数组逆序排列
数组作为函数参数的时候,没有办法通过指针来获取数组长度,数组长度要作为参数传递给函数。 在函数定义中 int a[10] 这样的形参定义方式会被转化为int * a不管是int a[10]还是int a[],都不会创建出一个数组,编译器也不会为他们分配内存,这些形式只能说明用户期望传递的数组有10个元素,最后sizeof(a) 长度只有4位,一个指针变量所占内存大小。
【C】指针(六)字符指针做函数参数
这里来说说,三种在函数中调用字符数组的方法:1. 以字符数组作为形参与实参调用2. 以字符数组作为形参,以指针作为实参调用3. 以指针作为形参与实参调用方法1:这是最常规的手段,没学指针前可以用这种很没有效率的方式,值得注意的是,由于b的长度比a长,这种方法其实是把a的元素赋值到了b的前10位,并且将第11位赋值为‘\0’,在输出的时候由于用的是 \s,所以在遇到   '\0'之后就停止输出。方法...
【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语言的一级指针和二级指针作为函数参数,链表,malloc中的分配等等总结
主要内容: 1、一级指针和二级指针 2、函数指针传递的例子 3、什么时候需要传递二级指针? 4、二级指针在链表中的使用 1、一级指针和二级指针 一级指针:即我们一般说的指针,就是内存地址; 二级指针:指向指针的指针,就是地址的地址; 如: int a=1; int *p=&amp;amp;a;  // p为a变量的地址,通过*p可以得到a的值 int **q=&amp;amp;p;   //...
C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
本文用简单的例子说明了C语言中数组做函数参数,数组名a与&a区别,数组名a的"数据类型",以及编译器的不同,相应指针所占字节的不同导致程序的细微差别。
对结构体数组进行冒泡排序(根据名字大小)
对结构体数组进行冒泡排序
根据结构体数组中某一数据项对结构体数组排序
/* *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...
oj Problem F: 复杂类型作函数参数之结构体指针做参数
题目: Description 用结构体指针做参数,修改结构体变量的值。 #include #include struct student                                                     /* 定义结构体类型 */ {     char name[20];     long num;     char gender;
结构体作为参数传入函数错误
结构体作为参数传递的错误! 如下代码:定义了一个结构体变量,将该结构体变量作为参数传递给函数func2,此时传递给函数func2的是结构体变量my_sis的拷贝,函数func2中对所传入的结构体的修改不影响main函数中定义的结构体,所修改的只是传入的拷贝的副本。 1 #include 2 3 struct score 4 { 5 int math;
C语言指针作为函数参数传递学习(一)
1. 数组或者一维指针做函数形参 1.1传入的指针为NULL 比如下面的例子,很多人都会理解错: #include &amp;amp;lt;stdio.h&amp;amp;gt; void test(char *string) { string = &amp;quot;hello world&amp;quot;; } int main() { char *str = NULL; test(str); printf(&amp;quot;str=%s\n&amp;quot;,str); ...
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...
结构体数组中的某个成员进行排序
class Program    {        static void Main(string[] args)        {                                    Struct[] array = new  Struct[3];
C语言中“指针”作为“函数参数”时的注意事项
C语言中“指针”作为“函数参数”时的注意事项
C语言 enum作为函数返回值及函数参数
1.作为返回值 作为函数参数 https://bbs.csdn.net/topics/340095770
文章热词 统计学稳健估计opencv函数 设计制作学习 CAVLC系数矩阵解析 Objective-C培训 机器学习教程
相关热词 ios获取idfa server的安全控制模型是什么 sql android title搜索 java语言学习数据结构 大数据课程的体系结构