本程序摘自張志良編著著《單片機實驗實訓100例——基于Keil C和Proteus》 ISBN 978-7-5124-1603-1北航出版社。
從串口隨機輸入16個數據,然后再從串口分二行分別輸出其排序前后的數據。
#include <reg51.h> //包含訪問sfr庫函數reg51.h
#include <stdio.h> //包含I/O庫函數stdio.h
#define uchar unsigned char //用uchar表示unsigned char
void main ( ) { //主函數
uchar data i,j,k,m; //定義字符型變量i、j、k(最大值序號)、m(暫存器)
uchar data a[16]; //定義整型數組a[16]
TMOD=0x20; //串口初始化:定時器1工作方式2;
TH1=TL1=0xE6; //置1200波特率(fosc=12MHz)
SCON=0x52; //串口方式1,允許接收,清發送中斷
TCON=0x40; //設置中斷控制,啟動T1
for(i=0; i<16; i++) //for循環
scanf("%bu",a+i); //串口輸入數組a數據(無符號字符型十進制整數)
for(i=0; i<16; i++) { //for循環
if (i%8==0) printf("\n"); //若i是8的整倍數,換行(輸出時,8個一行)
printf ("a[%bu]=%bu,",i,a);} //輸出數組a原始數據元素
for(i=0; i<15; i++) { //for循環,選擇法排序
k=i; //最大值序號k賦值,設最大值為首個元素
for(j=i; j<16; j++) //for循環,依次與后續數組元素比較,選出最大值
if (a[k]<a[j]) k=j; //比較,若a[k] <a[j],最大值序號變更
m=a[k];a[k]=a;a=m;} //交換位置
printf ("\n"); //換行
for(i=0; i<16; i++) { //for循環
if (i%8==0) printf("\n"); //若i是8的整倍數,換行(輸出時,8個一行)
printf ("a[%bu]=%bu,",i,a);} //輸出從大到小排序后數組a的數據元素
while(1);} //原地踏步,無限循環
|