① 如何利用c語言實現集合的運算
這種集合問題,一般是使用鏈表來處理。
比如說有兩個鏈表list1,list2,它們分別用來存儲集合A,B
如果要對A,B進行並運算,
那麼可以首先定義一個新的鏈表list3,然後讓list1和list2的值進行循環的比較,如果有相同的值,那麼就將這個值放入list3中,直到沒有相同的值為止。
大致的演算法就是這樣了。
② 如何用C語言做出「完成集合運算的並集,交
定義兩個數組存放這兩個集合,再定義一個數組存放它們的集合,用類似冒泡排序的演算法,遍歷數組1中的第一個元素和數組2中每一個元素,若有相同的,則把這個元素放入第三個數組,繼續遍歷,知道數組1遍歷完所有元素,那數組3中的元素,即為兩個數組(集合)的交集。
③ C語言實現集合合並的問題
C語言沒有提供這樣的功能,只能自己寫個函數了
但是我感覺你所謂的「合並」很模糊。
如果是12和34,合並是變成了46呢還是1234?
如果是char數組,難道合並以後這個變成了兩個字元碼?
把這些考慮清楚了就可以自己寫個函數,如果不會把你的想法告訴我,我可以幫你寫一個
***************************************************
你這個補充的就難了,如果是把兩個數字合在一起還好,但是是集合,而且集合裡面的元素個數還不是固定的,這樣的話我想直接用C語言編寫太難了(C語言沒有foreach),當作為參數傳遞進來的時候,即使是數組也已經轉化成為了指針,而且是數字,沒有『\0'作為標識來結束,誰都不知道到底裡面放了幾個數字,這怎麼合並呢?
④ 怎樣用語言c語言實現集合的合並,交集
通過你描述的問題,正確的交集代碼如下:
void
bing(char
a[],char
b[],int
m,int
n)
{
char
d[400];
int
i=0,j=0,s=m;
for(i=0;i<m;i++)
d[i]=a[i];
for(i=0;i<n;i++){
for(j=0;j<m;j++)
{
if(b[i]==a[j])
break;
}
if(j==m)
d[s++]=b[i];
}
cout<<"集合並集是:";
for(i=0;i<s;i++)
cout<<d[i]<<"
";
}
⑤ C語言編程 集合子集問題
#include<iostream>
#include<string>
#include<fstream>
#include<conio.h>
usingnamespacestd;
//定義集合的最大數量,可以自己修改
#defineMAX_COUNT100
//集合使用數組來保存
intSetA[MAX_COUNT];
intSetB[MAX_COUNT];
intCountA=0;//集合A的長度
intCountB=0;//集合B的長度
///函數Contains,判定集合是否包含一個數
///@paramset,集合
///@paramcount,集合Set中的元素個數
///@paramvalue,是否包含的值
///@returnset包含value,返回true,否則返回false
boolContains(intset[],intcount,intvalue)
{
for(inti=0;i<count;i++)
if(value==set[i])
returntrue;
returnfalse;
}
//輸入一個集合
voidInputSet(intset[],int&count)
{
strings;
//讀取這一行
getline(cin,s);
inti=0;
while(i<s.length())
{
intspacePos=0;
spacePos=s.find('',i);//查找空格下一個空格的位置
if(spacePos<0||spacePos>=s.length()-1)//如果沒有空格或者空格超出了字元串范圍,跳出循環
break;
stringtemp=s.substr(i,spacePos-i);
if(temp=="")//如果字元串為空,執行下一條
continue;
intvalue=stoi(temp);
if(!Contains(set,count,value))//如果集合中已經包含此數字了,就不再添加
set[count++]=value;
i=spacePos+1;
}
//讀取最後一個數
stringtemp=s.substr(i,s.length()-i);
intvalue=stoi(temp);
if(!Contains(set,count,value))
set[count++]=value;
}
//判斷是為setB是否為setA的子集
boolIsSubSet(intsetA[],intcountA,intsetB[],intcountB)
{
for(inti=0;i<countB;i++)
if(!Contains(setA,countA,setB[i]))
returnfalse;
returntrue;
}
voidmain()
{
cout<<"注意:只能輸入整數,並且數字之間以空格隔開。"<<endl<<endl;
cout<<"請輸入集合A:"<<endl;
InputSet(SetA,CountA);
cout<<"請輸入集合B:"<<endl;
InputSet(SetB,CountB);
cout<<endl;
cout<<"集合A和集合B比較結果"<<endl;
if(IsSubSet(SetA,CountA,SetB,CountB))
cout<<"集合B是集合A的子集"<<endl;
else
cout<<"集合B不是集合A的子集"<<endl;
cout<<endl;
cout<<"按任意鍵退出"<<endl;
getch();
}
⑥ 用C語言編寫集合子集的程序怎麼寫
首先,你的題目和舉例不相符啊。題目是{ 1 ~ n },而舉例是{ 0 ~ n-1};我以題目為准吧。
如果n=5;其中後面的一部分子集按順序排是這樣的:
{5}
{1 5}
{2 5}
{3 5}
{4 5}
{1 4 5}
{2 4 5}
{3 4 5}
{1 3 4 5}
{2 3 4 5}
{1 2 3 4 5}
我們可以把一個子集看成兩個部分,一部分是前面的追趕者,另一部分是後面的累積者。
{1 5},{2 5},{3 5},{4 5}就像這些子集,追趕者從1一直追趕到了4,然後與累積者{5}相遇,累積者變成{4 5};追趕者從頭繼續從1一直追趕到了3,然後與累積者{4 5}相遇,累積者變成{3 4 5};如此反復,可以把這個全部輸出來。
而累積者始終是連續的,比如{4 5}、{3 4 5}、{2 3 4 5},所以我們只用定義累積者的頭和尾,就可以把累積者的范圍定義。
代碼如下,僅供參考:
#include <stdio.h>
void main( void )
{
int n,i,runner,start,end;
printf("請輸入正整數n的值:");
scanf("%d",&n);
printf("{}\n"); //空集必定是有的
for(end=1;end<=n;end++) //累積者的尾加一,直到n
{
printf("{%d}\n",end);
for(start=end;start>0;start--) //累積者的頭減一,直到1
{
for(runner=1;runner<start;runner++) //追趕者加一,直到遇到累積者的頭
{
printf("{");
printf("%d ",runner); //輸出追趕者
for(i=start;i<end;i++)
printf("%d ",i); //輸出累積者(不包括頭,因為累積者的尾後面不跟空格,而是跟})
printf("%d}\n",end); //輸出累積者的尾
}
}
}
}
⑦ C語言 集合運算
Deletetable函數有兩個地方把pcollelm寫成了collelm
Addition函數體第4行沒加分號
Addition函數中3次調用AppendToTable時都寫了3個參數,但AppendToTable只聲明了2個參數
Multiply的返回類型寫了collelm,應該是pcollelm
Multiply的函數參數是x,y,但函數體裡面寫的是a,b
Multiply里調用AppendToTable時,p的前面不用寫類型
main的第3行,p=collp;改成p=&collp;
main裡面case 2調用Deletetable時,第一個參數是Collelm類型的colla,但Deletetable對應的參數類型是Collelm *
⑧ C語言集合問題
for循環中第一個條件是初始條件,把c=0加裡面只是在剛開始給c賦值,之後每次循環的c就是之後++的值,你的目的是每次循環的時候c=0,如果a的值與b的值不想等,c就自加1,當i=1時,c不能清0,所以要在for循環裡面加上c=0,而不是在for的條件里,像這樣
for(i=0;i<n;i++)
{
c=0;
...
⑨ 用C語言求兩個整數集合的並集.
有a、b 2個數組,把b中每個元素分別和a中每個元素比較,若無重復,則加入數組a。這樣的話一個for語句,再加一個功能函數(也可以寫在主函數中)就好。
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char a[20],b[20];
int n,m,j,k;
printf ("請輸入第一個集合內容 ");
scanf ("%s",a);
j=strlen(a);
printf ("請輸入第二個集合內容 ");
scanf ("%s",b);
k=strlen(b);
char c[20]="",d[40]="";
for (n=0;n<j;n++)
printf(" %s ",c);
index=0;
for (n=0;n<j;n++)
{
for(m=0;m<index;m++)
if(d[m] == a[n])
flag=0;
d[index++]=b[n];
}
flag=1;
} printf ("集合的並集是:");
printf(" %s ",d);
return 0;
}
(9)c語言中集合問題怎麼做擴展閱讀:
集合中元素的數目稱為集合的基數,集合A的基數記作card(A)。當其為有限大時,集合A稱為有限集,反之則為無限集。一般的,把含有有限個元素的集合叫做有限集,含無限個元素的集合叫做無限集。
表示
假設有實數x < y:
①[x,y] :方括弧表示包括邊界,即表示x到y之間的數以及x和y;
②(x,y):小括弧是不包括邊界,即表示大於x、小於y的數。
⑩ 關於集合問題 C#高手請進
c# 實現字元串倒序的n 種寫法
最簡潔就是linq的寫法,推薦
// string concatenation with for loop
public string ReverseA(string text)
{
char[] cArray = text.ToCharArray();
string reverse = String.Empty;
for (int i = cArray.Length - 1; i > -1; i--)
{
reverse += cArray[i];
}
return reverse;
}
// Array.Reverse function
public string ReverseB(string text)
{
char[] charArray = text.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
// push/pop Stack<>
public string ReverseC(string text)
{
Stack resultStack = new Stack();
foreach (char c in text)
{
resultStack.Push(c);
}
StringBuilder sb = new StringBuilder();
while (resultStack.Count > 0)
{
sb.Append(resultStack.Pop());
}
return sb.ToString();
}
// LINQ
public string ReverseD(string text)
{
return new string(text.ToCharArray().Reverse().ToArray());
}
// StringBuilder
public string ReverseE(string text)
{
char[] cArray = text.ToCharArray();
StringBuilder reverse = new StringBuilder();
for (int i = cArray.Length - 1; i > -1; i--)
{
reverse.Append(cArray[i]);
}
return reverse.ToString();
}