#include<iostream>
using namespace std;
//主選單
void menu(){
cout<<"*********** Welcome !*********"<<endl;
cout<<"*******1 輸入集合A、B ********"<<endl;
cout<<"*******2 求集合A交B *********"<<endl;
cout<<"*******3 求集合A并B *********"<<endl;
cout<<"*******4 求集合A減B *********"<<endl;
cout<<"******負數 退出 *********"<<endl;
cout<<"*******************************"<<endl;
}
//集合內元素的收集
void collect(int shun,int n,int a[]) {
int i,j,k;
for(i=0;i<n;i++){
cout<<"請輸入第"<<shun<<"個集合的第"<<i+1<<"個元素:" ;
cin>>a[i];
while(a[i]<=0){
cout<<"請重新輸入一個正整數:";
cin>>a[i];
}
//從輸入的第二個數開始判斷是否有重復值
if(i>0){
for(j=i,k=0;k<j;k++){
while(a[k]==a[j]){
cout<<"集合中不允許有重復的正整數出現,請重新輸入:";
cin>>a[i];
}
}
}
}
}
//集合交集
void Jiao(int n,int m,int a[],int b[]){
int count=0,i,j;
int c[n+m];
cout<<"A、B的交集元素有:";
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(a[i]==b[j]){
cout<<a[i]<<" ";
count =+ 1;//對 相同的數的記數
}
}
}
if(count==0){
cout<<"空"<<endl;
}
else
cout<<endl;
}
//集合的并集,感覺寫的太麻煩了.....
//while和if有些地方用混了
void Union(int n,int m,int a[],int b[]) {
int i=0,j=0,count=0,temp;
//使用冒泡排序簡化求并集
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(i=0;i<m-1;i++){
for(j=0;j<m-i-1;j++){
if(b[j]>b[j+1]){
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
}
// 校驗冒泡排序
// for(i=0;i<n;i++){
// cout<<a[i];
// }
// for(j=0;j<m;j++){
// cout<<b[j];
// }
i=0,j=0;//必須有這一步
cout<<"A、B的并集元素有:";
while((i!=(n-1))&&(j!=(m-1))){
if(a[i]==b[j]){
cout<<a[i]<<" ";
i++;
j++;
}
else if(a[i]<b[j]){
cout<<a[i]<<" ";
i++;
}
else if(b[j]<a[i]){
cout<<b[j]<<" ";
j++;
}
}
while(j==(m-1)&&i<(n-1)){
//考慮 A:1 2 3,B:1 4 6 和 A:1 2 3,B:1 3 6 情況
if(b[m-1]==a[i]){
cout<<b[j]<<" ";
for(i =+ 1;i<n;i++){
cout<<a[i]<<" ";
}
}
else if(b[m-1]<a[i]){
cout<<b[j]<<" ";
for(;i<n;i++){
cout<<a[i]<<" ";
}
}
while(b[m-1]>a[i]){
cout<<a[i]<<" ";
i++;
}
}
//此處應用while,但用if雖然麻煩但也已經考慮到各種情況,所以不再修改
if(i==(n-1)&&j<(m-1)){
if(a[n-1]==b[j]){
cout<<a[i]<<" ";
for(j=j+1;j<m;j++){
cout<<b[j]<<" ";
}
}
else if(a[n-1]<b[j]){
cout<<a[i]<<" ";
for(;j<m;j++){
cout<<b[j]<<" ";
}
}
else if(a[n-1]>b[j]){
cout<<b[j]<<" ";
j++;
if(a[i]==b[j]){
cout<<a[i]<<" ";
j++;
if(j<m){
for(;j<m;j++){
cout<<b[j]<<" ";
}
}
}
else if(a[i]<b[j]){
cout<<a[i]<<" ";
for(;j<m;j++){
cout<<b[j]<<" ";
}
}
else if(a[i]>b[j]){
cout<<b[j]<<" ";
for(j=j+1;j<m;){
if(a[i]>b[j]){
cout<<b[j]<<" ";
j++;
}
else if(a[i]<b[j]){
cout<<a[i]<<" ";
for(;j<m;j++){
cout<<b[j]<" ";
}
}
else if(a[i]==b[j]){
cout<<a[i]<<" ";
i++;
j++;
}
}
}
}
}
else if(i==(n-1)&&j==(m-1)){
for(;i<n,j<m;i++,j++){
if(a[n-1]<b[m-1]){
cout<<a[n-1]<<" "<<b[m-1]<<" ";
}
else if(a[n-1]==b[m-1]){
cout<<a[n-1]<<" ";
}
else if(a[n-1]>b[m-1]){
cout<<b[m-1]<<" "<<a[n-1]<<" ";
}
}
}
cout<<endl;
}
void Cha(int n,int m,int a[],int b[]){
int i,j,count;
cout<<"A-B的元素有:";
for(i=0;i<n;i++){
for(j=0,count=0;j<m;j++){
//記重復次數 用來判斷當前a[i]是否輸出
if(a[i]==b[j]){
count=count+1;
}
}
while(count==0){
cout<<a[i]<<" ";
count=count+1;
}
}
cout<<endl;
}
int main(){
menu();
int num,a_length,b_length;
//確定兩個集合的元素個數,為陣列的輸入做準備
cout<<"請輸入第一個集合元素的個數:";
cin>>a_length;
int a[a_length];
cout<<"請輸入第二個集合元素的個數:";
cin>>b_length;
int b[b_length];
num=1;
while(num>0){
cout<<"請輸入選項:";
cin>>num;
switch(num){
case 1: collect(1,a_length,a);
collect(2,b_length,b);
break;
case 2:Jiao(a_length,b_length,a,b);
break;
case 3:Union(a_length,b_length,a,b);
break;
case 4:Cha(a_length,b_length,a,b);
break;
default:cout<<"您輸入有誤,請重新輸入!"<<endl;
}
}
}
設計思想:先確定A、B集合元素的個數(因為后續用到switch-case陳述句,case陳述句中無法定義全域變數),在設計四個函式和一個主選單。確定集合元素后集合元素的輸入就很簡單;集合的交集函式的思路是拿B集合中的所有元素去和A集合的每一個元素比較,若有相同的就輸出;集合的并集的函式思路是A、B集合中從第一個元素相比較,哪個集合元素較小哪個集合的元素后移一位(在代碼中就是陣列下標加一),直到兩個集合的元素都全部輸出;集合的差函式的思路是定義一個計數變數,拿A集合的元素與B集合元素比較,如果有相同的元素,計數變數加一,A集合元素后移一位(在代碼中就是陣列下標加一),通過計數變數是0還是1控制A集合元素的輸出。
主要是并集寫的復雜,因為while、if使用不當
選單不可以動
河南大學-軟體學院-YD
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/132341.html
標籤:C++ 語言
上一篇:串口通訊小程式問題
