main()
{
char str[100]
int i
float c, f//声明摄氏和华氏温度变量
printf("请输入华氏温度:")//提示输入华氏温度
scanf("%s", str)//将输入的字符串保存到变量str数组中
for (i = 0i <strlen(str)i++) {
if (str[i] <'0' || str[i] >'9') {
printf("输入不是纯数字")
return
}
}//判断输入的字符串里是否只有数值字符
f = atof(str) //将数值字符转换成浮点数
c = 5.0 / 9 * (f - 32)//计算摄氏温度
printf("摄氏温度是%0.2f", c)//保留两位小数输出
}
//直接运行通过
各种用C
Sum
为例,用
C++
Template
可写如下:
template
R
Sum(const
T
*array,
int
n)
{
R
sum
=
0
for
(int
i
=
0
i
<
n
++i)
sum
+=
i
return
sum
}
如果不是内置类型,该模板隐式地需要
有R
R::operator+=(T)运算符可用。
1.
使用函数指针作为
Functor
替换者
Typedef
struct
tagAddClass
{
Void
(*add)(char*
r1,
const
char*
r2)
Int
elemSize
Char
sum[MAX_ELEM_SIZE]
}
AddClass
void
Sum(AddClass*
self,
const
char*
array,
int
n)
{
for
(int
i
=
0
i
<
n
++i)
self->add(self->sum,
array
+
i*self->elemSize)
}
使用时:
Void
AddInt(char*
r1,
const
char*
r2)
{
*(long*)r1
+=
*(int*)r2
}
AddClass
addClass
=
{AddInt,
2,
0
}
Int
array[100]
Read(array)
Sum(&addClass,
array,
100)
…..
2.
用宏作为Functor的替换者
#define
GenSumFun(SumFunName,
Add,
RetType,
ElemType)
RetType
SumFunName
(const
ElemType
*array,
int
n)
\
{
RetType
sum
=
0
for
(int
i
=
0
i
<
n
++i)
Add(sum,
i)
return
sum
}
使用时:
#define
AddInt(x,
y)
((x)
+=
(y))
GenSumFun(SumInt,
AddInt,
long,
int)
…..
Int
array[100]
Read(array)
Long
sum
=
SumInt(array,
100)
…..
3.
所有可替换参数均为宏
至少需要一个额外的文件(实现文件)为
impsum.c
/*
impsum.c
*/
RetType
FunName(const
ElemType
*array,
int
n)
{
RetType
sum
=
0
for
(int
i
=
0
i
<
n
++i)
Add(sum,
i)
return
sum
}
使用时:
#undef
RetType
#undef
FunName
#undef
ElemType
#undef
Add
#define
AddInt(x,
y)
((x)
+=
(y))
#define
RetType
long
#define
FunName
SumInt
#define
ElemType
int
#define
Add
AddInt
#include
impsum.c
…..
Int
array[100]
Read(array)
Long
sum
=
SumInt(array,
100)
4.
总结:
第一种方法,易于跟踪调试,但是效率低下,适用于对可变函数(函数指针)的效率要求不高,但程序出错的可能性较大(复杂),模板函数(Sum)本身很复杂,模板参数也比较复杂(add)的场合。
第二种方法,效率高,但很难跟踪调试,在模板函数和模板参数本身都很复杂的时候更是如此。
第三种方法,是我最近几天才想出的,我认为是最好的,在模板参数(Add)比较复杂时可以用函数(第二种也可以如此),简单时可以用宏,并且,易于调试。在模板函数本身很复杂,而模板参数比较简单时更为优越。但是,可能有点繁琐。
{和}是匹配的表示一个单独的
程序段
。
当if
while
for等
这类
控制语句
,要包含多余一句的语句时
需要用{}括起来。
//表示注释
。
//之后到行末
只给编写程序的人看,
编译器
不会处理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)