2013-10-25 41 views
0

这是计算每个学生的标记总数并对总数进行排序但不交换其他参数(如学生姓名及其主题标记)的顺序的程序。如何将整个结构排序为整体,同时将总分作为排序的基础?我不想使用任何内置函数,并通过基本方法来完成。使用基本方法对结构进行排序

#include<stdio.h> 
#include<conio.h> 
struct stnd 
{ 
    int sub[20]; 
    char name[20]; 
    int total; 
} 
stnd[20]; 
main() 
{ 
    int i, j, n=4, m=4,k; 
    for(i=0; i<n; i++) 
     for(j=0; j<m; j++) 
      scanf("%d",&stnd[i].sub[j]); 
    for(i=0; i<n; i++) 
     scanf(" %s",stnd[i].name); 
    for(i=0; i<n; i++) 
    { 
     stnd[i].total=0; 
     for(j=0; j<m; j++) 
      stnd[i].total=stnd[i].total+stnd[i].sub[j]; 
    } 

    for(i=0; i<n; i++) 
    { 
     for(j=i+1; j<n; j++) 
     { 
      if(stnd[i].total<stnd[j].total) 
      { 
       k=stnd[i].total; 
       stnd[i].total=stnd[j].total; 
       stnd[j].total=k; 
      } 
     } 
    } 

    printf("Rank\t Chin\t Math\t Eng\t Comp\t total\t name\n"); 
    for(i=0; i<n; i++) 
    { 
     printf("%d\t",i+1); 
     for(j=0; j<m; j++) 
     printf("%d\t",stnd[i].sub[j]); 
     printf("%d\t",stnd[i].total); 
     printf("%s\t\n",stnd[i].name); 

    } 
    getch(); 
} 

回答

2

在你那里交换的功能,只是交换结构,而不是总:

// Where you declare k, declare it as a struct stnd 
struct stnd k; 

// Where you swap, just swap the structures, not the totals 
k = stnd[i]; 
stnd[i] stnd[j]; 
stnd[j] = k; 

当您设置一个struct stnd,它确实你复制对象的按位复制,这正是你所需要的分类。

+1

我想指出,这不是*总是*你想要什么。这使得一个浅拷贝。它将在*这个案例中起作用,但是理解**为什么会起作用,以及**如何在**和**时如何起作用,它不会非常重要。 –

+0

@NikBougalis其实,我觉得有必要澄清你的说明。如果您正在复制一行数据,是的,您必须谨慎执行浅拷贝。尽管如此,我不能想到任何实例在排序时*。由于您正在交换,其目的是“移动”数据,而不是复制数据,而浅层复制对于“移动”操作来说是完美的。 –

相关问题