十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在C語言中用到數(shù)值范圍一般有如下兩種情況:
成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(創(chuàng)新互聯(lián)).為客戶提供專業(yè)的成都服務(wù)器托管,四川各地服務(wù)器托管,成都服務(wù)器托管、多線服務(wù)器托管.托管咨詢專線:028-86922220
1 邏輯判斷中確定某數(shù)在某個范圍內(nèi)。
比如判斷數(shù)c在[a,b]區(qū)間內(nèi)可以寫作
(a=c) (c = b)
2 使計算結(jié)果處于某個范圍內(nèi)。
比如計算時間時,當(dāng)前時間為n點,經(jīng)過m小時后是幾點,由于時間僅取值在0點到23點,所以對數(shù)值范圍需要做約束。對于此可以用模除(%)來限定。
(n+m)%24
其它關(guān)于數(shù)值范圍限定的問題,都可以從這兩種情況中延伸獲得。
比如下面兩個例題就是兩種情況的應(yīng)用。
例一,輸入起始天的星期數(shù)(1-7),及天數(shù)n,計算經(jīng)過n天后是星期幾。
分析,這個是第二種的典型應(yīng)用,不過數(shù)據(jù)規(guī)模為1到7,與之前說的0起始情況略有不同,可以通過轉(zhuǎn)換達到目的,代碼如下:
#include stdio.h
int main()
{
int s,n;
scanf("%d%d",s,n);
s --;//將s-1;這樣用0-6代表星期一到日
s +=n;
s%=7;//通過模除限定結(jié)果
s++;//轉(zhuǎn)換回1-7的表示方法
printf("%d\n", s);//輸出結(jié)果
return 0;
}
例二,依照下面的公式計算,直到結(jié)果小于0或者大于100為止,f(0)由外部輸入。
如果f(n)為奇數(shù),f(n+1)=2f(n)
否則f(n+1) = f(n)/2-10
輸出計算結(jié)果。
題目很清晰,直接輸入并循環(huán)計算,直到符合退出條件為止。 對于條件的判斷就是第一種情況的簡單應(yīng)用了。
代碼如下:
#include stdio.h
int main()
{
int r;
scanf("%d",r);
while(r = 0 r = 100)//對結(jié)果進行范圍判斷
{
if(r 1) r *= 2; //奇數(shù)的情況。
else r=r/2-10;//偶數(shù)的情況。
}
printf("%d\n", r);
return 0;
}
各種用
C
語言實現(xiàn)的模板可能在使用形式上有所不同?,F(xiàn)以一個求和函數(shù)
Sum
為例,用
C++
Template
可寫如下:
template
R
Sum(const
T
*array,
int
n)
{
R
sum
=
0;
for
(int
i
=
;
i
n
;
++i)
sum
+=
i;
return
sum;
}
如果不是內(nèi)置類型,該模板隱式地需要
有R
R::operator+=(T)運算符可用。
1.
使用函數(shù)指針作為
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
=
;
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,
};
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
=
;
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.
所有可替換參數(shù)均為宏
至少需要一個額外的文件(實現(xiàn)文件)為
impsum.c
/*
impsum.c
*/
RetType
FunName(const
ElemType
*array,
int
n)
{
RetType
sum
=
0;
for
(int
i
=
;
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.
總結(jié):
第一種方法,易于跟蹤調(diào)試,但是效率低下,適用于對可變函數(shù)(函數(shù)指針)的效率要求不高,但程序出錯的可能性較大(復(fù)雜),模板函數(shù)(Sum)本身很復(fù)雜,模板參數(shù)也比較復(fù)雜(add)的場合。
第二種方法,效率高,但很難跟蹤調(diào)試,在模板函數(shù)和模板參數(shù)本身都很復(fù)雜的時候更是如此。
第三種方法,是我最近幾天才想出的,我認為是最好的,在模板參數(shù)(Add)比較復(fù)雜時可以用函數(shù)(第二種也可以如此),簡單時可以用宏,并且,易于調(diào)試。在模板函數(shù)本身很復(fù)雜,而模板參數(shù)比較簡單時更為優(yōu)越。但是,可能有點繁瑣。
function s(GetData0,GetData1,GetData2)
{
if(GetData0 == "")return;
if(n==1)tempstr+="tr";
if(GetData1 == null || trim(GetData1) == "")
{
tempstr+="";
}
else
{
tempstr+="td ";
}
if(GetData1 == null || trim(GetData1) == "")
{
//tempstr+="font color=#8888ff※/fonta href=;%=Url%User/LookUserMoreInfo.asp?OlID=" + GetData0 + "游客/a/td";
}
else
{
rguser+=1;
if (GetData1 == "隱身會員")
{
tempstr+="font color=gray class=GrayFont※/fonta href=;%=Url%User/LookUserMoreInfo.asp?OlID=" + GetData0 + "隱身會員/a/td";
}
else
{
if(parseInt(GetData2)(1(10-1))){tempstr+="font color=Red class=RedFont●/font";}
else
{
if(parseInt(GetData2)(1(14-1))){tempstr+="font color=Green class=GreenFont●/font";}
else
{
if(parseInt(GetData2)(1(8-1))){tempstr+="font color=Blue class=BlueFont●/font";}
else
{
if(parseInt(GetData2)(1(2-1))){tempstr+="font color=Gray class=GrayFont●/font";}
else{tempstr+="font color=green class=GreenFont※/font";}
}
}
}
tempstr+="a href='%=Url%User/LookUserInfo.asp?name=" + GetData1 + "'" + GetData1 + "/a/td";
}
}
if(GetData1 == null || trim(GetData1) == "")
{
}
else
{
n+=1;
}
if(n7)
{
tempstr+="/tr";
n=1;
}
}