c語言遍歷枚舉
❶ c語言的枚舉求解的循環問題
因為你的if(b>c){t=b;b=c;c=t;}一句把b、c的值交換了,導致不斷循環。在for循環中不要變動循環計數器的值,這會導致結構混亂。在某些編譯器里如果在for循環內改動循環計數器的值會直接報錯。
如果你想避免重復,有兩種方法,其一是c直接從b開始循環;其二是可以將每一對結果保存在一個Bitmap數組中,將已知的數對的flag置為1,得到一組新結果時,首先判斷這兩個數在Bitmap中的flag是否為1,如果均為1說明這是一個已知解,拋棄該解;否則說明這是一個新解,那麼將該解寫入Bitmap中並且輸出到屏幕上。
另外你這個演算法的冗餘太多,可以進行大量剪枝以優化性能。
利用導數可以證明當a,b∈N*時,(ab-1)'≥(a+b)',∴當(ab-1)/(b+c)>x時,應該直接拋棄其後的所有a、b值。為了避免重復解,b的值應該從a開始循環。這樣可以節省大量無用的CPU時間。修改後的代碼如下:
#include<stdio.h>
intmain()
{
intb,c,x,t;
floata;
scanf("%d",&x);
for(b=0;b<=60000;b++)
for(c=b;c<=60000;c++)
if(b!=0||c!=0)
{
a=(b*c-1)*1.0/(b+c);
if(a>x)break;
if(a==x)printf("%d %d ",b,c);
}
return0;
}
輸入100時,對比修改前後代碼,一個用時31s,一個用時1s,時間節省了96%,可見優化效果多麼巨大。
❷ C語言怎樣取得枚舉型的名字 而不是值
在C語言中,枚舉類型是被當做int或者unsigned int類型來處理的,所以按照C語言規范是沒有辦法遍歷枚舉類型的。
不過在一些特殊的情況下,可以實現有條件的遍歷。
1 枚舉類型必須連續。
由於枚舉類型支持如下方式定義:
enum
{
ENUM_0,
ENUM_10 = 10,
ENUM_11
};
這樣就會導致枚舉類型不連續,這種枚舉無法遍歷。
2 枚舉類型中人為加入起始及結束標記。
enum
{
ENUM_START,
ENUM_0,
ENUM_1,
ENUM_2,
ENUM_END
};
可以看到,在這個枚舉類型中,人為加入可ENUM_START, 和ENUM_END。中間的ENUM_0,ENUM_1,ENUM_2才是實際的有效數據。當後續需要增刪枚舉元素時,也要保證ENUM_START, 和ENUM_END分別為最小和最大值。
滿足以上兩種條件下,就可以做枚舉的遍歷了,參考代碼如下:
int i;
for(i = ENUM_START+1; i<ENUM_END; i ++)
{
//使用枚舉元素。
}
這個循環中,i的值就是所有有效的枚舉元素值。
❸ 關於c語言中enum類型與循環
就是為了定義一組同屬性的值,默認的最前面的是0,後面的元素依次+1;
但是注意,每個枚舉都唯一定義一個類型,裡面的元素的值不是唯一的,枚舉成員的初始化只能通過同一枚舉的成員進行!!
如:
enum
num{a,b,c,d};那麼a=0,b=1,c=2,d=3;
enum
number{a=1,b,c=1,d,e}那麼a=1,b=2,c=1,d=2,e=3;
❹ c語言里的union和enum怎麼用
一、聯合
聯合(Union) 使得同一段內存可以被按照不同的數據類型來訪問,數據實際是存儲在同一個位置的。它的聲明和使用看起來與結構(structure)十分相似,但實際功能是完全不同的:
unionmodel_name{
type1element1;
type2element2;
type3element3;
.
.
}object_name;
union 中的所有被聲明的元素占據同一段內存空間,其大小取聲明中最長的元素的大小。例如:
unionmytypes_t{
charc;
inti;
floatf;
}mytypes;
定義了3個元素:
mytypes.c;
mytypes.i;
mytypes.f;
每一個是一種不同的數據類型。既然它們都指向同一段內存空間,改變其中一個元素的值,將會影響所有其他元素的值。
union 的用途之一是將一種較長的基本類型與由其它比較小的數據類型組成的結構(structure)或數組(array)聯合使用,例如:
unionmix_t{
longl;
struct{
shorthi;
shortlo;
}s;
charc[4];
}mix;
以上例子中定義了3個名稱:mix.l, mix.s 和 mix.c,可以通過這3個名字來訪問同一段4 bytes長的內存空間。至於使用哪一個名字來訪問,取決於想使用什麼數據類型,是long, short 還是 char 。下圖顯示了在這個聯合(union)中各個元素在內存中的的可能結構,以及如何通過不同的數據類型進行訪問:
a=tue;
❺ c語言如何遍歷枚舉元素
用for循環:
for(i=1;i<=999;i++)
{/*對數組a[i]進行處理*/}
當然也可以用while或do…while語句。
❻ C語言的遍歷演算法
思路1:
寫出所有24種4個數的排列,存到一個數組里,假如數組是P[24][4];
那麼可以
for
(i
=
0;
i
<
24;
i++)
for
(j
=
0;
j
<
24;
j++)
for
(k
=
0;
k
<
24;
k++)
三層循環,P[i],P[j],P[k]分別是矩陣的三個列
思路2:
利用dfs遞歸枚舉
int
used[3][4];/*這個數組存放三個列中0~3這四個數是否已在這一列中出現過,需要提前清零*/
int
mat[3][4];/*要枚舉的矩陣*/
void
dfs(int
col,
int
row)/*col表示現在已經搜索到哪一列(從0開始編號),row表示這一列已經填了幾行*/
{
int
i;
if
(col
==
2
&&
row
==
4)
{
....../*運行到這里的時候,mat就是枚舉到的一個矩陣*/
return;
}
if
(row
==
4)
{row
=
0;
col++;}
for
(i
=
0;
i
<
4;
i++)
if
(!used[col][i])
{
used[col][i]
=
1;
mat[col][row]
=
i;
dfs(col,
row
+
1);
used[col][i]
=
0;
}
return;
}
調用的時候調用dfs(0,0)
❼ C語言 怎麼使用一個循環能夠將一個文件夾中的文件(二進制文件)逐個打開(可以對其進行修改)
這個需要使用 Win32 API 函數
FindFirstFile( ) 函數可以查找到一個文件
FindNextFile( ) 可以打開下一個文件
循環調用 FindNextFile( ) 可以遍歷枚舉目錄裡面的所有文件,包括目錄
❽ c語言中這段代碼的執行過程!要詳細的!
頭文件寫錯了,#include,其次主函數的返回類型,
要說過程,如下,在if(k%i==0)break語句中,這是判斷語句,從2開始到k這個數,在循環當中,判斷是否是素數,如果k%i==0成立,則跳出此次循環,到第一個for循環當中去,此時k++,又來進行判斷,如果(k%i==0)為假,也就是下面的( i == k)成立,則輸出,如此這樣的循環,就可以找到的,可以達到你的要求了。
❾ C語言的枚舉類型知識
導語:定義一個變數是枚舉類型,可以先定義一個枚舉類型名,然後再說明這個變數是該枚舉類型。下面是C語言的枚舉類型知識,歡迎閱讀:
在實際應用中,有的變數只有幾種可能取值。如人的性別只有兩種可能取值,星期只有七種可能取值。在 C 語言中對這樣取值比較特殊的變數可以定義為枚舉類型。所謂枚舉是指將變數的值一一列舉出來,變數只限於列舉出來的值的范圍內取值。
例如:
enum weekday{sun,mon,tue,wed,thu,fri,sat};
定義了一個枚舉類型名 enum weekday,然後定義變數為該枚舉類型。例如:
enum weekday day;
當然,也可以直接定義枚舉類型變數。例如:
enum weekday{sun,mon,tue,wed,thu,fri,sat} day;
其中,sum,mon,…,sat 等稱為枚舉元素或枚舉常量,它們是用戶定義的標識符。
需要說明的有以下幾點。
① 枚舉元素不是變數,而是常數,因此枚舉元素又稱為枚舉常量。因為是常量,所以不能對枚舉元素進行賦值。
② 枚舉元素作為常量,它們是有值的,C 語言在編譯時按定義的順序使它們的值為,1,2,…。
在上面的說明中,sun 的值為 0,mon 的值為 1,…sat 的.值為 6,如果有賦值語句
day=mon;
則 day 變數的值為 1。當然,這個變數值是可以輸出的。例如:
printf ("%d",day);
將輸出整數 1。
如果在定義枚舉類型時指定元素的值,也可以改變枚舉元素的值。例如:
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;
這時,sun 為 7,mon 為 1,以後元素順次加 1,所以 sat 就是 6 了。
③ 枚舉值可以用來作判斷。例如:
if (day==mon) {…}
if (day>mon) {…}
枚舉值的比較規則是:按其在說明時的順序號比較,如果說明時沒有人為指定,則第一個枚舉元素的值認作 0。例如,mon>sun,sat>fri。
C 語言教程 ?216?
④ 一個整數不能直接賦給一個枚舉變數,必須強制進行類型轉換才能賦值。例如:
day=(enum weekday)2;
這個賦值的意思是,將順序號為 2 的枚舉元素賦給 day,相當於workday=tue;
【例 11.6】從鍵盤輸入一個整數,顯示與該整數對應的枚舉常量的英文名稱。
# include
void main( )
{
enum weekday {sun,mon,tue,wed,thu,fri,sat} day;
int k;
printf("input a number(0--6)");
scanf("%d",&k);
day=(enum weekday)k;
switch(day)
{
case sun: printf("sunday/n");break;
case mon: printf("monday/n");break;
case tue: printf("tuesday/n");break;
case wed: printf("wednesday/n");break;
case thu: printf("thursday/n");break;
case fri: printf("friday/n");break;
case sat: printf("satday/n");break;
default: printf("input error/n");break;
}
}
程序運行結果為:
input a number(0--6)1
monday
在該程序中,枚舉常量與枚舉變數可以進行比較,但要輸出枚舉常量對應的英文單詞,不能使用以下語句:
printf(" %s",mon);
因為枚舉常量 mon 為整數值,而非字元串。
在使用枚舉變數時,主要關心的不是它的值的大小,而是其表示的狀態。
註:以下全部代碼的執行環境為VC++ 6.0
在程序中,可能需要為某些整數定義一個別名,我們可以利用預處理指令#define來完成這項工作,您的代碼可能是:
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
在此,我們定義一種新的數據類型,希望它能完成同樣的工作。這種新的數據類型叫枚舉型。
1. 定義一種新的數據類型 - 枚舉型
以下代碼定義了這種新的數據類型 - 枚舉型
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
(1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號,隔開。
(2) DAY是一個標識符,可以看成這個集合的名字,是一個可選項,即是可有可無的項。
(3) 第一個枚舉成員的默認值為整型的0,後續枚舉成員的值在前一個成員上加1。
(4) 可以人為設定枚舉成員的值,從而自定義某個范圍內的整數。
(5) 枚舉型是預處理指令#define的替代。
(6) 類型定義以分號;結束。
2. 使用枚舉類型對變數進行聲明
新的數據類型定義完成後,它就可以使用了。我們已經見過最基本的數據類型,如:整型int, 單精度浮點型float, 雙精度浮點型double, 字元型char, 短整型short等等。用這些基本數據類型聲明變數通常是這樣:
char a; //變數a的類型均為字元型char
char letter;
int x,
y,
z; //變數x,y和z的類型均為整型int
int number;
double m, n;
double result; //變數result的類型為雙精度浮點型double
既然枚舉也是一種數據類型,那麼它和基本數據類型一樣也可以對變數進行聲明。
方法一:枚舉類型的定義和變數的聲明分開
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY yesterday;
enum DAY today;
enum DAY tomorrow; //變數 tomorrow的類型為枚舉型enum DAY
enum DAY good_day, bad_day; //變數good_day和bad_day的類型均為枚舉型enum DAY
方法二:類型定義與變數聲明同時進行:
enum //跟第一個定義不同的是,此處的標號DAY省略,這是允許的。
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //變數workday的類型為枚舉型enum DAY
enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //變數days的類型為枚舉型enum week
enum BOOLEAN { false, true } end_flag, match_flag; //定義枚舉類型並聲明了兩個枚舉型變數
方法三:用typedef關鍵字將枚舉類型定義成別名,並利用該別名進行變數聲明:
typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此處的workday為枚舉型enum workday的別名
workday today, tomorrow; //變數today和tomorrow的類型為枚舉型workday,也即enum workday
enum workday中的workday可以省略:
typedef enum
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此處的workday為枚舉型enum workday的別名
workday today, tomorrow; //變數today和tomorrow的類型為枚舉型workday,也即 enum workday。
❿ c語言,定義一個枚舉類型,用來表示一周中的七天,利用循環將枚舉值輸出
#include"stdio.h"
enumweek{
sun,mon,tue,wed,thu,fri,sat,
};
intmain(void){
intwd;
enumweekpw,t;
while(1){
printf("Pleaseinputwd(0~7)... wd=");
if(scanf("%d",&wd)&&wd>0&&wd<8)
break;
printf("Error,redo:");
}
for(t=(enumweek)wd,wd=0,pw=sun;pw<t;pw=(enumweek)++wd)
printf("%d",pw);
printf(" ");
return0;
}