卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

c語言背包問題(c語言新手常見問題?)

三角符文鍵盤怎么打開背包?I鍵和C鍵都可以打開背包。C鍵是人物面板,但是人物和背包是在一起的,所以C鍵也可以打開,比I鍵方便很多。背包問題應(yīng)用實(shí)例?背包問題是一個組合優(yōu)化的NP完全問題。背包問題可以描

c語言背包問題(c語言新手常見問題?)

三角符文鍵盤怎么打開背包?

I鍵和C鍵都可以打開背包。C鍵是人物面板,但是人物和背包是在一起的,所以C鍵也可以打開,比I鍵方便很多。

背包問題應(yīng)用實(shí)例?

背包問題是一個組合優(yōu)化的NP完全問題。

背包問題可以描述為:給定一組物品,每個物品都有自己的重量和價格。在有限的總重量內(nèi),如何選擇才能使物品總價最高?

問題的名稱來源于如何選擇最合適的物品放入給定的背包中。

類似的問題經(jīng)常出現(xiàn)在商業(yè)、組合數(shù)學(xué)、計(jì)算復(fù)雜性理論、密碼學(xué)和應(yīng)用數(shù)學(xué)等領(lǐng)域。

背包問題也可以描述為一個決定性問題,即在總重量不超過W的前提下,總價值能否達(dá)到V?它是由Merkle和Hellman在1978年提出的。

背包問題已經(jīng)被研究了一個多世紀(jì)。早期的作品可以追溯到數(shù)學(xué)家托拜厄斯丹齊格(tobias Dancziger)在1897年的早期作品,它指的是在不超載行李的情況下打包你最有價值或最有用的物品這一常見問題。

背包問題的主要思想是假設(shè)某人有大量不同重量的物品。

這個人偷偷挑選一些物品放在背包里,加密消息。

背包里物品的總重量是公開的,所有可能的物品也是公開的,但是背包里的物品是保密的。

附加一定的限制,賦予權(quán)重,列出可能的項(xiàng)目,在計(jì)算上是不可行的。背包問題是一個眾所周知的不可計(jì)算問題,背包系統(tǒng)以其快速的加解密速度吸引了人們的注意。

但是背包系統(tǒng)大部分都被破譯了,所以用的人很少。

編程里出現(xiàn)bag怎么辦?

1.目的明確。仔細(xì)檢查異常報(bào)告,確定是否是bug,找出各種有用的信息,找到問題的癥結(jié)所在。

2.準(zhǔn)備工作——找出正確的代碼并用排除法清潔工作區(qū)域。

3.匹配測試環(huán)境。如果客戶正在操作計(jì)算機(jī)配置,則可以跳過此過程。

4.明確代碼的用途,確?,F(xiàn)有的所有測試工具正常。

c語言新手常見問題?

1.在編寫標(biāo)識符時,大寫字母和小寫字母之間的差異被忽略。

2.忽略變量的類型,進(jìn)行非法操作。

3.混淆字符常量和字符串常量。

4.忽略等號和雙等號的區(qū)別。

5.忘了獎金數(shù)字吧。

6.輸入變量時忘記添加地址運(yùn)算符。

7.數(shù)據(jù)輸入方式不符合要求。

8.輸入字符的格式不符合要求。

9.輸入和輸出的數(shù)據(jù)類型與使用的格式說明符不一致。

c語言新手常見問題?

以下是C語言初學(xué)者的常見問題

1.程序屏幕一閃而過。

# include int main(void){ int I signal/*定義表示信號燈狀態(tài)的變量*/printf (# 34紅燈為0,綠燈為1

#34) /*輸出提示信息*/scanf (# 34 % d # 34,Ampisignal)/*輸入isignal變量*/if(iSignal==1) /*用if語句判斷*/{printf (# 34燈為綠色,汽車可以行駛

#34) /* Output */} if當(dāng)判斷結(jié)果為真(iSignal==0)/*使用if語句判斷*/{printf (# 34燈為紅色,carscan # 39T運(yùn)行

#34) /* Output */}判斷結(jié)果為真時返回0}

分析:這個程序在XP或以上系統(tǒng)上用win-tc、dev-cpp等ide編譯運(yùn)行時,無論輸入什么數(shù)字,結(jié)果都是一閃而過,因?yàn)槌绦驁?zhí)行完語句直接退出。

解決方案:這里有幾個解決方案:

(1):在程序的開頭加上#include,然后在程序的結(jié)尾加上system(#34pause#34)。

這種方法只適用于MS-DOS,windows,不適用于*nix等系統(tǒng)。

(2):在需要暫停的地方添加一兩個get)

這種方法,本質(zhì)上不是掛起程序,而是讓程序等待用戶輸入幾個回車。但是效果和暫停一樣。

(3):在程序開頭加#include,在需要暫停的地方加一個getch()。原理和上一個差不多。在win-tc中廣泛使用。

2.if,for,while判斷直接跟隨。

例如:

# include int main(void){ int a scanf(# 34 % d # 34,AMPA) if(a==123)///error,if(a==123)不應(yīng)該加,而應(yīng)該跟///{ printf()} code { printf(# 34 CCC # 34)} else { printf(# 34 DDD # 34)} return 0 } # include int main(void){ int n,i printf(#34請輸入a numbergt2:

#34,n) else printf(#34%d是一個sushu

#34,n)返回0}

解決amp解決方案:參見注釋。

3.頭文件缺失,main函數(shù)格式不規(guī)范。

例如:

main(){ int a scanf(#34%d#34,ampa) printf(#34input %d#34,a)}

分析:這個程序沒有帶頭文件stdio.h也就是省略了#include。如果只有scanf,printf函數(shù),stdio.h可以省略,正確運(yùn)行,但這是一個很不好的習(xí)慣。而main()的寫法,C89標(biāo)準(zhǔn)勉強(qiáng)允許這種形式,C99標(biāo)準(zhǔn)不允許。

而void main(),到目前為止,還沒有標(biāo)準(zhǔn)考慮接受它。但是一些編譯器允許這樣做。當(dāng)然,這種寫法很受歡迎,應(yīng)該和老譚的書有很大關(guān)系。

解決方案:使用的頭文件應(yīng)該包含在include中。main()函數(shù)應(yīng)該以int main(void)的形式編寫,在main()函數(shù)的末尾返回0。

也就是

# include int main(void){ int a scanf(# 34 % d # 34,ampa) printf(#34input %d#34,a) return 0}

4.scanf格式控制的誤用

例如:

#includeint main(void){ float a,b,c printf(# 34 shuru 3 ge Shu : # 34)scanf(# 34 %f, % f,%f#34,ampa,ampb,ampc) printf(#34he shi %f#34,a b c) return 0}

解析:scanf()函數(shù)允許在格式字符串中放置普通字符。除空格字符之外的普通字符必須與輸入字符串完全匹配。否則,例如上面的程序,然后scanf()將其解釋為,它將鍵入一個數(shù)字,一個逗號,然后一個數(shù)字,一個逗號,最后一個數(shù)學(xué)。也就是說必須這樣輸入:2.3,5.1,3.8。如果沒有完全匹配,scanf()讀取將失敗。

作為編寫這個程序的人,你可以用這種格式輸入,但是用戶不知道用哪種格式輸入。所以應(yīng)該改成SCANF (# 34 % f % f # 34,AMPA,AMPB,AMPC)

解決方案:請參見scanf行的解析。

5.錯誤的scanf參數(shù)

例如:

# include int main(void){ char str[80]printf(# 34請輸入您的名字#34) scanf(#34%s#34,ampstr) printf(#34Hello %s#34,str) return 0}

解析:在scanf()中,讀取int、long、float、double、char等數(shù)據(jù)。需要在第n個參數(shù)(ngt=2)上加amp,因?yàn)樵趕canf()函數(shù)中,第n個參數(shù)(ngt=2)是變量的地址,而不是變量本身:比如定義了int num,scnaf (# 34)

但是讀取字符串時不需要加amp,因?yàn)樽址旧淼淖兞棵痛砹说刂?。因此,在示例中?yīng)該是scanf(#34%s#34,str)。同時,這一規(guī)則也適用于結(jié)構(gòu)中的變量,即

struct foo { char chchar str[80]int num }數(shù)據(jù)

那就應(yīng)該是

scanf(#34%c%s%d#34、)

解決方法:見分析。

6.數(shù)據(jù)類型混亂

例如:

# include int main(void){ int A double b=1 for(A=1 alt=6aA)b *=A printf(# 34 % LD # 34,b)}

分析:B定義為雙精度浮點(diǎn)型,而輸出使用%ld,即長整型,數(shù)據(jù)類型不一致。輸出是:老譚書中關(guān)于用TC調(diào)試的那一節(jié)給出的例子,好像是把int a寫到printf (# 34 % f # 34,a)引起的錯誤。

解決方法:將B定義為long,即long b=1(實(shí)際上這里涉及到隱式轉(zhuǎn)換,所以更正確的做法是將A定義為long)

7.C語言中的“除法”

例如:

# include int main(void){ printf(# 34請輸入一個華氏溫度。

# 34) float a,c scanf (# 34 % f # 34,a)c=5/9 *(a-32)printf(# 34 % 4.2f # 34,c) return 0}

解析:C語言中,兩個整數(shù)相除。如果它們不能被整除,小數(shù)部分會被直接丟棄,即“截?cái)唷?。所?/9的結(jié)果是0。

解決方法:應(yīng)該使用類型轉(zhuǎn)換,或者明確定義兩個除數(shù)的類型。

c=(浮點(diǎn)型)5/9*(a-32)

c=5.0/9*(a-32)

c=5.0/9.0*(a-32)

8.混合輸入數(shù)字和字符的杯子

# include int main(void){ char ch int num,I printf(# 34輸入一個字符和一個整數(shù):

#34) while((ch=get))!=#39

#39) { scanf(#34%d#34,ampnum)for(I=0 I lt num I)putch)put # 39

# 39)printf(# 34輸入另一對。空行退出#34) }返回0}

分析:這個程序表面上看起來沒什么問題,但實(shí)際再次運(yùn)行時會發(fā)現(xiàn)只輸入了一組數(shù)據(jù),程序就退出了。

開始時,程序運(yùn)行良好。例如,如果輸入2,程序?qū)⒋蛴a。但是,程序在響應(yīng)第二次輸入之前退出。

問題出在換行符上,這次換行符緊接在第一個輸入的2之后。scanf()函數(shù)將換行符保存在輸入隊(duì)列中,而get)不跳過換行符。所以在循環(huán)的下一個循環(huán)中,get)讀取第一個輸入的換行符,換行符是終止循環(huán)的條件。

解決方案:在輸入流中吃回車鍵。

在while循環(huán)的末尾,添加以下語句

while(獲取)!=#39

#39)繼續(xù)

還可以添加fflush(stdin)來刷新輸入流。

9.我,我糾結(jié)了

示例:

# include int main(void){ int I=5 printf(# 34 % d % d # 34,I,i ) return 0}

分析:這個問題,在實(shí)際編程中,應(yīng)該沒人會寫,但還是有很多初學(xué)者糾結(jié)于此。在編程領(lǐng)域,實(shí)踐在很多情況下是最好的老師。如果代碼有疑問,在電腦上敲一下,重新編譯運(yùn)行,是個不錯的辦法。但是在I,I方面,這個程序即使編譯運(yùn)行,也不一定有正確的結(jié)果。用VC,TC,gcc編譯運(yùn)行后的結(jié)果不一定一樣?;蛘邚哪撤N角度來說,這里的結(jié)果是否正確其實(shí)并不重要。

Printf(#34%d %d#34,I,I)這個語句,其中I,I是一個未指定的行為。也就是說,C語言的標(biāo)準(zhǔn)并沒有規(guī)定這個操作的執(zhí)行順序。如果用gcc編譯并添加-Wall選項(xiàng),將會出現(xiàn)警告:

函數(shù)#039; main#039;6:24:中的Gcc 2_1.c -o 2_1 -g -Wall2_1.c:警告:對#039; I #039;的操作結(jié)果可能未定義。

所以,解決這個問題最好的辦法就是不要在程序中寫這樣的代碼。

解決方法:見上文。

10、60lt=等級lt=70

示例:

if(60 lt=grade lt=70)printf(# 34 pass # 34)else if(70 lt=grade lt=85)printf(# 34 good # 34)

:在數(shù)學(xué)中,表達(dá)式60lt=gradelt=70是有效的,但是在C語言中,沒有這樣的表達(dá)式。

解決方案:它應(yīng)該重寫為

If ((60 lt=等級)amp amp(等級lt=70)) printf (# 34 pass #34)else.

11.switch接受什么值?

示例:

# include int main(void){ double choice scanf(# 34 % lf # 34,amp choice)switch(choice){ case 1.0 : printf(# 341.0 # 34)break case 2.0 : printf(# 342.0 # 34)break default : printf(# 34It # 39s not 1.0或2.0#34) } return 0}

分析:這種問題在實(shí)際編程中也是不會出現(xiàn)的。但是有些C語言的題可能會這樣出來。Switch()接受整數(shù):整數(shù)或字符。所以switch()不接受浮點(diǎn)、字符串等類型。

解決方案:沒有他…

12.==的困惑

示例:

Void count(void)/* counter函數(shù)*/void show _ count(void)/* Report count result */int main(void){ puts(# 34請輸入一些字母3360(# to end)# 34)count()show _ count()puts(# 34感謝您使用本草_茶制作的這個程序!#34)系統(tǒng)(#34pause#34)返回0 } void count(void){ while((ch=get))!=STOP){ if(ch=SPACE){ sp _ count continue } if(ch=ENTER){ n _ count continue } other _ count }/* end of while((ch=get))!=# 39 # # 39)*/} void show _ count(void){ puts(# 34的數(shù)量

空格輸入other # 34)printf(# 34)mm

#34,sp_count,n_count,other_count)}

分析:換句話說,這個錯誤是我自己犯的。在數(shù)學(xué)中,=表示相等,而在很多編程語言中,=表示賦值,==表示相等。惰性導(dǎo)致錯誤。這個錯誤C編譯器既不會報(bào)告錯誤也不會發(fā)出警告。很難檢查是否出了問題。

看了二十多遍調(diào)試值監(jiān)控都沒找到。最后我一行一行的看了源代碼才知道是這個問題。C語言四書五經(jīng)中的C陷阱與陷阱和專家C編程都提到了這個問題。

解決方法:除了關(guān)心什么都不是。

13.溢出問題

舉例:求斐波那契數(shù)列的前n項(xiàng)。

# include # define N 100 int main(void){ int fib[N]int I fib[0]=fib[1]=1 printf(# 34 % d % d # 34,fib[0],fib[1])for(I=2 I lt N I){ fib[I]=fib[I-1]fib[I-2]printf(# 34 % d # 34,fib[i]) } return 0}

解析:在數(shù)學(xué)概念中,整數(shù)和小數(shù)是無限的,但在計(jì)算機(jī)中,即使是long long int或double類型也有一定的極限,會溢出。

即假設(shè)指針式體重秤的最大量程是120KG,那么一個體重130KG的人站起來,指針會指向10KG的體重秤。同樣,溢出。

在C語言中,編譯器不會檢查或處理溢出。因此,在編程時,您應(yīng)該自己估計(jì)數(shù)字的大小,以選擇合適的數(shù)據(jù)類型來表示數(shù)據(jù)。

PS:由于TC編譯的程序是16位的,所以int也是16位的,所以會很容易溢出。

解決方法:一方面使用合適的數(shù)據(jù)類型,如long、long long或double。另一方面,如果數(shù)字大到連無符號的long long int或double都無法表示,那就用數(shù)組。但是定義數(shù)組的加減是好的,定義乘除就沒那么簡單了。

所以新人推薦第一種方法。第二種方法,可以考慮自己編個小程序?qū)崿F(xiàn)。

14.四舍五入?

示例:需要將輸入的數(shù)字四舍五入到指定的精度并輸出。

# include int main(void){ double a=158.385427 printf(# 34 % . 2 lf # 34,a) return 0}

解析:C語言中,printf(#34%.2lf#34,num)直接截?cái)嗟叫?shù)點(diǎn)后兩位,類似于零截?cái)喽皇撬纳嵛迦搿?/p>

解決方案:如下所示

//對顯示的數(shù)字進(jìn)行四舍五入,用戶可以準(zhǔn)確輸入。//區(qū)分正負(fù)# include # include # include int main(void){ int width double a=158.385427 puts(# 34 ent ER the width # 34)scanf(# 34 % d # 34,amp width)if(AGT 0.0)a=(int)(a * pow(10,width) 0.5)/pow(10,width) else a=(int)(a*pow(10,width) - 0.5)/pow(10,width)printf(# 34t*lf

#34,寬度,a)系統(tǒng)(#34原因# 34)返回0}

15.函數(shù)的返回值

示例:

#includedouble salary()/*用于計(jì)算工資稅的函數(shù)*/void main(){ int choice char want 0 double result while(1){ printf(# 34歡迎使用個人所得稅計(jì)算器

#34) printf(#34

#34) printf(#341。工資薪金所得稅的計(jì)算

#34) printf(#34

#34) printf(#34,請輸入要計(jì)算的稅目序號:# 34) scanf (# 34 % d # 34,amp choice)if(choice==1){ salary()printf(# 34 % lf # 34,Result)} double sale Result printf(# 34請輸入您的薪金:#34) scanf(#34%lf#34,amp sal)if(sallt=3000)Result=# 34 sal # 34 sal=# 34

分析:問題簡單來說就是用戶自定義函數(shù)不返回計(jì)算出的值。本質(zhì)上是關(guān)于存儲類和鏈接,也就是變量的作用域、鏈接和存儲周期。

解決方案:

/* * main.c * *創(chuàng)建于: 2011年6月11日*作者3360 ICE */# INCLUDE DOUBLE SALARY()/*用于計(jì)算工資稅的函數(shù)*/int main(void){ int choice//char want0///此want 0變量不使用DOUBLE result while(1){ printf(# 34歡迎使用個人所得稅計(jì)算器。

#34) printf(#34

#34) printf(#341。工資薪金所得稅的計(jì)算

#34) printf(#34

#34) printf(#34請輸入需要計(jì)算的稅收項(xiàng)目序號:#34) scanf(#34%d#34,amp choice)if(choice==1){ result=salary()//要有一個值接受返回值才可以printf(#34%lf#34,result)} } } double salary(){ double sal,result printf(#34請輸入您的薪水:#34) scanf(#34%lf#34,amps al)if(sallt=3000)result=# 34 sal # 34 sal=# 34 # 34gt 3000 amps allt=4500)result=# 34 sal * 0.05 # 34 sal=# 34 # 34gt 4500 amps allt=7500)result=# 34 sal * 0.1-75 # 34 sal=# 34 # 34gt 7500