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;
}