因為用到了這塊,所以轉了一篇文章。
原文地址http://blog.sina.com.cn/s/blog_5f777ddd0100chbl.html
設有學生情況登記表,用選擇排序法對該表按從小到大進行排序。
學生情況登記表
學號num |
姓名name[8] |
性別sex |
年齡age |
成績score |
101 |
zhang |
m |
19 |
95.6 |
102 |
zhao |
m |
20 |
89.0 |
103 |
wang |
f |
18 |
96.5 |
104 |
shan |
m |
20 |
94.0 |
105 |
chen |
f |
20 |
76.5 |
106 |
han |
f |
19 |
87.0 |
107 |
cui |
m |
20 |
78.8 |
108 |
ding |
f |
18 |
98.4 |
109 |
chu |
m |
19 |
90.0 |
110 |
gao |
m |
20 |
97.3 |
程式碼如下:
#include<iostream>
#include<iomanip>
using namespace std;
struct STUDENT
{
int num;
char name[8];
char sex;
int age;
double score;
};
void sort(STUDENT *p[],int n)
{
int i,j,k;
struct STUDENT *w;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if((*p[j]).score<(*p[k]).score)
k=j;
if(k!=i)
{
w=p[i];
p[i]=p[k];
p[k]=w;
}
}
return;
}
int main()
{
int i;
STUDENT stu[10]={{101,"zhang",'m',19,95.6},
{102,"zhao",'m',20,89.0},{103,"wang",'f',18,96.5},
{104,"shan",'m',20,94.0},{105,"chen",'f',20,76.5},
{106,"han",'f',19,87.0},{107,"cui",'m',20,78.8},
{108,"ding",'f',18,98.4},{109,"chu",'m',19,90.0},
{110,"gao",'m',20,97.3}};
struct STUDENT *p[10];
for(i=0;i<10;i++)
p[i]=&stu[i];
cout<<"NO. NAME SEX AGE SCORE\n";
cout<<setiosflags(ios::fixed);//浮點數以十進位小數形式輸出
cout<<setiosflags(ios::left); //輸出資料靠左對齊
cout<<setprecision(2); //小數點後兩位
for(i=0;i<10;i++)
{
cout<<setw(8)<<(*p[i]).num<<setw(9)<<(*p[i]).name;
cout<<setw(8)<<(*p[i]).sex<<setw(8)<<(*p[i]).age;
cout<<setw(5)<<(*p[i]).score<<endl;
}
cout<<endl;
sort(p,10);
cout<<"NO. NAME SEX AGE SCORE\n";
for(i=0;i<10;i++)
{
cout<<setw(8)<<(*p[i]).num<<setw(9)<<(*p[i]).name;
cout<<setw(8)<<(*p[i]).sex<<setw(8)<<(*p[i]).age;
cout<<setw(5)<<(*p[i]).score<<endl;
}
return 0;
}
編程心得:
在本程式中,將學生資訊定義為結構體類型變數,在函數的調用時,用結構體類型指標變數做函數參數,由於傳送的是地址,因此,被調函數中改變結構體類型形參所指向的地址中的值也就改變了結構體類型指標實參所指向地址的值,即學生的排序得以改變。本例中,選擇排序法也得到了重要的應用。