7-12 集合的模擬實現(函式模板) (40分) pta c++
我們可以用一個數組來模擬集合,add運算用以實現集合元素的增加,delete運算用於實現集合元素的刪除,find運算用以實現集合元素的查詢,但是目前集合元素型別未知,可以是int、char、double等基本資料型別,也可以是String、Time、Student等物件型別,要求採用模板函式實現集合元素的增加、刪除和查詢功能。
三個模板函式如下:
int addSet(T * myset, T elem,int len)
int deleSet(T * myset, T elem, int len)
int findElem(T * myset, T elem, int len)
其中,addSet向集合中新增一個元素,deleSet從集合中刪除一個元素,findElem判斷elem是否是集合成員,三個函式分別返回元素插入位置,刪除位置和存在位置。
主函式有如下資料成員 :
int intSet[100]
double douSet[100]
String StrSet[100] 分別是int型別、double型別、String的陣列集合。
int intLen, douLen, strLen分別是int型別、double型別、String的陣列集合的長度
完成上述函式模板和主函式,主函式根據輸入的資訊,建立初始的空集合,呼叫三個模板函式分別對intSet、douSet和StrSet執行相應的操作,並輸出對應的集合資訊。
輸入格式:
每一行為一個集合操作,每行的第一個數字為集合元素型別,1為整型元素,2為浮點型元素,3為String型別,第二個數字為集合操作型別,1為插入,2為刪除,3為查詢,第三個為集合元素,集合元素型別視第一個數字給定的集合元素型別而定。輸入0時標誌輸入結束。
輸出格式:
輸出當前操作的執行位置(插入位置、刪除位置和存在位置)
刪除操作時,如果元素X不存在,輸出“X is not exist!”。
插入操作時,如果集合已滿,輸出“Full Set.”若元素已存在,輸出“X is already exist!”
查詢操作時,如果找不到元素,輸出“X is not exist!”。
輸入:
1 1 1
1 1 2
1 3 1
1 2 1
1 2 3
1 3 1
2 1 1.1
2 1 2.2
2 1 3.3
2 3 1.1
2 2 2.2
2 2 2.2
3 1 abc
3 1 bcd
3 3 abc
3 2 abc
3 3 abc
0
輸出:
0
1
0
0
3 is not exist!
1 is not exist!
0
1
2
0
1
2.2 is not exist!
0
1
0
0
abc is not exist!
#include <iostream> using namespace std; template<typename T> int existElem(T * myset, T elem, int len){ for(int i=0;i<len;i++){ if(myset[i]==elem)return 1; } return 0; } template<typename T> int addSet(T * myset, T elem, int& len){ if(len>=99){ cout<<"Full Set."<<endl; }else if(existElem(myset, elem, len+1)){ cout<<elem<<" is already exist!"<<endl; }else { myset[len]=elem; cout<<len<<endl; len++; } } template<typename T> int deleSet(T * myset, T elem, int &len){ if(!existElem( myset, elem, len+1)){ cout<<elem<<" is not exist!"<<endl; }else if(len>0){ for(int i=0;i<len;i++){ if(myset[i]==elem){ cout<<i<<endl; for(int j=i;j+1<=len;j++){ myset[j]=myset[j+1]; } } } len--; } } template<typename T> int findElem(T * myset, T elem, int len){ for(int i=0;i<len;i++){ if(myset[i]==elem){ cout<<i<<endl; return 0; } } cout<<elem<<" is not exist!"<<endl; } int main(){ int intSet[100]; double douSet[100]; string StrSet[100]; int intLen=0, douLen=0, strLen=0; int type; int op; while(1){ cin>>type; if(type==0)break; cin>>op; if(type==1){ int elem; cin>>elem; if(op==1){ addSet(intSet, elem, intLen); } else if(op==2){ deleSet(intSet, elem, intLen); } else{ findElem(intSet, elem, intLen); } } else if(type==2){ double elem; cin>>elem; if(op==1){ addSet(douSet, elem, douLen); } else if(op==2){ deleSet(douSet, elem, douLen); } else{ findElem(douSet, elem, douLen); } } else{ string elem; cin>>elem; if(op==1){ addSet(StrSet, elem, strLen); } else if(op==2){ deleSet(StrSet, elem, strLen); } else{ findElem(StrSet, elem, strLen); } } } return 0; }
對於 0號和3號測試點要注意極限的情況(例如fullset