通訊錄排序(c++)
阿新 • • 發佈:2018-11-16
通訊錄排序(c++)
【問題描述】
建立一個通訊錄的結構記錄,包括姓名、生日、電話號碼。輸入n(n<10)個朋友的資訊,再按他們的年齡從大到小的順序依次輸出其資訊
【輸入形式】
先輸入朋友數n(整型,n<10),再依次輸入每個朋友的姓名(字串)、生日(整型)、和電話號碼(字串)。
【輸入輸出樣例】
Input n:3
Input the name,birthday,number of the 1 friend:zhang 19850403 13912345678
Input the name,birthday,number of the 2 friend:wang 19821020 0571-88018448
Input the name,birthday,number of the 3 friend:qian 19840619 13609876543
wang□19821020□0571-88018448
qian□19840619□13609876543
zhang□19850403□13912345678
【樣例說明】
按朋友年齡從大到小的順序依次輸出每位朋友的資訊,內容與格式如下
姓名□生日□電話號碼
%s□%d□%s
□表示空格
題目難點
1. 呼叫陣列做儲存
2. 陣列定義為string型,這樣就可以存放多個字母(如果用char型,就只能存放一個字元)
問題解答
#include <iostream>
using namespace std;
void sort(int [],string [],string [],int);//排序函式
int main()
{
int n,bir[10];
string name[10],tel[10];//注意陣列型別
cout<<"Input n:";
cin>>n;
cout<<endl;
for(int i=0;i<n;++i)//分別給三個陣列賦值
{
cout<<"Input the name,birthday,number of the "<<i+1<<" friend:";
cin>>name[i]>>bir[i]>>tel[i];
cout<<endl;
}
sort (bir,name,tel,n);//呼叫排序函式
return 0;
}
void sort(int bir[],string name[],string tel[],int n)
{
for(int i=0;i<n-1;++i)//經典選擇排序
{
int index=i,temp1;
string temp2,temp3;//注意型別
for(int j=index+1;j<n;++j)
if(bir[j]<bir[index]) index=j;//注意:這邊用小於號,因為生日年齡從大到小排序和普通數字從大到小排序正好是相反的
//下面程式碼實現的是經典的交換兩個陣列元素(只不過同時交換了3組陣列)
//因為不可能你單單交換生日大小,不然就竄改資料了,每個人和他的生日電話就匹配不上了
temp1=bir[i];temp2=name[i];temp3=tel[i];
bir[i]=bir[index];name[i]=name[index];tel[i]=tel[index];
bir[index]=temp1;name[index]=temp2;tel[index]=temp3;
}
for(int i=0;i<n;++i)
cout<<name[i]<<" "<<bir[i]<<" "<<tel[i]<<endl;
}
筆記:
- C++中輸入一串字元的函式有多種:
(1)C標準函式,儲存字元到字元陣列中:
char str[100];
scanf("%s", str ) ; //讀入一串字元,不能包括空格
gets(str); //輸入一行字元,可以有空格,以回車鍵結束
(2)C++函式,可以儲存到字元陣列,也可以儲存到string類物件中:
string str;
cin >> str ; //讀入一串字元,不能包括空格
getline(cin,str ); //輸入一行字元,可以有空格,以回車鍵結束